Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct
@ 2023-08-18 16:50 Niklas Haas
  2023-08-18 16:50 ` [FFmpeg-devel] [PATCH 2/2] lavfi/vf_libplacebo: add extra_opts AVDictionary Niklas Haas
  2023-08-27 11:47 ` [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct Niklas Haas
  0 siblings, 2 replies; 4+ messages in thread
From: Niklas Haas @ 2023-08-18 16:50 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Niklas Haas

From: Niklas Haas <git@haasn.dev>

This new upstream struct simplifies params struct management by allowing
them to all be contained in a single dynamically allocated struct. This
commit switches to the new API in a backwards-compatible way.

The only nontrivial change that was required was to handle
`sigmoid_params` in a way consistent with the rest of the params
structs, instead of setting it directly to the upstream default.
---
 libavfilter/vf_libplacebo.c | 89 ++++++++++++++++++++++++-------------
 1 file changed, 57 insertions(+), 32 deletions(-)

diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index 34879910538..b9effdbad95 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -42,6 +42,25 @@ static inline AVFrame *pl_get_mapped_avframe(const struct pl_frame *frame)
 }
 #endif
 
+#if PL_API_VER >= 309
+#include <libplacebo/options.h>
+#else
+typedef struct pl_options_t {
+    // Backwards compatibility shim of this struct
+    struct pl_render_params params;
+    struct pl_deband_params deband_params;
+    struct pl_sigmoid_params sigmoid_params;
+    struct pl_color_adjustment color_adjustment;
+    struct pl_peak_detect_params peak_detect_params;
+    struct pl_color_map_params color_map_params;
+    struct pl_dither_params dither_params;
+    struct pl_cone_params cone_params;
+} *pl_options;
+
+#define pl_options_alloc(log) av_mallocz(sizeof(struct pl_options_t))
+#define pl_options_free(ptr)  av_freep(ptr)
+#endif
+
 enum {
     TONE_MAP_AUTO,
     TONE_MAP_CLIP,
@@ -175,7 +194,7 @@ typedef struct LibplaceboContext {
     int color_trc;
 
     /* pl_render_params */
-    struct pl_render_params params;
+    pl_options opts;
     char *upscaler;
     char *downscaler;
     char *frame_mixer;
@@ -190,7 +209,6 @@ typedef struct LibplaceboContext {
     int disable_fbos;
 
     /* pl_deband_params */
-    struct pl_deband_params deband_params;
     int deband;
     int deband_iterations;
     float deband_threshold;
@@ -198,7 +216,6 @@ typedef struct LibplaceboContext {
     float deband_grain;
 
     /* pl_color_adjustment */
-    struct pl_color_adjustment color_adjustment;
     float brightness;
     float contrast;
     float saturation;
@@ -206,7 +223,6 @@ typedef struct LibplaceboContext {
     float gamma;
 
     /* pl_peak_detect_params */
-    struct pl_peak_detect_params peak_detect_params;
     int peakdetect;
     float smoothing;
     float min_peak;
@@ -215,7 +231,6 @@ typedef struct LibplaceboContext {
     float percentile;
 
     /* pl_color_map_params */
-    struct pl_color_map_params color_map_params;
     int gamut_mode;
     int tonemapping;
     float tonemapping_param;
@@ -239,13 +254,11 @@ typedef struct LibplaceboContext {
 #endif
 
     /* pl_dither_params */
-    struct pl_dither_params dither_params;
     int dithering;
     int dither_lut_size;
     int dither_temporal;
 
     /* pl_cone_params */
-    struct pl_cone_params cone_params;
     int cones;
     float cone_str;
 
@@ -363,6 +376,7 @@ static int update_settings(AVFilterContext *ctx)
 {
     int err = 0;
     LibplaceboContext *s = ctx->priv;
+    pl_options opts = s->opts;
     int gamut_mode = s->gamut_mode;
     uint8_t color_rgba[4];
 
@@ -394,14 +408,16 @@ static int update_settings(AVFilterContext *ctx)
 
     RET(av_parse_color(color_rgba, s->fillcolor, -1, s));
 
-    s->deband_params = *pl_deband_params(
+    opts->deband_params = *pl_deband_params(
         .iterations = s->deband_iterations,
         .threshold = s->deband_threshold,
         .radius = s->deband_radius,
         .grain = s->deband_grain,
     );
 
-    s->color_adjustment = (struct pl_color_adjustment) {
+    opts->sigmoid_params = pl_sigmoid_default_params;
+
+    opts->color_adjustment = (struct pl_color_adjustment) {
         .brightness = s->brightness,
         .contrast = s->contrast,
         .saturation = s->saturation,
@@ -409,7 +425,7 @@ static int update_settings(AVFilterContext *ctx)
         .gamma = s->gamma,
     };
 
-    s->peak_detect_params = *pl_peak_detect_params(
+    opts->peak_detect_params = *pl_peak_detect_params(
         .smoothing_period = s->smoothing,
         .minimum_peak = s->min_peak,
         .scene_threshold_low = s->scene_low,
@@ -422,7 +438,7 @@ static int update_settings(AVFilterContext *ctx)
 #endif
     );
 
-    s->color_map_params = *pl_color_map_params(
+    opts->color_map_params = *pl_color_map_params(
 #if FF_API_LIBPLACEBO_OPTS
 # if PL_API_VER >= 269
         .hybrid_mix = hybrid_mix,
@@ -441,20 +457,20 @@ static int update_settings(AVFilterContext *ctx)
 #endif
     );
 
-    set_gamut_mode(&s->color_map_params, gamut_mode);
+    set_gamut_mode(&opts->color_map_params, gamut_mode);
 
-    s->dither_params = *pl_dither_params(
+    opts->dither_params = *pl_dither_params(
         .method = s->dithering,
         .lut_size = s->dither_lut_size,
         .temporal = s->dither_temporal,
     );
 
-    s->cone_params = *pl_cone_params(
+    opts->cone_params = *pl_cone_params(
         .cones = s->cones,
         .strength = s->cone_str,
     );
 
-    s->params = *pl_render_params(
+    opts->params = *pl_render_params(
         .lut_entries = s->lut_entries,
         .antiringing_strength = s->antiringing,
         .background_transparency = 1.0f - (float) color_rgba[3] / UINT8_MAX,
@@ -467,13 +483,13 @@ static int update_settings(AVFilterContext *ctx)
         .corner_rounding = s->corner_rounding,
 #endif
 
-        .deband_params = s->deband ? &s->deband_params : NULL,
-        .sigmoid_params = s->sigmoid ? &pl_sigmoid_default_params : NULL,
-        .color_adjustment = &s->color_adjustment,
-        .peak_detect_params = s->peakdetect ? &s->peak_detect_params : NULL,
-        .color_map_params = &s->color_map_params,
-        .dither_params = s->dithering >= 0 ? &s->dither_params : NULL,
-        .cone_params = s->cones ? &s->cone_params : NULL,
+        .deband_params = s->deband ? &opts->deband_params : NULL,
+        .sigmoid_params = s->sigmoid ? &opts->sigmoid_params : NULL,
+        .color_adjustment = &opts->color_adjustment,
+        .peak_detect_params = s->peakdetect ? &opts->peak_detect_params : NULL,
+        .color_map_params = &opts->color_map_params,
+        .dither_params = s->dithering >= 0 ? &opts->dither_params : NULL,
+        .cone_params = s->cones ? &opts->cone_params : NULL,
 
         .hooks = s->hooks,
         .num_hooks = s->num_hooks,
@@ -486,9 +502,9 @@ static int update_settings(AVFilterContext *ctx)
         .disable_fbos = s->disable_fbos,
     );
 
-    RET(find_scaler(ctx, &s->params.upscaler, s->upscaler, 0));
-    RET(find_scaler(ctx, &s->params.downscaler, s->downscaler, 0));
-    RET(find_scaler(ctx, &s->params.frame_mixer, s->frame_mixer, 1));
+    RET(find_scaler(ctx, &opts->params.upscaler, s->upscaler, 0));
+    RET(find_scaler(ctx, &opts->params.downscaler, s->downscaler, 0));
+    RET(find_scaler(ctx, &opts->params.frame_mixer, s->frame_mixer, 1));
     return 0;
 
 fail:
@@ -528,6 +544,12 @@ static int libplacebo_init(AVFilterContext *avctx)
     if (!s->log)
         return AVERROR(ENOMEM);
 
+    s->opts = pl_options_alloc(s->log);
+    if (!s->opts) {
+        libplacebo_uninit(avctx);
+        return AVERROR(ENOMEM);
+    }
+
     if (s->out_format_string) {
         s->out_format = av_get_pix_fmt(s->out_format_string);
         if (s->out_format == AV_PIX_FMT_NONE) {
@@ -712,6 +734,8 @@ static void libplacebo_uninit(AVFilterContext *avctx)
             input_uninit(&s->inputs[i]);
         av_freep(&s->inputs);
     }
+
+    pl_options_free(&s->opts);
     pl_vulkan_destroy(&s->vulkan);
     pl_log_destroy(&s->log);
     ff_vk_uninit(&s->vkctx);
@@ -818,6 +842,7 @@ static int output_frame(AVFilterContext *ctx, int64_t pts)
 {
     int err = 0, ok, changed_csp;
     LibplaceboContext *s = ctx->priv;
+    pl_options opts = s->opts;
     AVFilterLink *outlink = ctx->outputs[0];
     const AVPixFmtDescriptor *outdesc = av_pix_fmt_desc_get(outlink->format);
     struct pl_frame target;
@@ -901,18 +926,18 @@ static int output_frame(AVFilterContext *ctx, int64_t pts)
     }
 
     /* Draw first frame opaque, others with blending */
-    s->params.skip_target_clearing = false;
-    s->params.blend_params = NULL;
+    opts->params.skip_target_clearing = false;
+    opts->params.blend_params = NULL;
     for (int i = 0; i < s->nb_inputs; i++) {
         LibplaceboInput *in = &s->inputs[i];
         int high_fps = av_cmp_q(in->link->frame_rate, outlink->frame_rate) >= 0;
         if (in->qstatus != PL_QUEUE_OK)
             continue;
-        s->params.skip_caching_single_frame = high_fps;
+        opts->params.skip_caching_single_frame = high_fps;
         update_crops(ctx, in, &target, out->pts * av_q2d(outlink->time_base));
-        pl_render_image_mix(in->renderer, &in->mix, &target, &s->params);
-        s->params.skip_target_clearing = true;
-        s->params.blend_params = &pl_alpha_overlay;
+        pl_render_image_mix(in->renderer, &in->mix, &target, &opts->params);
+        opts->params.skip_target_clearing = true;
+        opts->params.blend_params = &pl_alpha_overlay;
     }
 
     if (outdesc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
@@ -1057,7 +1082,7 @@ static int libplacebo_activate(AVFilterContext *ctx)
 
             in->qstatus = pl_queue_update(in->queue, &in->mix, pl_queue_params(
                 .pts            = out_pts * av_q2d(outlink->time_base),
-                .radius         = pl_frame_mix_radius(&s->params),
+                .radius         = pl_frame_mix_radius(&s->opts->params),
                 .vsync_duration = av_q2d(av_inv_q(outlink->frame_rate)),
             ));
 
-- 
2.41.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [FFmpeg-devel] [PATCH 2/2] lavfi/vf_libplacebo: add extra_opts AVDictionary
  2023-08-18 16:50 [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct Niklas Haas
@ 2023-08-18 16:50 ` Niklas Haas
  2023-08-27 11:47 ` [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct Niklas Haas
  1 sibling, 0 replies; 4+ messages in thread
From: Niklas Haas @ 2023-08-18 16:50 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Niklas Haas

From: Niklas Haas <git@haasn.dev>

Can be used to configure libplacebo's underlying raw options, which
sometimes includes new or advanced / in-depth settings not (yet) exposed
by vf_libplacebo.
---
 doc/filters.texi            | 10 ++++++++++
 libavfilter/vf_libplacebo.c | 13 +++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/doc/filters.texi b/doc/filters.texi
index cac1ee43810..421785ef46f 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -16312,6 +16312,16 @@ Render frames with rounded corners. The value, given as a float ranging from
 square to fully circular. In other words, it gives the radius divided by half
 the smaller side length. Defaults to @code{0.0}.
 
+@item extra_opts
+Pass extra libplacebo internal configuration options. These can be specified
+as a list of @var{key}=@var{value} pairs separated by ':'. The following example
+shows how to configure a custom filter kernel ("EWA LanczosSharp") and use it
+to double the input image resolution:
+
+@example
+-vf "libplacebo=w=iw*2:h=ih*2:extra_opts='upscaler=custom\:upscaler_preset=ewa_lanczos\:upscaler_blur=0.9812505644269356'"
+@end example
+
 @item colorspace
 @item color_primaries
 @item color_trc
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index b9effdbad95..942c3210424 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -192,6 +192,7 @@ typedef struct LibplaceboContext {
     int color_range;
     int color_primaries;
     int color_trc;
+    AVDictionary *extra_opts;
 
     /* pl_render_params */
     pl_options opts;
@@ -376,6 +377,7 @@ static int update_settings(AVFilterContext *ctx)
 {
     int err = 0;
     LibplaceboContext *s = ctx->priv;
+    AVDictionaryEntry *e = NULL;
     pl_options opts = s->opts;
     int gamut_mode = s->gamut_mode;
     uint8_t color_rgba[4];
@@ -505,6 +507,16 @@ static int update_settings(AVFilterContext *ctx)
     RET(find_scaler(ctx, &opts->params.upscaler, s->upscaler, 0));
     RET(find_scaler(ctx, &opts->params.downscaler, s->downscaler, 0));
     RET(find_scaler(ctx, &opts->params.frame_mixer, s->frame_mixer, 1));
+
+#if PL_API_VER >= 309
+    while ((e = av_dict_get(s->extra_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
+        if (!pl_options_set_str(s->opts, e->key, e->value)) {
+            err = AVERROR(EINVAL);
+            goto fail;
+        }
+    }
+#endif
+
     return 0;
 
 fail:
@@ -1322,6 +1334,7 @@ static const AVOption libplacebo_options[] = {
     { "pad_crop_ratio", "ratio between padding and cropping when normalizing SAR (0=pad, 1=crop)", OFFSET(pad_crop_ratio), AV_OPT_TYPE_FLOAT, {.dbl=0.0}, 0.0, 1.0, DYNAMIC },
     { "fillcolor", "Background fill color", OFFSET(fillcolor), AV_OPT_TYPE_STRING, {.str = "black"}, .flags = DYNAMIC },
     { "corner_rounding", "Corner rounding radius", OFFSET(corner_rounding), AV_OPT_TYPE_FLOAT, {.dbl = 0.0}, 0.0, 1.0, .flags = DYNAMIC },
+    { "extra_opts", "Pass extra libplacebo-specific options using a :-separated list of key=value pairs", OFFSET(extra_opts), AV_OPT_TYPE_DICT, .flags = DYNAMIC },
 
     {"colorspace", "select colorspace", OFFSET(colorspace), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_SPC_NB-1, DYNAMIC, "colorspace"},
     {"auto", "keep the same colorspace",  0, AV_OPT_TYPE_CONST, {.i64=-1},                          INT_MIN, INT_MAX, STATIC, "colorspace"},
-- 
2.41.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct
  2023-08-18 16:50 [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct Niklas Haas
  2023-08-18 16:50 ` [FFmpeg-devel] [PATCH 2/2] lavfi/vf_libplacebo: add extra_opts AVDictionary Niklas Haas
@ 2023-08-27 11:47 ` Niklas Haas
  1 sibling, 0 replies; 4+ messages in thread
From: Niklas Haas @ 2023-08-27 11:47 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Niklas Haas

On Fri, 18 Aug 2023 18:50:43 +0200 Niklas Haas <ffmpeg@haasn.xyz> wrote:
> From: Niklas Haas <git@haasn.dev>
> 
> This new upstream struct simplifies params struct management by allowing
> them to all be contained in a single dynamically allocated struct. This
> commit switches to the new API in a backwards-compatible way.
> 
> The only nontrivial change that was required was to handle
> `sigmoid_params` in a way consistent with the rest of the params
> structs, instead of setting it directly to the upstream default.
> ---
>  libavfilter/vf_libplacebo.c | 89 ++++++++++++++++++++++++-------------
>  1 file changed, 57 insertions(+), 32 deletions(-)
> 
> diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
> index 34879910538..b9effdbad95 100644
> --- a/libavfilter/vf_libplacebo.c
> +++ b/libavfilter/vf_libplacebo.c
> @@ -42,6 +42,25 @@ static inline AVFrame *pl_get_mapped_avframe(const struct pl_frame *frame)
>  }
>  #endif
>  
> +#if PL_API_VER >= 309
> +#include <libplacebo/options.h>
> +#else
> +typedef struct pl_options_t {
> +    // Backwards compatibility shim of this struct
> +    struct pl_render_params params;
> +    struct pl_deband_params deband_params;
> +    struct pl_sigmoid_params sigmoid_params;
> +    struct pl_color_adjustment color_adjustment;
> +    struct pl_peak_detect_params peak_detect_params;
> +    struct pl_color_map_params color_map_params;
> +    struct pl_dither_params dither_params;
> +    struct pl_cone_params cone_params;
> +} *pl_options;
> +
> +#define pl_options_alloc(log) av_mallocz(sizeof(struct pl_options_t))
> +#define pl_options_free(ptr)  av_freep(ptr)
> +#endif
> +
>  enum {
>      TONE_MAP_AUTO,
>      TONE_MAP_CLIP,
> @@ -175,7 +194,7 @@ typedef struct LibplaceboContext {
>      int color_trc;
>  
>      /* pl_render_params */
> -    struct pl_render_params params;
> +    pl_options opts;
>      char *upscaler;
>      char *downscaler;
>      char *frame_mixer;
> @@ -190,7 +209,6 @@ typedef struct LibplaceboContext {
>      int disable_fbos;
>  
>      /* pl_deband_params */
> -    struct pl_deband_params deband_params;
>      int deband;
>      int deband_iterations;
>      float deband_threshold;
> @@ -198,7 +216,6 @@ typedef struct LibplaceboContext {
>      float deband_grain;
>  
>      /* pl_color_adjustment */
> -    struct pl_color_adjustment color_adjustment;
>      float brightness;
>      float contrast;
>      float saturation;
> @@ -206,7 +223,6 @@ typedef struct LibplaceboContext {
>      float gamma;
>  
>      /* pl_peak_detect_params */
> -    struct pl_peak_detect_params peak_detect_params;
>      int peakdetect;
>      float smoothing;
>      float min_peak;
> @@ -215,7 +231,6 @@ typedef struct LibplaceboContext {
>      float percentile;
>  
>      /* pl_color_map_params */
> -    struct pl_color_map_params color_map_params;
>      int gamut_mode;
>      int tonemapping;
>      float tonemapping_param;
> @@ -239,13 +254,11 @@ typedef struct LibplaceboContext {
>  #endif
>  
>      /* pl_dither_params */
> -    struct pl_dither_params dither_params;
>      int dithering;
>      int dither_lut_size;
>      int dither_temporal;
>  
>      /* pl_cone_params */
> -    struct pl_cone_params cone_params;
>      int cones;
>      float cone_str;
>  
> @@ -363,6 +376,7 @@ static int update_settings(AVFilterContext *ctx)
>  {
>      int err = 0;
>      LibplaceboContext *s = ctx->priv;
> +    pl_options opts = s->opts;
>      int gamut_mode = s->gamut_mode;
>      uint8_t color_rgba[4];
>  
> @@ -394,14 +408,16 @@ static int update_settings(AVFilterContext *ctx)
>  
>      RET(av_parse_color(color_rgba, s->fillcolor, -1, s));
>  
> -    s->deband_params = *pl_deband_params(
> +    opts->deband_params = *pl_deband_params(
>          .iterations = s->deband_iterations,
>          .threshold = s->deband_threshold,
>          .radius = s->deband_radius,
>          .grain = s->deband_grain,
>      );
>  
> -    s->color_adjustment = (struct pl_color_adjustment) {
> +    opts->sigmoid_params = pl_sigmoid_default_params;
> +
> +    opts->color_adjustment = (struct pl_color_adjustment) {
>          .brightness = s->brightness,
>          .contrast = s->contrast,
>          .saturation = s->saturation,
> @@ -409,7 +425,7 @@ static int update_settings(AVFilterContext *ctx)
>          .gamma = s->gamma,
>      };
>  
> -    s->peak_detect_params = *pl_peak_detect_params(
> +    opts->peak_detect_params = *pl_peak_detect_params(
>          .smoothing_period = s->smoothing,
>          .minimum_peak = s->min_peak,
>          .scene_threshold_low = s->scene_low,
> @@ -422,7 +438,7 @@ static int update_settings(AVFilterContext *ctx)
>  #endif
>      );
>  
> -    s->color_map_params = *pl_color_map_params(
> +    opts->color_map_params = *pl_color_map_params(
>  #if FF_API_LIBPLACEBO_OPTS
>  # if PL_API_VER >= 269
>          .hybrid_mix = hybrid_mix,
> @@ -441,20 +457,20 @@ static int update_settings(AVFilterContext *ctx)
>  #endif
>      );
>  
> -    set_gamut_mode(&s->color_map_params, gamut_mode);
> +    set_gamut_mode(&opts->color_map_params, gamut_mode);
>  
> -    s->dither_params = *pl_dither_params(
> +    opts->dither_params = *pl_dither_params(
>          .method = s->dithering,
>          .lut_size = s->dither_lut_size,
>          .temporal = s->dither_temporal,
>      );
>  
> -    s->cone_params = *pl_cone_params(
> +    opts->cone_params = *pl_cone_params(
>          .cones = s->cones,
>          .strength = s->cone_str,
>      );
>  
> -    s->params = *pl_render_params(
> +    opts->params = *pl_render_params(
>          .lut_entries = s->lut_entries,
>          .antiringing_strength = s->antiringing,
>          .background_transparency = 1.0f - (float) color_rgba[3] / UINT8_MAX,
> @@ -467,13 +483,13 @@ static int update_settings(AVFilterContext *ctx)
>          .corner_rounding = s->corner_rounding,
>  #endif
>  
> -        .deband_params = s->deband ? &s->deband_params : NULL,
> -        .sigmoid_params = s->sigmoid ? &pl_sigmoid_default_params : NULL,
> -        .color_adjustment = &s->color_adjustment,
> -        .peak_detect_params = s->peakdetect ? &s->peak_detect_params : NULL,
> -        .color_map_params = &s->color_map_params,
> -        .dither_params = s->dithering >= 0 ? &s->dither_params : NULL,
> -        .cone_params = s->cones ? &s->cone_params : NULL,
> +        .deband_params = s->deband ? &opts->deband_params : NULL,
> +        .sigmoid_params = s->sigmoid ? &opts->sigmoid_params : NULL,
> +        .color_adjustment = &opts->color_adjustment,
> +        .peak_detect_params = s->peakdetect ? &opts->peak_detect_params : NULL,
> +        .color_map_params = &opts->color_map_params,
> +        .dither_params = s->dithering >= 0 ? &opts->dither_params : NULL,
> +        .cone_params = s->cones ? &opts->cone_params : NULL,
>  
>          .hooks = s->hooks,
>          .num_hooks = s->num_hooks,
> @@ -486,9 +502,9 @@ static int update_settings(AVFilterContext *ctx)
>          .disable_fbos = s->disable_fbos,
>      );
>  
> -    RET(find_scaler(ctx, &s->params.upscaler, s->upscaler, 0));
> -    RET(find_scaler(ctx, &s->params.downscaler, s->downscaler, 0));
> -    RET(find_scaler(ctx, &s->params.frame_mixer, s->frame_mixer, 1));
> +    RET(find_scaler(ctx, &opts->params.upscaler, s->upscaler, 0));
> +    RET(find_scaler(ctx, &opts->params.downscaler, s->downscaler, 0));
> +    RET(find_scaler(ctx, &opts->params.frame_mixer, s->frame_mixer, 1));
>      return 0;
>  
>  fail:
> @@ -528,6 +544,12 @@ static int libplacebo_init(AVFilterContext *avctx)
>      if (!s->log)
>          return AVERROR(ENOMEM);
>  
> +    s->opts = pl_options_alloc(s->log);
> +    if (!s->opts) {
> +        libplacebo_uninit(avctx);
> +        return AVERROR(ENOMEM);
> +    }
> +
>      if (s->out_format_string) {
>          s->out_format = av_get_pix_fmt(s->out_format_string);
>          if (s->out_format == AV_PIX_FMT_NONE) {
> @@ -712,6 +734,8 @@ static void libplacebo_uninit(AVFilterContext *avctx)
>              input_uninit(&s->inputs[i]);
>          av_freep(&s->inputs);
>      }
> +
> +    pl_options_free(&s->opts);
>      pl_vulkan_destroy(&s->vulkan);
>      pl_log_destroy(&s->log);
>      ff_vk_uninit(&s->vkctx);
> @@ -818,6 +842,7 @@ static int output_frame(AVFilterContext *ctx, int64_t pts)
>  {
>      int err = 0, ok, changed_csp;
>      LibplaceboContext *s = ctx->priv;
> +    pl_options opts = s->opts;
>      AVFilterLink *outlink = ctx->outputs[0];
>      const AVPixFmtDescriptor *outdesc = av_pix_fmt_desc_get(outlink->format);
>      struct pl_frame target;
> @@ -901,18 +926,18 @@ static int output_frame(AVFilterContext *ctx, int64_t pts)
>      }
>  
>      /* Draw first frame opaque, others with blending */
> -    s->params.skip_target_clearing = false;
> -    s->params.blend_params = NULL;
> +    opts->params.skip_target_clearing = false;
> +    opts->params.blend_params = NULL;
>      for (int i = 0; i < s->nb_inputs; i++) {
>          LibplaceboInput *in = &s->inputs[i];
>          int high_fps = av_cmp_q(in->link->frame_rate, outlink->frame_rate) >= 0;
>          if (in->qstatus != PL_QUEUE_OK)
>              continue;
> -        s->params.skip_caching_single_frame = high_fps;
> +        opts->params.skip_caching_single_frame = high_fps;
>          update_crops(ctx, in, &target, out->pts * av_q2d(outlink->time_base));
> -        pl_render_image_mix(in->renderer, &in->mix, &target, &s->params);
> -        s->params.skip_target_clearing = true;
> -        s->params.blend_params = &pl_alpha_overlay;
> +        pl_render_image_mix(in->renderer, &in->mix, &target, &opts->params);
> +        opts->params.skip_target_clearing = true;
> +        opts->params.blend_params = &pl_alpha_overlay;
>      }
>  
>      if (outdesc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
> @@ -1057,7 +1082,7 @@ static int libplacebo_activate(AVFilterContext *ctx)
>  
>              in->qstatus = pl_queue_update(in->queue, &in->mix, pl_queue_params(
>                  .pts            = out_pts * av_q2d(outlink->time_base),
> -                .radius         = pl_frame_mix_radius(&s->params),
> +                .radius         = pl_frame_mix_radius(&s->opts->params),
>                  .vsync_duration = av_q2d(av_inv_q(outlink->frame_rate)),
>              ));
>  
> -- 
> 2.41.0
> 

Merged as 816983d951c77..3c9dc009b6e5
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct
@ 2023-08-18 16:50 Niklas Haas
  0 siblings, 0 replies; 4+ messages in thread
From: Niklas Haas @ 2023-08-18 16:50 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Niklas Haas

From: Niklas Haas <git@haasn.dev>

This new upstream struct simplifies params struct management by allowing
them to all be contained in a single dynamically allocated struct. This
commit switches to the new API in a backwards-compatible way.

The only nontrivial change that was required was to handle
`sigmoid_params` in a way consistent with the rest of the params
structs, instead of setting it directly to the upstream default.
---
 libavfilter/vf_libplacebo.c | 89 ++++++++++++++++++++++++-------------
 1 file changed, 57 insertions(+), 32 deletions(-)

diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index 34879910538..b9effdbad95 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -42,6 +42,25 @@ static inline AVFrame *pl_get_mapped_avframe(const struct pl_frame *frame)
 }
 #endif
 
+#if PL_API_VER >= 309
+#include <libplacebo/options.h>
+#else
+typedef struct pl_options_t {
+    // Backwards compatibility shim of this struct
+    struct pl_render_params params;
+    struct pl_deband_params deband_params;
+    struct pl_sigmoid_params sigmoid_params;
+    struct pl_color_adjustment color_adjustment;
+    struct pl_peak_detect_params peak_detect_params;
+    struct pl_color_map_params color_map_params;
+    struct pl_dither_params dither_params;
+    struct pl_cone_params cone_params;
+} *pl_options;
+
+#define pl_options_alloc(log) av_mallocz(sizeof(struct pl_options_t))
+#define pl_options_free(ptr)  av_freep(ptr)
+#endif
+
 enum {
     TONE_MAP_AUTO,
     TONE_MAP_CLIP,
@@ -175,7 +194,7 @@ typedef struct LibplaceboContext {
     int color_trc;
 
     /* pl_render_params */
-    struct pl_render_params params;
+    pl_options opts;
     char *upscaler;
     char *downscaler;
     char *frame_mixer;
@@ -190,7 +209,6 @@ typedef struct LibplaceboContext {
     int disable_fbos;
 
     /* pl_deband_params */
-    struct pl_deband_params deband_params;
     int deband;
     int deband_iterations;
     float deband_threshold;
@@ -198,7 +216,6 @@ typedef struct LibplaceboContext {
     float deband_grain;
 
     /* pl_color_adjustment */
-    struct pl_color_adjustment color_adjustment;
     float brightness;
     float contrast;
     float saturation;
@@ -206,7 +223,6 @@ typedef struct LibplaceboContext {
     float gamma;
 
     /* pl_peak_detect_params */
-    struct pl_peak_detect_params peak_detect_params;
     int peakdetect;
     float smoothing;
     float min_peak;
@@ -215,7 +231,6 @@ typedef struct LibplaceboContext {
     float percentile;
 
     /* pl_color_map_params */
-    struct pl_color_map_params color_map_params;
     int gamut_mode;
     int tonemapping;
     float tonemapping_param;
@@ -239,13 +254,11 @@ typedef struct LibplaceboContext {
 #endif
 
     /* pl_dither_params */
-    struct pl_dither_params dither_params;
     int dithering;
     int dither_lut_size;
     int dither_temporal;
 
     /* pl_cone_params */
-    struct pl_cone_params cone_params;
     int cones;
     float cone_str;
 
@@ -363,6 +376,7 @@ static int update_settings(AVFilterContext *ctx)
 {
     int err = 0;
     LibplaceboContext *s = ctx->priv;
+    pl_options opts = s->opts;
     int gamut_mode = s->gamut_mode;
     uint8_t color_rgba[4];
 
@@ -394,14 +408,16 @@ static int update_settings(AVFilterContext *ctx)
 
     RET(av_parse_color(color_rgba, s->fillcolor, -1, s));
 
-    s->deband_params = *pl_deband_params(
+    opts->deband_params = *pl_deband_params(
         .iterations = s->deband_iterations,
         .threshold = s->deband_threshold,
         .radius = s->deband_radius,
         .grain = s->deband_grain,
     );
 
-    s->color_adjustment = (struct pl_color_adjustment) {
+    opts->sigmoid_params = pl_sigmoid_default_params;
+
+    opts->color_adjustment = (struct pl_color_adjustment) {
         .brightness = s->brightness,
         .contrast = s->contrast,
         .saturation = s->saturation,
@@ -409,7 +425,7 @@ static int update_settings(AVFilterContext *ctx)
         .gamma = s->gamma,
     };
 
-    s->peak_detect_params = *pl_peak_detect_params(
+    opts->peak_detect_params = *pl_peak_detect_params(
         .smoothing_period = s->smoothing,
         .minimum_peak = s->min_peak,
         .scene_threshold_low = s->scene_low,
@@ -422,7 +438,7 @@ static int update_settings(AVFilterContext *ctx)
 #endif
     );
 
-    s->color_map_params = *pl_color_map_params(
+    opts->color_map_params = *pl_color_map_params(
 #if FF_API_LIBPLACEBO_OPTS
 # if PL_API_VER >= 269
         .hybrid_mix = hybrid_mix,
@@ -441,20 +457,20 @@ static int update_settings(AVFilterContext *ctx)
 #endif
     );
 
-    set_gamut_mode(&s->color_map_params, gamut_mode);
+    set_gamut_mode(&opts->color_map_params, gamut_mode);
 
-    s->dither_params = *pl_dither_params(
+    opts->dither_params = *pl_dither_params(
         .method = s->dithering,
         .lut_size = s->dither_lut_size,
         .temporal = s->dither_temporal,
     );
 
-    s->cone_params = *pl_cone_params(
+    opts->cone_params = *pl_cone_params(
         .cones = s->cones,
         .strength = s->cone_str,
     );
 
-    s->params = *pl_render_params(
+    opts->params = *pl_render_params(
         .lut_entries = s->lut_entries,
         .antiringing_strength = s->antiringing,
         .background_transparency = 1.0f - (float) color_rgba[3] / UINT8_MAX,
@@ -467,13 +483,13 @@ static int update_settings(AVFilterContext *ctx)
         .corner_rounding = s->corner_rounding,
 #endif
 
-        .deband_params = s->deband ? &s->deband_params : NULL,
-        .sigmoid_params = s->sigmoid ? &pl_sigmoid_default_params : NULL,
-        .color_adjustment = &s->color_adjustment,
-        .peak_detect_params = s->peakdetect ? &s->peak_detect_params : NULL,
-        .color_map_params = &s->color_map_params,
-        .dither_params = s->dithering >= 0 ? &s->dither_params : NULL,
-        .cone_params = s->cones ? &s->cone_params : NULL,
+        .deband_params = s->deband ? &opts->deband_params : NULL,
+        .sigmoid_params = s->sigmoid ? &opts->sigmoid_params : NULL,
+        .color_adjustment = &opts->color_adjustment,
+        .peak_detect_params = s->peakdetect ? &opts->peak_detect_params : NULL,
+        .color_map_params = &opts->color_map_params,
+        .dither_params = s->dithering >= 0 ? &opts->dither_params : NULL,
+        .cone_params = s->cones ? &opts->cone_params : NULL,
 
         .hooks = s->hooks,
         .num_hooks = s->num_hooks,
@@ -486,9 +502,9 @@ static int update_settings(AVFilterContext *ctx)
         .disable_fbos = s->disable_fbos,
     );
 
-    RET(find_scaler(ctx, &s->params.upscaler, s->upscaler, 0));
-    RET(find_scaler(ctx, &s->params.downscaler, s->downscaler, 0));
-    RET(find_scaler(ctx, &s->params.frame_mixer, s->frame_mixer, 1));
+    RET(find_scaler(ctx, &opts->params.upscaler, s->upscaler, 0));
+    RET(find_scaler(ctx, &opts->params.downscaler, s->downscaler, 0));
+    RET(find_scaler(ctx, &opts->params.frame_mixer, s->frame_mixer, 1));
     return 0;
 
 fail:
@@ -528,6 +544,12 @@ static int libplacebo_init(AVFilterContext *avctx)
     if (!s->log)
         return AVERROR(ENOMEM);
 
+    s->opts = pl_options_alloc(s->log);
+    if (!s->opts) {
+        libplacebo_uninit(avctx);
+        return AVERROR(ENOMEM);
+    }
+
     if (s->out_format_string) {
         s->out_format = av_get_pix_fmt(s->out_format_string);
         if (s->out_format == AV_PIX_FMT_NONE) {
@@ -712,6 +734,8 @@ static void libplacebo_uninit(AVFilterContext *avctx)
             input_uninit(&s->inputs[i]);
         av_freep(&s->inputs);
     }
+
+    pl_options_free(&s->opts);
     pl_vulkan_destroy(&s->vulkan);
     pl_log_destroy(&s->log);
     ff_vk_uninit(&s->vkctx);
@@ -818,6 +842,7 @@ static int output_frame(AVFilterContext *ctx, int64_t pts)
 {
     int err = 0, ok, changed_csp;
     LibplaceboContext *s = ctx->priv;
+    pl_options opts = s->opts;
     AVFilterLink *outlink = ctx->outputs[0];
     const AVPixFmtDescriptor *outdesc = av_pix_fmt_desc_get(outlink->format);
     struct pl_frame target;
@@ -901,18 +926,18 @@ static int output_frame(AVFilterContext *ctx, int64_t pts)
     }
 
     /* Draw first frame opaque, others with blending */
-    s->params.skip_target_clearing = false;
-    s->params.blend_params = NULL;
+    opts->params.skip_target_clearing = false;
+    opts->params.blend_params = NULL;
     for (int i = 0; i < s->nb_inputs; i++) {
         LibplaceboInput *in = &s->inputs[i];
         int high_fps = av_cmp_q(in->link->frame_rate, outlink->frame_rate) >= 0;
         if (in->qstatus != PL_QUEUE_OK)
             continue;
-        s->params.skip_caching_single_frame = high_fps;
+        opts->params.skip_caching_single_frame = high_fps;
         update_crops(ctx, in, &target, out->pts * av_q2d(outlink->time_base));
-        pl_render_image_mix(in->renderer, &in->mix, &target, &s->params);
-        s->params.skip_target_clearing = true;
-        s->params.blend_params = &pl_alpha_overlay;
+        pl_render_image_mix(in->renderer, &in->mix, &target, &opts->params);
+        opts->params.skip_target_clearing = true;
+        opts->params.blend_params = &pl_alpha_overlay;
     }
 
     if (outdesc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
@@ -1057,7 +1082,7 @@ static int libplacebo_activate(AVFilterContext *ctx)
 
             in->qstatus = pl_queue_update(in->queue, &in->mix, pl_queue_params(
                 .pts            = out_pts * av_q2d(outlink->time_base),
-                .radius         = pl_frame_mix_radius(&s->params),
+                .radius         = pl_frame_mix_radius(&s->opts->params),
                 .vsync_duration = av_q2d(av_inv_q(outlink->frame_rate)),
             ));
 
-- 
2.41.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-08-27 11:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-18 16:50 [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct Niklas Haas
2023-08-18 16:50 ` [FFmpeg-devel] [PATCH 2/2] lavfi/vf_libplacebo: add extra_opts AVDictionary Niklas Haas
2023-08-27 11:47 ` [FFmpeg-devel] [PATCH 1/2] lavfi/vf_libplacebo: switch to new pl_options struct Niklas Haas
  -- strict thread matches above, loose matches on Subject: below --
2023-08-18 16:50 Niklas Haas

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git