Merge commit '91d305790ea0f6fe0f54b48236da42181c39c18b'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 2 Sep 2014 20:18:12 +0000 (22:18 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 2 Sep 2014 20:18:12 +0000 (22:18 +0200)
* commit '91d305790ea0f6fe0f54b48236da42181c39c18b':
  get_bits: Rename HAVE_BITS_REMAINING --> BITS_AVAILABLE

Conflicts:
libavcodec/golomb.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/get_bits.h
libavcodec/golomb.h

diff --combined libavcodec/get_bits.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -31,7 -31,6 +31,7 @@@
  #include "libavutil/common.h"
  #include "libavutil/intreadwrite.h"
  #include "libavutil/log.h"
 +#include "libavutil/avassert.h"
  #include "mathops.h"
  
  /*
@@@ -55,7 -54,9 +55,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
@@@ -113,9 -114,6 +113,9 @@@ typedef struct RL_VLC_ELEM 
   * LAST_SKIP_BITS(name, gb, num)
   *   Like SKIP_BITS, to be used if next call is UPDATE_CACHE or CLOSE_READER.
   *
 + * BITS_LEFT(name, gb)
 + *   Return the number of bits left
 + *
   * For examples see get_bits, show_bits, skip_bits, get_vlc.
   */
  
  #if UNCHECKED_BITSTREAM_READER
  #define OPEN_READER(name, gb)                   \
      unsigned int name ## _index = (gb)->index;  \
 -    unsigned int av_unused name ## _cache = 0
 +    unsigned int av_unused name ## _cache
  
- #define HAVE_BITS_REMAINING(name, gb) 1
+ #define BITS_AVAILABLE(name, gb) 1
  #else
  #define OPEN_READER(name, gb)                   \
      unsigned int name ## _index = (gb)->index;  \
      unsigned int av_unused name ## _cache = 0;  \
      unsigned int av_unused name ## _size_plus8 = (gb)->size_in_bits_plus8
  
- #define HAVE_BITS_REMAINING(name, gb) name ## _index < name ## _size_plus8
+ #define BITS_AVAILABLE(name, gb) name ## _index < name ## _size_plus8
  #endif
  
  #define CLOSE_READER(name, gb) (gb)->index = name ## _index
  
 +# ifdef LONG_BITSTREAM_READER
 +
 +# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
 +      AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
 +
 +# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
 +      AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7))
 +
 +#else
 +
 +# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
 +      AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
 +
 +# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
 +      AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7)
 +
 +#endif
 +
 +
  #ifdef BITSTREAM_READER_LE
  
 -# ifdef LONG_BITSTREAM_READER
 -#   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 & 7)
 -# endif
 +# define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb)
  
  # 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 & 7))
 -# else
 -#   define UPDATE_CACHE(name, gb) name ## _cache = \
 -        AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7)
 -# endif
 +# define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb)
  
  # define SKIP_CACHE(name, gb, num) name ## _cache <<= (num)
  
      name ## _index = FFMIN(name ## _size_plus8, name ## _index + (num))
  #endif
  
 +#define BITS_LEFT(name, gb) ((int)((gb)->size_in_bits - name ## _index))
 +
  #define SKIP_BITS(name, gb, num)                \
      do {                                        \
          SKIP_CACHE(name, gb, num);              \
  
  #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
  
 +#define SHOW_UBITS_LE(name, gb, num) zero_extend(name ## _cache, num)
 +#define SHOW_SBITS_LE(name, gb, num) sign_extend(name ## _cache, num)
 +
 +#define SHOW_UBITS_BE(name, gb, num) NEG_USR32(name ## _cache, num)
 +#define SHOW_SBITS_BE(name, gb, num) NEG_SSR32(name ## _cache, num)
 +
  #ifdef BITSTREAM_READER_LE
 -#   define SHOW_UBITS(name, gb, num) zero_extend(name ## _cache, num)
 -#   define SHOW_SBITS(name, gb, num) sign_extend(name ## _cache, num)
 +#   define SHOW_UBITS(name, gb, num) SHOW_UBITS_LE(name, gb, num)
 +#   define SHOW_SBITS(name, gb, num) SHOW_SBITS_LE(name, gb, num)
  #else
 -#   define SHOW_UBITS(name, gb, num) NEG_USR32(name ## _cache, num)
 -#   define SHOW_SBITS(name, gb, num) NEG_SSR32(name ## _cache, num)
 +#   define SHOW_UBITS(name, gb, num) SHOW_UBITS_BE(name, gb, num)
 +#   define SHOW_SBITS(name, gb, num) SHOW_SBITS_BE(name, gb, num)
  #endif
  
  #define GET_CACHE(name, gb) ((uint32_t) name ## _cache)
@@@ -223,7 -206,7 +223,7 @@@ static inline void skip_bits_long(GetBi
  }
  
  /**
 - * read mpeg1 dc style vlc (sign bit + mantisse with no MSB).
 + * read mpeg1 dc style vlc (sign bit + mantissa with no MSB).
   * if MSB not set it is negative
   * @param n length in bits
   */
@@@ -232,7 -215,6 +232,7 @@@ static inline int get_xbits(GetBitConte
      register int sign;
      register int32_t cache;
      OPEN_READER(re, s);
 +    av_assert2(n>0 && n<=25);
      UPDATE_CACHE(re, s);
      cache = GET_CACHE(re, s);
      sign  = ~cache >> 31;
@@@ -245,7 -227,6 +245,7 @@@ static inline int get_sbits(GetBitConte
  {
      register int tmp;
      OPEN_READER(re, s);
 +    av_assert2(n>0 && n<=25);
      UPDATE_CACHE(re, s);
      tmp = SHOW_SBITS(re, s, n);
      LAST_SKIP_BITS(re, s, n);
@@@ -260,7 -241,6 +260,7 @@@ static inline unsigned int get_bits(Get
  {
      register int tmp;
      OPEN_READER(re, s);
 +    av_assert2(n>0 && n<=25);
      UPDATE_CACHE(re, s);
      tmp = SHOW_UBITS(re, s, n);
      LAST_SKIP_BITS(re, s, n);
      return tmp;
  }
  
 +static inline unsigned int get_bits_le(GetBitContext *s, int n)
 +{
 +    register int tmp;
 +    OPEN_READER(re, s);
 +    av_assert2(n>0 && n<=25);
 +    UPDATE_CACHE_LE(re, s);
 +    tmp = SHOW_UBITS_LE(re, s, n);
 +    LAST_SKIP_BITS(re, s, n);
 +    CLOSE_READER(re, s);
 +    return tmp;
 +}
 +
  /**
   * Show 1-25 bits.
   */
@@@ -287,7 -255,6 +287,7 @@@ static inline unsigned int show_bits(Ge
  {
      register int tmp;
      OPEN_READER(re, s);
 +    av_assert2(n>0 && n<=25);
      UPDATE_CACHE(re, s);
      tmp = SHOW_UBITS(re, s, n);
      return tmp;
  static inline void skip_bits(GetBitContext *s, int n)
  {
      OPEN_READER(re, s);
 -    UPDATE_CACHE(re, s);
      LAST_SKIP_BITS(re, s, n);
      CLOSE_READER(re, s);
  }
@@@ -335,22 -303,20 +335,22 @@@ static inline void skip_bits1(GetBitCon
   */
  static inline unsigned int get_bits_long(GetBitContext *s, int n)
  {
 -    if (n <= MIN_CACHE_BITS) {
 +    if (!n) {
 +        return 0;
 +    } else if (n <= MIN_CACHE_BITS) {
          return get_bits(s, n);
      } else {
  #ifdef BITSTREAM_READER_LE
 -        int ret = get_bits(s, 16);
 +        unsigned ret = get_bits(s, 16);
          return ret | (get_bits(s, n - 16) << 16);
  #else
 -        int ret = get_bits(s, 16) << (n - 16);
 +        unsigned ret = get_bits(s, 16) << (n - 16);
          return ret | get_bits(s, n - 16);
  #endif
      }
  }
  
 -/*
 +/**
   * Read 0-64 bits.
   */
  static inline uint64_t get_bits64(GetBitContext *s, int n)
@@@ -412,8 -378,8 +412,8 @@@ static inline int init_get_bits(GetBitC
      int buffer_size;
      int ret = 0;
  
 -    if (bit_size > INT_MAX - 7 || bit_size < 0 || !buffer) {
 -        buffer_size = bit_size = 0;
 +    if (bit_size >= INT_MAX - 7 || bit_size < 0 || !buffer) {
 +        bit_size    = 0;
          buffer      = NULL;
          ret         = AVERROR_INVALIDDATA;
      }
  
      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;
  
  static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
                                   int byte_size)
  {
 -    if (byte_size > INT_MAX / 8)
 -        return AVERROR_INVALIDDATA;
 +    if (byte_size > INT_MAX / 8 || byte_size < 0)
 +        byte_size = -1;
      return init_get_bits(s, buffer, byte_size * 8);
  }
  
@@@ -517,7 -485,7 +517,7 @@@ void ff_free_vlc(VLC *vlc)
          SKIP_BITS(name, gb, n);                                 \
      } while (0)
  
 -#define GET_RL_VLC(level, run, name, gb, table, bits,           \
 +#define GET_RL_VLC_INTERNAL(level, run, name, gb, table, bits,  \
                     max_depth, need_update)                      \
      do {                                                        \
          int n, nb_bits;                                         \
@@@ -589,20 -557,6 +589,20 @@@ static inline int get_bits_left(GetBitC
      return gb->size_in_bits - get_bits_count(gb);
  }
  
 +static inline int skip_1stop_8data_bits(GetBitContext *gb)
 +{
 +    if (get_bits_left(gb) <= 0)
 +        return AVERROR_INVALIDDATA;
 +
 +    while (get_bits1(gb)) {
 +        skip_bits(gb, 8);
 +        if (get_bits_left(gb) <= 0)
 +            return AVERROR_INVALIDDATA;
 +    }
 +
 +    return 0;
 +}
 +
  //#define TRACE
  
  #ifdef TRACE
@@@ -646,25 -600,6 +646,25 @@@ static inline int get_vlc_trace(GetBitC
      return r;
  }
  
 +#define GET_RL_VLC(level, run, name, gb, table, bits,           \
 +                   max_depth, need_update)                      \
 +    do {                                                        \
 +        int show  = SHOW_UBITS(name, gb, 24);                   \
 +        int len;                                                \
 +        int pos = name ## _index;                               \
 +                                                                \
 +        GET_RL_VLC_INTERNAL(level, run, name, gb, table, bits,max_depth, need_update); \
 +                                                                \
 +        len = name ## _index - pos + 1;                         \
 +        show = show >> (24 - len);                              \
 +                                                                \
 +        print_bin(show, len);                                   \
 +                                                                \
 +        av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d/%-3d rlv @%5d in %s %s:%d\n",\
 +               show, len, run-1, level, pos, __FILE__, __PRETTY_FUNCTION__, __LINE__);\
 +    } while (0)                                                 \
 +
 +
  static inline int get_xbits_trace(GetBitContext *s, int n, const char *file,
                                    const char *func, int line)
  {
  
  #else //TRACE
  #define tprintf(p, ...) { }
 +#define GET_RL_VLC GET_RL_VLC_INTERNAL
  #endif
  
  #endif /* AVCODEC_GET_BITS_H */
diff --combined libavcodec/golomb.h
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
   * Copyright (c) 2004 Alex Beregszaszi
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -66,14 -66,10 +66,14 @@@ static inline int get_ue_golomb(GetBitC
          return ff_ue_golomb_vlc_code[buf];
      } else {
          int log = 2 * av_log2(buf) - 31;
 -        buf >>= log;
 -        buf--;
          LAST_SKIP_BITS(re, gb, 32 - log);
          CLOSE_READER(re, gb);
 +        if (CONFIG_FTRAPV && log < 0) {
 +            av_log(0, AV_LOG_ERROR, "Invalid UE golomb code\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +        buf >>= log;
 +        buf--;
  
          return buf;
      }
@@@ -142,7 -138,7 +142,7 @@@ static inline unsigned svq3_get_ue_golo
              ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
              UPDATE_CACHE(re, gb);
              buf = GET_CACHE(re, gb);
-         } while (ret<0x8000000U && HAVE_BITS_REMAINING(re, gb));
 -        } while (BITS_AVAILABLE(re, gb));
++        } while (ret<0x8000000U && BITS_AVAILABLE(re, gb));
  
          CLOSE_READER(re, gb);
          return ret - 1;
   */
  static inline int get_te0_golomb(GetBitContext *gb, int range)
  {
 -    assert(range >= 1);
 +    av_assert2(range >= 1);
  
      if (range == 1)
          return 0;
   */
  static inline int get_te_golomb(GetBitContext *gb, int range)
  {
 -    assert(range >= 1);
 +    av_assert2(range >= 1);
  
      if (range == 2)
          return get_bits1(gb) ^ 1;
@@@ -195,11 -191,7 +195,11 @@@ static inline int get_se_golomb(GetBitC
  
          return ff_se_golomb_vlc_code[buf];
      } else {
 -        int log = 2 * av_log2(buf) - 31;
 +        int log = av_log2(buf);
 +        LAST_SKIP_BITS(re, gb, 31 - log);
 +        UPDATE_CACHE(re, gb);
 +        buf = GET_CACHE(re, gb);
 +
          buf >>= log;
  
          LAST_SKIP_BITS(re, gb, 32 - log);
@@@ -336,9 -328,7 +336,9 @@@ static inline int get_ur_golomb_jpegls(
          return buf;
      } else {
          int i;
 -        for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0 && BITS_AVAILABLE(re, gb); i++) {
 +        for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
 +            if (gb->size_in_bits <= re_index)
 +                return -1;
              LAST_SKIP_BITS(re, gb, 1);
              UPDATE_CACHE(re, gb);
          }
@@@ -477,7 -467,7 +477,7 @@@ static inline int get_te(GetBitContext 
   */
  static inline void set_ue_golomb(PutBitContext *pb, int i)
  {
 -    assert(i >= 0);
 +    av_assert2(i >= 0);
  
  #if 0
      if (i = 0) {
   */
  static inline void set_te_golomb(PutBitContext *pb, int i, int range)
  {
 -    assert(range >= 1);
 -    assert(i <= range);
 +    av_assert2(range >= 1);
 +    av_assert2(i <= range);
  
      if (range == 2)
          put_bits(pb, 1, i ^ 1);
@@@ -536,7 -526,7 +536,7 @@@ static inline void set_ur_golomb(PutBit
  {
      int e;
  
 -    assert(i >= 0);
 +    av_assert2(i >= 0);
  
      e = i >> k;
      if (e < limit)
@@@ -553,7 -543,7 +553,7 @@@ static inline void set_ur_golomb_jpegls
  {
      int e;
  
 -    assert(i >= 0);
 +    av_assert2(i >= 0);
  
      e = (i >> k) + 1;
      if (e < limit) {