diff options
author | Clément Bœsch <u@pkh.me> | 2016-02-26 22:32:04 +0100 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2016-02-27 11:13:26 +0100 |
commit | f9987464cff3bb766107509964b97116996ad3f8 (patch) | |
tree | a7f8a76c13aee7369411f38562dfe18608e0c839 | |
parent | 5156578d1f486163d5b83f1d63246cd23d107933 (diff) | |
download | ffmpeg-streaming-f9987464cff3bb766107509964b97116996ad3f8.zip ffmpeg-streaming-f9987464cff3bb766107509964b97116996ad3f8.tar.gz |
sws/yuv2rgb: avoid a few ub on signed left shifts
-rw-r--r-- | libswscale/yuv2rgb.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c index 3671fe3..9d79d79 100644 --- a/libswscale/yuv2rgb.c +++ b/libswscale/yuv2rgb.c @@ -824,18 +824,18 @@ av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], c->ugCoeff = roundToInt16(cgu * 8192) * 0x0001000100010001ULL; c->yOffset = roundToInt16(oy * 8) * 0x0001000100010001ULL; - c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy << 13); - c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy << 9); - c->yuv2rgb_v2r_coeff = (int16_t)roundToInt16(crv << 13); - c->yuv2rgb_v2g_coeff = (int16_t)roundToInt16(cgv << 13); - c->yuv2rgb_u2g_coeff = (int16_t)roundToInt16(cgu << 13); - c->yuv2rgb_u2b_coeff = (int16_t)roundToInt16(cbu << 13); + c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy * (1 << 13)); + c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy * (1 << 9)); + c->yuv2rgb_v2r_coeff = (int16_t)roundToInt16(crv * (1 << 13)); + c->yuv2rgb_v2g_coeff = (int16_t)roundToInt16(cgv * (1 << 13)); + c->yuv2rgb_u2g_coeff = (int16_t)roundToInt16(cgu * (1 << 13)); + c->yuv2rgb_u2b_coeff = (int16_t)roundToInt16(cbu * (1 << 13)); //scale coefficients by cy - crv = ((crv << 16) + 0x8000) / FFMAX(cy, 1); - cbu = ((cbu << 16) + 0x8000) / FFMAX(cy, 1); - cgu = ((cgu << 16) + 0x8000) / FFMAX(cy, 1); - cgv = ((cgv << 16) + 0x8000) / FFMAX(cy, 1); + crv = ((crv * (1 << 16)) + 0x8000) / FFMAX(cy, 1); + cbu = ((cbu * (1 << 16)) + 0x8000) / FFMAX(cy, 1); + cgu = ((cgu * (1 << 16)) + 0x8000) / FFMAX(cy, 1); + cgv = ((cgv * (1 << 16)) + 0x8000) / FFMAX(cy, 1); av_freep(&c->yuvTable); |