From fa1195227ff010bc22472688587fdcfa620f69de Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 30 Apr 2011 21:38:40 +0200 Subject: [PATCH] FFMPEG: support demuxer specific options. Signed-off-by: Michael Niedermayer --- cmdutils.c | 10 ++++++++++ ffmpeg.c | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cmdutils.c b/cmdutils.c index 5ad45e107d..4363e8a842 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -297,6 +297,7 @@ int opt_default(const char *opt, const char *arg){ int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0}; AVCodec *p = NULL; AVOutputFormat *oformat = NULL; + AVInputFormat *iformat = NULL; while ((p = av_codec_next(p))) { AVClass *c = p->priv_class; @@ -312,6 +313,13 @@ int opt_default(const char *opt, const char *arg){ } if (oformat) goto out; + while ((iformat = av_iformat_next(iformat))) { + const AVClass *c = iformat->priv_class; + if (c && av_find_opt(&c, opt, NULL, 0, 0)) + break; + } + if (iformat) + goto out; for(type=0; *avcodec_opts && type= 0; type++){ const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]); @@ -415,6 +423,8 @@ void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec) AVFormatContext *avctx = ctx; if (avctx->oformat && avctx->oformat->priv_class) { priv_ctx = avctx->priv_data; + } else if (avctx->iformat && avctx->iformat->priv_class) { + priv_ctx = avctx->priv_data; } } diff --git a/ffmpeg.c b/ffmpeg.c index bde23e0ba9..db9701d90d 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -3258,10 +3258,16 @@ static void opt_input_file(const char *filename) ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0, avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance); - ic->flags |= AVFMT_FLAG_NONBLOCK; + ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT; /* open the input file with generic libav function */ err = av_open_input_file(&ic, filename, file_iformat, 0, ap); + if(err >= 0){ + set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL); + err = av_demuxer_open(ic, ap); + if(err < 0) + avformat_free_context(ic); + } if (err < 0) { print_error(filename, err); ffmpeg_exit(1);