On Fri, Oct 27, 2023 at 07:04:42PM +0200, Niklas Haas wrote: > From: Niklas Haas > > 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) [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Asymptotically faster algorithms should always be preferred if you have asymptotical amounts of data