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.
+@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
_______________________________________________
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".

Reply via email to