[FFmpeg-devel] ffmpeg: implement input file stream disabling

Submitted by Gyan on Dec. 10, 2018, 3:27 p.m.

Details

Message ID 1a338c60-598b-cf86-ed74-6f6b89c90c05@gyani.pro
State New
Headers show

Commit Message

Gyan Dec. 10, 2018, 3:27 p.m.
At Michael's suggestion, this patch lets -vn/-an/-sn/-dn work for input 
files. Individual streams can still be let through e.g.

     ffmpeg -an -discard:a:1 none -i file ...

will let (only) the 2nd audio stream be seen during stream selection and 
filtergraph construction.

Thanks,
Gyan
From 9823a71f2055f2c4c4484536291bbd2afee36a81 Mon Sep 17 00:00:00 2001
From: Gyan Doshi <ffmpeg@gyani.pro>
Date: Mon, 10 Dec 2018 20:38:20 +0530
Subject: [PATCH] ffmpeg: implement input file stream disabling

-vn/-an/-sn/-dn can be set to stop processing of streams
of said type from an input file.
---
 fftools/ffmpeg_filter.c |  7 +++++++
 fftools/ffmpeg_opt.c    | 17 +++++++++++++++++
 2 files changed, 24 insertions(+)

Comments

Michael Niedermayer Dec. 11, 2018, 10:10 p.m.
On Mon, Dec 10, 2018 at 08:57:44PM +0530, Gyan wrote:
> At Michael's suggestion, this patch lets -vn/-an/-sn/-dn work for input
> files. Individual streams can still be let through e.g.
> 
>     ffmpeg -an -discard:a:1 none -i file ...
> 
> will let (only) the 2nd audio stream be seen during stream selection and
> filtergraph construction.
> 
> Thanks,
> Gyan

>  ffmpeg_filter.c |    7 +++++++
>  ffmpeg_opt.c    |   17 +++++++++++++++++
>  2 files changed, 24 insertions(+)
> 212c7bcecbd62329f3f18893c71f464ebeee3b67  0001-ffmpeg-implement-input-file-stream-disabling.patch
> From 9823a71f2055f2c4c4484536291bbd2afee36a81 Mon Sep 17 00:00:00 2001
> From: Gyan Doshi <ffmpeg@gyani.pro>
> Date: Mon, 10 Dec 2018 20:38:20 +0530
> Subject: [PATCH] ffmpeg: implement input file stream disabling
> 
> -vn/-an/-sn/-dn can be set to stop processing of streams
> of said type from an input file.

isnt this 2 seperate changes ?
one is adding -vn/-an/-sn/-dn input support and the other is fixing some input
discard issues related to existing -discard functionality

if thats the case it should be 2 seperate patches

thanks

[...]
Gyan Dec. 12, 2018, 4:55 a.m.
On 12-12-2018 03:40 AM, Michael Niedermayer wrote:
> On Mon, Dec 10, 2018 at 08:57:44PM +0530, Gyan wrote:
>> At Michael's suggestion, this patch lets -vn/-an/-sn/-dn work for input
>> files. Individual streams can still be let through e.g.
>>
>>      ffmpeg -an -discard:a:1 none -i file ...
>>
>> will let (only) the 2nd audio stream be seen during stream selection and
>> filtergraph construction.
>>
>> Thanks,
>> Gyan
>>   ffmpeg_filter.c |    7 +++++++
>>   ffmpeg_opt.c    |   17 +++++++++++++++++
>>   2 files changed, 24 insertions(+)
>> 212c7bcecbd62329f3f18893c71f464ebeee3b67  0001-ffmpeg-implement-input-file-stream-disabling.patch
>>  From 9823a71f2055f2c4c4484536291bbd2afee36a81 Mon Sep 17 00:00:00 2001
>> From: Gyan Doshi <ffmpeg@gyani.pro>
>> Date: Mon, 10 Dec 2018 20:38:20 +0530
>> Subject: [PATCH] ffmpeg: implement input file stream disabling
>>
>> -vn/-an/-sn/-dn can be set to stop processing of streams
>> of said type from an input file.
> isnt this 2 seperate changes ?
> one is adding -vn/-an/-sn/-dn input support and the other is fixing some input
> discard issues related to existing -discard functionality


