mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-06-08 16:50:26 +02:00
0c1a1ee12e
In an op list like:
[ u8 +XXX] SWS_OP_READ : 1 elem(s) planar >> 3
[ u8 .XXX] SWS_OP_FILTER_V : 256 -> 320 bilinear (2 taps)
[f32 .XXX] SWS_OP_SCALE : * 65535
[f32 +XXX] SWS_OP_CONVERT : f32 -> u16
[u16 zXXX] SWS_OP_SWAP_BYTES
[u16 zzzX] SWS_OP_SWIZZLE : 0003
[u16 zzz+] SWS_OP_CLEAR : {_ _ _ 65535}
[u16 XXXX] SWS_OP_WRITE : 4 elem(s) packed >> 0
The current version of the code would happily push the SWS_OP_SCALE past
the truncating conversion, leading to degenerate loss of information. (In
this case, the result was quite extreme)
Affects quality across a wide range of formats, e.g.:
rgb24 16x16 -> rgb48be 16x32:
[ u8 +++X] SWS_OP_READ : 3 elem(s) packed >> 0
min: {0 0 0 _}, max: {255 255 255 _}
[ u8 ...X] SWS_OP_FILTER_V : 16 -> 32 bilinear (2 taps)
min: {0 0 0 _}, max: {255 255 255 _}
+ [f32 ...X] SWS_OP_SCALE : * 257
+ min: {0 0 0 _}, max: {65535 65535 65535 _}
[f32 +++X] SWS_OP_CONVERT : f32 -> u16
- min: {0 0 0 _}, max: {255 255 255 _}
- [u16 +++X] SWS_OP_SCALE : * 257
min: {0 0 0 _}, max: {65535 65535 65535 _}
[u16 zzzX] SWS_OP_SWAP_BYTES
min: {0 0 0 _}, max: {65535 65535 65535 _}
[u16 XXXX] SWS_OP_WRITE : 3 elem(s) packed >> 0
(X = unused, z = byteswapped, + = exact, 0 = zero)
Signed-off-by: Niklas Haas <git@haasn.dev>