From patchwork Mon May 2 17:51:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linjie Fu X-Patchwork-Id: 35544 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a885:b0:7f:4be2:bd17 with SMTP id ca5csp4055pzb; Mon, 2 May 2022 10:52:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz2FYhzB8QKPu6sX9cNlLvMGxGZgPDE0hzgPmB9M9TwjDfiq0Pd8SkKxYAFZldbZwm6Ycqa X-Received: by 2002:a17:907:7254:b0:6db:ad8f:27b4 with SMTP id ds20-20020a170907725400b006dbad8f27b4mr12340151ejc.599.1651513922226; Mon, 02 May 2022 10:52:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651513922; cv=none; d=google.com; s=arc-20160816; b=pmCMFSHR7zXiUCvESkhxXRFjlz2quZnwxDzw+/L1socvUsR7hdxfTS7WpJbJoUJIvQ F44H0nD4/6vcIHcjZbb4poWtII8hK2+P32QK27voTnFu1KHqq+ihFkNX1yRl49xUcVDx UUbOLlfm8E8WbKhHpwFfO1iqXbCw1OpUPsMpzFcB1guK1D5+aGx3YiAfvBL90CdWP/uk WSdE1f+eq5kP1cnYLgDy/AOBhZri4F7/xNZ8CcvS0ovn7hxVO3BB1SeuRZ8Oyu5t93Vf k57LKT/dq5jYBivV5OhBFdYOHyM+lTQVvMolrND00EOGeV9UAo2pLpqDnaLUY3HpfodD h1XA== 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=4Vn1YbUrQt5CfVnPL1MqoF0JUTugOKA294MGSGKEFO4=; b=VsbgGleM1Dn4InVFlt8P+syGEwrBCK0rNHl0UWUGiz2WOPDQ/lGt1hR1dxf2XqtcR1 iBbw2Dj1DzV2YAgil9ywhfP7WqJ+IGyYJ7AwYr28rQCC9wv7WmqlcDSUz3y8wDe6Kilf Bk8Mz19Gk60pxZ6L1Z2b2iVVVLq7x+Lv/3I5jPvHOygN3/ErjU4jEeYAWZjyiuiDLJiY P8qM9sVypuxTIKWws0SsVuldPxBNiGG0wr+sEMZ38DyMxwRC9GiukHwPG6pekpqQmqHV KvMDWa00OTAjucu3geK2pZxeoGjfWYhWLgXYlKClQyXo3bNEVphv3Lc1WXzRUZAeR6f6 A02Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=bcn8bGgR; 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 cr19-20020a170906d55300b006df76385c48si6803851ejc.232.2022.05.02.10.52.01; Mon, 02 May 2022 10:52:02 -0700 (PDT) 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=20210112 header.b=bcn8bGgR; 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 2CC6268B2B5; Mon, 2 May 2022 20:51:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9915968B03B for ; Mon, 2 May 2022 20:51:52 +0300 (EEST) Received: by mail-pj1-f54.google.com with SMTP id w5-20020a17090aaf8500b001d74c754128so30522pjq.0 for ; Mon, 02 May 2022 10:51:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qbEd/KaFLCbZBFvdahw3fTibPwI2HuMtuCx4cbrCkJg=; b=bcn8bGgRAJBadFBC2rb45dameqorb4cfr6Wgc5uFzNq+b49uoNYID+DFVjFGwjLH7W NZRgASOlB3e6BAbQlDkYgnJxnEZzvaMPPkbmZE8WzBiPOVhBM3+UhE82yGYYV7zgfJDZ lwF52JE7bTDNRBCl6tEiJmfprLFgjJnVQAw6+YrMsZqwhErJcCtAygX0dSJLifRM+vpQ gzXT3FhNupKuigpqBJvZq5CUjDLrLb+csoiVHOTeIWe0rbEShX7AKoSj7x4SNrXIyDRW X3qB3KEUxgLpir91byN+XYS/uaj6TEGyIXajqP1gsJO1h6oCnKgJIHg4b0hQq6xlP2y0 Ag/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qbEd/KaFLCbZBFvdahw3fTibPwI2HuMtuCx4cbrCkJg=; b=c63EquV/V/yenjnt9Dabqoej/C2xuy7mUvuuzo7U9YLAUglpMVuz01U4kPupNOaOc3 MWiiSAFWOjcO5FNYAhWaU5egLSlxG5uJfQDfsry/SrAicg70DcLju4pB8QQH4zyl9iAJ zUOeW7wUWdiktDFIJ42H3inz1NGH5yfNaDurzJa1d2Qd3WX0wl32Ok0royaLgDXg2CXL eqI2+VSIYrysrf1c5FfzyATBXk8ns+d4Zsh6PxyGnWQSi0Wc9IBYAEIDYBeALfM6LT7c 20No0cw3GydGg4gS8utY7lre3p5HuXrXp6DkRfEUiR6S8H/uX1A1q5HX/GeJUyCzco9r TNfA== X-Gm-Message-State: AOAM530R9ZuBfVd3nIphSU5DptWMQyKB95wAdjxMr6WMKcLbDOXXb1pY FtwzM9HgJ4TC+fBHQJYUObMo0qwAownc5g== X-Received: by 2002:a17:902:b703:b0:158:2667:7447 with SMTP id d3-20020a170902b70300b0015826677447mr12612973pls.92.1651513910318; Mon, 02 May 2022 10:51:50 -0700 (PDT) Received: from localhost.localdomain ([223.167.244.38]) by smtp.gmail.com with ESMTPSA id m8-20020a63fd48000000b003c14af505f4sm11132298pgj.12.2022.05.02.10.51.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 10:51:50 -0700 (PDT) From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Tue, 3 May 2022 01:51:43 +0800 Message-Id: <20220502175143.1643-1-linjie.justin.fu@gmail.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avfilter/vf_overlay: Fix the calculation of average alpha with alpha composition and threads > 1 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: Linjie Fu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NhmtYWypmhQT The calculation of average alpha utilizes the value of next line(alpha[x+linesize]): alpha[0] alpha[1] alpha[0+linesize] alpha[1+linesize] However, alpha[x+linesize] could be either an alpha_composited value or an original value if it locates at next slice, which may lead to an incorrect output and run2run changed MD5. Hence, only utilizes the alpha within one slice on the boundary to fix the calculation of average alpha. CMD: $ffmpeg -i https://samples.ffmpeg.org/FLV/flash_with_alpha/laraShadow_dl.flv \ -filter_complex "nullsrc=1920x1080[arena];[arena][0:v]overlay" \ -vframes 10 -an -f md5 - Before: Incorrect output and changed MD5 at each run. After this patch: Consistent output and MD5. Signed-off-by: Linjie Fu --- [RFC]This is a partial fix. A fully-fixed method may be don't overwrite dst_alpha or preserve the original alpha value in composite_alpha(). Then we can use the original alpha value for calculation in blend_plane(). libavfilter/vf_overlay.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index f560d54dae..9488ccd0d7 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -515,13 +515,13 @@ static av_always_inline void blend_plane_##depth##_##nbits##bits(AVFilterContext if (main_has_alpha && alpha != 0 && alpha != max) { \ /* average alpha for color components, improve quality */ \ uint8_t alpha_d; \ - if (hsub && vsub && j+1 < src_hp && k+1 < src_wp) { \ + if (hsub && vsub && j+1 < src_hp && k+1 < src_wp && j+1 < slice_end) { \ alpha_d = (da[0] + da[dst->linesize[3]] + \ da[1] + da[dst->linesize[3]+1]) >> 2; \ } else if (hsub || vsub) { \ alpha_h = hsub && k+1 < src_wp ? \ (da[0] + da[1]) >> 1 : da[0]; \ - alpha_v = vsub && j+1 < src_hp ? \ + alpha_v = vsub && j+1 < src_hp && j+1 < slice_end ? \ (da[0] + da[dst->linesize[3]]) >> 1 : da[0]; \ alpha_d = (alpha_v + alpha_h) >> 1; \ } else \