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 9083B4874A for ; Sat, 16 Dec 2023 14:24:51 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D1C7468D139; Sat, 16 Dec 2023 16:24:47 +0200 (EET) Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0A2BB68CFFA for ; Sat, 16 Dec 2023 16:24:41 +0200 (EET) Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-50e2bd8c396so273420e87.0 for ; Sat, 16 Dec 2023 06:24:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1702736679; x=1703341479; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=2yJF4TqkghIOmXqnQZhXQC2lPKdDdfhxFRgmmipl7W0=; b=WoivBoLa3ADqO48vKvfU/SFWFvylQ8kUxVPwLGUy2HJt/rBdDPfbCx4Q4kU9j4H/3r VCUiAHbAPPrQeVBsYYefXRCiS7/y/NBjmNhnPXuEQnD7PcvN15rpnc/ZzQ8qJX6OXySU rtDvfVweHA++ltgQdDODNEcWjSHLmalXrq+7qrg7UiPYZZTBdpGPUHuLzCKpj88qLAs4 aB01SVsnYxZjc5BwhXCZ7ZNfrw+k9hJktYpbgzL6GjX44dgqzySa9ARt55QrvdHsJDfP 7TbNdz8xVyx6PD90H/X8498lyXHYq+1xf43RdxWjQoKpDfUu43OT6AOlmKnLeebaHvWe DkMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702736679; x=1703341479; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=2yJF4TqkghIOmXqnQZhXQC2lPKdDdfhxFRgmmipl7W0=; b=LnaWcwnkbibZSoXShJDDtKX3NkbBverTHf/8l+P5Tc6c2t4TrdNgki3ypS6nnw2u26 dnFnKGqwVsMw34AGvZJLps9/RU2fSIsodjcAnHescSjDLFxZK3h/iVcTXCMw8hSY2mdm yoP1eUbfk65dRvAmfQA+y6rl2B93g389cxk2JOj5OEAAWI+qcnGkz2ZNt8AMTQbDR8JB QeNAH1d05TEeqiQMnjsm+YETkQEcu9hoV5v11dGOSPhCPClpq6GWt9xaOdpQJfd6eOpP ftwVphtGTCRhn4bOsdj5g0Wjytdv5G1C5Ry6rcH4z3gP3Gjc2jGrCxmvvPQv0J5lzviG 7/OQ== X-Gm-Message-State: AOJu0Yw994zNisffG/OGqF7BaLXF+yzmP1AUfZ2gv5xCBVHSOicRB9NU K9RhT9v7B/YooJV7zQlsyalVweapAYI= X-Google-Smtp-Source: AGHT+IEOgRkQPsOgMy0VcLXR669ZaItXwATogunUO47Vvodmj+JpxVWTSrou3e4x9qKsDgdO11NEjA== X-Received: by 2002:ac2:5926:0:b0:50b:f820:ae36 with SMTP id v6-20020ac25926000000b0050bf820ae36mr5424403lfi.66.1702736678980; Sat, 16 Dec 2023 06:24:38 -0800 (PST) Received: from mariano (dynamic-adsl-84-220-189-10.clienti.tiscali.it. [84.220.189.10]) by smtp.gmail.com with ESMTPSA id th18-20020a1709078e1200b00a1f8df4e2d5sm9768971ejc.178.2023.12.16.06.24.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Dec 2023 06:24:38 -0800 (PST) Received: by mariano (Postfix, from userid 1000) id ED743BFCDA; Sat, 16 Dec 2023 15:24:36 +0100 (CET) From: Stefano Sabatini To: FFmpeg development discussions and patches Date: Sat, 16 Dec 2023 15:24:36 +0100 Message-Id: <20231216142436.615809-1-stefasab@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavfi/overlay: factorize definition of planar and package blending functions 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: Stefano Sabatini 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: --- libavfilter/vf_overlay.c | 260 ++++++++------------------------------- 1 file changed, 53 insertions(+), 207 deletions(-) diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index fa39abb23a..caf0634b51 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -690,213 +690,59 @@ static av_always_inline void blend_slice_planar_rgb(AVFilterContext *ctx, alpha_composite_8_8bits(src, dst, src_w, src_h, dst_w, dst_h, x, y, jobnr, nb_jobs); } -static int blend_slice_yuv420(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 1, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva420(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 1, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv420p10(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 1, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva420p10(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 1, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv422p10(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 0, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva422p10(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 1, 0, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv422(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 0, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva422(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 0, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv444(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 0, 0, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva444(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 0, 0, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv444p10(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 0, 0, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva444p10(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_16_10bits(ctx, td->dst, td->src, 0, 0, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_gbrp(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_planar_rgb(ctx, td->dst, td->src, 0, 0, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_gbrap(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_planar_rgb(ctx, td->dst, td->src, 0, 0, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv420_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 1, 0, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva420_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 1, 1, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv422_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 0, 0, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva422_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 1, 0, 1, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuv444_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 0, 0, 0, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_yuva444_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_yuv_8_8bits(ctx, td->dst, td->src, 0, 0, 1, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_gbrp_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_planar_rgb(ctx, td->dst, td->src, 0, 0, 0, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_gbrap_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_planar_rgb(ctx, td->dst, td->src, 0, 0, 1, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_packed_rgb(ctx, td->dst, td->src, 0, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_rgba(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_packed_rgb(ctx, td->dst, td->src, 1, s->x, s->y, 1, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_rgb_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_packed_rgb(ctx, td->dst, td->src, 0, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} - -static int blend_slice_rgba_pm(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) -{ - OverlayContext *s = ctx->priv; - ThreadData *td = arg; - blend_slice_packed_rgb(ctx, td->dst, td->src, 1, s->x, s->y, 0, jobnr, nb_jobs); - return 0; -} +#define DEFINE_BLEND_SLICE_PLANAR_FMT(format_, blend_slice_fn_suffix_, hsub_, vsub_, main_has_alpha_, direct_) \ +static int blend_slice_##format_(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \ +{ \ + OverlayContext *s = ctx->priv; \ + ThreadData *td = arg; \ + blend_slice_##blend_slice_fn_suffix_(ctx, td->dst, td->src, \ + hsub_, vsub_, main_has_alpha_, \ + s->x, s->y, direct_, \ + jobnr, nb_jobs); \ + return 0; \ +} + +// FMT FN H V A D +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv420, yuv_8_8bits, 1, 1, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva420, yuv_8_8bits, 1, 1, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv420p10, yuv_16_10bits, 1, 1, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva420p10, yuv_16_10bits, 1, 1, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv422p10, yuv_16_10bits, 1, 0, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva422p10, yuv_16_10bits, 1, 0, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv422, yuv_8_8bits, 1, 0, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva422, yuv_8_8bits, 1, 0, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv444, yuv_8_8bits, 0, 0, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva444, yuv_8_8bits, 0, 0, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv444p10, yuv_16_10bits, 0, 0, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva444p10, yuv_16_10bits, 0, 0, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(gbrp, planar_rgb, 0, 0, 0, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(gbrap, planar_rgb, 0, 0, 1, 1); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv420_pm, yuv_8_8bits, 1, 1, 0, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva420_pm, yuv_8_8bits, 1, 1, 1, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv422_pm, yuv_8_8bits, 1, 0, 0, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva422_pm, yuv_8_8bits, 1, 0, 1, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuv444_pm, yuv_8_8bits, 0, 0, 0, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(yuva444_pm, yuv_8_8bits, 0, 0, 1, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(gbrp_pm, planar_rgb, 0, 0, 0, 0); +DEFINE_BLEND_SLICE_PLANAR_FMT(gbrap_pm, planar_rgb, 0, 0, 1, 0); + +#define DEFINE_BLEND_SLICE_PACKED_FMT(format_, blend_slice_fn_suffix_, main_has_alpha_, direct_) \ +static int blend_slice_##format_(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \ +{ \ + OverlayContext *s = ctx->priv; \ + ThreadData *td = arg; \ + blend_slice_packed_##blend_slice_fn_suffix_(ctx, td->dst, td->src, \ + main_has_alpha_, \ + s->x, s->y, direct_, \ + jobnr, nb_jobs); \ + return 0; \ +} + +// FMT FN A D +DEFINE_BLEND_SLICE_PACKED_FMT(rgb, rgb, 0, 1); +DEFINE_BLEND_SLICE_PACKED_FMT(rgba, rgb, 1, 1); +DEFINE_BLEND_SLICE_PACKED_FMT(rgb_pm, rgb, 0, 0); +DEFINE_BLEND_SLICE_PACKED_FMT(rgba_pm, rgb, 1, 0); static int config_input_main(AVFilterLink *inlink) { -- 2.34.1 _______________________________________________ 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".