FFMPEG: support demuxer specific options.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
ffdc49df25
commit
fa1195227f
10
cmdutils.c
10
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};
|
int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
|
||||||
AVCodec *p = NULL;
|
AVCodec *p = NULL;
|
||||||
AVOutputFormat *oformat = NULL;
|
AVOutputFormat *oformat = NULL;
|
||||||
|
AVInputFormat *iformat = NULL;
|
||||||
|
|
||||||
while ((p = av_codec_next(p))) {
|
while ((p = av_codec_next(p))) {
|
||||||
AVClass *c = p->priv_class;
|
AVClass *c = p->priv_class;
|
||||||
@ -312,6 +313,13 @@ int opt_default(const char *opt, const char *arg){
|
|||||||
}
|
}
|
||||||
if (oformat)
|
if (oformat)
|
||||||
goto out;
|
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<AVMEDIA_TYPE_NB && ret>= 0; type++){
|
for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
|
||||||
const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[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;
|
AVFormatContext *avctx = ctx;
|
||||||
if (avctx->oformat && avctx->oformat->priv_class) {
|
if (avctx->oformat && avctx->oformat->priv_class) {
|
||||||
priv_ctx = avctx->priv_data;
|
priv_ctx = avctx->priv_data;
|
||||||
|
} else if (avctx->iformat && avctx->iformat->priv_class) {
|
||||||
|
priv_ctx = avctx->priv_data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
8
ffmpeg.c
8
ffmpeg.c
@ -3258,10 +3258,16 @@ static void opt_input_file(const char *filename)
|
|||||||
ic->subtitle_codec_id=
|
ic->subtitle_codec_id=
|
||||||
find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
|
find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
|
||||||
avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
|
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 */
|
/* open the input file with generic libav function */
|
||||||
err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
|
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) {
|
if (err < 0) {
|
||||||
print_error(filename, err);
|
print_error(filename, err);
|
||||||
ffmpeg_exit(1);
|
ffmpeg_exit(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user