[FFmpeg-devel] [PATCH] ffmpeg: add option recast_media

James Almer jamrial at gmail.com
Tue Jul 13 22:05:02 EEST 2021


On 7/13/2021 6:12 AM, Gyan Doshi wrote:
> 
> 
> 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.
>>> + at 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;
>      ...
> }

ist->dec_ctx is initialized as a copy of par, and its codec_type is 
never changed.
In fact, for video, copying back to par doesn't seem needed to begin 
with. And it could be looked how to remove it for audio and subtitles, 
where channel_layout and dimensions respectively may be changed.

> 
> 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.
> 
> Regards,
> Gyan
> 
> 
> 
> 
>>
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list