mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
swscale: fix overflows in output of RGB48 pixels.
For certain types of filters where the intermediate sum of coefficients can go above the fixed-point equivalent of 1.0 in the middle of a filter, the sum of a 31-bit calculation can overflow in both directions and can thus not be represented in a 32-bit signed or unsigned integer. To work around this, we subtract 0x40000000 from a signed integer base, so that we're halfway signed/unsigned, which makes it fit even if it overflows. After the filter finishes, we add the scaled bias back after a shift. We use the same trick for 16-bit bpc YUV output routines. Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
parent
5d8122db5c
commit
be1bafc303
@ -754,8 +754,8 @@ yuv2rgb48_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
||||
|
||||
for (i = 0; i < (dstW >> 1); i++) {
|
||||
int j;
|
||||
int Y1 = 0;
|
||||
int Y2 = 0;
|
||||
int Y1 = -0x40000000;
|
||||
int Y2 = -0x40000000;
|
||||
int U = -128 << 23; // 19
|
||||
int V = -128 << 23;
|
||||
int R, G, B;
|
||||
@ -771,7 +771,9 @@ yuv2rgb48_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
||||
|
||||
// 8bit: 12+15=27; 16-bit: 12+19=31
|
||||
Y1 >>= 14; // 10
|
||||
Y1 += 0x10000;
|
||||
Y2 >>= 14;
|
||||
Y2 += 0x10000;
|
||||
U >>= 14;
|
||||
V >>= 14;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user