diff options
author | Paul B Mahol <onemda@gmail.com> | 2022-04-26 19:58:28 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2022-04-26 20:07:04 +0200 |
commit | 452d611fc70cf7c37df5c68fecedc0e38981e94a (patch) | |
tree | 010615f2dbd399feeb52a94d4e00c0630d11d2ca | |
parent | 1da3394adb04f6fa97f8730a9ac6f25bc4c440b4 (diff) | |
download | ffmpeg-452d611fc70cf7c37df5c68fecedc0e38981e94a.tar.gz |
avfilter/vf_lut3d: allow to control when to upload CLUT for haldclut
-rw-r--r-- | doc/filters.texi | 4 | ||||
-rw-r--r-- | libavfilter/lut3d.h | 2 | ||||
-rw-r--r-- | 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 +@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 @@ -1218,6 +1218,11 @@ 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); } |