Only one change. I provided an example command syntax to show how to 
selectively enable streams while leaving others of the same type disabled.

Gyan
Michael Niedermayer Dec. 12, 2018, 7:20 p.m.
On Wed, Dec 12, 2018 at 10:25:46AM +0530, Gyan wrote:
> 
> On 12-12-2018 03:40 AM, Michael Niedermayer wrote:
> >On Mon, Dec 10, 2018 at 08:57:44PM +0530, Gyan wrote:
> >>At Michael's suggestion, this patch lets -vn/-an/-sn/-dn work for input
> >>files. Individual streams can still be let through e.g.
> >>
> >>     ffmpeg -an -discard:a:1 none -i file ...
> >>
> >>will let (only) the 2nd audio stream be seen during stream selection and
> >>filtergraph construction.
> >>
> >>Thanks,
> >>Gyan
> >>  ffmpeg_filter.c |    7 +++++++
> >>  ffmpeg_opt.c    |   17 +++++++++++++++++
> >>  2 files changed, 24 insertions(+)
> >>212c7bcecbd62329f3f18893c71f464ebeee3b67  0001-ffmpeg-implement-input-file-stream-disabling.patch
> >> From 9823a71f2055f2c4c4484536291bbd2afee36a81 Mon Sep 17 00:00:00 2001
> >>From: Gyan Doshi <ffmpeg@gyani.pro>
> >>Date: Mon, 10 Dec 2018 20:38:20 +0530
> >>Subject: [PATCH] ffmpeg: implement input file stream disabling
> >>
> >>-vn/-an/-sn/-dn can be set to stop processing of streams
> >>of said type from an input file.
> >isnt this 2 seperate changes ?
> >one is adding -vn/-an/-sn/-dn input support and the other is fixing some input
> >discard issues related to existing -discard functionality
> 
> 
> Only one change. I provided an example command syntax to show how to
> selectively enable streams while leaving others of the same type disabled.

You misunderstand me i think
patches should be split in self contained changes.
part of this patch adds support for -vn/-an/-sn/-dn
and other parts are fixing bugs

the patch for example adds a error check for disabled filter inputs
using this example:
ffmpeg -discard all  -i tests/data/asynth-44100-1.wav -i tests/data/asynth-44100-1.wav -filter_complex '[0:a][1:a]amerge=inputs=2[aout]' -map '[aout]'  -f framecrc -

This newly added code triggers and prints
"Stream specifier ':a' in filtergraph description [0:a][1:a]amerge=inputs=2[aout] matches a disabled input stream."

before the patch the code did not error out.

