diff mbox series

[FFmpeg-devel,05/13] fftools/ffmpeg_enc: do not set output stream codec parameters directly

Message ID 20240924071000.11428-5-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,01/13] doc/ffmpeg; improve wording in the description section | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov Sept. 24, 2024, 7:09 a.m. UTC
Have the muxer code read them out of the encoder context in
of_stream_init() instead.

OutputStream.par_in no longer needs to be public, so can be moved to
MuxStream.

This is a step towards decoupling encoders from muxers.
---
 fftools/ffmpeg.h          |  6 ------
 fftools/ffmpeg_enc.c      |  7 -------
 fftools/ffmpeg_mux.c      | 13 ++++++++++---
 fftools/ffmpeg_mux.h      |  6 ++++++
 fftools/ffmpeg_mux_init.c | 30 +++++++++++++++++-------------
 5 files changed, 33 insertions(+), 29 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 98080213fd..13be7c4872 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -594,12 +594,6 @@  typedef struct OutputStream {
 
     int index;               /* stream index in the output file */
 
-    /**
-     * Codec parameters for packets submitted to the muxer (i.e. before
-     * bitstream filtering, if any).
-     */
-    AVCodecParameters *par_in;
-
     /* input stream that is the source for this output stream;
      * may be NULL for streams with no well-defined source, e.g.
      * attachments or outputs from complex filtergraphs */
diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
index ba79f6a3fc..796849fdb9 100644
--- a/fftools/ffmpeg_enc.c
+++ b/fftools/ffmpeg_enc.c
@@ -360,13 +360,6 @@  int enc_open(void *opaque, const AVFrame *frame)
         av_log(e, AV_LOG_WARNING, "The bitrate parameter is set too low."
                                     " It takes bits/s as argument, not kbits/s\n");
 
-    ret = avcodec_parameters_from_context(ost->par_in, ost->enc_ctx);
-    if (ret < 0) {
-        av_log(e, AV_LOG_FATAL,
-               "Error initializing the output stream codec context.\n");
-        return ret;
-    }
-
     ret = of_stream_init(of, ost, enc_ctx);
     if (ret < 0)
         return ret;
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index 71a771052f..ea0bbeed32 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -581,9 +581,9 @@  static int bsf_init(MuxStream *ms)
     int ret;
 
     if (!ctx)
-        return avcodec_parameters_copy(ost->st->codecpar, ost->par_in);
+        return avcodec_parameters_copy(ost->st->codecpar, ms->par_in);
 
-    ret = avcodec_parameters_copy(ctx->par_in, ost->par_in);
+    ret = avcodec_parameters_copy(ctx->par_in, ms->par_in);
     if (ret < 0)
         return ret;
 
@@ -619,6 +619,13 @@  int of_stream_init(OutputFile *of, OutputStream *ost,
         // use upstream time base unless it has been overridden previously
         if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0)
             ost->st->time_base = av_add_q(enc_ctx->time_base, (AVRational){0, 1});
+
+        ret = avcodec_parameters_from_context(ms->par_in, enc_ctx);
+        if (ret < 0) {
+            av_log(ost, AV_LOG_FATAL,
+                   "Error initializing the output stream codec parameters.\n");
+            return ret;
+        }
     }
 
     /* initialize bitstream filters for the output stream
@@ -813,7 +820,7 @@  static void ost_free(OutputStream **post)
         ost->logfile = NULL;
     }
 
-    avcodec_parameters_free(&ost->par_in);
+    avcodec_parameters_free(&ms->par_in);
 
     av_bsf_free(&ms->bsf_ctx);
     av_packet_free(&ms->bsf_pkt);
diff --git a/fftools/ffmpeg_mux.h b/fftools/ffmpeg_mux.h
index 22d728a919..5df718faf0 100644
--- a/fftools/ffmpeg_mux.h
+++ b/fftools/ffmpeg_mux.h
@@ -36,6 +36,12 @@ 
 typedef struct MuxStream {
     OutputStream    ost;
 
+    /**
+     * Codec parameters for packets submitted to the muxer (i.e. before
+     * bitstream filtering, if any).
+     */
+    AVCodecParameters *par_in;
+
     // name used for logging
     char            log_name[32];
 
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index b2351de177..47d745aa65 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -67,8 +67,9 @@  static int check_opt_bitexact(void *ctx, const AVDictionary *opts,
 }
 
 static int choose_encoder(const OptionsContext *o, AVFormatContext *s,
-                          OutputStream *ost, const AVCodec **enc)
+                          MuxStream *ms, const AVCodec **enc)
 {
+    OutputStream     *ost = &ms->ost;
     enum AVMediaType type = ost->type;
     const char *codec_name = NULL;
 
@@ -90,20 +91,20 @@  static int choose_encoder(const OptionsContext *o, AVFormatContext *s,
     }
 
     if (!codec_name) {
-        ost->par_in->codec_id = av_guess_codec(s->oformat, NULL, s->url, NULL, ost->type);
-        *enc = avcodec_find_encoder(ost->par_in->codec_id);
+        ms->par_in->codec_id = av_guess_codec(s->oformat, NULL, s->url, NULL, ost->type);
+        *enc = avcodec_find_encoder(ms->par_in->codec_id);
         if (!*enc) {
             av_log(ost, AV_LOG_FATAL, "Automatic encoder selection failed "
                    "Default encoder for format %s (codec %s) is "
                    "probably disabled. Please choose an encoder manually.\n",
-                    s->oformat->name, avcodec_get_name(ost->par_in->codec_id));
+                    s->oformat->name, avcodec_get_name(ms->par_in->codec_id));
             return AVERROR_ENCODER_NOT_FOUND;
         }
     } else if (strcmp(codec_name, "copy")) {
         int ret = find_codec(ost, codec_name, ost->type, 1, enc);
         if (ret < 0)
             return ret;
-        ost->par_in->codec_id = (*enc)->id;
+        ms->par_in->codec_id = (*enc)->id;
     }
 
     return 0;
