This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit e1e6ebb065ebfb2a08a4adc4b4aae0a85640018d
Author:     James Almer <[email protected]>
AuthorDate: Thu Jun 4 14:46:51 2026 -0300
Commit:     James Almer <[email protected]>
CommitDate: Sat Jul 11 19:32:17 2026 -0300

    fftools/ffmpeg_filter: propagate downmix matrix side data to the filterchain
    
    Signed-off-by: James Almer <[email protected]>
---
 fftools/ffmpeg_filter.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 5b68d831d8..dc2069360f 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -145,6 +145,10 @@ typedef struct InputFilterPriv {
     int                 downmixinfo_present;
     AVDownmixInfo       downmixinfo;
 
+    AVBufferRef        *downmixmatrix;
+    size_t              downmixmatrix_size;
+    int                 downmixmatrix_present;
+
     struct {
         AVFrame *frame;
 
@@ -1040,6 +1044,7 @@ void fg_free(FilterGraph **pfg)
         av_channel_layout_uninit(&ifp->ch_layout);
         av_freep(&ifilter->linklabel);
         av_freep(&ifp->opts.name);
+        av_buffer_unref(&ifp->downmixmatrix);
         av_frame_side_data_free(&ifp->side_data, &ifp->nb_side_data);
         av_freep(&ifilter->name);
         av_freep(&ifilter->input_name);
@@ -2287,6 +2292,18 @@ static int ifilter_parameters_from_frame(InputFilter 
*ifilter, const AVFrame *fr
         memcpy(&ifp->downmixinfo, sd->data, sizeof(ifp->downmixinfo));
     }
     ifp->downmixinfo_present = !!sd;
+    sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DOWNMIX_MATRIX);
+    if (sd) {
+        ret = av_frame_side_data_clone(&ifp->side_data,
+                                       &ifp->nb_side_data, sd, 0);
+        if (ret < 0)
+            return ret;
+        ret = av_buffer_replace(&ifp->downmixmatrix, sd->buf);
+        if (ret < 0)
+            return ret;
+        ifp->downmixmatrix_size = sd->size;
+    }
+    ifp->downmixmatrix_present = !!sd;
 
     return 0;
 }
@@ -3103,6 +3120,13 @@ static int send_frame(FilterGraph *fg, FilterGraphThread 
*fgt,
     } else if (ifp->downmixinfo_present)
         need_reinit |= DOWNMIX_CHANGED;
 
+    if (sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DOWNMIX_MATRIX)) {
+        if (!ifp->downmixmatrix_present ||
+            sd->size != ifp->downmixmatrix_size || memcmp(sd->data, 
ifp->downmixmatrix->data, sd->size))
+            need_reinit |= DOWNMIX_CHANGED;
+    } else if (ifp->downmixmatrix_present)
+        need_reinit |= DOWNMIX_CHANGED;
+
     if (need_reinit && fgt->graph && (ifp->opts.flags & 
IFILTER_FLAG_DROPCHANGED)) {
             ifp->nb_dropped++;
             av_log_once(fg, AV_LOG_WARNING, AV_LOG_DEBUG, &ifp->drop_warned, 
"Avoiding reinit; dropping frame pts: %s bound for %s\n", 
av_ts2str(frame->pts), ifilter->name);

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to