[...]
Gyan Dec. 12, 2018, 7:50 p.m.
On 13-12-2018 12:50 AM, Michael Niedermayer wrote:
> On Wed, Dec 12, 2018 at 10:25:46AM +0530, Gyan wrote:
>> On 12-12-2018 03:40 AM, Michael Niedermayer wrote:
>>> On Mon, Dec 10, 2018 at 08:57:44PM +0530, Gyan wrote:
>>>> At Michael's suggestion, this patch lets -vn/-an/-sn/-dn work for input
>>>> files. Individual streams can still be let through e.g.
>>>>
>>>>      ffmpeg -an -discard:a:1 none -i file ...
>>>>
>>>> will let (only) the 2nd audio stream be seen during stream selection and
>>>> filtergraph construction.
>>>>
>>>> Thanks,
>>>> Gyan
>>>>   ffmpeg_filter.c |    7 +++++++
>>>>   ffmpeg_opt.c    |   17 +++++++++++++++++
>>>>   2 files changed, 24 insertions(+)
>>>> 212c7bcecbd62329f3f18893c71f464ebeee3b67  0001-ffmpeg-implement-input-file-stream-disabling.patch
>>>>  From 9823a71f2055f2c4c4484536291bbd2afee36a81 Mon Sep 17 00:00:00 2001
>>>> From: Gyan Doshi <ffmpeg@gyani.pro>
>>>> Date: Mon, 10 Dec 2018 20:38:20 +0530
>>>> Subject: [PATCH] ffmpeg: implement input file stream disabling
>>>>
>>>> -vn/-an/-sn/-dn can be set to stop processing of streams
>>>> of said type from an input file.
>>> isnt this 2 seperate changes ?
>>> one is adding -vn/-an/-sn/-dn input support and the other is fixing some input
>>> discard issues related to existing -discard functionality
>>
>> Only one change. I provided an example command syntax to show how to
>> selectively enable streams while leaving others of the same type disabled.
> You misunderstand me i think
> patches should be split in self contained changes.
> part of this patch adds support for -vn/-an/-sn/-dn
> and other parts are fixing bugs
>
> the patch for example adds a error check for disabled filter inputs
> using this example:
> ffmpeg -discard all  -i tests/data/asynth-44100-1.wav -i tests/data/asynth-44100-1.wav -filter_complex '[0:a][1:a]amerge=inputs=2[aout]' -map '[aout]'  -f framecrc -
>
> This newly added code triggers and prints
> "Stream specifier ':a' in filtergraph description [0:a][1:a]amerge=inputs=2[aout] matches a disabled input stream."
>
> before the patch the code did not error out.

Actually, I meant to catch and error out for scenarios like,

     ffmpeg -vn -i input -lavfi [0:v]filter output

Since there's only one variable to set discard state, it happens to 
error out your command as well. I didn't consider it a bug fix but as 
due diligence for this new 'feature'.

I can split this in two, if you like.

Anything else?

Gyan
Michael Niedermayer Dec. 12, 2018, 11:50 p.m.
On Thu, Dec 13, 2018 at 01:20:22AM +0530, Gyan wrote:
> 
> On 13-12-2018 12:50 AM, Michael Niedermayer wrote:
> >On Wed, Dec 12, 2018 at 10:25:46AM +0530, Gyan wrote:
> >>On 12-12-2018 03:40 AM, Michael Niedermayer wrote:
> >>>On Mon, Dec 10, 2018 at 08:57:44PM +0530, Gyan wrote:
> >>>>At Michael's suggestion, this patch lets -vn/-an/-sn/-dn work for input
> >>>>files. Individual streams can still be let through e.g.
> >>>>
> >>>>     ffmpeg -an -discard:a:1 none -i file ...
> >>>>
> >>>>will let (only) the 2nd audio stream be seen during stream selection and
> >>>>filtergraph construction.
> >>>>
> >>>>Thanks,
> >>>>Gyan
> >>>>  ffmpeg_filter.c |    7 +++++++
> >>>>  ffmpeg_opt.c    |   17 +++++++++++++++++
> >>>>  2 files changed, 24 insertions(+)
> >>>>212c7bcecbd62329f3f18893c71f464ebeee3b67  0001-ffmpeg-implement-input-file-stream-disabling.patch
> >>>> From 9823a71f2055f2c4c4484536291bbd2afee36a81 Mon Sep 17 00:00:00 2001
> >>>>From: Gyan Doshi <ffmpeg@gyani.pro>
> >>>>Date: Mon, 10 Dec 2018 20:38:20 +0530
> >>>>Subject: [PATCH] ffmpeg: implement input file stream disabling
> >>>>
> >>>>-vn/-an/-sn/-dn can be set to stop processing of streams
> >>>>of said type from an input file.
> >>>isnt this 2 seperate changes ?
> >>>one is adding -vn/-an/-sn/-dn input support and the other is fixing some input
> >>>discard issues related to existing -discard functionality
> >>
> >>Only one change. I provided an example command syntax to show how to
> >>selectively enable streams while leaving others of the same type disabled.
> >You misunderstand me i think
> >patches should be split in self contained changes.
> >part of this patch adds support for -vn/-an/-sn/-dn
> >and other parts are fixing bugs
> >
> >the patch for example adds a error check for disabled filter inputs
> >using this example:
> >ffmpeg -discard all  -i tests/data/asynth-44100-1.wav -i tests/data/asynth-44100-1.wav -filter_complex '[0:a][1:a]amerge=inputs=2[aout]' -map '[aout]'  -f framecrc -
> >
> >This newly added code triggers and prints
> >"Stream specifier ':a' in filtergraph description [0:a][1:a]amerge=inputs=2[aout] matches a disabled input stream."
> >
> >before the patch the code did not error out.
> 
> Actually, I meant to catch and error out for scenarios like,
> 
>     ffmpeg -vn -i input -lavfi [0:v]filter output
> 
> Since there's only one variable to set discard state, it happens to error
> out your command as well. I didn't consider it a bug fix but as due
> diligence for this new 'feature'.
> 
> I can split this in two, if you like.
> 
> Anything else?