@@ -1029,7 +1030,7 @@  static int streamcopy_init(const Muxer *mux, OutputStream *ost, AVDictionary **e
     const InputStream   *ist        = ost->ist;
     const InputFile     *ifile      = ist->file;
 
-    AVCodecParameters   *par        = ost->par_in;
+    AVCodecParameters   *par        = ms->par_in;
     uint32_t             codec_tag  = par->codec_tag;
 
     AVCodecContext      *codec_ctx  = NULL;
@@ -1198,8 +1199,8 @@  static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
         }
     }
 
-    ost->par_in = avcodec_parameters_alloc();
-    if (!ost->par_in)
+    ms->par_in = avcodec_parameters_alloc();
+    if (!ms->par_in)
         return AVERROR(ENOMEM);
 
     ms->last_mux_dts = AV_NOPTS_VALUE;
@@ -1207,10 +1208,10 @@  static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
     ost->st         = st;
     ost->ist        = ist;
     ost->kf.ref_pts = AV_NOPTS_VALUE;
-    ost->par_in->codec_type  = type;
+    ms->par_in->codec_type   = type;
     st->codecpar->codec_type = type;
 
-    ret = choose_encoder(o, oc, ost, &enc);
+    ret = choose_encoder(o, oc, ms, &enc);
     if (ret < 0) {
         av_log(ost, AV_LOG_FATAL, "Error selecting an encoder\n");
         return ret;
@@ -1447,7 +1448,7 @@  static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
             tag = AV_RL32(buf);
         }
         ost->st->codecpar->codec_tag = tag;
-        ost->par_in->codec_tag = tag;
+        ms->par_in->codec_tag = tag;
         if (ost->enc_ctx)
             ost->enc_ctx->codec_tag = tag;
     }
@@ -1799,6 +1800,7 @@  loop_end:
 
 static int of_add_attachments(Muxer *mux, const OptionsContext *o)
 {
+    MuxStream *ms;
     OutputStream *ost;
     int err;
 
@@ -1866,9 +1868,11 @@  read_fail:
             return err;
         }
 
+        ms = ms_from_ost(ost);
+
         ost->attachment_filename       = attachment_filename;
-        ost->par_in->extradata         = attachment;
-        ost->par_in->extradata_size    = len;
+        ms->par_in->extradata          = attachment;
+        ms->par_in->extradata_size     = len;
 
         p = strrchr(o->attachments[i], '/');
         av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);