[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