Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Niklas Haas <ffmpeg@haasn.xyz>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [RFC] swscale dithering
Date: Tue, 25 Mar 2025 02:59:25 +0100
Message-ID: <20250325025925.GB1438997@haasn.xyz> (raw)
In-Reply-To: <20250324200446.GT4991@pb2>

On Mon, 24 Mar 2025 21:04:46 +0100 Michael Niedermayer <michael@niedermayer.cc> wrote:
> Hi Niklas
> 
> On Mon, Mar 24, 2025 at 01:43:19PM +0100, Niklas Haas wrote:
> > Hi all,
> > 
> > As part of my ongoing swscale rewrite, we have both the opportunity and the
> > need to make a central decision about how to apply rounding and/or dithering.
> > 
> > Some particular cases I want to point out and gather feedback on include:
> > 
> 
> all IMHO:
> 
> 
> > 1. Should we dither and/or accurately round when scaling up full range
> >    content? For example, say you are converting from full-range rgb24 to
> 
> by default, yes
> 
> 
> [...]
> 
> > 2. At what bit depth does dithering become negligible? For context, the
> 
> I think we should consistently always apply it by default
> 
> also especially if someone does work with lets say 32bit, that person has
> some strange requirements already and direct human vison may not be it.
> 
> 
> [...]
> 
> > 3. Should we dither per-channel after conversion from grayscale to RGB? For
> 
> in general, yes
> 
> 
> [...]
> > 
> > 3. What should we make of the SWS_ACCURATE_RND and SWS_BITEXACT flags? I am
> >    personally thinking that SWS_BITEXACT should become a no-op flag, with
> >    bit exact output being the default behavior of all new implementations.
> >    But What about SWS_ACCURATE_RND?
> > 
> >    I am thinking that SWS_ACCURATE_RND should essentially be the switch that
> >    toggles our preferred resolution of question 1. So in other words, with
> >    SWS_ACCURATE_RND specified, full range upconversions should go through an
> >    accurate dither pass, while being relaxed to the simple (x << 2) | (x >> 6)
> >    upconversion in the absence of this flag.
> > 
> >    How should this flag relate to question 2? With the flag specified, I am
> >    thinking that we should also force dithering even at 16 bit depth, and
> >    skip dithering in this case only in the flag's absence. If so, what
> >    bit depth should the cutoff threshold be, for when to skip accurate
> >    dithering? I am thinking to simply use the 12/14 bit SDR/HDR threshold as
> >    appropriate for the content type.
> > 
> > This would lead to the following conversions, as an illustration:
> > 
> > SWS_ACCURATE_RND specified:
> > 
> > - rgb24 -> yuv420p10:       full dithering
> > - rgb24 -> yuv420p12:       full dithering
> > - rgb24 -> rgb30:           full dithering
> > - rgb24 -> rgba64:          full dithering
> > - yuva444p -> yuva444p10:   scale YUV, dither alpha
> > - yuva444p14 -> yuva444p16: scale YUV, dither alpha
> > - yuv444p10 -> yuv444p14:   left shift, no dithering needed
> > 
> > SWS_ACCURATE_RND absent:
> > 
> > - rgb24 -> yuv420p10:       full dithering
> > - rgb24 -> yuv420p12:       truncate if SDR, full dithering if HDR
> > - rgb24 -> rgb30:           truncate
> > - rgb24 -> rgba64:          truncate
> > - yuva444p -> yuva444p10:   left shift YUV, truncate alpha
> > - yuva444p14 -> yuva444p16: left shift YUV, truncate alpha
> > 
> > Does this seem reasonable?
> 
> IMHO in the accurate mode, dither should always be on
> its also easier to understand

That seems reasonable. It does mean some conversions are necessarily going
to get slower than the status quo.

> 
> but there could be a flag for vissual percetion
> 
> SWS_VISSUAL_PERCEPTION (or some better name)
> some flag that uses less accurate and faster operations when their
> effect is expected to be vissually impercivable

This could be the behavior of SWS_DITHER_AUTO, which is not clearly defined
either way.

In a much earlier thread we discussed the idea of adding quality "presets",
which seems like a good thing to consider as well.

How about this proposal?

1. SWS_ACCURATE_RND is added to the default flags.
2. When SWS_ACCURATE_RND is absent, the implementation may truncate instead
   of rounding; to enable e.g. fast alpha upconversions.
3. SWS_DITHER_AUTO implies dithering only when the result is visually needed,
   and skips dithering otherwise
4. When a specific dither mode is requested, dithering is always performed,
   at whatever bit depth.

Tying this into the quality presets, I suggest the "default" quality prefix
imply (accurate_rnd + dither=auto). One of the "slower" presets could
always enable dithering, while one of the "faster" presets could skip
accurate rounding.

> 
> thx
> 
> [...]
> 
> -- 
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> 
> I have often repented speaking, but never of holding my tongue.
> -- Xenocrates
> _______________________________________________
> 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".
_______________________________________________
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".

  reply	other threads:[~2025-03-25  1:59 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-24 12:43 Niklas Haas
2025-03-24 20:04 ` Michael Niedermayer
2025-03-25  1:59   ` Niklas Haas [this message]
2025-03-28 20:08     ` Michael Niedermayer

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=20250325025925.GB1438997@haasn.xyz \
    --to=ffmpeg@haasn.xyz \
    --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