]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/wmaprodec.c
lavc: Drop deprecated way of setting codec dimensions
[ffmpeg] / libavcodec / wmaprodec.c
index 56bb83ce2722e01579103c5f2dbd8819b2909dcc..4eaeed610ee241c634f3cf6dcab9daa020fd598d 100644 (file)
  * subframe in order to reconstruct the output samples.
  */
 
+#include <inttypes.h>
+
 #include "libavutil/float_dsp.h"
 #include "libavutil/intfloat.h"
 #include "libavutil/intreadwrite.h"
+
 #include "avcodec.h"
+#include "bitstream.h"
 #include "internal.h"
-#include "get_bits.h"
 #include "put_bits.h"
 #include "wmaprodata.h"
 #include "sinewin.h"
 
 #define WMAPRO_BLOCK_MIN_BITS  6                                           ///< log2 of min block size
 #define WMAPRO_BLOCK_MAX_BITS 13                                           ///< log2 of max block size
+#define WMAPRO_BLOCK_MIN_SIZE (1 << WMAPRO_BLOCK_MIN_BITS)                 ///< minimum block size
 #define WMAPRO_BLOCK_MAX_SIZE (1 << WMAPRO_BLOCK_MAX_BITS)                 ///< maximum block size
 #define WMAPRO_BLOCK_SIZES    (WMAPRO_BLOCK_MAX_BITS - WMAPRO_BLOCK_MIN_BITS + 1) ///< possible block sizes
 
@@ -124,12 +128,12 @@ static VLC              vec4_vlc;         ///< 4 coefficients per symbol
 static VLC              vec2_vlc;         ///< 2 coefficients per symbol
 static VLC              vec1_vlc;         ///< 1 coefficient per symbol
 static VLC              coef_vlc[2];      ///< coefficient run length vlc codes
-static float            sin64[33];        ///< sinus table for decorrelation
+static float            sin64[33];        ///< sine table for decorrelation
 
 /**
  * @brief frame specific decoder context for a single channel
  */
