[FFmpeg-devel] [PATCH 4/7] lavd/lavfi: use AV_BUFFERSINK_FLAG_PARAMS

Anton Khirnov anton at khirnov.net
Mon Sep 23 18:01:42 EEST 2024


---
 libavdevice/lavfi.c | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index 3b77a7396a..ef7d1fef1a 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -102,6 +102,7 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx)
     LavfiContext *lavfi = avctx->priv_data;
     AVFilterInOut *input_links = NULL, *output_links = NULL, *inout;
     const AVFilter *buffersink, *abuffersink;
+    AVFrame *params = NULL;
     enum AVMediaType type;
     int ret = 0, i, n;
 
@@ -287,33 +288,39 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx)
         }
     }
 
+    params = av_frame_alloc();
+    if (!params)
+        FAIL(AVERROR(ENOMEM));
+
     /* fill each stream with the information in the corresponding sink */
     for (i = 0; i < lavfi->nb_sinks; i++) {
         AVFilterContext *sink = lavfi->sinks[lavfi->stream_sink_map[i]];
-        AVRational time_base = av_buffersink_get_time_base(sink);
         AVRational frame_rate = av_buffersink_get_frame_rate(sink);
         AVStream *st = avctx->streams[i];
         AVCodecParameters *const par = st->codecpar;
-        avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
+
+        av_frame_unref(params);
+        ret = av_buffersink_get_frame_flags(sink, params, AV_BUFFERSINK_FLAG_PARAMS);
+        if (ret < 0)
+            goto end;
+
+        avpriv_set_pts_info(st, 64, params->time_base.num, params->time_base.den);
         par->codec_type = av_buffersink_get_type(sink);
+        par->format     = params->format;
         if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
             par->codec_id   = AV_CODEC_ID_WRAPPED_AVFRAME;
-            par->format     = av_buffersink_get_format(sink);
-            par->width      = av_buffersink_get_w(sink);
-            par->height     = av_buffersink_get_h(sink);
+            par->width      = params->width;
+            par->height     = params->height;
             avctx->probesize = FFMAX(avctx->probesize, sizeof(AVFrame) * 30);
             st ->sample_aspect_ratio =
-            par->sample_aspect_ratio = av_buffersink_get_sample_aspect_ratio(sink);
+            par->sample_aspect_ratio = params->sample_aspect_ratio;
             if (frame_rate.num > 0 && frame_rate.den > 0) {
                 st->avg_frame_rate = frame_rate;
                 st->r_frame_rate   = frame_rate;
             }
         } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
-            par->sample_rate = av_buffersink_get_sample_rate(sink);
-            ret = av_buffersink_get_ch_layout(sink, &par->ch_layout);
-            if (ret < 0)
-                goto end;
-            par->format      = av_buffersink_get_format(sink);
+            par->sample_rate = params->sample_rate;
+            FFSWAP(AVChannelLayout, par->ch_layout, params->ch_layout);
             par->codec_id    = av_get_pcm_codec(par->format, -1);
             if (par->codec_id == AV_CODEC_ID_NONE)
                 av_log(avctx, AV_LOG_ERROR,
@@ -326,6 +333,7 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx)
         goto end;
 
 end:
+    av_frame_free(&params);
     avfilter_inout_free(&input_links);
     avfilter_inout_free(&output_links);
     return ret;
-- 
2.43.0



More information about the ffmpeg-devel mailing list