[FFmpeg-devel] [PATCH 4/8] avfilter/vf_scale: properly respect to input colorimetry

Niklas Haas ffmpeg at haasn.xyz
Sat Oct 28 14:18:17 EEST 2023


On Sat, 28 Oct 2023 12:50:14 +0200 Niklas Haas <ffmpeg at haasn.xyz> wrote:
> On Fri, 27 Oct 2023 23:01:25 +0200 Michael Niedermayer <michael at niedermayer.cc> wrote:
> > On Fri, Oct 27, 2023 at 07:04:42PM +0200, Niklas Haas wrote:
> > > From: Niklas Haas <git at haasn.dev>
> > > 
> > > This code, as written, skips sws_init_context if scale->in_range was not
> > > set, even if scale->in_frame_range is set to something. So this would
> > > hit the 'no sws context' fast path in scale_frame and skip color range
> > > conversion even where technically required. This had the effect of, in
> > > practice, effectively applying limited/full range conversion if and only
> > > if you set e.g. a nonzero yuv color matrix, which is obviously
> > > undesirable behavior.
> > > 
> > > Second, the assignment of out->color_range inside the branch would fail
> > > to properly propagate tags for any actually applied conversion, for
> > > example on conversion to a forced full range format.
> > > 
> > > Solve both of these problems and make the code much easier to understand
> > > and follow by doing the following:
> > > 
> > > 1. Always initialize sws context on get_props
> > > 2. Always use sws_getColorspaceDetails + sws_setColorspaceDetails to
> > >    fix the conversion matrices per-frame.
> > > 3. Rather than testing if the context exists, do the no-op test after
> > >    settling the above values and deciding what conversion to actually
> > >    perform.
> > > ---
> > >  libavfilter/vf_scale.c | 186 +++++++++++++++++------------------------
> > >  1 file changed, 76 insertions(+), 110 deletions(-)
> > 
> > This breaks
> > tickets/2939/lena.jpg
> > 
> > (color looks slightly wrong compared to reference lena image)
> 
> How do I reproduce this? I tested with:
> 
>   ffmpeg -i lena.jpg lena.png
> 
> But the resulting checksum was identical before and after this commit.

Nvm, I see the issue. Actually, the bug is in patch 1 - the logic is
insufficient to cover all cases, since ff_sws_init_range_convert is
never re-called after changing range.

I will rewrite that commit, which should fix this one also.


More information about the ffmpeg-devel mailing list