diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-12-18 05:23:57 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-12-18 06:04:44 +0400 |
commit | 1bdc212a39312bd5914d643a4e664b4599477d8c (patch) | |
tree | 19fcd489c7ec86908e240f1d6f6752d587dc97e7 /libswscale | |
parent | 1a2484fc4e5c5effc32c55c2f25670ec23cbf57b (diff) | |
parent | 0ea5b44275aa334528eb384a6548cc9f98c50a17 (diff) |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
build: link test programs with static libraries
dct-test: remove unused variable cropTbl
swscale: fix overflow in gray16 vertical scaling.
get_bits: remove LAST_SKIP_CACHE macro
swscale: fix integer overflows in RGB pixel writing.
swscale: add endian conversion for RGB555 and RGB444 pixel formats
swscale: fix overflows in output of RGB48 pixels.
get_bits: remove strange/obsolete comments
get_bits: whitespace (mostly) cosmetics
swscale: add rgb565 endianess conversion
get_bits: remove unnecessary #includes
mp3dec: hack: fix decoding with safe bitstream reader
fate: fix eatqi test
adpcm: Check for channels to be a non-zero integer
swscale: fix overflows in RGB rounding constants.
get_bits: introduce safe bitreading to prevent overreads.
Conflicts:
libswscale/swscale.c
libswscale/swscale_unscaled.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswscale')
-rw-r--r-- | libswscale/swscale.c | 35 | ||||
-rw-r--r-- | libswscale/swscale_unscaled.c | 27 |
2 files changed, 36 insertions, 26 deletions
diff --git a/libswscale/swscale.c b/libswscale/swscale.c index ca444b2669..72f6d58144 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -483,8 +483,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]; @@ -492,12 +492,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); } } @@ -851,8 +849,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; @@ -868,7 +866,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; @@ -1015,8 +1015,8 @@ YUV2PACKED16WRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE) YUV2PACKED16WRAPPER(yuv2, rgb48, bgr48le, PIX_FMT_BGR48LE) static av_always_inline void -yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2, - int U, int V, int A1, int A2, +yuv2rgb_write(uint8_t *_dest, int i, unsigned Y1, unsigned Y2, + unsigned U, unsigned V, unsigned A1, unsigned A2, const void *_r, const void *_g, const void *_b, int y, enum PixelFormat target, int hasAlpha) { @@ -1553,8 +1553,8 @@ rgb16_32ToY_c_template(int16_t *dst, const uint8_t *src, int maskr, int maskg, int maskb, int rsh, int gsh, int bsh, int S) { - const int ry = RY << rsh, gy = GY << gsh, by = BY << bsh, - rnd = (32<<((S)-1)) + (1<<(S-7)); + const int ry = RY << rsh, gy = GY << gsh, by = BY << bsh; + const unsigned rnd = (32<<((S)-1)) + (1<<(S-7)); int i; for (i = 0; i < width; i++) { @@ -1576,8 +1576,8 @@ rgb16_32ToUV_c_template(int16_t *dstU, int16_t *dstV, int rsh, int gsh, int bsh, int S) { const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh, - rv = RV << rsh, gv = GV << gsh, bv = BV << bsh, - rnd = (256<<((S)-1)) + (1<<(S-7)); + rv = RV << rsh, gv = GV << gsh, bv = BV << bsh; + const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7)); int i; for (i = 0; i < width; i++) { @@ -1601,7 +1601,8 @@ rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV, { const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh, rv = RV << rsh, gv = GV << gsh, bv = BV << bsh, - rnd = (256U<<(S)) + (1<<(S-6)), maskgx = ~(maskr | maskb); + maskgx = ~(maskr | maskb); + const unsigned rnd = (256U<<(S)) + (1<<(S-6)); int i; maskr |= maskr << 1; maskb |= maskb << 1; maskg |= maskg << 1; diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index 1065d79fc9..fcb926b311 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -667,6 +667,12 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[ return srcSliceH; } + +#define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt) \ + ((src_fmt == pix_fmt ## BE && dst_fmt == pix_fmt ## LE) || \ + (src_fmt == pix_fmt ## LE && dst_fmt == pix_fmt ## BE)) + + void ff_get_unscaled_swscale(SwsContext *c) { const enum PixelFormat srcFormat = c->srcFormat; @@ -697,15 +703,6 @@ void ff_get_unscaled_swscale(SwsContext *c) if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND)) c->swScale= bgr24ToYv12Wrapper; - /* bswap 16 bits per component packed formats */ - if ((srcFormat == PIX_FMT_RGB48LE && dstFormat == PIX_FMT_RGB48BE) || - (srcFormat == PIX_FMT_RGB48BE && dstFormat == PIX_FMT_RGB48LE) || - (srcFormat == PIX_FMT_BGR48LE && dstFormat == PIX_FMT_BGR48BE) || - (srcFormat == PIX_FMT_BGR48BE && dstFormat == PIX_FMT_BGR48LE) || - (srcFormat == PIX_FMT_GRAY16LE && dstFormat == PIX_FMT_GRAY16BE) || - (srcFormat == PIX_FMT_GRAY16BE && dstFormat == PIX_FMT_GRAY16LE)) - c->swScale = packed_16bpc_bswap; - /* RGB/BGR -> RGB/BGR (no dither needed forms) */ if ( isAnyRGB(srcFormat) && isAnyRGB(dstFormat) @@ -735,6 +732,18 @@ void ff_get_unscaled_swscale(SwsContext *c) if (isAnyRGB(srcFormat) && isPlanar(srcFormat) && isByteRGB(dstFormat)) c->swScale= planarRgbToRgbWrapper; + /* bswap 16 bits per pixel/component packed formats */ + if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_BGR444) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_BGR48) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_BGR555) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_BGR565) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_GRAY16) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_RGB444) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_RGB48) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_RGB555) || + IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_RGB565)) + c->swScale = packed_16bpc_bswap; + if (usePal(srcFormat) && isByteRGB(dstFormat)) c->swScale= palToRgbWrapper; |