From patchwork Fri Dec 30 11:34:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= X-Patchwork-Id: 39811 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp5490549pzb; Fri, 30 Dec 2022 03:35:20 -0800 (PST) X-Google-Smtp-Source: AMrXdXtEivvjWI6U7bFSiFHuFGRnc8V3HC8QT7JPjLFhMU/rva4JPZKx+vlXs9nVAhLE3RQNbESJ X-Received: by 2002:a17:906:5012:b0:7c1:2e19:ba3f with SMTP id s18-20020a170906501200b007c12e19ba3fmr31149648ejj.57.1672400120391; Fri, 30 Dec 2022 03:35:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672400120; cv=none; d=google.com; s=arc-20160816; b=k9Wxbfao7q1mEXzTMLG00oAnbiBu8Y2klgDOTzBaHLFSViNLc24BAYJb63lUuu5iAU M14QICAPhdwX/OFFm0ptbySWx6iBAZkJL5E6JR45rWxn4BeacO1YVIbOAuLtcP5oRMu1 jIJgKBahFQlFDfT+de0f4XkvCRzS/hdfEEpXO6bAvwye84XovRASwYg7j38WhZHlAMrj nEgZXyFoII+t+y+gANOPr+CITFJ8S1bLBbIeBUjG1P2+Q9N8m4EPi1xKODrmA9zfW6mT ElXgrpmWxSxv+ZAo+rnNkjxwofF/rUri6j5I3ns6xhSjOUqDXWCobkpl3Hn8KRPMKa2z dmXw== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=orEWY1uSHXDVMpQLW44qKY13O4J2ZRQnFYFwTSb6vZ0=; b=c0Ith2bkuVvVN3ATwBjd6iSBzuzohPDbQTHWNIvTV2K9eLOFRQU2dsSoF4GOP3Smol xCT/RuXcAFwAcvmlVXa6qdw5OXcgUTrTDpsIA6ub3BOVjOQr71zaDwTqbilEzzhUwq4i p39DWAP5WB359qa/k3q9+jBA+WTveHl9Q8iCQY9431uTHXdnNw8SfDm3pFR4u5bFs3B4 Y20qB3LYQcMvW2DfiqAuPfxXpUdO3HxMp/AzpAWuFi82pI2ROu9WAi1gCBzmWYHm4h3Y Q+lyRcavbjpDZEluN8beRf12r9ijqsBr2kUcqoDv67zIqnARYtZFfED+g+RUf0Aa72Yx Imeg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@pkh.me header.s=selector1 header.b=PkdbdLVf; 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=NONE dis=NONE) header.from=pkh.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id qa14-20020a170907868e00b007baa6e22742si17718439ejc.570.2022.12.30.03.35.20; Fri, 30 Dec 2022 03:35:20 -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=@pkh.me header.s=selector1 header.b=PkdbdLVf; 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=NONE dis=NONE) header.from=pkh.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1D4DF68B9C1; Fri, 30 Dec 2022 13:35:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from ssq0.pkh.me (unknown [92.154.28.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3D8C968B53C for ; Fri, 30 Dec 2022 13:35:03 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pkh.me; s=selector1; t=1672400097; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tRr9BEhPW6gQcELeeL1ibAGlvCwlNy/+0Ao/wuWt5yI=; b=PkdbdLVffzuxVMe0iWl4KuWYgmuMPaDfhMM2LBURx/nztmgER7u9+oQkTUXSF05kqPiJQL 27hJp5VKlPjP+xflwKeEbdZynqt7FGmifCZubVGyjqAUs7OewTLPbHMKKxebJaALz3UZoS y2t93hZfLk5AcCwxgstu6DCh1nDcovU= Received: from localhost (ssq0.pkh.me [local]) by ssq0.pkh.me (OpenSMTPD) with ESMTPA id cd181b27; Fri, 30 Dec 2022 11:34:57 +0000 (UTC) From: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Dec 2022 12:34:52 +0100 Message-Id: <20221230113455.2632289-2-u@pkh.me> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221230113455.2632289-1-u@pkh.me> References: <20221230113455.2632289-1-u@pkh.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] avfilter/paletteuse: add sierra3 dithering 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: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 843SuMQ3i5CD Sierra3 according to https://bisqwit.iki.fi/jutut/kuvat/ordered_dither/error_diffusion.txt: * 5 3 2 4 5 4 2 2 3 2 / 32 --- doc/filters.texi | 2 ++ libavfilter/vf_paletteuse.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index f51623d16a..84034072be 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -18516,6 +18516,8 @@ Floyd and Steingberg dithering (error diffusion) Frankie Sierra dithering v2 (error diffusion) @item sierra2_4a Frankie Sierra dithering v2 "Lite" (error diffusion) +@item sierra3 +Frankie Sierra dithering v3 (error diffusion) @end table Default is @var{sierra2_4a}. diff --git a/libavfilter/vf_paletteuse.c b/libavfilter/vf_paletteuse.c index 67e065da7f..902bf5d82f 100644 --- a/libavfilter/vf_paletteuse.c +++ b/libavfilter/vf_paletteuse.c @@ -42,6 +42,7 @@ enum dithering_mode { DITHERING_FLOYD_STEINBERG, DITHERING_SIERRA2, DITHERING_SIERRA2_4A, + DITHERING_SIERRA3, NB_DITHERING }; @@ -113,6 +114,7 @@ static const AVOption paletteuse_options[] = { { "floyd_steinberg", "Floyd and Steingberg dithering (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_FLOYD_STEINBERG}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "sierra2", "Frankie Sierra dithering v2 (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA2}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "sierra2_4a", "Frankie Sierra dithering v2 \"Lite\" (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA2_4A}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, + { "sierra3", "Frankie Sierra dithering v3 (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA3}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "bayer_scale", "set scale for bayer dithering", OFFSET(bayer_scale), AV_OPT_TYPE_INT, {.i64=2}, 0, 5, FLAGS }, { "diff_mode", "set frame difference mode", OFFSET(diff_mode), AV_OPT_TYPE_INT, {.i64=DIFF_MODE_NONE}, 0, NB_DIFF_MODE-1, FLAGS, "diff_mode" }, { "rectangle", "process smallest different rectangle", 0, AV_OPT_TYPE_CONST, {.i64=DIFF_MODE_RECTANGLE}, INT_MIN, INT_MAX, FLAGS, "diff_mode" }, @@ -368,6 +370,32 @@ static av_always_inline int set_frame(PaletteUseContext *s, AVFrame *out, AVFram if (left && down) src[src_linesize + x - 1] = dither_color(src[src_linesize + x - 1], er, eg, eb, 1, 2); if ( down) src[src_linesize + x ] = dither_color(src[src_linesize + x ], er, eg, eb, 1, 2); + } else if (dither == DITHERING_SIERRA3) { + const int right = x < w - 1, down = y < h - 1, left = x > x_start; + const int right2 = x < w - 2, down2 = y < h - 2, left2 = x > x_start + 1; + const int color = get_dst_color_err(s, src[x], &er, &eg, &eb); + + if (color < 0) + return color; + dst[x] = color; + + if (right) src[ x + 1] = dither_color(src[ x + 1], er, eg, eb, 5, 5); + if (right2) src[ x + 2] = dither_color(src[ x + 2], er, eg, eb, 3, 5); + + if (down) { + if (left2) src[src_linesize + x - 2] = dither_color(src[src_linesize + x - 2], er, eg, eb, 2, 5); + if (left) src[src_linesize + x - 1] = dither_color(src[src_linesize + x - 1], er, eg, eb, 4, 5); + if (1) src[src_linesize + x ] = dither_color(src[src_linesize + x ], er, eg, eb, 5, 5); + if (right) src[src_linesize + x + 1] = dither_color(src[src_linesize + x + 1], er, eg, eb, 4, 5); + if (right2) src[src_linesize + x + 2] = dither_color(src[src_linesize + x + 2], er, eg, eb, 2, 5); + + if (down2) { + if (left) src[src_linesize*2 + x - 1] = dither_color(src[src_linesize*2 + x - 1], er, eg, eb, 2, 5); + if (1) src[src_linesize*2 + x ] = dither_color(src[src_linesize*2 + x ], er, eg, eb, 3, 5); + if (right) src[src_linesize*2 + x + 1] = dither_color(src[src_linesize*2 + x + 1], er, eg, eb, 2, 5); + } + } + } else { const int color = color_get(s, src[x]); @@ -842,6 +870,7 @@ DEFINE_SET_FRAME(heckbert, DITHERING_HECKBERT) DEFINE_SET_FRAME(floyd_steinberg, DITHERING_FLOYD_STEINBERG) DEFINE_SET_FRAME(sierra2, DITHERING_SIERRA2) DEFINE_SET_FRAME(sierra2_4a, DITHERING_SIERRA2_4A) +DEFINE_SET_FRAME(sierra3, DITHERING_SIERRA3) static const set_frame_func set_frame_lut[NB_DITHERING] = { set_frame_none, @@ -850,6 +879,7 @@ static const set_frame_func set_frame_lut[NB_DITHERING] = { set_frame_floyd_steinberg, set_frame_sierra2, set_frame_sierra2_4a, + set_frame_sierra3, }; static int dither_value(int p) From patchwork Fri Dec 30 11:34:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= X-Patchwork-Id: 39812 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp5490630pzb; Fri, 30 Dec 2022 03:35:29 -0800 (PST) X-Google-Smtp-Source: AMrXdXu/EB++pEE3aC01wu95Gq2kZZMQHxwyxGdN9XYG62W/xVfYDuJbTXM9CFbgW9w9jFQLKBiG X-Received: by 2002:a17:906:284a:b0:7c1:e78:1e2 with SMTP id s10-20020a170906284a00b007c10e7801e2mr36167231ejc.11.1672400129551; Fri, 30 Dec 2022 03:35:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672400129; cv=none; d=google.com; s=arc-20160816; b=XfDU7b/EUEpyTwfN4fwuPN9EX/Gz3ELXB8oRNV4+dqG3XrfbAYbKuxlqrGzsvkcBlj PAdam09mXWBP+U5LXxt4HS8LHYHUjZuru9dohAlM/BYTbupNDI104ZUgs6NSf9gUZQG0 rOrBqqQWWIkkdJ5u/yctJY4uWImWhfnbyHJK6arWj34Lx3zs/FDoiakABrK6ATIdhI2U Ry6VDfeW3yt8xhJfgEj+BR7ZGAn500GsAm51lAtQjt2jwfWvBLfFdykRxgHWXrIzBAb6 8QvhTxxYFK/trl7j+l+yAwSoODQdwrk72pwKBeQq3FWlpeskvcQVcwipxlF4fWNNaVqJ Qg9Q== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=rNLxaEOD7WfLxn+S9cfGPeo/v+xWhJ9WFFxX5Ls/5R8=; b=D9OdtC8g7rpL3F05wRt7C/3YAp5GkEK/IzHBSeL+xzBpOZFkZ5ZXGZ1gaboKJ1SIfD prgVcjm7HhZHWagmYKXPwZt0vC7S4F5iwIl0Yw0YUr7yr18RlS5Jozh7aMQ/84kdkSMr /wEidRU4G+SqU5gDxr5lBmuDqcpnmUJOds2eDHnwT03UVsvR60XtzIVteTUF6in4LCCB guftEdN6El9gf+zsmA+gcUlZTfxu/LApULVMLS/PpSQgmmaIu4wDiE9ok/ZpGMBJ5wwN WwqygYkTafQnMVGojLJ5V10Tb/ChO6e1OZiSR07M8BPco8eHO5XWYxDu2pWU5EzKffgm PGlw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@pkh.me header.s=selector1 header.b=YQ8YDVnr; 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=NONE dis=NONE) header.from=pkh.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ae10-20020a17090725ca00b0084c855e9b5bsi5194604ejc.97.2022.12.30.03.35.29; Fri, 30 Dec 2022 03:35:29 -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=@pkh.me header.s=selector1 header.b=YQ8YDVnr; 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=NONE dis=NONE) header.from=pkh.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3EEB568B940; Fri, 30 Dec 2022 13:35:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from ssq0.pkh.me (unknown [92.154.28.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C30A768B53C for ; Fri, 30 Dec 2022 13:35:03 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pkh.me; s=selector1; t=1672400097; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=smnfLI7Rs6Tu6BajzGs3vGF38TCOLGH5hgflSg2VB4s=; b=YQ8YDVnrRycD9b7Ncc55B1HmnGaX1ztPvRFnUoyA8CBUGc9/kKw0m+pAm8CZngvbxGXapj pGNGHX5FxWuHPC9unPJJrqluHjE4uaccLqsYZefXoM7K7Wo6lt2rbjOr3LDVD5DMpHdap+ 5HsOWY4wK1Q5hM5HdwsWiXJ2Lhn7NE0= Received: from localhost (ssq0.pkh.me [local]) by ssq0.pkh.me (OpenSMTPD) with ESMTPA id 2481f66c; Fri, 30 Dec 2022 11:34:57 +0000 (UTC) From: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Dec 2022 12:34:53 +0100 Message-Id: <20221230113455.2632289-3-u@pkh.me> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221230113455.2632289-1-u@pkh.me> References: <20221230113455.2632289-1-u@pkh.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] avfilter/paletteuse: add burkes dithering 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: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5DWnExC2wWFZ Burkes according to https://bisqwit.iki.fi/jutut/kuvat/ordered_dither/error_diffusion.txt: * 8 4 2 4 8 4 2 / 32 --- doc/filters.texi | 2 ++ libavfilter/vf_paletteuse.c | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index 84034072be..16a8dde4f3 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -18518,6 +18518,8 @@ Frankie Sierra dithering v2 (error diffusion) Frankie Sierra dithering v2 "Lite" (error diffusion) @item sierra3 Frankie Sierra dithering v3 (error diffusion) +@item burkes +Burkes dithering (error diffusion) @end table Default is @var{sierra2_4a}. diff --git a/libavfilter/vf_paletteuse.c b/libavfilter/vf_paletteuse.c index 902bf5d82f..3c3b6b3ef8 100644 --- a/libavfilter/vf_paletteuse.c +++ b/libavfilter/vf_paletteuse.c @@ -43,6 +43,7 @@ enum dithering_mode { DITHERING_SIERRA2, DITHERING_SIERRA2_4A, DITHERING_SIERRA3, + DITHERING_BURKES, NB_DITHERING }; @@ -115,6 +116,7 @@ static const AVOption paletteuse_options[] = { { "sierra2", "Frankie Sierra dithering v2 (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA2}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "sierra2_4a", "Frankie Sierra dithering v2 \"Lite\" (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA2_4A}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "sierra3", "Frankie Sierra dithering v3 (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA3}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, + { "burkes", "Burkes dithering (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_BURKES}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "bayer_scale", "set scale for bayer dithering", OFFSET(bayer_scale), AV_OPT_TYPE_INT, {.i64=2}, 0, 5, FLAGS }, { "diff_mode", "set frame difference mode", OFFSET(diff_mode), AV_OPT_TYPE_INT, {.i64=DIFF_MODE_NONE}, 0, NB_DIFF_MODE-1, FLAGS, "diff_mode" }, { "rectangle", "process smallest different rectangle", 0, AV_OPT_TYPE_CONST, {.i64=DIFF_MODE_RECTANGLE}, INT_MIN, INT_MAX, FLAGS, "diff_mode" }, @@ -396,6 +398,26 @@ static av_always_inline int set_frame(PaletteUseContext *s, AVFrame *out, AVFram } } + } else if (dither == DITHERING_BURKES) { + const int right = x < w - 1, down = y < h - 1, left = x > x_start; + const int right2 = x < w - 2, left2 = x > x_start + 1; + const int color = get_dst_color_err(s, src[x], &er, &eg, &eb); + + if (color < 0) + return color; + dst[x] = color; + + if (right) src[ x + 1] = dither_color(src[ x + 1], er, eg, eb, 8, 5); + if (right2) src[ x + 2] = dither_color(src[ x + 2], er, eg, eb, 4, 5); + + if (down) { + if (left2) src[src_linesize + x - 2] = dither_color(src[src_linesize + x - 2], er, eg, eb, 2, 5); + if (left) src[src_linesize + x - 1] = dither_color(src[src_linesize + x - 1], er, eg, eb, 4, 5); + if (1) src[src_linesize + x ] = dither_color(src[src_linesize + x ], er, eg, eb, 8, 5); + if (right) src[src_linesize + x + 1] = dither_color(src[src_linesize + x + 1], er, eg, eb, 4, 5); + if (right2) src[src_linesize + x + 2] = dither_color(src[src_linesize + x + 2], er, eg, eb, 2, 5); + } + } else { const int color = color_get(s, src[x]); @@ -871,6 +893,7 @@ DEFINE_SET_FRAME(floyd_steinberg, DITHERING_FLOYD_STEINBERG) DEFINE_SET_FRAME(sierra2, DITHERING_SIERRA2) DEFINE_SET_FRAME(sierra2_4a, DITHERING_SIERRA2_4A) DEFINE_SET_FRAME(sierra3, DITHERING_SIERRA3) +DEFINE_SET_FRAME(burkes, DITHERING_BURKES) static const set_frame_func set_frame_lut[NB_DITHERING] = { set_frame_none, @@ -880,6 +903,7 @@ static const set_frame_func set_frame_lut[NB_DITHERING] = { set_frame_sierra2, set_frame_sierra2_4a, set_frame_sierra3, + set_frame_burkes, }; static int dither_value(int p) From patchwork Fri Dec 30 11:34:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= X-Patchwork-Id: 39813 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp5490692pzb; Fri, 30 Dec 2022 03:35:38 -0800 (PST) X-Google-Smtp-Source: AMrXdXsa/fCGAVnUrz5KKAXmvLjIRy3JWs7++NJl4mO0qKqp7ovc2taeN+eT6tHJ37hl5tVTlTOw X-Received: by 2002:a17:907:72d3:b0:7c0:fd1e:972e with SMTP id du19-20020a17090772d300b007c0fd1e972emr34462962ejc.46.1672400138565; Fri, 30 Dec 2022 03:35:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672400138; cv=none; d=google.com; s=arc-20160816; b=JQSK9IDfwNhQcHt7co6yY+FssPMb5FyMGv9oArTTo1BxqTA/Gqaln00wM81Xxg3qmq JK9+v66UA0nUIxAR9EBxt600K5ndby4MBL35gxx0yDxNipI60wH+ZuSUsOH3JwqjVV9Z oVi7lKYz40Wvjf0g22AuwfDo5iXhGRQ9wZ8p2NI8Mrd+zgJD70umf2h3lCCJOjiuI9Gi MBGJjrf/uxcAPR8McsZmD+QLPj82h8fjP8PGHFyIQAtGx/v4XlLm5vXD6k6Ejq0GzrOJ CXfw7VMabGfgy5WMotEn3SYA2V/rgd/SfUsl0PO5q5VdXscCZCv9DIp9J9hg6yi+NF8q meBw== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=ZCFK2xsdtNp3R3dBoa5xiI78k30AX07xebZ/3pkvTwU=; b=N0q1Sat+xnFfy5Vln8tFETjs3ic8h9aolPjtkAEj6GtVWm7Mf+YBsh3XGSo22+Uxb9 h0ixdSdHK7TDIUJDDq3QPIJJlwDBAD1j4noIv+wpB0IVFE0ZOAtgHcK08MRH5Eb2N4eg SVndu3RwmOtAqbhghq+c9FuCOnMoBydnH3YXnYqhqeoNvJhOKMxnyeRau1RhOUM+p4sS BAGsOdyDtX6wU7L3+AHy9x2RSFhUZEegdAP2jy8X4P9URHlLOFszyw4up74MbNH6QzI7 figRf1nnWez+gO1Cl3HP49YacgEkIqNEd7S0HKEqHJWBFGdRUbKlFCewp43yX7fp9t3+ UC0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@pkh.me header.s=selector1 header.b=Pk7svx3b; 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=NONE dis=NONE) header.from=pkh.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id xc2-20020a170907074200b007897abd2d17si17481767ejb.468.2022.12.30.03.35.38; Fri, 30 Dec 2022 03:35:38 -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=@pkh.me header.s=selector1 header.b=Pk7svx3b; 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=NONE dis=NONE) header.from=pkh.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 66FA868BAA5; Fri, 30 Dec 2022 13:35:15 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from ssq0.pkh.me (unknown [92.154.28.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 68DA968BA5C for ; Fri, 30 Dec 2022 13:35:08 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pkh.me; s=selector1; t=1672400098; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sJs+x6Nv8+wDMwsgd5w+i7K9XyfmKAjOqBh4uwfGea0=; b=Pk7svx3b/zUPmR8Sv1oWWHNHuHe5QqXbk6ZsvezTcsJNcA3gPjmzB3E0ABOMXP2JjRZmnR A4+C7Tj3qLYFcVJkLewSXScI/CXHBP82YVzGIQ/xKbBM7Z22JkzCL1aBsOQGn2Fma597rE J0o9Dmg1SHJOMZRHUNcPFAfkBY6YYWA= Received: from localhost (ssq0.pkh.me [local]) by ssq0.pkh.me (OpenSMTPD) with ESMTPA id 36edbaae; Fri, 30 Dec 2022 11:34:58 +0000 (UTC) From: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Dec 2022 12:34:54 +0100 Message-Id: <20221230113455.2632289-4-u@pkh.me> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221230113455.2632289-1-u@pkh.me> References: <20221230113455.2632289-1-u@pkh.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] avfilter/paletteuse: add atkinson dithering 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: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: agPKX56cm4tN Atkinson according to https://bisqwit.iki.fi/jutut/kuvat/ordered_dither/error_diffusion.txt: * 1 1 / 8 1 1 1 1 --- doc/filters.texi | 2 ++ libavfilter/vf_paletteuse.c | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index 16a8dde4f3..2672ae6ee7 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -18520,6 +18520,8 @@ Frankie Sierra dithering v2 "Lite" (error diffusion) Frankie Sierra dithering v3 (error diffusion) @item burkes Burkes dithering (error diffusion) +@item atkinson +Atkinson dithering by Bill Atkinson at Apple Computer (error diffusion) @end table Default is @var{sierra2_4a}. diff --git a/libavfilter/vf_paletteuse.c b/libavfilter/vf_paletteuse.c index 3c3b6b3ef8..252ad746f0 100644 --- a/libavfilter/vf_paletteuse.c +++ b/libavfilter/vf_paletteuse.c @@ -44,6 +44,7 @@ enum dithering_mode { DITHERING_SIERRA2_4A, DITHERING_SIERRA3, DITHERING_BURKES, + DITHERING_ATKINSON, NB_DITHERING }; @@ -117,6 +118,7 @@ static const AVOption paletteuse_options[] = { { "sierra2_4a", "Frankie Sierra dithering v2 \"Lite\" (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA2_4A}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "sierra3", "Frankie Sierra dithering v3 (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_SIERRA3}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "burkes", "Burkes dithering (error diffusion)", 0, AV_OPT_TYPE_CONST, {.i64=DITHERING_BURKES}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, + { "atkinson", "Atkinson dithering by Bill Atkinson at Apple Computer (error diffusion)",0, AV_OPT_TYPE_CONST, {.i64=DITHERING_ATKINSON}, INT_MIN, INT_MAX, FLAGS, "dithering_mode" }, { "bayer_scale", "set scale for bayer dithering", OFFSET(bayer_scale), AV_OPT_TYPE_INT, {.i64=2}, 0, 5, FLAGS }, { "diff_mode", "set frame difference mode", OFFSET(diff_mode), AV_OPT_TYPE_INT, {.i64=DIFF_MODE_NONE}, 0, NB_DIFF_MODE-1, FLAGS, "diff_mode" }, { "rectangle", "process smallest different rectangle", 0, AV_OPT_TYPE_CONST, {.i64=DIFF_MODE_RECTANGLE}, INT_MIN, INT_MAX, FLAGS, "diff_mode" }, @@ -418,6 +420,25 @@ static av_always_inline int set_frame(PaletteUseContext *s, AVFrame *out, AVFram if (right2) src[src_linesize + x + 2] = dither_color(src[src_linesize + x + 2], er, eg, eb, 2, 5); } + } else if (dither == DITHERING_ATKINSON) { + const int right = x < w - 1, down = y < h - 1, left = x > x_start; + const int right2 = x < w - 2, down2 = y < h - 2; + const int color = get_dst_color_err(s, src[x], &er, &eg, &eb); + + if (color < 0) + return color; + dst[x] = color; + + if (right) src[ x + 1] = dither_color(src[ x + 1], er, eg, eb, 1, 3); + if (right2) src[ x + 2] = dither_color(src[ x + 2], er, eg, eb, 1, 3); + + if (down) { + if (left) src[src_linesize + x - 1] = dither_color(src[src_linesize + x - 1], er, eg, eb, 1, 3); + if (1) src[src_linesize + x ] = dither_color(src[src_linesize + x ], er, eg, eb, 1, 3); + if (right) src[src_linesize + x + 1] = dither_color(src[src_linesize + x + 1], er, eg, eb, 1, 3); + if (down2) src[src_linesize*2 + x ] = dither_color(src[src_linesize*2 + x ], er, eg, eb, 1, 3); + } + } else { const int color = color_get(s, src[x]); @@ -894,6 +915,7 @@ DEFINE_SET_FRAME(sierra2, DITHERING_SIERRA2) DEFINE_SET_FRAME(sierra2_4a, DITHERING_SIERRA2_4A) DEFINE_SET_FRAME(sierra3, DITHERING_SIERRA3) DEFINE_SET_FRAME(burkes, DITHERING_BURKES) +DEFINE_SET_FRAME(atkinson, DITHERING_ATKINSON) static const set_frame_func set_frame_lut[NB_DITHERING] = { set_frame_none, @@ -904,6 +926,7 @@ static const set_frame_func set_frame_lut[NB_DITHERING] = { set_frame_sierra2_4a, set_frame_sierra3, set_frame_burkes, + set_frame_atkinson, }; static int dither_value(int p) From patchwork Fri Dec 30 11:34:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= X-Patchwork-Id: 39814 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp5490764pzb; Fri, 30 Dec 2022 03:35:48 -0800 (PST) X-Google-Smtp-Source: AMrXdXvfPB3oIy4LtYsJpPkDbj+xEqqMK8yRzIK/aL68+V8a0wj10cPEF6F0ZkTRlgstRAYM/RLm X-Received: by 2002:a05:6402:d5f:b0:482:2bbe:65d1 with SMTP id ec31-20020a0564020d5f00b004822bbe65d1mr19902241edb.31.1672400148372; Fri, 30 Dec 2022 03:35:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672400148; cv=none; d=google.com; s=arc-20160816; b=O3SOkgZgiiRoETe/4G122WFWk3gU9SnUvQXAO8mWyc+m7iz29tRVR4Sgbyc/ASsfd3 0Upz83PbSx8yQWWQAozEQJ56wKza3+3rr65hqNVjU3us1XK1R/5iiPkt4GazdzkUWvRW Xual5uXZd6WeYKSSANUK3Vdu0JUP7WwhluBN2xgHMS/N+1XdYV+5GM9nams08ZHF5gfx hffgfQhmvHud+nIXWLzPgkX2liX5aSnyb/T8KIJlKQ5USsaCC4tHeVZPx+LPBhSicRsC CCvEK3GWH2rrCAR9ARNgcP14BIk5eoXdmEmcRuFgaYot//VdeDutE1W/5ZmqQm7udfFr EdsA== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=CLDZn2yL8mB6IXmhsM4Z1YJl43YbFMhcMCEP0ApG4Bs=; b=dGdJciN3jGR3iq1/GXiscq0tNYA+ru6NKRcCmkp893nRbmCZgukUuZtPIhEY3XA4GN 9fsFOpMF0tGglBCyfzW4zen0R8XjZUsZfSk7DI58nLAQr5AthiIHUQMGoiL6K3/gCm2N YYLBj5xC67GJOZqGL+ywtW7oNfdxvnt3lvms/+VGZit8LU0lbwe4gh6bQJ6GCSDpgYwp AaiFp5guO0294PogKOolSEsjDKrPA8nuVgzuuzx2I3fv2X8+MRmUjSKlJfihnq6d3+0p HwcIoXOPlPI3HcCX0E50/i0jT6x96cH3SLwzr3ZfhDiW4j7VSjoYDWBGTT000NUHo+TZ s00Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@pkh.me header.s=selector1 header.b=VR8qUn69; 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=NONE dis=NONE) header.from=pkh.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id he7-20020a1709073d8700b007da4fe085d4si19837811ejc.694.2022.12.30.03.35.48; Fri, 30 Dec 2022 03:35:48 -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=@pkh.me header.s=selector1 header.b=VR8qUn69; 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=NONE dis=NONE) header.from=pkh.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 610D968BAB3; Fri, 30 Dec 2022 13:35:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from ssq0.pkh.me (unknown [92.154.28.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id ECD6168BA5C for ; Fri, 30 Dec 2022 13:35:08 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pkh.me; s=selector1; t=1672400098; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qDe7f8UCwzRhdymEmaWu5sD9bHhSSqcwXUBbyBViZF4=; b=VR8qUn69Ur+p+mKYmLeKqfqOUPiPQqoGy6Ei73h2CMBhI7T5gl2nqiteVIsGOnGbnYf4+u zvhGcaPBjzDUPyIP057vviPMWgPMxWD+GLWedGLvPxi94kBek5gjOJlsk1cKYv2dnT+CJc KIelmVAU42TZE1a2JjdeYGN1YHMlIvA= Received: from localhost (ssq0.pkh.me [local]) by ssq0.pkh.me (OpenSMTPD) with ESMTPA id 6e2ae615; Fri, 30 Dec 2022 11:34:58 +0000 (UTC) From: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Dec 2022 12:34:55 +0100 Message-Id: <20221230113455.2632289-5-u@pkh.me> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221230113455.2632289-1-u@pkh.me> References: <20221230113455.2632289-1-u@pkh.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] avfilter/paletteuse: use explicit key indexes in set_frame_lut 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: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hXau6wnIZich --- libavfilter/vf_paletteuse.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libavfilter/vf_paletteuse.c b/libavfilter/vf_paletteuse.c index 252ad746f0..944ff5c74d 100644 --- a/libavfilter/vf_paletteuse.c +++ b/libavfilter/vf_paletteuse.c @@ -918,15 +918,15 @@ DEFINE_SET_FRAME(burkes, DITHERING_BURKES) DEFINE_SET_FRAME(atkinson, DITHERING_ATKINSON) static const set_frame_func set_frame_lut[NB_DITHERING] = { - set_frame_none, - set_frame_bayer, - set_frame_heckbert, - set_frame_floyd_steinberg, - set_frame_sierra2, - set_frame_sierra2_4a, - set_frame_sierra3, - set_frame_burkes, - set_frame_atkinson, + [DITHERING_NONE] = set_frame_none, + [DITHERING_BAYER] = set_frame_bayer, + [DITHERING_HECKBERT] = set_frame_heckbert, + [DITHERING_FLOYD_STEINBERG] = set_frame_floyd_steinberg, + [DITHERING_SIERRA2] = set_frame_sierra2, + [DITHERING_SIERRA2_4A] = set_frame_sierra2_4a, + [DITHERING_SIERRA3] = set_frame_sierra3, + [DITHERING_BURKES] = set_frame_burkes, + [DITHERING_ATKINSON] = set_frame_atkinson, }; static int dither_value(int p)