* [FFmpeg-devel] [PATCH 2/4] avfilter/blend: put slice parameters to a single struct
2024-05-09 6:49 [FFmpeg-devel] [PATCH 1/4] avfilter/vsrc_testsrc: do not round down width and height for color src Marton Balint
@ 2024-05-09 6:49 ` Marton Balint
2024-05-09 6:49 ` [FFmpeg-devel] [PATCH 3/4] avfilter/blend: use a per-thread AVExpr Marton Balint
2024-05-09 6:49 ` [FFmpeg-devel] [PATCH 4/4] avfilter/vf_geq: fix interpolation with 1 pixel width/height Marton Balint
2 siblings, 0 replies; 6+ messages in thread
From: Marton Balint @ 2024-05-09 6:49 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Marton Balint
This should make future extensibility easier.
Signed-off-by: Marton Balint <cus@passwd.hu>
---
libavfilter/blend.h | 7 ++++++-
libavfilter/blend_modes.c | 2 +-
libavfilter/vf_blend.c | 7 +++++--
libavfilter/vf_blend_init.h | 4 ++--
libavfilter/x86/vf_blend_init.c | 2 +-
5 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/libavfilter/blend.h b/libavfilter/blend.h
index b046e062bc..52c1b777c2 100644
--- a/libavfilter/blend.h
+++ b/libavfilter/blend.h
@@ -69,6 +69,11 @@ enum BlendMode {
BLEND_NB
};
+typedef struct SliceParams {
+ double *values;
+ int starty;
+} SliceParams;
+
typedef struct FilterParams {
enum BlendMode mode;
double opacity;
@@ -78,7 +83,7 @@ typedef struct FilterParams {
const uint8_t *bottom, ptrdiff_t bottom_linesize,
uint8_t *dst, ptrdiff_t dst_linesize,
ptrdiff_t width, ptrdiff_t height,
- struct FilterParams *param, double *values, int starty);
+ struct FilterParams *param, SliceParams *sliceparam);
} FilterParams;
void ff_blend_init_x86(FilterParams *param, int depth);
diff --git a/libavfilter/blend_modes.c b/libavfilter/blend_modes.c
index 65c5e6f890..def5ae8e0d 100644
--- a/libavfilter/blend_modes.c
+++ b/libavfilter/blend_modes.c
@@ -91,7 +91,7 @@ static void fn0(NAME)(const uint8_t *_top, ptrdiff_t top_linesize, \
const uint8_t *_bottom, ptrdiff_t bottom_linesize, \
uint8_t *_dst, ptrdiff_t dst_linesize, \
ptrdiff_t width, ptrdiff_t height, \
- FilterParams *param, double *values, int starty) \
+ FilterParams *param, SliceParams *sliceparam) \
{ \
const PIXEL *top = (const PIXEL *)_top; \
const PIXEL *bottom = (const PIXEL *)_bottom; \
diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c
index 6b52647966..9ee8901e45 100644
--- a/libavfilter/vf_blend.c
+++ b/libavfilter/vf_blend.c
@@ -132,10 +132,12 @@ static void blend_expr_## name(const uint8_t *_top, ptrdiff_t top_linesize,
const uint8_t *_bottom, ptrdiff_t bottom_linesize, \
uint8_t *_dst, ptrdiff_t dst_linesize, \
ptrdiff_t width, ptrdiff_t height, \
- FilterParams *param, double *values, int starty) \
+ FilterParams *param, SliceParams *sliceparam) \
{ \
const type *top = (const type*)_top; \
const type *bottom = (const type*)_bottom; \
+ double *values = sliceparam->values; \
+ int starty = sliceparam->starty; \
type *dst = (type*)_dst; \
AVExpr *e = param->e; \
int y, x; \
@@ -171,6 +173,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
const uint8_t *bottom = td->bottom->data[td->plane];
uint8_t *dst = td->dst->data[td->plane];
double values[VAR_VARS_NB];
+ SliceParams sliceparam = {.values = &values[0], .starty = slice_start};
values[VAR_N] = td->inlink->frame_count_out;
values[VAR_T] = td->dst->pts == AV_NOPTS_VALUE ? NAN : td->dst->pts * av_q2d(td->inlink->time_base);
@@ -185,7 +188,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
td->bottom->linesize[td->plane],
dst + slice_start * td->dst->linesize[td->plane],
td->dst->linesize[td->plane],
- td->w, height, td->param, &values[0], slice_start);
+ td->w, height, td->param, &sliceparam);
return 0;
}
diff --git a/libavfilter/vf_blend_init.h b/libavfilter/vf_blend_init.h
index d24f178032..956e1cb9fc 100644
--- a/libavfilter/vf_blend_init.h
+++ b/libavfilter/vf_blend_init.h
@@ -58,7 +58,7 @@ static void blend_copy ## src##_##depth(const uint8_t *top, ptrdiff_t top_linesi
const uint8_t *bottom, ptrdiff_t bottom_linesize,\
uint8_t *dst, ptrdiff_t dst_linesize, \
ptrdiff_t width, ptrdiff_t height, \
- FilterParams *param, double *values, int starty) \
+ FilterParams *param, SliceParams *sliceparam) \
{ \
av_image_copy_plane(dst, dst_linesize, src, src ## _linesize, \
width * depth / 8, height); \
@@ -80,7 +80,7 @@ static void blend_normal_##name(const uint8_t *_top, ptrdiff_t top_linesize,
const uint8_t *_bottom, ptrdiff_t bottom_linesize,\
uint8_t *_dst, ptrdiff_t dst_linesize, \
ptrdiff_t width, ptrdiff_t height, \
- FilterParams *param, double *values, int starty) \
+ FilterParams *param, SliceParams *sliceparam) \
{ \
const type *top = (const type*)_top; \
const type *bottom = (const type*)_bottom; \
diff --git a/libavfilter/x86/vf_blend_init.c b/libavfilter/x86/vf_blend_init.c
index c326c43362..f4e097ee3d 100644
--- a/libavfilter/x86/vf_blend_init.c
+++ b/libavfilter/x86/vf_blend_init.c
@@ -28,7 +28,7 @@ void ff_blend_##name##_##opt(const uint8_t *top, ptrdiff_t top_linesize, \
const uint8_t *bottom, ptrdiff_t bottom_linesize, \
uint8_t *dst, ptrdiff_t dst_linesize, \
ptrdiff_t width, ptrdiff_t height, \
- struct FilterParams *param, double *values, int starty);
+ FilterParams *param, SliceParams *sliceparam);
BLEND_FUNC(addition, sse2)
BLEND_FUNC(addition, avx2)
--
2.35.3
_______________________________________________
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] 6+ messages in thread
* [FFmpeg-devel] [PATCH 3/4] avfilter/blend: use a per-thread AVExpr
2024-05-09 6:49 [FFmpeg-devel] [PATCH 1/4] avfilter/vsrc_testsrc: do not round down width and height for color src Marton Balint
2024-05-09 6:49 ` [FFmpeg-devel] [PATCH 2/4] avfilter/blend: put slice parameters to a single struct Marton Balint
@ 2024-05-09 6:49 ` Marton Balint
2024-05-09 6:49 ` [FFmpeg-devel] [PATCH 4/4] avfilter/vf_geq: fix interpolation with 1 pixel width/height Marton Balint
2 siblings, 0 replies; 6+ messages in thread
From: Marton Balint @ 2024-05-09 6:49 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Marton Balint
Otherwise expression state is accessed and changed from multiple threads.
Fixes ticket #10987.
Signed-off-by: Marton Balint <cus@passwd.hu>
---
libavfilter/blend.h | 3 ++-
libavfilter/vf_blend.c | 35 ++++++++++++++++++++++++++---------
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/libavfilter/blend.h b/libavfilter/blend.h
index 52c1b777c2..e6636839db 100644
--- a/libavfilter/blend.h
+++ b/libavfilter/blend.h
@@ -72,12 +72,13 @@ enum BlendMode {
typedef struct SliceParams {
double *values;
int starty;
+ AVExpr *e;
} SliceParams;
typedef struct FilterParams {
enum BlendMode mode;
double opacity;
- AVExpr *e;
+ AVExpr **e;
char *expr_str;
void (*blend)(const uint8_t *top, ptrdiff_t top_linesize,
const uint8_t *bottom, ptrdiff_t bottom_linesize,
diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c
index 9ee8901e45..5ea6df2e75 100644
--- a/libavfilter/vf_blend.c
+++ b/libavfilter/vf_blend.c
@@ -47,6 +47,7 @@ typedef struct BlendContext {
FilterParams params[4];
int tblend;
AVFrame *prev_frame; /* only used with tblend */
+ int nb_threads;
} BlendContext;
static const char *const var_names[] = { "X", "Y", "W", "H", "SW", "SH", "T", "N", "A", "B", "TOP", "BOTTOM", NULL };
@@ -139,7 +140,7 @@ static void blend_expr_## name(const uint8_t *_top, ptrdiff_t top_linesize,
double *values = sliceparam->values; \
int starty = sliceparam->starty; \
type *dst = (type*)_dst; \
- AVExpr *e = param->e; \
+ AVExpr *e = sliceparam->e; \
int y, x; \
dst_linesize /= div; \
top_linesize /= div; \
@@ -173,7 +174,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
const uint8_t *bottom = td->bottom->data[td->plane];
uint8_t *dst = td->dst->data[td->plane];
double values[VAR_VARS_NB];
- SliceParams sliceparam = {.values = &values[0], .starty = slice_start};
+ SliceParams sliceparam = {.values = &values[0], .starty = slice_start, .e = td->param->e ? td->param->e[jobnr] : NULL};
values[VAR_N] = td->inlink->frame_count_out;
values[VAR_T] = td->dst->pts == AV_NOPTS_VALUE ? NAN : td->dst->pts * av_q2d(td->inlink->time_base);
@@ -221,7 +222,7 @@ static AVFrame *blend_frame(AVFilterContext *ctx, AVFrame *top_buf,
.inlink = inlink };
ff_filter_execute(ctx, filter_slice, &td, NULL,
- FFMIN(outh, ff_filter_get_nb_threads(ctx)));
+ FFMIN(outh, s->nb_threads));
}
if (!s->tblend)
@@ -250,6 +251,7 @@ static av_cold int init(AVFilterContext *ctx)
BlendContext *s = ctx->priv;
s->tblend = !strcmp(ctx->filter->name, "tblend");
+ s->nb_threads = ff_filter_get_nb_threads(ctx);
s->fs.on_event = blend_frame_for_dualinput;
return 0;
@@ -284,8 +286,14 @@ static av_cold void uninit(AVFilterContext *ctx)
ff_framesync_uninit(&s->fs);
av_frame_free(&s->prev_frame);
- for (i = 0; i < FF_ARRAY_ELEMS(s->params); i++)
- av_expr_free(s->params[i].e);
+ for (i = 0; i < FF_ARRAY_ELEMS(s->params); i++) {
+ if (s->params[i].e) {
+ for (int j = 0; j < s->nb_threads; j++)
+ av_expr_free(s->params[i].e[j]);
+ av_freep(&s->params[i].e);
+ }
+ }
+
}
static int config_params(AVFilterContext *ctx)
@@ -309,10 +317,19 @@ static int config_params(AVFilterContext *ctx)
return AVERROR(ENOMEM);
}
if (param->expr_str) {
- ret = av_expr_parse(¶m->e, param->expr_str, var_names,
- NULL, NULL, NULL, NULL, 0, ctx);
- if (ret < 0)
- return ret;
+ if (!param->e) {
+ param->e = av_calloc(s->nb_threads, sizeof(*param->e));
+ if (!param->e)
+ return AVERROR(ENOMEM);
+ }
+ for (int i = 0; i < s->nb_threads; i++) {
+ av_expr_free(param->e[i]);
+ param->e[i] = NULL;
+ ret = av_expr_parse(¶m->e[i], param->expr_str, var_names,
+ NULL, NULL, NULL, NULL, 0, ctx);
+ if (ret < 0)
+ return ret;
+ }
param->blend = s->depth > 8 ? s->depth > 16 ? blend_expr_32bit : blend_expr_16bit : blend_expr_8bit;
}
}
--
2.35.3
_______________________________________________
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] 6+ messages in thread
* [FFmpeg-devel] [PATCH 4/4] avfilter/vf_geq: fix interpolation with 1 pixel width/height
2024-05-09 6:49 [FFmpeg-devel] [PATCH 1/4] avfilter/vsrc_testsrc: do not round down width and height for color src Marton Balint
2024-05-09 6:49 ` [FFmpeg-devel] [PATCH 2/4] avfilter/blend: put slice parameters to a single struct Marton Balint
2024-05-09 6:49 ` [FFmpeg-devel] [PATCH 3/4] avfilter/blend: use a per-thread AVExpr Marton Balint
@ 2024-05-09 6:49 ` Marton Balint
2024-05-11 1:57 ` Michael Niedermayer
2 siblings, 1 reply; 6+ messages in thread
From: Marton Balint @ 2024-05-09 6:49 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Marton Balint
Fixes ticket #9740.
Signed-off-by: Marton Balint <cus@passwd.hu>
---
libavfilter/vf_geq.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/libavfilter/vf_geq.c b/libavfilter/vf_geq.c
index dbe50e5250..12604d44a2 100644
--- a/libavfilter/vf_geq.c
+++ b/libavfilter/vf_geq.c
@@ -112,8 +112,12 @@ static inline double getpix(void *priv, double x, double y, int plane)
return 0;
if (geq->interpolation == INTERP_BILINEAR) {
- xi = x = av_clipd(x, 0, w - 2);
- yi = y = av_clipd(y, 0, h - 2);
+ int xn, yn;
+
+ xi = x = av_clipd(x, 0, w - 1);
+ yi = y = av_clipd(y, 0, h - 1);
+ xn = av_clip(xi + 1, 0, w - 1);
+ yn = av_clip(yi + 1, 0, h - 1);
x -= xi;
y -= yi;
@@ -122,17 +126,17 @@ static inline double getpix(void *priv, double x, double y, int plane)
const uint16_t *src16 = (const uint16_t*)src;
linesize /= 2;
- return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xi + 1 + yi * linesize])
- + y *((1-x)*src16[xi + (yi+1) * linesize] + x*src16[xi + 1 + (yi+1) * linesize]);
+ return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xn + yi * linesize])
+ + y *((1-x)*src16[xi + yn * linesize] + x*src16[xn + yn * linesize]);
} else if (geq->bps == 32) {
const float *src32 = (const float*)src;
linesize /= 4;
- return (1-y)*((1-x)*src32[xi + yi * linesize] + x*src32[xi + 1 + yi * linesize])
- + y *((1-x)*src32[xi + (yi+1) * linesize] + x*src32[xi + 1 + (yi+1) * linesize]);
+ return (1-y)*((1-x)*src32[xi + yi * linesize] + x*src32[xn + yi * linesize])
+ + y *((1-x)*src32[xi + yn * linesize] + x*src32[xn + yn * linesize]);
} else if (geq->bps == 8) {
- return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xi + 1 + yi * linesize])
- + y *((1-x)*src[xi + (yi+1) * linesize] + x*src[xi + 1 + (yi+1) * linesize]);
+ return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xn + yi * linesize])
+ + y *((1-x)*src[xi + yn * linesize] + x*src[xn + yn * linesize]);
}
} else {
xi = av_clipd(x, 0, w - 1);
--
2.35.3
_______________________________________________
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] 6+ messages in thread