Merge commit 'b574e1e97ea7067a5fcd3876e30a67df0e4e6611'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 5 Sep 2014 17:08:27 +0000 (19:08 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 5 Sep 2014 17:08:27 +0000 (19:08 +0200)
* commit 'b574e1e97ea7067a5fcd3876e30a67df0e4e6611':
  get_bits: Add OPEN_READER macro variant w/o size_plus8

Conflicts:
libavcodec/get_bits.h

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

diff --combined libavcodec/dvdec.c
   * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
   * of DV technical info.
   *
 - * 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
   */
  
@@@ -35,7 -35,6 +35,7 @@@
   * DV decoder
   */
  
 +#include "libavutil/avassert.h"
  #include "libavutil/internal.h"
  #include "libavutil/imgutils.h"
  #include "libavutil/pixdesc.h"
@@@ -66,19 -65,12 +66,19 @@@ static av_cold int dvvideo_decode_init(
      IDCTDSPContext idsp;
      int i;
  
 +    memset(&idsp,0, sizeof(idsp));
      ff_idctdsp_init(&idsp, avctx);
  
      for (i = 0; i < 64; i++)
         s->dv_zigzag[0][i] = idsp.idct_permutation[ff_zigzag_direct[i]];
  
 -    memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
 +    if (avctx->lowres){
 +        for (i = 0; i < 64; i++){
 +            int j = ff_dv_zigzag248_direct[i];
 +            s->dv_zigzag[1][i] = idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
 +        }
 +    }else
 +        memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
  
      s->idct_put[0] = idsp.idct_put;
      s->idct_put[1] = ff_simple_idct248_put;
@@@ -96,7 -88,7 +96,7 @@@ static void dv_decode_ac(GetBitContext 
      int partial_bit_count = mb->partial_bit_count;
      int level, run, vlc_len, index;
  
-     OPEN_READER(re, gb);
+     OPEN_READER_NOSIZE(re, gb);
      UPDATE_CACHE(re, gb);
  
      /* if we must parse a partial VLC, we do it here */
@@@ -175,11 -167,11 +175,11 @@@ static int dv_decode_video_segment(AVCo
      LOCAL_ALIGNED_16(int16_t, sblock, [5*DV_MAX_BPM], [64]);
      LOCAL_ALIGNED_16(uint8_t, mb_bit_buffer, [  80 + FF_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
      LOCAL_ALIGNED_16(uint8_t, vs_bit_buffer, [5*80 + FF_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
 -    const int log2_blocksize = 3;
 +    const int log2_blocksize = 3-s->avctx->lowres;
      int is_field_mode[5];
  
 -    assert((((int)mb_bit_buffer) & 7) == 0);
 -    assert((((int)vs_bit_buffer) & 7) == 0);
 +    av_assert1((((int)mb_bit_buffer) & 7) == 0);
 +    av_assert1((((int)vs_bit_buffer) & 7) == 0);
  
      memset(sblock, 0, 5*DV_MAX_BPM*sizeof(*sblock));
  
      flush_put_bits(&vs_pb);
      for (mb_index = 0; mb_index < 5; mb_index++) {
          for (j = 0; j < s->sys->bpm; j++) {
 -            if (mb->pos < 64) {
 +            if (mb->pos < 64 && get_bits_left(&gb) > 0) {
                  av_dlog(avctx, "start %d:%d\n", mb_index, j);
                  dv_decode_ac(&gb, mb, block);
              }
                    int x, y;
                    mb->idct_put(pixels, 8, block);
                    for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->frame->linesize[j], pixels += 8) {
 -                      ptr1   = pixels + (1 << (log2_blocksize - 1));
 +                      ptr1   = pixels + ((1 << (log2_blocksize))>>1);
                        c_ptr1 = c_ptr + (s->frame->linesize[j] << log2_blocksize);
 -                      for (x = 0; x < (1 << (log2_blocksize - 1)); x++) {
 +                      for (x = 0; x < (1 << FFMAX(log2_blocksize - 1, 0)); x++) {
                            c_ptr[x]  = pixels[x];
                            c_ptr1[x] = ptr1[x];
                        }
@@@ -351,7 -343,7 +351,7 @@@ static int dvvideo_decode_frame(AVCodec
      int apt, is16_9, ret;
      const AVDVProfile *sys;
  
 -    sys = av_dv_frame_profile(s->sys, buf, buf_size);
 +    sys = avpriv_dv_frame_profile2(avctx, s->sys, buf, buf_size);
      if (!sys || buf_size < sys->frame_size) {
          av_log(avctx, AV_LOG_ERROR, "could not find dv frame profile\n");
          return -1; /* NOTE: we only accept several full frames */
      vsc_pack = buf + 80*5 + 48 + 5;
      if ( *vsc_pack == dv_video_control ) {
          apt = buf[4] & 0x07;
 -        is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 || (!apt && (vsc_pack[2] & 0x07) == 0x07)));
 +        is16_9 = (vsc_pack[2] & 0x07) == 0x02 || (!apt && (vsc_pack[2] & 0x07) == 0x07);
          ff_set_sar(avctx, s->sys->sar[is16_9]);
      }
  
 -    if (ff_get_buffer(avctx, s->frame, 0) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 -        return -1;
 -    }
 +    if ((ret = ff_get_buffer(avctx, s->frame, 0)) < 0)
 +        return ret;
      s->frame->interlaced_frame = 1;
      s->frame->top_field_first  = 0;
  
 +    /* Determine the codec's field order from the packet */
 +    if ( *vsc_pack == dv_video_control ) {
 +        s->frame->top_field_first = !(vsc_pack[3] & 0x40);
 +    }
 +
      s->buf = buf;
      avctx->execute(avctx, dv_decode_video_segment, s->work_chunks, NULL,
                     dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
@@@ -415,5 -404,4 +415,5 @@@ AVCodec ff_dvvideo_decoder = 
      .init           = dvvideo_decode_init,
      .decode         = dvvideo_decode_frame,
      .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS,
 +    .max_lowres     = 3,
  };
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.
   */
  
  #   define MIN_CACHE_BITS 25
  #endif
  
- #if UNCHECKED_BITSTREAM_READER
- #define OPEN_READER(name, gb)                   \
+ #define OPEN_READER_NOSIZE(name, gb)            \
      unsigned int name ## _index = (gb)->index;  \
 -    unsigned int av_unused name ## _cache = 0
 +    unsigned int av_unused name ## _cache
  
+ #if UNCHECKED_BITSTREAM_READER
+ #define OPEN_READER(name, gb) OPEN_READER_NOSIZE(name, gb)
  #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
+     OPEN_READER_NOSIZE(name, gb);               \
+     unsigned int name ## _size_plus8 = (gb)->size_in_bits_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 -207,7 +224,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 -216,6 +233,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 -228,6 +246,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 -242,6 +261,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.
   */
  static inline unsigned int show_bits(GetBitContext *s, int n)
  {
      register int tmp;
-     OPEN_READER(re, s);
+     OPEN_READER_NOSIZE(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 -304,20 +336,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 -379,8 +413,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 -486,7 +518,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 -558,6 +590,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 -601,6 +647,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 */