[FFmpeg-cvslog] avfilter/vf_lut3d: allow to control when to upload CLUT for haldclut

Paul B Mahol git at videolan.org
Tue Apr 26 21:05:38 EEST 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Tue Apr 26 19:58:28 2022 +0200| [452d611fc70cf7c37df5c68fecedc0e38981e94a] | committer: Paul B Mahol

avfilter/vf_lut3d: allow to control when to upload CLUT for haldclut

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

 doc/filters.texi       |  4 ++++
 libavfilter/lut3d.h    |  2 ++
 libavfilter/vf_lut3d.c | 20 ++++++++++++++------
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index cf25edaa0b..52c40833eb 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -13793,6 +13793,10 @@ The Hald CLUT input can be a simple picture or a complete video stream.
 The filter accepts the following options:
 
 @table @option
+ at item clut
+Set which CLUT video frames will be processed from second input stream,
+can be @var{first} or @var{all}. Default is @var{all}.
+
 @item shortest
 Force termination when the shortest input terminates. Default is @code{0}.
 @item repeatlast
diff --git a/libavfilter/lut3d.h b/libavfilter/lut3d.h
index 97cd413233..14e3c7fea6 100644
--- a/libavfilter/lut3d.h
+++ b/libavfilter/lut3d.h
@@ -66,6 +66,8 @@ typedef struct LUT3DContext {
     avfilter_action_func *interp;
     Lut3DPreLut prelut;
 #if CONFIG_HALDCLUT_FILTER
+    int clut;
+    int got_clut;
     uint8_t clut_rgba_map[4];
     int clut_step;
     int clut_bits;
diff --git a/libavfilter/vf_lut3d.c b/libavfilter/vf_lut3d.c
index 1880141e51..a5190b6688 100644
--- a/libavfilter/vf_lut3d.c
+++ b/libavfilter/vf_lut3d.c
@@ -1217,6 +1217,11 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar
 static const AVOption lut3d_haldclut_options[] = {
 #if CONFIG_LUT3D_FILTER
     { "file", "set 3D LUT file name", OFFSET(file), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
+#endif
+#if CONFIG_HALDCLUT_FILTER
+    { "clut", "when to process CLUT", OFFSET(clut), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, .flags = TFLAGS, "clut" },
+    {   "first", "process only first CLUT, ignore rest", 0, AV_OPT_TYPE_CONST, {.i64=0}, .flags = TFLAGS, "clut" },
+    {   "all",   "process all CLUTs",                    0, AV_OPT_TYPE_CONST, {.i64=1}, .flags = TFLAGS, "clut" },
 #endif
     COMMON_OPTIONS
 };
@@ -1519,12 +1524,15 @@ static int update_apply_clut(FFFrameSync *fs)
         return ret;
     if (!second)
         return ff_filter_frame(ctx->outputs[0], master);
-    if (lut3d->clut_float)
-        update_clut_float(ctx->priv, second);
-    else if (lut3d->clut_planar)
-        update_clut_planar(ctx->priv, second);
-    else
-        update_clut_packed(ctx->priv, second);
+    if (lut3d->clut || !lut3d->got_clut) {
+        if (lut3d->clut_float)
+            update_clut_float(ctx->priv, second);
+        else if (lut3d->clut_planar)
+            update_clut_planar(ctx->priv, second);
+        else
+            update_clut_packed(ctx->priv, second);
+        lut3d->got_clut = 1;
+    }
     out = apply_lut(inlink, master);
     return ff_filter_frame(ctx->outputs[0], out);
 }



More information about the ffmpeg-cvslog mailing list