Quoting Diego Biurrun (2016-06-09 17:12:42)
> From: Alexandra Hájková <[email protected]>
> 
> ---
>  libavcodec/tta.c | 50 +++++++++++++++++++++++++-------------------------
>  1 file changed, 25 insertions(+), 25 deletions(-)
> 
> diff --git a/libavcodec/tta.c b/libavcodec/tta.c
> index 2b57406..2f96933 100644
> --- a/libavcodec/tta.c
> +++ b/libavcodec/tta.c
> @@ -33,7 +33,7 @@
>  
>  #define BITSTREAM_READER_LE
>  #include "avcodec.h"
> -#include "get_bits.h"
> +#include "bitstream.h"
>  #include "internal.h"
>  
>  #define FORMAT_SIMPLE    1
> @@ -59,7 +59,7 @@ typedef struct TTAChannel {
>  
>  typedef struct TTAContext {
>      AVCodecContext *avctx;
> -    GetBitContext gb;
> +    BitstreamContext bc;
>      const AVCRC *crc_table;
>  
>      int format, channels, bps;
> @@ -171,12 +171,12 @@ static void rice_init(TTARice *c, uint32_t k0, uint32_t 
> k1)
>      c->sum1 = shift_16[k1];
>  }
>  
> -static int tta_get_unary(GetBitContext *gb)
> +static int tta_get_unary(BitstreamContext *bc)
>  {
>      int ret = 0;
>  
>      // count ones
> -    while (get_bits_left(gb) > 0 && get_bits1(gb))
> +    while (bitstream_bits_left(bc) > 0 && bitstream_read_bit(bc))
>          ret++;
>      return ret;
>  }
> @@ -206,18 +206,17 @@ static av_cold int tta_decode_init(AVCodecContext * 
> avctx)
>      if (avctx->extradata_size < 30)
>          return -1;
>  
> -    init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8);
> -    if (show_bits_long(&s->gb, 32) == AV_RL32("TTA1"))
> -    {
> +    bitstream_init(&s->bc, avctx->extradata, avctx->extradata_size * 8);
> +    if (bitstream_peek(&s->bc, 32) == AV_RL32("TTA1")) {
>          if (avctx->err_recognition & AV_EF_CRCCHECK) {
>              s->crc_table = av_crc_get_table(AV_CRC_32_IEEE_LE);
>              tta_check_crc(s, avctx->extradata, 18);
>          }
>  
>          /* signature */
> -        skip_bits_long(&s->gb, 32);
> +        bitstream_skip(&s->bc, 32);
>  
> -        s->format = get_bits(&s->gb, 16);
> +        s->format = bitstream_read(&s->bc, 16);
>          if (s->format > 2) {
>              av_log(s->avctx, AV_LOG_ERROR, "Invalid format\n");
>              return -1;
> @@ -226,12 +225,13 @@ static av_cold int tta_decode_init(AVCodecContext * 
> avctx)
>              avpriv_report_missing_feature(s->avctx, "Encrypted TTA");
>              return AVERROR_PATCHWELCOME;
>          }
> -        avctx->channels = s->channels = get_bits(&s->gb, 16);
> -        avctx->bits_per_coded_sample = get_bits(&s->gb, 16);
> +        avctx->channels              =
> +        s->channels                  = bitstream_read(&s->bc, 16);
> +        avctx->bits_per_coded_sample = bitstream_read(&s->bc, 16);
>          s->bps = (avctx->bits_per_coded_sample + 7) / 8;
> -        avctx->sample_rate = get_bits_long(&s->gb, 32);
> -        s->data_length = get_bits_long(&s->gb, 32);
> -        skip_bits_long(&s->gb, 32); // CRC32 of header
> +        avctx->sample_rate           = bitstream_read(&s->bc, 32);
> +        s->data_length               = bitstream_read(&s->bc, 32);
> +        bitstream_skip(&s->bc, 32); // CRC32 of header
>  
>          if (s->channels == 0) {
>              av_log(s->avctx, AV_LOG_ERROR, "Invalid number of channels\n");
> @@ -281,8 +281,8 @@ static av_cold int tta_decode_init(AVCodecContext * avctx)
>              if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE)
>                  return AVERROR_INVALIDDATA;
>          }
> -        skip_bits_long(&s->gb, 32 * total_frames);
> -        skip_bits_long(&s->gb, 32); // CRC32 of seektable
> +        bitstream_skip(&s->bc, 32 * total_frames);
> +        bitstream_skip(&s->bc, 32); // CRC32 of seektable
>  
>          if(s->frame_length >= UINT_MAX / (s->channels * sizeof(int32_t))){
>              av_log(avctx, AV_LOG_ERROR, "frame_length too large\n");
> @@ -324,7 +324,7 @@ static int tta_decode_frame(AVCodecContext *avctx, void 
> *data,
>              return AVERROR_INVALIDDATA;
>      }
>  
> -    init_get_bits(&s->gb, buf, buf_size*8);
> +    bitstream_init(&s->bc, buf, buf_size * 8);
>  
>      /* get output buffer */
>      frame->nb_samples = framelen;
> @@ -352,7 +352,7 @@ static int tta_decode_frame(AVCodecContext *avctx, void 
> *data,
>          uint32_t unary, depth, k;
>          int32_t value;
>  
> -        unary = tta_get_unary(&s->gb);
> +        unary = tta_get_unary(&s->bc);
>  
>          if (unary == 0) {
>              depth = 0;
> @@ -363,17 +363,17 @@ static int tta_decode_frame(AVCodecContext *avctx, void 
> *data,
>              unary--;
>          }
>  
> -        if (get_bits_left(&s->gb) < k) {
> +        if (bitstream_bits_left(&s->bc) < k) {
>              ret = AVERROR_INVALIDDATA;
>              goto error;
>          }
>  
>          if (k) {
> -            if (k > MIN_CACHE_BITS) {
> +            if (k > 32) {

Shift by 32 is undefined behaviour.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to