diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-05-31 05:53:06 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-06-07 21:26:22 +0200 |
commit | 01ef127bf8556c934262f96d6876e4479bba9d5f (patch) | |
tree | 5884463baae9e4b9f3bea1802ec35688a719f520 | |
parent | 5affab960cd50c6cf83ba05e3c24b3e6c1a9e733 (diff) | |
download | ffmpeg-01ef127bf8556c934262f96d6876e4479bba9d5f.tar.gz |
ffmpeg: support setting AVStream.discard
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | doc/ffmpeg.texi | 24 | ||||
-rw-r--r-- | ffmpeg.h | 3 | ||||
-rw-r--r-- | ffmpeg_opt.c | 17 |
3 files changed, 42 insertions, 2 deletions
diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index 0f6c093493..68fd12f158 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -1146,6 +1146,30 @@ requested by @command{ffserver}. The option is intended for cases where features are needed that cannot be specified to @command{ffserver} but can be to @command{ffmpeg}. +@item -discard (@emph{input}) +Allows discarding specific streams or frames of streams at the demuxer. +Not all demuxers support this. + +@table @option +@item none +Discard no frame. + +@item default +Default, which discards no frames. + +@item noref +Discard all non-reference frames. + +@item bidir +Discard all bidirectional frames. + +@item nokey +Discard all frames excepts keyframes. + +@item all +Discard all frames. +@end table + @end table As a special exception, you can use a bitmap subtitle stream as input: it @@ -204,6 +204,8 @@ typedef struct OptionsContext { int nb_guess_layout_max; SpecifierOpt *apad; int nb_apad; + SpecifierOpt *discard; + int nb_discard; } OptionsContext; typedef struct InputFilter { @@ -240,6 +242,7 @@ typedef struct InputStream { int file_index; AVStream *st; int discard; /* true if stream data should be discarded */ + int user_set_discard; int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */ AVCodecContext *dec_ctx; AVCodec *dec; diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 15a82bf637..887752d8c1 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -572,6 +572,8 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL; char *codec_tag = NULL; char *next; + char *discard_str = NULL; + const AVOption *discard_opt = av_opt_find(dec, "skip_frame", NULL, 0, 0); if (!ist) exit_program(1); @@ -601,6 +603,14 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) ist->reinit_filters = -1; MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st); + MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st); + ist->user_set_discard = AVDISCARD_NONE; + if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) { + av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n", + discard_str); + exit_program(1); + } + ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE; ist->dec_ctx = avcodec_alloc_context3(ist->dec); @@ -1165,7 +1175,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e if (source_index >= 0) { ost->sync_ist = input_streams[source_index]; input_streams[source_index]->discard = 0; - input_streams[source_index]->st->discard = AVDISCARD_NONE; + input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard; } ost->last_mux_dts = AV_NOPTS_VALUE; @@ -1804,7 +1814,7 @@ static int open_output_file(OptionsContext *o, const char *filename) if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull"); if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null"); ist->discard = 0; - ist->st->discard = AVDISCARD_NONE; + ist->st->discard = ist->user_set_discard; break; } } @@ -2852,6 +2862,9 @@ const OptionDef options[] = { "print timestamp debugging info" }, { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate }, "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." }, + { "discard", OPT_STRING | HAS_ARG | OPT_SPEC | + OPT_INPUT, { .off = OFFSET(discard) }, + "discard", "" }, /* video options */ { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames }, |