Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 18 Dec 2011 01:23:57 +0000 (02:23 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 18 Dec 2011 02:04:44 +0000 (03:04 +0100)
* 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>
12 files changed:
1  2 
configure
libavcodec/adpcm.c
libavcodec/dct-test.c
libavcodec/get_bits.h
libavcodec/mpeg4videodec.c
libavcodec/mpegaudiodec.c
libavcodec/msmpeg4.c
libavcodec/wmavoice.c
library.mak
libswscale/swscale.c
libswscale/swscale_unscaled.c
tests/fate.mak

diff --cc configure
+++ b/configure
@@@ -109,13 -107,15 +109,16 @@@ Configuration options
    --disable-lpc            disable LPC code
    --disable-mdct           disable MDCT code
    --disable-rdft           disable RDFT code
 -  --enable-vaapi           enable VAAPI code
 -  --enable-vda             enable VDA code
 -  --enable-vdpau           enable VDPAU code
 +  --enable-vaapi           enable VAAPI code [autodetect]
 +  --enable-vda             enable VDA code [autodetect]
 +  --enable-vdpau           enable VDPAU code [autodetect]
    --disable-dxva2          disable DXVA2 code
 +  --disable-vda            disable VDA code
    --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
    --enable-hardcoded-tables use hardcoded tables instead of runtime generation
+   --disable-safe-bitstream-reader
+                            disable buffer boundary checking in bitreaders
+                            (faster, but may crash)
    --enable-memalign-hack   emulate memalign, interferes with memory debuggers
    --disable-everything     disable all components listed below
    --disable-encoder=NAME   disable encoder NAME
Simple merge
Simple merge
@@@ -41,6 -53,9 +53,7 @@@ typedef struct GetBitContext 
      const uint8_t *buffer, *buffer_end;
      int index;
      int size_in_bits;
 -#if !UNCHECKED_BITSTREAM_READER
+     int size_in_bits_plus8;
 -#endif
  } GetBitContext;
  
  #define VLC_TYPE int16_t
@@@ -108,38 -120,46 +118,46 @@@ for examples see get_bits, show_bits, s
  #   define MIN_CACHE_BITS 25
  #endif
  
- #   define OPEN_READER(name, gb)                \
+ #define OPEN_READER(name, gb)                   \
      unsigned int name##_index = (gb)->index;    \
 -    unsigned int av_unused name##_cache = 0
 +    av_unused unsigned int name##_cache
  
- #   define CLOSE_READER(name, gb) (gb)->index = name##_index
+ #define CLOSE_READER(name, gb) (gb)->index = name##_index
+ #ifdef ALT_BITSTREAM_READER_LE
  
- # ifdef ALT_BITSTREAM_READER_LE
  # ifdef LONG_BITSTREAM_READER
- #   define UPDATE_CACHE(name, gb) \
-     name##_cache = AV_RL64((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07)
+ #   define UPDATE_CACHE(name, gb) name##_cache = \
+         AV_RL64((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7)
  # else
- #   define UPDATE_CACHE(name, gb) \
-     name##_cache = AV_RL32((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07)
+ #   define UPDATE_CACHE(name, gb) name##_cache = \
+         AV_RL32((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7)
  # endif
  
- #   define SKIP_CACHE(name, gb, num) name##_cache >>= (num)
- # else
+ # define SKIP_CACHE(name, gb, num) name##_cache >>= (num)
+ #else
  # ifdef LONG_BITSTREAM_READER
- #   define UPDATE_CACHE(name, gb) \
-     name##_cache = AV_RB64((gb)->buffer+(name##_index >> 3)) >> (32 - (name##_index & 0x07))
+ #   define UPDATE_CACHE(name, gb) name##_cache = \
+         AV_RB64((gb)->buffer + (name##_index >> 3)) >> (32 - (name##_index & 7))
  # else
- #   define UPDATE_CACHE(name, gb) \
-     name##_cache = AV_RB32((gb)->buffer+(name##_index>>3)) << (name##_index&0x07)
+ #   define UPDATE_CACHE(name, gb) name##_cache = \
+         AV_RB32((gb)->buffer + (name##_index >> 3)) << (name##_index & 7)
  # endif
  
- #   define SKIP_CACHE(name, gb, num) name##_cache <<= (num)
- # endif
+ # define SKIP_CACHE(name, gb, num) name##_cache <<= (num)
  
- // FIXME name?
+ #endif
+ #if UNCHECKED_BITSTREAM_READER
  #   define SKIP_COUNTER(name, gb, num) name##_index += (num)
+ #else
+ #   define SKIP_COUNTER(name, gb, num) \
+     name##_index = FFMIN((gb)->size_in_bits_plus8, name##_index + (num))
+ #endif
  
- #   define SKIP_BITS(name, gb, num) do {        \
+ #define SKIP_BITS(name, gb, num) do {           \
          SKIP_CACHE(name, gb, num);              \
          SKIP_COUNTER(name, gb, num);            \
      } while (0)
@@@ -314,6 -347,9 +345,7 @@@ static inline void init_get_bits(GetBit
  
      s->buffer       = buffer;
      s->size_in_bits = bit_size;
 -#if !UNCHECKED_BITSTREAM_READER
+     s->size_in_bits_plus8 = bit_size + 8;
 -#endif
      s->buffer_end   = buffer + buffer_size;
      s->index        = 0;
  }
Simple merge
@@@ -24,6 -24,6 +24,8 @@@
   * MPEG Audio decoder
   */
  
++#define UNCHECKED_BITSTREAM_READER 1
++
  #include "libavutil/audioconvert.h"
  #include "avcodec.h"
  #include "get_bits.h"
Simple merge
Simple merge
diff --cc library.mak
Simple merge
@@@ -1553,8 -1456,8 +1553,8 @@@ rgb16_32ToY_c_template(int16_t *dst, co
                         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 = 33u << (S - 1);
++    const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
      int i;
  
      for (i = 0; i < width; i++) {
@@@ -1576,8 -1479,8 +1576,8 @@@ rgb16_32ToUV_c_template(int16_t *dstU, 
                          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 = 257u << (S - 1);
++    const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
      int i;
  
      for (i = 0; i < width; i++) {
@@@ -1601,7 -1504,8 +1601,8 @@@ rgb16_32ToUV_half_c_template(int16_t *d
  {
      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 = 257u << S;
++    const unsigned rnd = (256U<<(S)) + (1<<(S-6));
      int i;
  
      maskr |= maskr << 1; maskb |= maskb << 1; maskg |= maskg << 1;
@@@ -724,18 -742,25 +721,30 @@@ void ff_get_unscaled_swscale(SwsContex
          && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT))))
          c->swScale= rgbToRgbWrapper;
  
 -    if ((usePal(srcFormat) && (
 -        dstFormat == PIX_FMT_RGB32   ||
 -        dstFormat == PIX_FMT_RGB32_1 ||
 -        dstFormat == PIX_FMT_RGB24   ||
 -        dstFormat == PIX_FMT_BGR32   ||
 -        dstFormat == PIX_FMT_BGR32_1 ||
 -        dstFormat == PIX_FMT_BGR24)))
 +#define isByteRGB(f) (\
 +        f == PIX_FMT_RGB32   ||\
 +        f == PIX_FMT_RGB32_1 ||\
 +        f == PIX_FMT_RGB24   ||\
 +        f == PIX_FMT_BGR32   ||\
 +        f == PIX_FMT_BGR32_1 ||\
 +        f == PIX_FMT_BGR24)
 +
 +    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;
  
      if (srcFormat == PIX_FMT_YUV422P) {
diff --cc tests/fate.mak
Simple merge