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 4ED2A42C44 for ; Fri, 30 Dec 2022 11:35:27 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 11E1368B612; Fri, 30 Dec 2022 13:35:11 +0200 (EET) 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?q?Cl=C3=A9ment=20B=C5=93sch?= 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?q?Cl=C3=A9ment=20B=C5=93sch?= 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: 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) -- 2.39.0 _______________________________________________ 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".