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

Gyan Doshi ffmpeg at gyani.pro
Wed Jul 14 12:05:24 EEST 2021



On 2021-07-14 00:35, James Almer wrote:
> 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.

Well, the underlying point is that the info available to the demuxer may 
be wrong and/or incomplete.

Whatever sanitary correction is made here,  fftools should be free to 
apply automatic or user-requested adjustment for onward processing. 
Unless it's easier to make allowances inside lavf.

Regards,
Gyan


More information about the ffmpeg-devel mailing list