more spliting is better, yes
you know your changes better than i do, any self contained bugfix could be
split out. Or maybe all related bugfixes together if you dont want too many
one line patches

thanks

[...]

Patch hide | download patch | download mbox

diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 6518d50870..8c0ff99dd9 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -293,10 +293,17 @@  static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
             exit_program(1);
         }
         ist = input_streams[input_files[file_idx]->ist_index + st->index];
+        if (ist->user_set_discard == AVDISCARD_ALL) {
+            av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
+                   "matches a disabled input stream.\n", p, fg->graph_desc);
+            exit_program(1);
+        }
     } else {
         /* find the first unused stream of corresponding type */
         for (i = 0; i < nb_input_streams; i++) {
             ist = input_streams[i];
+            if (ist->user_set_discard == AVDISCARD_ALL)
+                continue;
             if (ist->dec_ctx->codec_type == type && ist->discard)
                 break;
         }
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index d4851a2cd8..59f4236127 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -746,6 +746,13 @@  static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 
         MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
         ist->user_set_discard = AVDISCARD_NONE;
+
+        if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
+            (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
+            (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
+            (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
+                ist->user_set_discard = AVDISCARD_ALL;
+
         if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
             av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
                     discard_str);
@@ -2174,6 +2181,8 @@  static int open_output_file(OptionsContext *o, const char *filename)
                 int new_area;
                 ist = input_streams[i];
                 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
+                if (ist->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
                     new_area = 1;
                 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
@@ -2195,6 +2204,8 @@  static int open_output_file(OptionsContext *o, const char *filename)
                 int score;
                 ist = input_streams[i];
                 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
+                if (ist->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                     score > best_score) {
                     best_score = score;
@@ -2216,6 +2227,8 @@  static int open_output_file(OptionsContext *o, const char *filename)
                     AVCodec const *output_codec =
                         avcodec_find_encoder(oc->oformat->subtitle_codec);
                     int input_props = 0, output_props = 0;
+                    if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
+                        continue;
                     if (output_codec)
                         output_descriptor = avcodec_descriptor_get(output_codec->id);
                     if (input_descriptor)
@@ -2237,6 +2250,8 @@  static int open_output_file(OptionsContext *o, const char *filename)
         if (!o->data_disable ) {
             enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
             for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
+                if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
                     && input_streams[i]->st->codecpar->codec_id == codec_id )
                     new_data_stream(o, oc, i);
@@ -2275,6 +2290,8 @@  loop_end:
                 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
 
                 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
+                if (ist->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
                     continue;
                 if(o->   audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)