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 1/4] avfilter/paletteuse: add sierra3 dithering Date: Fri, 30 Dec 2022 12:34:52 +0100 Message-ID: <20221230113455.2632289-2-u@pkh.me> (raw) In-Reply-To: <20221230113455.2632289-1-u@pkh.me> 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) -- 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 ` Clément Bœsch [this message] 2022-12-30 11:34 ` [FFmpeg-devel] [PATCH 2/4] avfilter/paletteuse: add burkes dithering Clément Bœsch 2022-12-30 11:34 ` [FFmpeg-devel] [PATCH 3/4] avfilter/paletteuse: add atkinson dithering Clément Bœsch 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-2-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