[FFmpeg-cvslog] lavfi: add a preinit callback to filters.

Nicolas George git at videolan.org
Tue Aug 29 18:01:52 EEST 2017


ffmpeg | branch: master | Nicolas George <george at nsup.org> | Mon Jul 31 00:29:01 2017 +0200| [f8d7b5febba075035a94de5d7d1dc9083ad2f3ed] | committer: Nicolas George

lavfi: add a preinit callback to filters.

It is necessary for filters with child objects, to set the class
and default options values.

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

 libavfilter/avfilter.c |  8 ++++++++
 libavfilter/avfilter.h | 15 +++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 185ba8df00..dcd975e104 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -692,6 +692,7 @@ static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, voi
 AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
 {
     AVFilterContext *ret;
+    int preinited = 0;
 
     if (!filter)
         return NULL;
@@ -708,6 +709,11 @@ AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
         if (!ret->priv)
             goto err;
     }
+    if (filter->preinit) {
+        if (filter->preinit(ret) < 0)
+            goto err;
+        preinited = 1;
+    }
 
     av_opt_set_defaults(ret);
     if (filter->priv_class) {
@@ -745,6 +751,8 @@ AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
     return ret;
 
 err:
+    if (preinited)
+        filter->uninit(ret);
     av_freep(&ret->inputs);
     av_freep(&ret->input_pads);
     ret->nb_inputs = 0;
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index 60662c19ac..73a723d583 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -195,6 +195,21 @@ typedef struct AVFilter {
      */
 
     /**
+     * Filter pre-initialization function
+     *
+     * This callback will be called immediately after the filter context is
+     * allocated, to allow allocating and initing sub-objects.
+     *
+     * If this callback is not NULL, the uninit callback will be called on
+     * allocation failure.
+     *
+     * @return 0 on success,
+     *         AVERROR code on failure (but the code will be
+     *           dropped and treated as ENOMEM by the calling code)
+     */
+    int (*preinit)(AVFilterContext *ctx);
+
+    /**
      * Filter initialization function.
      *
      * This callback will be called only once during the filter lifetime, after



More information about the ffmpeg-cvslog mailing list