From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 3158649D29 for ; Thu, 9 May 2024 06:49:53 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A75EF68D748; Thu, 9 May 2024 09:49:38 +0300 (EEST) Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EEBD368D728 for ; Thu, 9 May 2024 09:49:30 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id B2501EA449; Thu, 9 May 2024 08:49:30 +0200 (CEST) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KhLut-sB-ovH; Thu, 9 May 2024 08:49:28 +0200 (CEST) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 2C976EA66E; Thu, 9 May 2024 08:49:28 +0200 (CEST) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 May 2024 08:49:17 +0200 Message-Id: <20240509064918.6654-3-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20240509064918.6654-1-cus@passwd.hu> References: <20240509064918.6654-1-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] avfilter/blend: use a per-thread AVExpr X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Marton Balint Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Otherwise expression state is accessed and changed from multiple threads. Fixes ticket #10987. Signed-off-by: Marton Balint --- 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".