mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-16 11:47:04 +00:00
swscale/input: Use more unsigned intermediates
Same principle as previous commit, with sufficiently huge rgb2yuv table values this produces wrong results and undefined behavior. The unsigned produces the same incorrect results. That is probably ok as these cases with huge values seem not to occur in any real use case. Fixes: signed integer overflow Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
ce566281f9
commit
ba209e3d51
@ -84,9 +84,9 @@ rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
|
||||
int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
|
||||
av_assert1(src1==src2);
|
||||
for (i = 0; i < width; i++) {
|
||||
int r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
|
||||
int g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
|
||||
int b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
|
||||
unsigned r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
|
||||
unsigned g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
|
||||
unsigned b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
|
||||
|
||||
dstU[i]= (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
|
||||
dstV[i]= (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
|
||||
@ -158,9 +158,9 @@ static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
|
||||
int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
|
||||
av_assert1(src1 == src2);
|
||||
for (i = 0; i < width; i++) {
|
||||
int r_b = input_pixel(&src1[i * 3 + 0]);
|
||||
int g = input_pixel(&src1[i * 3 + 1]);
|
||||
int b_r = input_pixel(&src1[i * 3 + 2]);
|
||||
unsigned r_b = input_pixel(&src1[i * 3 + 0]);
|
||||
unsigned g = input_pixel(&src1[i * 3 + 1]);
|
||||
unsigned b_r = input_pixel(&src1[i * 3 + 2]);
|
||||
|
||||
dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
|
||||
dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
|
||||
@ -180,12 +180,12 @@ static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
|
||||
int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
|
||||
av_assert1(src1 == src2);
|
||||
for (i = 0; i < width; i++) {
|
||||
int r_b = (input_pixel(&src1[6 * i + 0]) +
|
||||
input_pixel(&src1[6 * i + 3]) + 1) >> 1;
|
||||
int g = (input_pixel(&src1[6 * i + 1]) +
|
||||
input_pixel(&src1[6 * i + 4]) + 1) >> 1;
|
||||
int b_r = (input_pixel(&src1[6 * i + 2]) +
|
||||
input_pixel(&src1[6 * i + 5]) + 1) >> 1;
|
||||
unsigned r_b = (input_pixel(&src1[6 * i + 0]) +
|
||||
input_pixel(&src1[6 * i + 3]) + 1) >> 1;
|
||||
unsigned g = (input_pixel(&src1[6 * i + 1]) +
|
||||
input_pixel(&src1[6 * i + 4]) + 1) >> 1;
|
||||
unsigned b_r = (input_pixel(&src1[6 * i + 2]) +
|
||||
input_pixel(&src1[6 * i + 5]) + 1) >> 1;
|
||||
|
||||
dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
|
||||
dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
|
||||
|
Loading…
Reference in New Issue
Block a user