From patchwork Sat Dec 16 14:24:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Sabatini X-Patchwork-Id: 45182 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1225:b0:181:818d:5e7f with SMTP id v37csp6329767pzf; Sat, 16 Dec 2023 06:24:52 -0800 (PST) X-Google-Smtp-Source: AGHT+IHBDPAFkr61koz3FNiUyzRh6TKpypP6juiTPTdfcZqswLngQLVgYBFPtRv9ZGQZn45IZvTr X-Received: by 2002:a50:9ee1:0:b0:553:1c05:2d1d with SMTP id a88-20020a509ee1000000b005531c052d1dmr33515edf.4.1702736692620; Sat, 16 Dec 2023 06:24:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702736692; cv=none; d=google.com; s=arc-20160816; b=umDci6c681i7D8ib+PjyVyBGYpqW26tRRdN/uiecaI2ymw+olHCOynL6CjjhSwa8hy wo1F5OtFWZVl7Hy6nRiTRaaBq686CMkFNjkpwa5VbDIhadE5Sk80RkFc0JSFHJFozxo/ YgZgUGuh6uAG++GmHZcBeNKvFxMq+eIw1KgrgQqYNXe1UW4loBps1W/6mmnHLnlfb50W CIqcFzDCInV/wa2RonnRrGuYxeqknjYvy0jlxgDm/xLrCDm6ZrVrm4PslUpkN+E5QAYG 0Oq8Ti9QB/QklzeCru6qzfLc4BpFbQG3ISdFeEdOdkBWNkDl5Ny9ylcHDP7fwo9UutmM k0PA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=agncYw43GX3JYckkvs8HVKcoc3G4NdkhfKpNAMhusCQ=; fh=QdWxt2OToL83TTnLQn0lGhLakV7i1QyAJdC8te7qN0E=; b=LiwzZfhioF0HnkJEhr5LT072aafhW5pn2sBu6JAVgaokc+a9Mg1/qMV89P9F8QZw8n zR3zt2mi3fbVDdKCPofB7PK/ggDqbjp2GgWMbX79oDHRttVMfdxHNN20w5wo2EDBEZck FKeNkk0sg0BDojFa+Udxb3w3hhPEuSKGB/YsGYQxZZQuF6DSKhPNSVjFDgGnYsc9jbfl 1NS7ujP+mWbYXXeUxcyeZ4FSoCIE+1hLHaE+guRriXUmD5UoEpEmgfmst13qPAi5KBeN X7Fk9+/LMpHh57RiQX5bK6/yyzdmu3VzTQaDBslmueCMDvYs4XEb2FFFZctJtXaShwbE 76dw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=WoivBoLa; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id di9-20020a056402318900b00552f53ce62dsi771033edb.600.2023.12.16.06.24.51; Sat, 16 Dec 2023 06:24:52 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=WoivBoLa; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1F9CC68CF52; Sat, 16 Dec 2023 16:24:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org 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-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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MXzM/b8p72YW --- 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) {