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

Niklas Haas ffmpeg at haasn.xyz
Sat Oct 28 13:50:14 EEST 2023


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.


More information about the ffmpeg-devel mailing list