-typedef struct {
+typedef struct WMAProChannelCtx {
     int16_t  prev_block_len;                          ///< length of the previous block
     uint8_t  transmit_coefs;
     uint8_t  num_subframes;
@@ -154,7 +158,7 @@ typedef struct {
 /**
  * @brief channel group for channel transformations
  */
-typedef struct {
+typedef struct WMAProChannelGrp {
     uint8_t num_channels;                                     ///< number of channels in the group
     int8_t  transform;                                        ///< transform on / off
     int8_t  transform_band[MAX_BANDS];                        ///< controls if the transform is enabled for a certain band
@@ -170,7 +174,7 @@ typedef struct WMAProDecodeCtx {
     AVCodecContext*  avctx;                         ///< codec context for av_log
     AVFloatDSPContext fdsp;
     uint8_t          frame_data[MAX_FRAMESIZE +
-                      FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data
+                      AV_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data
     PutBitContext    pb;                            ///< context for filling the frame_data buffer
     FFTContext       mdct_ctx[WMAPRO_BLOCK_SIZES];  ///< MDCT context per block size
     DECLARE_ALIGNED(32, float, tmp)[WMAPRO_BLOCK_MAX_SIZE]; ///< IMDCT output buffer
@@ -194,7 +198,7 @@ typedef struct WMAProDecodeCtx {
     int16_t          subwoofer_cutoffs[WMAPRO_BLOCK_SIZES]; ///< subwoofer cutoff values
 
     /* packet decode state */
-    GetBitContext    pgb;                           ///< bitstream reader context for the packet
+    BitstreamContext pbc;                           ///< bitstream reader context for the packet
     int              next_packet_start;             ///< start offset of the next wma packet in the demuxer packet
     uint8_t          packet_offset;                 ///< frame offset in the packet
     uint8_t          packet_sequence_number;        ///< current packet number
@@ -206,7 +210,7 @@ typedef struct WMAProDecodeCtx {
 
     /* frame decode state */
     uint32_t         frame_num;                     ///< current frame number (not used for decoding)
-    GetBitContext    gb;                            ///< bitstream reader context
+    BitstreamContext bc;                            ///< bitstream reader context
     int              buf_bit_size;                  ///< buffer size in bits
     uint8_t          drc_gain;                      ///< gain for the DRC tool
     int8_t           skip_frame;                    ///< skip output step
@@ -236,7 +240,7 @@ typedef struct WMAProDecodeCtx {
 static av_cold void dump_context(WMAProDecodeCtx *s)
 {
 #define PRINT(a, b)     av_log(s->avctx, AV_LOG_DEBUG, " %s = %d\n", a, b);
-#define PRINT_HEX(a, b) av_log(s->avctx, AV_LOG_DEBUG, " %s = %x\n", a, b);
+#define PRINT_HEX(a, b) av_log(s->avctx, AV_LOG_DEBUG, " %s = %"PRIx32"\n", a, b);
 
     PRINT("ed sample bit depth", s->bits_per_sample);
     PRINT_HEX("ed decode flags", s->decode_flags);
@@ -283,7 +287,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
     }
 
     s->avctx = avctx;
-    avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
+    avpriv_float_dsp_init(&s->fdsp, avctx->flags & AV_CODEC_FLAG_BITEXACT);
 
     init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
 
@@ -295,11 +299,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
         s->bits_per_sample = AV_RL16(edata_ptr);
         /** dump the extradata */
         for (i = 0; i < avctx->extradata_size; i++)
-            av_dlog(avctx, "[%x] ", avctx->extradata[i]);
-        av_dlog(avctx, "\n");
+            ff_dlog(avctx, "[%x] ", avctx->extradata[i]);
+        ff_dlog(avctx, "\n");
 
     } else {
-        av_log_ask_for_sample(avctx, "Unknown extradata size\n");
+        avpriv_request_sample(avctx, "Unknown extradata size");
         return AVERROR_PATCHWELCOME;
     }
 
@@ -314,7 +318,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
     /** get frame len */
     bits = ff_wma_get_frame_len_bits(avctx->sample_rate, 3, s->decode_flags);
     if (bits > WMAPRO_BLOCK_MAX_BITS) {
-        av_log_missing_feature(avctx, "14-bits block sizes", 1);
+        avpriv_request_sample(avctx, "14-bit block sizes");
         return AVERROR_PATCHWELCOME;
     }
     s->samples_per_frame = 1 << bits;
@@ -331,7 +335,13 @@ static av_cold int decode_init(AVCodecContext *avctx)
     s->dynamic_range_compression = (s->decode_flags & 0x80);
 
     if (s->max_num_subframes > MAX_SUBFRAMES) {
-        av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %i\n",
+        av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %"PRId8"\n",
+               s->max_num_subframes);
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (s->min_samples_per_subframe < WMAPRO_BLOCK_MIN_SIZE) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid minimum block size %"PRId8"\n",
                s->max_num_subframes);
         return AVERROR_INVALIDDATA;
     }
@@ -346,7 +356,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
                avctx->channels);
         return AVERROR_INVALIDDATA;
     } else if (avctx->channels > WMAPRO_MAX_CHANNELS) {
-        av_log_ask_for_sample(avctx, "unsupported number of channels\n");
+        avpriv_request_sample(avctx,
+                              "More than %d channels", WMAPRO_MAX_CHANNELS);
         return AVERROR_PATCHWELCOME;
     }
 
@@ -428,7 +439,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
             for (x = 0; x < num_possible_block_sizes; x++) {
                 int v = 0;
                 while (s->sfb_offsets[x][v + 1] << x < offset)
-                    ++v;
+                    if (++v >= MAX_BANDS)
+                        return AVERROR_INVALIDDATA;
                 s->sf_offsets[i][x][b] = v;
             }
         }
@@ -440,7 +452,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
                      1.0 / (1 << (WMAPRO_BLOCK_MIN_BITS + i - 1))
                      / (1 << (s->bits_per_sample - 1)));
 
-    /** init MDCT windows: simple sinus window */
+    /** init MDCT windows: simple sine window */
     for (i = 0; i < WMAPRO_BLOCK_SIZES; i++) {
         const int win_idx = WMAPRO_BLOCK_MAX_BITS - i;
         ff_init_ff_sine_windows(win_idx);
@@ -484,10 +496,11 @@ static int decode_subframe_length(WMAProDecodeCtx *s, int offset)
 
     /** 1 bit indicates if the subframe is of maximum length */
     if (s->max_subframe_len_bit) {
-        if (get_bits1(&s->gb))
-            frame_len_shift = 1 + get_bits(&s->gb, s->subframe_len_bits-1);
+        if (bitstream_read_bit(&s->bc))
+            frame_len_shift = 1 + bitstream_read(&s->bc,
+                                                 s->subframe_len_bits - 1);
     } else
-        frame_len_shift = get_bits(&s->gb, s->subframe_len_bits);
+        frame_len_shift = bitstream_read(&s->bc, s->subframe_len_bits);
 
     subframe_len = s->samples_per_frame >> frame_len_shift;
 
@@ -540,7 +553,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
     for (c = 0; c < s->avctx->channels; c++)
         s->channel[c].num_subframes = 0;
 
-    if (s->max_num_subframes == 1 || get_bits1(&s->gb))
+    if (s->max_num_subframes == 1 || bitstream_read_bit(&s->bc))
         fixed_channel_layout = 1;
 
     /** loop until the frame data is split between the subframes */
@@ -554,7 +567,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
                    (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe))
                     contains_subframe[c] = 1;
                 else
-                    contains_subframe[c] = get_bits1(&s->gb);
+                    contains_subframe[c] = bitstream_read_bit(&s->bc);
             } else
                 contains_subframe[c] = 0;
         }
@@ -596,8 +609,8 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
         int i;
         int offset = 0;
         for (i = 0; i < s->channel[c].num_subframes; i++) {
-            av_dlog(s->avctx, "frame[%i] channel[%i] subframe[%i]"
-                    " len %i\n", s->frame_num, c, i,
+            ff_dlog(s->avctx, "frame[%"PRIi32"] channel[%i] subframe[%i]"
+                    " len %"PRIu16"\n", s->frame_num, c, i,
                     s->channel[c].subframe_len[i]);
             s->channel[c].subframe_offset[i] = offset;
             offset += s->channel[c].subframe_len[i];
@@ -622,11 +635,11 @@ static void decode_decorrelation_matrix(WMAProDecodeCtx *s,
            s->avctx->channels * sizeof(*chgroup->decorrelation_matrix));
 
     for (i = 0; i < chgroup->num_channels * (chgroup->num_channels - 1) >> 1; i++)
-        rotation_offset[i] = get_bits(&s->gb, 6);
+        rotation_offset[i] = bitstream_read(&s->bc, 6);
 
     for (i = 0; i < chgroup->num_channels; i++)
         chgroup->decorrelation_matrix[chgroup->num_channels * i + i] =
-            get_bits1(&s->gb) ? 1.0 : -1.0;
+            bitstream_read_bit(&s->bc) ? 1.0 : -1.0;
 
     for (i = 1; i < chgroup->num_channels; i++) {
         int x;
@@ -675,9 +688,9 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
     if (s->avctx->channels > 1) {
         int remaining_channels = s->channels_for_cur_subframe;
 
-        if (get_bits1(&s->gb)) {
-            av_log_ask_for_sample(s->avctx,
-                                  "unsupported channel transform bit\n");
+        if (bitstream_read_bit(&s->bc)) {
+            avpriv_request_sample(s->avctx,
+                                  "Channel transform bit");
             return AVERROR_PATCHWELCOME;
         }
 
@@ -693,7 +706,7 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
                 for (i = 0; i < s->channels_for_cur_subframe; i++) {
                     int channel_idx = s->channel_indexes_for_cur_subframe[i];
                     if (!s->channel[channel_idx].grouped
-                        && get_bits1(&s->gb)) {
+                        && bitstream_read_bit(&s->bc)) {
                         ++chgroup->num_channels;
                         s->channel[channel_idx].grouped = 1;
                         *channel_data++ = s->channel[channel_idx].coeffs;
@@ -711,10 +724,11 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
 
             /** decode transform type */
             if (chgroup->num_channels == 2) {
-                if (get_bits1(&s->gb)) {
-                    if (get_bits1(&s->gb)) {
-                        av_log_ask_for_sample(s->avctx,
-                                              "unsupported channel transform type\n");
+                if (bitstream_read_bit(&s->bc)) {
+                    if (bitstream_read_bit(&s->bc)) {
+                        avpriv_request_sample(s->avctx,
+                                              "Unknown channel transform type");
+                        return AVERROR_PATCHWELCOME;
                     }
                 } else {
                     chgroup->transform = 1;
@@ -732,15 +746,15 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
                     }
                 }
             } else if (chgroup->num_channels > 2) {
-                if (get_bits1(&s->gb)) {
+                if (bitstream_read_bit(&s->bc)) {
                     chgroup->transform = 1;
-                    if (get_bits1(&s->gb)) {
+                    if (bitstream_read_bit(&s->bc)) {
                         decode_decorrelation_matrix(s, chgroup);
                     } else {
                         /** FIXME: more than 6 coupled channels not supported */
                         if (chgroup->num_channels > 6) {
-                            av_log_ask_for_sample(s->avctx,
-                                                  "coupled channels > 6\n");
+                            avpriv_request_sample(s->avctx,
+                                                  "Coupled channels > 6");
                         } else {
                             memcpy(chgroup->decorrelation_matrix,
                                    default_decorrelation[chgroup->num_channels],
@@ -753,11 +767,11 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
 
             /** decode transform on / off */
             if (chgroup->transform) {
-                if (!get_bits1(&s->gb)) {
+                if (!bitstream_read_bit(&s->bc)) {
                     int i;
                     /** transform can be enabled for individual bands */
                     for (i = 0; i < s->num_bands; i++) {
-                        chgroup->transform_band[i] = get_bits1(&s->gb);
+                        chgroup->transform_band[i] = bitstream_read_bit(&s->bc);
                     }
                 } else {
                     memset(chgroup->transform_band, 1, s->num_bands);
@@ -795,9 +809,9 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
     const uint16_t* run;
     const float* level;
 
-    av_dlog(s->avctx, "decode coefficients for channel %i\n", c);
+    ff_dlog(s->avctx, "decode coefficients for channel %i\n", c);
 
-    vlctable = get_bits1(&s->gb);
+    vlctable = bitstream_read_bit(&s->bc);
     vlc = &coef_vlc[vlctable];
 
     if (vlctable) {
@@ -816,19 +830,19 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
         int i;
         unsigned int idx;
 
-        idx = get_vlc2(&s->gb, vec4_vlc.table, VLCBITS, VEC4MAXDEPTH);
+        idx = bitstream_read_vlc(&s->bc, vec4_vlc.table, VLCBITS, VEC4MAXDEPTH);
 
         if (idx == HUFF_VEC4_SIZE - 1) {
             for (i = 0; i < 4; i += 2) {
-                idx = get_vlc2(&s->gb, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH);
+                idx = bitstream_read_vlc(&s->bc, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH);
                 if (idx == HUFF_VEC2_SIZE - 1) {
                     uint32_t v0, v1;
-                    v0 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
+                    v0 = bitstream_read_vlc(&s->bc, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
                     if (v0 == HUFF_VEC1_SIZE - 1)
-                        v0 += ff_wma_get_large_val(&s->gb);
-                    v1 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
+                        v0 += ff_wma_get_large_val(&s->bc);
+                    v1 = bitstream_read_vlc(&s->bc, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
                     if (v1 == HUFF_VEC1_SIZE - 1)
-                        v1 += ff_wma_get_large_val(&s->gb);
+                        v1 += ff_wma_get_large_val(&s->bc);
                     vals[i  ] = av_float2int(v0);
                     vals[i+1] = av_float2int(v1);
                 } else {
@@ -846,7 +860,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
         /** decode sign */
         for (i = 0; i < 4; i++) {
             if (vals[i]) {
-                uint32_t sign = get_bits1(&s->gb) - 1;
+                uint32_t sign = bitstream_read_bit(&s->bc) - 1;
                 AV_WN32A(&ci->coeffs[cur_coeff], vals[i] ^ sign << 31);
                 num_zeros = 0;
             } else {
@@ -863,7 +877,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
     if (cur_coeff < s->subframe_len) {
         memset(&ci->coeffs[cur_coeff], 0,
                sizeof(*ci->coeffs) * (s->subframe_len - cur_coeff));
-        if (ff_wma_run_level_decode(s->avctx, &s->gb, vlc,
+        if (ff_wma_run_level_decode(s->avctx, &s->bc, vlc,
                                     level, run, 1, ci->coeffs,
                                     cur_coeff, s->subframe_len,
                                     s->subframe_len, s->esc_len, 0))
@@ -906,15 +920,14 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
                     s->channel[c].saved_scale_factors[s->channel[c].scale_factor_idx][*sf_offsets++];
         }
 
-        if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) {
-
+        if (!s->channel[c].cur_subframe || bitstream_read_bit(&s->bc)) {
             if (!s->channel[c].reuse_sf) {
                 int val;
                 /** decode DPCM coded scale factors */
-                s->channel[c].scale_factor_step = get_bits(&s->gb, 2) + 1;
+                s->channel[c].scale_factor_step = bitstream_read(&s->bc, 2) + 1;
                 val = 45 / s->channel[c].scale_factor_step;
                 for (sf = s->channel[c].scale_factors; sf < sf_end; sf++) {
-                    val += get_vlc2(&s->gb, sf_vlc.table, SCALEVLCBITS, SCALEMAXDEPTH) - 60;
+                    val += bitstream_read_vlc(&s->bc, sf_vlc.table, SCALEVLCBITS, SCALEMAXDEPTH) - 60;
                     *sf = val;
                 }
             } else {
@@ -926,10 +939,10 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
                     int val;
                     int sign;
 
-                    idx = get_vlc2(&s->gb, sf_rl_vlc.table, VLCBITS, SCALERLMAXDEPTH);
+                    idx = bitstream_read_vlc(&s->bc, sf_rl_vlc.table, VLCBITS, SCALERLMAXDEPTH);
 
                     if (!idx) {
-                        uint32_t code = get_bits(&s->gb, 14);
+                        uint32_t code = bitstream_read(&s->bc, 14);
                         val  =  code >> 6;
                         sign = (code & 1) - 1;
                         skip = (code & 0x3f) >> 1;
@@ -938,7 +951,7 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
                     } else {
                         skip = scale_rl_run[idx];
                         val  = scale_rl_level[idx];
-                        sign = get_bits1(&s->gb)-1;
+                        sign = bitstream_read_bit(&s->bc)-1;
                     }
 
                     i += skip;
@@ -1065,7 +1078,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
     int transmit_coeffs = 0;
     int cur_subwoofer_cutoff;
 
-    s->subframe_offset = get_bits_count(&s->gb);
+    s->subframe_offset = bitstream_tell(&s->bc);
 
     /** reset channel context and find the next block offset and size
         == the next block of the channel with the smallest number of
@@ -1080,7 +1093,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
         }
     }
 
-    av_dlog(s->avctx,
+    ff_dlog(s->avctx,
             "processing subframe with offset %i len %i\n", offset, subframe_len);
 
     /** get a list of all channels that contain the estimated block */
@@ -1107,7 +1120,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
         s->parsed_all_subframes = 1;
 
 
-    av_dlog(s->avctx, "subframe is part of %i channels\n",
+    ff_dlog(s->avctx, "subframe is part of %i channels\n",
             s->channels_for_cur_subframe);
 
     /** calculate number of scale factor bands and their offsets */
@@ -1117,37 +1130,38 @@ static int decode_subframe(WMAProDecodeCtx *s)
     cur_subwoofer_cutoff = s->subwoofer_cutoffs[s->table_idx];
 
     /** configure the decoder for the current subframe */
+    offset += s->samples_per_frame >> 1;
+
     for (i = 0; i < s->channels_for_cur_subframe; i++) {
         int c = s->channel_indexes_for_cur_subframe[i];
 
-        s->channel[c].coeffs = &s->channel[c].out[(s->samples_per_frame >> 1)
-                                                  + offset];
+        s->channel[c].coeffs = &s->channel[c].out[offset];
     }
 
     s->subframe_len = subframe_len;
     s->esc_len = av_log2(s->subframe_len - 1) + 1;
 
     /** skip extended header if any */
-    if (get_bits1(&s->gb)) {
+    if (bitstream_read_bit(&s->bc)) {
         int num_fill_bits;
-        if (!(num_fill_bits = get_bits(&s->gb, 2))) {
-            int len = get_bits(&s->gb, 4);
-            num_fill_bits = get_bits(&s->gb, len) + 1;
+        if (!(num_fill_bits = bitstream_read(&s->bc, 2))) {
+            int len       = bitstream_read(&s->bc, 4);
+            num_fill_bits = bitstream_read(&s->bc, len) + 1;
         }
 
         if (num_fill_bits >= 0) {
-            if (get_bits_count(&s->gb) + num_fill_bits > s->num_saved_bits) {
+            if (bitstream_tell(&s->bc) + num_fill_bits > s->num_saved_bits) {
                 av_log(s->avctx, AV_LOG_ERROR, "invalid number of fill bits\n");
                 return AVERROR_INVALIDDATA;
             }
 
-            skip_bits_long(&s->gb, num_fill_bits);
+            bitstream_skip(&s->bc, num_fill_bits);
         }
     }
 
     /** no idea for what the following bit is used */
-    if (get_bits1(&s->gb)) {
-        av_log_ask_for_sample(s->avctx, "reserved bit set\n");
+    if (bitstream_read_bit(&s->bc)) {
+        avpriv_request_sample(s->avctx, "Reserved bit");
         return AVERROR_PATCHWELCOME;
     }
 
@@ -1158,7 +1172,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
 
     for (i = 0; i < s->channels_for_cur_subframe; i++) {
         int c = s->channel_indexes_for_cur_subframe[i];
-        if ((s->channel[c].transmit_coefs = get_bits1(&s->gb)))
+        if ((s->channel[c].transmit_coefs = bitstream_read_bit(&s->bc)))
             transmit_coeffs = 1;
     }
 
@@ -1167,12 +1181,12 @@ static int decode_subframe(WMAProDecodeCtx *s)
         int quant_step = 90 * s->bits_per_sample >> 4;
 
         /** decode number of vector coded coefficients */
-        if ((s->transmit_num_vec_coeffs = get_bits1(&s->gb))) {
+        if ((s->transmit_num_vec_coeffs = bitstream_read_bit(&s->bc))) {
             int num_bits = av_log2((s->subframe_len + 3)/4) + 1;
             for (i = 0; i < s->channels_for_cur_subframe; i++) {
                 int c = s->channel_indexes_for_cur_subframe[i];
-                int num_vec_coeffs = get_bits(&s->gb, num_bits) << 2;
-                if (num_vec_coeffs > WMAPRO_BLOCK_MAX_SIZE) {
+                int num_vec_coeffs = bitstream_read(&s->bc, num_bits) << 2;
+                if (num_vec_coeffs + offset > FF_ARRAY_ELEMS(s->channel[c].out)) {
                     av_log(s->avctx, AV_LOG_ERROR, "num_vec_coeffs %d is too large\n", num_vec_coeffs);
                     return AVERROR_INVALIDDATA;
                 }
@@ -1185,13 +1199,13 @@ static int decode_subframe(WMAProDecodeCtx *s)
             }
         }
         /** decode quantization step */
-        step = get_sbits(&s->gb, 6);
+        step = bitstream_read_signed(&s->bc, 6);
         quant_step += step;
         if (step == -32 || step == 31) {
             const int sign = (step == 31) - 1;
             int quant = 0;
-            while (get_bits_count(&s->gb) + 5 < s->num_saved_bits &&
-                   (step = get_bits(&s->gb, 5)) == 31) {
+            while (bitstream_tell(&s->bc) + 5 < s->num_saved_bits &&
+                   (step = bitstream_read(&s->bc, 5)) == 31) {
                 quant += 31;
             }
             quant_step += ((quant + step) ^ sign) - sign;
@@ -1205,13 +1219,13 @@ static int decode_subframe(WMAProDecodeCtx *s)
         if (s->channels_for_cur_subframe == 1) {
             s->channel[s->channel_indexes_for_cur_subframe[0]].quant_step = quant_step;
         } else {
-            int modifier_len = get_bits(&s->gb, 3);
+            int modifier_len = bitstream_read(&s->bc, 3);
             for (i = 0; i < s->channels_for_cur_subframe; i++) {
                 int c = s->channel_indexes_for_cur_subframe[i];
                 s->channel[c].quant_step = quant_step;
-                if (get_bits1(&s->gb)) {
+                if (bitstream_read_bit(&s->bc)) {
                     if (modifier_len) {
-                        s->channel[c].quant_step += get_bits(&s->gb, modifier_len) + 1;
+                        s->channel[c].quant_step += bitstream_read(&s->bc, modifier_len) + 1;
                     } else
                         ++s->channel[c].quant_step;
                 }
@@ -1223,22 +1237,22 @@ static int decode_subframe(WMAProDecodeCtx *s)
             return AVERROR_INVALIDDATA;
     }
 
-    av_dlog(s->avctx, "BITSTREAM: subframe header length was %i\n",
-            get_bits_count(&s->gb) - s->subframe_offset);
+    ff_dlog(s->avctx, "BITSTREAM: subframe header length was %i\n",
+            bitstream_tell(&s->bc) - s->subframe_offset);
 
     /** parse coefficients */
     for (i = 0; i < s->channels_for_cur_subframe; i++) {
         int c = s->channel_indexes_for_cur_subframe[i];
         if (s->channel[c].transmit_coefs &&
-            get_bits_count(&s->gb) < s->num_saved_bits) {
+            bitstream_tell(&s->bc) < s->num_saved_bits) {
             decode_coeffs(s, c);
         } else
             memset(s->channel[c].coeffs, 0,
                    sizeof(*s->channel[c].coeffs) * subframe_len);
     }
 
-    av_dlog(s->avctx, "BITSTREAM: subframe length was %i\n",
-            get_bits_count(&s->gb) - s->subframe_offset);
+    ff_dlog(s->avctx, "BITSTREAM: subframe length was %i\n",
+            bitstream_tell(&s->bc) - s->subframe_offset);
 
     if (transmit_coeffs) {
         FFTContext *mdct = &s->mdct_ctx[av_log2(subframe_len) - WMAPRO_BLOCK_MIN_BITS];
@@ -1296,16 +1310,16 @@ static int decode_subframe(WMAProDecodeCtx *s)
 static int decode_frame(WMAProDecodeCtx *s, AVFrame *frame, int *got_frame_ptr)
 {
     AVCodecContext *avctx = s->avctx;
-    GetBitContext* gb = &s->gb;
+    BitstreamContext *bc = &s->bc;
     int more_frames = 0;
     int len = 0;
     int i, ret;
 
     /** get frame length */
     if (s->len_prefix)
-        len = get_bits(gb, s->log2_frame_size);
+        len = bitstream_read(bc, s->log2_frame_size);
 
-    av_dlog(s->avctx, "decoding frame with length %x\n", len);
+    ff_dlog(s->avctx, "decoding frame with length %x\n", len);
 
     /** decode tile information */
     if (decode_tilehdr(s)) {
@@ -1314,40 +1328,40 @@ static int decode_frame(WMAProDecodeCtx *s, AVFrame *frame, int *got_frame_ptr)
     }
 
     /** read postproc transform */
-    if (s->avctx->channels > 1 && get_bits1(gb)) {
-        if (get_bits1(gb)) {
+    if (s->avctx->channels > 1 && bitstream_read_bit(bc)) {
+        if (bitstream_read_bit(bc)) {
             for (i = 0; i < avctx->channels * avctx->channels; i++)
-                skip_bits(gb, 4);
+                bitstream_skip(bc, 4);
         }
     }
 
     /** read drc info */
     if (s->dynamic_range_compression) {
-        s->drc_gain = get_bits(gb, 8);
-        av_dlog(s->avctx, "drc_gain %i\n", s->drc_gain);
+        s->drc_gain = bitstream_read(bc, 8);
+        ff_dlog(s->avctx, "drc_gain %i\n", s->drc_gain);
     }
 
     /** no idea what these are for, might be the number of samples
         that need to be skipped at the beginning or end of a stream */
-    if (get_bits1(gb)) {
+    if (bitstream_read_bit(bc)) {
         int av_unused skip;
 
         /** usually true for the first frame */
-        if (get_bits1(gb)) {
-            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
-            av_dlog(s->avctx, "start skip: %i\n", skip);
+        if (bitstream_read_bit(bc)) {
+            skip = bitstream_read(bc, av_log2(s->samples_per_frame * 2));
+            ff_dlog(s->avctx, "start skip: %i\n", skip);
         }
 
         /** sometimes true for the last frame */
-        if (get_bits1(gb)) {
-            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
-            av_dlog(s->avctx, "end skip: %i\n", skip);
+        if (bitstream_read_bit(bc)) {
+            skip = bitstream_read(bc, av_log2(s->samples_per_frame * 2));
+            ff_dlog(s->avctx, "end skip: %i\n", skip);
         }
 
     }
 
-    av_dlog(s->avctx, "BITSTREAM: frame header length was %i\n",
-            get_bits_count(gb) - s->frame_offset);
+    ff_dlog(s->avctx, "BITSTREAM: frame header length was %i\n",
+            bitstream_tell(bc) - s->frame_offset);
 
     /** reset subframe states */
     s->parsed_all_subframes = 0;
@@ -1388,29 +1402,31 @@ static int decode_frame(WMAProDecodeCtx *s, AVFrame *frame, int *got_frame_ptr)
     if (s->skip_frame) {
         s->skip_frame = 0;
         *got_frame_ptr = 0;
+        av_frame_unref(frame);
     } else {
         *got_frame_ptr = 1;
     }
 
     if (s->len_prefix) {
-        if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
+        if (len != (bitstream_tell(bc) - s->frame_offset) + 2) {
             /** FIXME: not sure if this is always an error */
             av_log(s->avctx, AV_LOG_ERROR,
-                   "frame[%i] would have to skip %i bits\n", s->frame_num,
-                   len - (get_bits_count(gb) - s->frame_offset) - 1);
+                   "frame[%"PRIu32"] would have to skip %i bits\n",
+                   s->frame_num,
+                   len - (bitstream_tell(bc) - s->frame_offset) - 1);
             s->packet_loss = 1;
             return 0;
         }
 
         /** skip the rest of the frame data */
-        skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
+        bitstream_skip(bc, len - (bitstream_tell(bc) - s->frame_offset) - 1);
     } else {
-        while (get_bits_count(gb) < s->num_saved_bits && get_bits1(gb) == 0) {
+        while (bitstream_tell(bc) < s->num_saved_bits && bitstream_read_bit(bc) == 0) {
         }
     }
 
     /** decode trailer bit */
-    more_frames = get_bits1(gb);
+    more_frames = bitstream_read_bit(bc);
 
     ++s->frame_num;
     return more_frames;
@@ -1419,32 +1435,32 @@ static int decode_frame(WMAProDecodeCtx *s, AVFrame *frame, int *got_frame_ptr)
 /**
  *@brief Calculate remaining input buffer length.
  *@param s codec context
- *@param gb bitstream reader context
+ *@param bc bitstream reader context
  *@return remaining size in bits
  */
-static int remaining_bits(WMAProDecodeCtx *s, GetBitContext *gb)
+static int remaining_bits(WMAProDecodeCtx *s, BitstreamContext *bc)
 {
-    return s->buf_bit_size - get_bits_count(gb);
+    return s->buf_bit_size - bitstream_tell(bc);
 }
 
 /**
  *@brief Fill the bit reservoir with a (partial) frame.
  *@param s codec context
- *@param gb bitstream reader context
+ *@param bc bitstream reader context
  *@param len length of the partial frame
  *@param append decides whether to reset the buffer or not
  */
-static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len,
+static void save_bits(WMAProDecodeCtx *s, BitstreamContext *bc, int len,
                       int append)
 {
     int buflen;
 
     /** when the frame data does not need to be concatenated, the input buffer
-        is resetted and additional bits from the previous frame are copyed
+        is reset and additional bits from the previous frame are copied
         and skipped later so that a fast byte copy is possible */
 
     if (!append) {
-        s->frame_offset = get_bits_count(gb) & 7;
+        s->frame_offset = bitstream_tell(bc) & 7;
         s->num_saved_bits = s->frame_offset;
         init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
     }
@@ -1452,31 +1468,39 @@ static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len,
     buflen = (s->num_saved_bits + len + 8) >> 3;
 
     if (len <= 0 || buflen > MAX_FRAMESIZE) {
-        av_log_ask_for_sample(s->avctx, "input buffer too small\n");
+        avpriv_request_sample(s->avctx, "Too small input buffer");
+        s->packet_loss = 1;
+        return;
+    }
+
+    if (len > put_bits_left(&s->pb)) {
+        av_log(s->avctx, AV_LOG_ERROR,
+               "Cannot append %d bits, only %d bits available.\n",
+               len, put_bits_left(&s->pb));
         s->packet_loss = 1;
         return;
     }
 
     s->num_saved_bits += len;
     if (!append) {
-        avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
-                     s->num_saved_bits);
+        avpriv_copy_bits(&s->pb, bc->buffer + (bitstream_tell(bc) >> 3),
+                         s->num_saved_bits);
     } else {
-        int align = 8 - (get_bits_count(gb) & 7);
+        int align = 8 - (bitstream_tell(bc) & 7);
         align = FFMIN(align, len);
-        put_bits(&s->pb, align, get_bits(gb, align));
+        put_bits(&s->pb, align, bitstream_read(bc, align));
         len -= align;
-        avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
+        avpriv_copy_bits(&s->pb, bc->buffer + (bitstream_tell(bc) >> 3), len);
     }
-    skip_bits_long(gb, len);
+    bitstream_skip(bc, len);
 
     {
         PutBitContext tmp = s->pb;
         flush_put_bits(&tmp);
     }
 
-    init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
-    skip_bits(&s->gb, s->frame_offset);
+    bitstream_init(&s->bc, s->frame_data, s->num_saved_bits);
+    bitstream_skip(&s->bc, s->frame_offset);
 }
 
 /**
@@ -1490,7 +1514,7 @@ static int decode_packet(AVCodecContext *avctx, void *data,
                          int *got_frame_ptr, AVPacket* avpkt)
 {
     WMAProDecodeCtx *s = avctx->priv_data;
-    GetBitContext* gb  = &s->pgb;
+    BitstreamContext *bc = &s->pbc;
     const uint8_t* buf = avpkt->data;
     int buf_size       = avpkt->size;
     int num_bits_prev_frame;
@@ -1513,26 +1537,27 @@ static int decode_packet(AVCodecContext *avctx, void *data,
         s->buf_bit_size = buf_size << 3;
 
         /** parse packet header */
-        init_get_bits(gb, buf, s->buf_bit_size);
-        packet_sequence_number = get_bits(gb, 4);
-        skip_bits(gb, 2);
+        bitstream_init(bc, buf, s->buf_bit_size);
+        packet_sequence_number = bitstream_read(bc, 4);
+        bitstream_skip(bc, 2);
 
         /** get number of bits that need to be added to the previous frame */
-        num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
-        av_dlog(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number,
+        num_bits_prev_frame = bitstream_read(bc, s->log2_frame_size);
+        ff_dlog(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number,
                 num_bits_prev_frame);
 
         /** check for packet loss */
         if (!s->packet_loss &&
             ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
             s->packet_loss = 1;
-            av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n",
+            av_log(avctx, AV_LOG_ERROR,
+                   "Packet loss detected! seq %"PRIx8" vs %x\n",
                    s->packet_sequence_number, packet_sequence_number);
         }
         s->packet_sequence_number = packet_sequence_number;
 
         if (num_bits_prev_frame > 0) {
-            int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb);
+            int remaining_packet_bits = s->buf_bit_size - bitstream_tell(bc);
             if (num_bits_prev_frame >= remaining_packet_bits) {
                 num_bits_prev_frame = remaining_packet_bits;
                 s->packet_done = 1;
@@ -1540,15 +1565,15 @@ static int decode_packet(AVCodecContext *avctx, void *data,
 
             /** append the previous frame data to the remaining data from the
                 previous packet to create a full frame */
-            save_bits(s, gb, num_bits_prev_frame, 1);
-            av_dlog(avctx, "accumulated %x bits of frame data\n",
+            save_bits(s, bc, num_bits_prev_frame, 1);
+            ff_dlog(avctx, "accumulated %x bits of frame data\n",
                     s->num_saved_bits - s->frame_offset);
 
             /** decode the cross packet frame if it is valid */
             if (!s->packet_loss)
                 decode_frame(s, data, got_frame_ptr);
         } else if (s->num_saved_bits - s->frame_offset) {
-            av_dlog(avctx, "ignoring %x previously saved bits\n",
+            ff_dlog(avctx, "ignoring %x previously saved bits\n",
                     s->num_saved_bits - s->frame_offset);
         }
 
@@ -1563,15 +1588,15 @@ static int decode_packet(AVCodecContext *avctx, void *data,
     } else {
         int frame_size;
         s->buf_bit_size = (avpkt->size - s->next_packet_start) << 3;
-        init_get_bits(gb, avpkt->data, s->buf_bit_size);
-        skip_bits(gb, s->packet_offset);
-        if (s->len_prefix && remaining_bits(s, gb) > s->log2_frame_size &&
-            (frame_size = show_bits(gb, s->log2_frame_size)) &&
-            frame_size <= remaining_bits(s, gb)) {
-            save_bits(s, gb, frame_size, 0);
+        bitstream_init(bc, avpkt->data, s->buf_bit_size);
+        bitstream_skip(bc, s->packet_offset);
+        if (s->len_prefix && remaining_bits(s, bc) > s->log2_frame_size &&
+            (frame_size = bitstream_peek(bc, s->log2_frame_size)) &&
+            frame_size <= remaining_bits(s, bc)) {
+            save_bits(s, bc, frame_size, 0);
             s->packet_done = !decode_frame(s, data, got_frame_ptr);
         } else if (!s->len_prefix
-                   && s->num_saved_bits > get_bits_count(&s->gb)) {
+                   && s->num_saved_bits > bitstream_tell(&s->bc)) {
             /** when the frames do not have a length prefix, we don't know
                 the compressed length of the individual frames
                 however, we know what part of a new packet belongs to the
@@ -1585,17 +1610,17 @@ static int decode_packet(AVCodecContext *avctx, void *data,
     }
 
     if (s->packet_done && !s->packet_loss &&
-        remaining_bits(s, gb) > 0) {
+        remaining_bits(s, bc) > 0) {
         /** save the rest of the data so that it can be decoded
             with the next packet */
-        save_bits(s, gb, remaining_bits(s, gb), 0);
+        save_bits(s, bc, remaining_bits(s, bc), 0);
     }
 
-    s->packet_offset = get_bits_count(gb) & 7;
+    s->packet_offset = bitstream_tell(bc) & 7;
     if (s->packet_loss)
         return AVERROR_INVALIDDATA;
 
-    return get_bits_count(gb) >> 3;
+    return bitstream_tell(bc) >> 3;
 }
 
 /**
@@ -1620,15 +1645,15 @@ static void flush(AVCodecContext *avctx)
  */
 AVCodec ff_wmapro_decoder = {
     .name           = "wmapro",
+    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Professional"),
     .type           = AVMEDIA_TYPE_AUDIO,
     .id             = AV_CODEC_ID_WMAPRO,
     .priv_data_size = sizeof(WMAProDecodeCtx),
     .init           = decode_init,
     .close          = decode_end,
     .decode         = decode_packet,
-    .capabilities   = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
     .flush          = flush,
-    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Professional"),
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
                                                       AV_SAMPLE_FMT_NONE },
 };