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.


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@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

_______________________________________________
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