aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-05-31 05:53:06 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-06-07 21:26:22 +0200
commit01ef127bf8556c934262f96d6876e4479bba9d5f (patch)
tree5884463baae9e4b9f3bea1802ec35688a719f520
parent5affab960cd50c6cf83ba05e3c24b3e6c1a9e733 (diff)
downloadffmpeg-01ef127bf8556c934262f96d6876e4479bba9d5f.tar.gz
ffmpeg: support setting AVStream.discard
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--doc/ffmpeg.texi24
-rw-r--r--ffmpeg.h3
-rw-r--r--ffmpeg_opt.c17
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
diff --git a/ffmpeg.h b/ffmpeg.h
index a794255e6f..30890a0ee8 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -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 },