Просмотр исходного кода

avfilter/avfilter: add a side_data field to AVFilterLink

This will be used to propagate global side data through the filterchain.

Signed-off-by: James Almer <jamrial@gmail.com>
James Almer 1 год назад
Родитель
Сommit
ef1cb1c9c8
4 измененных файлов с 25 добавлено и 3 удалено
  1. 3 0
      doc/APIchanges
  2. 17 1
      libavfilter/avfilter.c
  3. 3 0
      libavfilter/avfilter.h
  4. 2 2
      libavfilter/version.h

+ 3 - 0
doc/APIchanges

@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07
 
 API changes, most recent first:
 
+2025-01-25 - xxxxxxxxxx - lavfi 10.7.100 - avfilter.h
+  Add AVFilterLink.side_data and AVFilterLink.nb_side_data
+
 2025-01-05 - xxxxxxxxxx - lavc 59.55.100 - frame.h
   Add AV_FRAME_SIDE_DATA_FLAG_NEW_REF.
 

+ 17 - 1
libavfilter/avfilter.c

@@ -206,6 +206,7 @@ static void link_free(AVFilterLink **link)
     ff_framequeue_free(&li->fifo);
     ff_frame_pool_uninit(&li->frame_pool);
     av_channel_layout_uninit(&(*link)->ch_layout);
+    av_frame_side_data_free(&(*link)->side_data, &(*link)->nb_side_data);
 
     av_buffer_unref(&li->l.hw_frames_ctx);
 
@@ -376,7 +377,22 @@ int ff_filter_config_links(AVFilterContext *filter)
                                                     "callbacks on all outputs\n");
                     return AVERROR(EINVAL);
                 }
-            } else if ((ret = config_link(link)) < 0) {
+            }
+
+            /* Copy side data before link->srcpad->config_props() is called, so the filter
+             * may remove it for the next filter in the chain */
+            if (inlink && inlink->nb_side_data && !link->nb_side_data) {
+                for (i = 0; i < inlink->nb_side_data; i++) {
+                    ret = av_frame_side_data_clone(&link->side_data, &link->nb_side_data,
+                                                   inlink->side_data[i], 0);
+                    if (ret < 0) {
+                        av_frame_side_data_free(&link->side_data, &link->nb_side_data);
+                        return ret;
+                    }
+                }
+            }
+
+            if (config_link && (ret = config_link(link)) < 0) {
                 av_log(link->src, AV_LOG_ERROR,
                        "Failed to configure output pad on %s\n",
                        link->src->name);

+ 3 - 0
libavfilter/avfilter.h

@@ -413,6 +413,9 @@ struct AVFilterLink {
      */
     AVRational time_base;
 
+    AVFrameSideData **side_data;
+    int nb_side_data;
+
     /*****************************************************************
      * All fields below this line are not part of the public API. They
      * may not be used outside of libavfilter and can be changed and

+ 2 - 2
libavfilter/version.h

@@ -31,8 +31,8 @@
 
 #include "version_major.h"
 
-#define LIBAVFILTER_VERSION_MINOR   6
-#define LIBAVFILTER_VERSION_MICRO 101
+#define LIBAVFILTER_VERSION_MINOR   7
+#define LIBAVFILTER_VERSION_MICRO 100
 
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \