mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-20 06:20:40 +00:00
swscale: fix overflow in gray16 vertical scaling.
This fixes the same overflow as in the RGB48/16-bit YUV scaling; some filters can overflow both negatively and positively (e.g. spline/lanczos), so we bias a signed integer so it's "half signed" and "half unsigned", and can cover overflows in both directions while maintaining full 31-bit depth. Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
parent
86a10281c7
commit
72dafea0fc
@ -386,8 +386,8 @@ yuv2gray16_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
||||
|
||||
for (i = 0; i < (dstW >> 1); i++) {
|
||||
int j;
|
||||
int Y1 = 1 << 14;
|
||||
int Y2 = 1 << 14;
|
||||
int Y1 = (1 << 14) - 0x40000000;
|
||||
int Y2 = (1 << 14) - 0x40000000;
|
||||
|
||||
for (j = 0; j < lumFilterSize; j++) {
|
||||
Y1 += lumSrc[j][i * 2] * lumFilter[j];
|
||||
@ -395,12 +395,10 @@ yuv2gray16_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
||||
}
|
||||
Y1 >>= 15;
|
||||
Y2 >>= 15;
|
||||
if ((Y1 | Y2) & 0x10000) {
|
||||
Y1 = av_clip_uint16(Y1);
|
||||
Y2 = av_clip_uint16(Y2);
|
||||
}
|
||||
output_pixel(&dest[i * 2 + 0], Y1);
|
||||
output_pixel(&dest[i * 2 + 1], Y2);
|
||||
Y1 = av_clip_int16(Y1);
|
||||
Y2 = av_clip_int16(Y2);
|
||||
output_pixel(&dest[i * 2 + 0], 0x8000 + Y1);
|
||||
output_pixel(&dest[i * 2 + 1], 0x8000 + Y2);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user