[FFmpeg-cvslog] fftools/ffmpeg_filter: switch to avcodec_get_supported_config()

Niklas Haas git at videolan.org
Sun Sep 8 15:04:10 EEST 2024


ffmpeg | branch: master | Niklas Haas <git at haasn.dev> | Fri Apr  5 20:47:48 2024 +0200| [33d5a4ec4eaf3d206eb229faf7276e0d0e543b34] | committer: Niklas Haas

fftools/ffmpeg_filter: switch to avcodec_get_supported_config()

Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=33d5a4ec4eaf3d206eb229faf7276e0d0e543b34
---

 fftools/ffmpeg.h          |  7 +++++--
 fftools/ffmpeg_filter.c   | 25 ++++++++++---------------
 fftools/ffmpeg_mux_init.c | 35 ++++++++++++++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 3c5d933e17..ca24b20640 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -283,8 +283,6 @@ typedef struct OutputFilterOptions {
 
     // Codec used for encoding, may be NULL
     const AVCodec      *enc;
-    // Overrides encoder pixel formats when set.
-    const enum AVPixelFormat *pix_fmts;
 
     int64_t             trim_start_us;
     int64_t             trim_duration_us;
@@ -311,6 +309,11 @@ typedef struct OutputFilterOptions {
 
     int                 sample_rate;
     AVChannelLayout     ch_layout;
+
+    const int                *formats;
+    const int                *sample_rates;
+    const AVChannelLayout    *ch_layouts;
+    const AVRational         *frame_rates;
 } OutputFilterOptions;
 
 typedef struct InputFilter {
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 4411985548..9effa96aac 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -819,11 +819,8 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost,
         ofp->height     = opts->height;
         if (opts->format != AV_PIX_FMT_NONE) {
             ofp->format = opts->format;
-        } else if (opts->pix_fmts)
-            ofp->formats = opts->pix_fmts;
-        else if (opts->enc &&
-                 !(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT))
-            ofp->formats = opts->enc->pix_fmts;
+        } else
+            ofp->formats = opts->formats;
 
         fgp->disable_conversions |= !!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT);
 
@@ -835,7 +832,7 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost,
         ofp->fps.framerate           = ost->frame_rate;
         ofp->fps.framerate_max       = ost->max_frame_rate;
         ofp->fps.framerate_supported = ost->force_fps || !opts->enc ?
-                                       NULL : opts->enc->supported_framerates;
+                                       NULL : opts->frame_rates;
 
         // reduce frame rate for mpeg4 to be within the spec limits
         if (opts->enc && opts->enc->id == AV_CODEC_ID_MPEG4)
@@ -847,21 +844,19 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost,
     case AVMEDIA_TYPE_AUDIO:
         if (opts->format != AV_SAMPLE_FMT_NONE) {
             ofp->format = opts->format;
-        } else if (opts->enc) {
-            ofp->formats = opts->enc->sample_fmts;
+        } else {
+            ofp->formats = opts->formats;
         }
         if (opts->sample_rate) {
             ofp->sample_rate = opts->sample_rate;
-        } else if (opts->enc) {
-            ofp->sample_rates = opts->enc->supported_samplerates;
-        }
+        } else
+            ofp->sample_rates = opts->sample_rates;
         if (opts->ch_layout.nb_channels) {
-            int ret = set_channel_layout(ofp, opts->enc ? opts->enc->ch_layouts : NULL,
-                                         &opts->ch_layout);
+            int ret = set_channel_layout(ofp, opts->ch_layouts, &opts->ch_layout);
             if (ret < 0)
                 return ret;
-        } else if (opts->enc) {
-            ofp->ch_layouts = opts->enc->ch_layouts;
+        } else {
+            ofp->ch_layouts = opts->ch_layouts;
         }
         break;
     }
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 79bdca013f..a2cb0ba294 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -952,6 +952,39 @@ ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter,
 
     snprintf(name, sizeof(name), "#%d:%d", mux->of.index, ost->index);
 
+    if (ost->type == AVMEDIA_TYPE_VIDEO) {
+        if (!keep_pix_fmt) {
+            ret = avcodec_get_supported_config(enc_ctx, NULL,
+                                               AV_CODEC_CONFIG_PIX_FORMAT, 0,
+                                               (const void **) &opts.formats, NULL);
+            if (ret < 0)
+                return ret;
+        }
+        if (!ost->force_fps) {
+            ret = avcodec_get_supported_config(enc_ctx, NULL,
+                                               AV_CODEC_CONFIG_FRAME_RATE, 0,
+                                               (const void **) &opts.frame_rates, NULL);
+            if (ret < 0)
+                return ret;
+        }
+    } else {
+        ret = avcodec_get_supported_config(enc_ctx, NULL,
+                                           AV_CODEC_CONFIG_SAMPLE_FORMAT, 0,
+                                           (const void **) &opts.formats, NULL);
+        if (ret < 0)
+            return ret;
+        ret = avcodec_get_supported_config(enc_ctx, NULL,
+                                           AV_CODEC_CONFIG_SAMPLE_RATE, 0,
+                                           (const void **) &opts.sample_rates, NULL);
+        if (ret < 0)
+            return ret;
+        ret = avcodec_get_supported_config(enc_ctx, NULL,
+                                           AV_CODEC_CONFIG_CHANNEL_LAYOUT, 0,
+                                           (const void **) &opts.ch_layouts, NULL);
+        if (ret < 0)
+            return ret;
+    }
+
     // MJPEG encoder exports a full list of supported pixel formats,
     // but the full-range ones are experimental-only.
     // Restrict the auto-conversion list unless -strict experimental
@@ -964,7 +997,7 @@ ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter,
               AV_PIX_FMT_NONE };
 
         if (enc_ctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL)
-            opts.pix_fmts = mjpeg_formats;
+            opts.formats = mjpeg_formats;
     }
 
     if (threads_manual) {



More information about the ffmpeg-cvslog mailing list