From: "Clément Bœsch" <u@pkh.me>
To: ffmpeg-devel@ffmpeg.org
Cc: "Clément Bœsch" <u@pkh.me>
Subject: [FFmpeg-devel] [PATCH 3/4] avfilter/paletteuse: add atkinson dithering
Date: Fri, 30 Dec 2022 12:34:54 +0100
Message-ID: <20221230113455.2632289-4-u@pkh.me> (raw)
In-Reply-To: <20221230113455.2632289-1-u@pkh.me>
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)
--
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".
next prev parent reply other threads:[~2022-12-30 11:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-30 11:34 [FFmpeg-devel] 3 more dithering mode in paletteuse Clément Bœsch
2022-12-30 11:34 ` [FFmpeg-devel] [PATCH 1/4] avfilter/paletteuse: add sierra3 dithering Clément Bœsch
2022-12-30 11:34 ` [FFmpeg-devel] [PATCH 2/4] avfilter/paletteuse: add burkes dithering Clément Bœsch
2022-12-30 11:34 ` Clément Bœsch [this message]
2022-12-30 11:34 ` [FFmpeg-devel] [PATCH 4/4] avfilter/paletteuse: use explicit key indexes in set_frame_lut Clément Bœsch
2022-12-30 11:49 ` [FFmpeg-devel] 3 more dithering mode in paletteuse Clément Bœsch
2023-01-03 16:31 ` Clément Bœsch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221230113455.2632289-4-u@pkh.me \
--to=u@pkh.me \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git