Quoting Gyan Doshi (2021-07-13 11:12:19) > > > On 2021-07-13 13:14, Anton Khirnov wrote: > > Quoting Gyan Doshi (2021-07-02 12:03:05) > >> Allows forcing decoders of different media type. > >> Needed to decode media data muxed as data streams. > >> --- > >> doc/ffmpeg.texi | 5 +++++ > >> fftools/ffmpeg_opt.c | 7 ++++++- > >> 2 files changed, 11 insertions(+), 1 deletion(-) > >> > >> diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi > >> index 7827291755..c1065086e5 100644 > >> --- a/doc/ffmpeg.texi > >> +++ b/doc/ffmpeg.texi > >> @@ -449,6 +449,11 @@ output file already exists. > >> Set number of times input stream shall be looped. Loop 0 means no loop, > >> loop -1 means infinite loop. > >> > >> +@item -recast_media (@emph{global}) > >> +Enable to allow forcing a decoder of a different media type than > >> +the one detected or designated by the demuxer. Useful for decoding > >> +media data muxed as data streams. > >> + > >> @item -c[:@var{stream_specifier}] @var{codec} > >> (@emph{input/output,per-stream}) > >> @itemx -codec[:@var{stream_specifier}] @var{codec} > >> (@emph{input/output,per-stream}) > >> Select an encoder (when used before an output file) or a decoder (when > >> used > >> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c > >> index a63bed54cf..76a220c21c 100644 > >> --- a/fftools/ffmpeg_opt.c > >> +++ b/fftools/ffmpeg_opt.c > >> @@ -186,6 +186,7 @@ static int input_sync; > >> static int input_stream_potentially_available = 0; > >> static int ignore_unknown_streams = 0; > >> static int copy_unknown_streams = 0; > >> +static int recast_media = 0; > >> static int find_stream_info = 1; > >> > >> static void uninit_options(OptionsContext *o) > >> @@ -759,7 +760,7 @@ static const AVCodec *find_codec_or_die(const char > >> *name, enum AVMediaType type, > >> av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, > >> name); > >> exit_program(1); > >> } > >> - if (codec->type != type) { > >> + if (codec->type != type && !recast_media) { > >> av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", > >> codec_string, name); > >> exit_program(1); > >> } > >> @@ -774,6 +775,8 @@ static const AVCodec *choose_decoder(OptionsContext > >> *o, AVFormatContext *s, AVSt > >> if (codec_name) { > >> const AVCodec *codec = find_codec_or_die(codec_name, > >> st->codecpar->codec_type, 0); > >> st->codecpar->codec_id = codec->id; > >> + if (recast_media && st->codecpar->codec_type != codec->type) > >> + st->codecpar->codec_type = codec->type; > > The caller is not allowed to modify this struct for demuxing. This might > > confuse demuxers that expect the values they put there to remain > > choose_decoder() is called from within add_input_streams(). > > Near the end of this parent function, we have > > ret = avcodec_parameters_from_context(par, ist->dec_ctx); > > where par is > > AVCodecParameters *par = st->codecpar; > > > avcodec_parameters_from_context(), starts with > { > codec_parameters_reset(par); --> sets codec_type to > AVMEDIA_TYPE_UNKNOWN > > par->codec_type = codec->codec_type; > ... > } > > So it's already being done. I did an immediate recast to avoid some > temporary variables as the media type is used in a few switch blocks > after the decoder is set. > But that way also works for me, if you insist.
Okay, I still consider this API abuse, but since it was there before it is not your responsibility to fix it. Guess I'll add it to my todo list. -- Anton Khirnov _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".