From: Alexandra Hájková <[email protected]>

---
 libavcodec/aac_adtstoasc_bsf.c |  20 +-
 libavcodec/aac_parser.c        |   7 +-
 libavcodec/aacadtsdec.c        |  34 +--
 libavcodec/aacadtsdec.h        |   7 +-
 libavcodec/aacdec.c            | 548 ++++++++++++++++++++---------------------
 libavcodec/aacps.c             |  78 +++---
 libavcodec/aacps.h             |   4 +-
 libavcodec/aacsbr.c            | 248 ++++++++++---------
 libavcodec/aacsbr.h            |   4 +-
 9 files changed, 477 insertions(+), 473 deletions(-)

diff --git a/libavcodec/aac_adtstoasc_bsf.c b/libavcodec/aac_adtstoasc_bsf.c
index 9168e2b..81a4c15 100644
--- a/libavcodec/aac_adtstoasc_bsf.c
+++ b/libavcodec/aac_adtstoasc_bsf.c
@@ -21,9 +21,9 @@
 
 #include "avcodec.h"
 #include "aacadtsdec.h"
+#include "bitstream.h"
 #include "bsf.h"
 #include "put_bits.h"
-#include "get_bits.h"
 #include "mpeg4audio.h"
 #include "internal.h"
 
@@ -39,7 +39,7 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket 
*out)
 {
     AACBSFContext *ctx = bsfc->priv_data;
 
-    GetBitContext gb;
+    BitstreamContext bc;
     PutBitContext pb;
     AACADTSHeaderInfo hdr;
     AVPacket *in;
@@ -52,12 +52,12 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, 
AVPacket *out)
     if (in->size < AAC_ADTS_HEADER_SIZE)
         goto packet_too_small;
 
-    init_get_bits(&gb, in->data, AAC_ADTS_HEADER_SIZE * 8);
+    bitstream_init8(&bc, in->data, AAC_ADTS_HEADER_SIZE);
 
-    if (bsfc->par_in->extradata && show_bits(&gb, 12) != 0xfff)
+    if (bsfc->par_in->extradata && bitstream_read(&bc, 12) != 0xfff)
         goto finish;
 
-    if (avpriv_aac_parse_header(&gb, &hdr) < 0) {
+    if (avpriv_aac_parse_header(&bc, &hdr) < 0) {
         av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
         ret = AVERROR_INVALIDDATA;
         goto fail;
@@ -81,8 +81,8 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket 
*out)
         uint8_t       *extradata;
 
         if (!hdr.chan_config) {
-            init_get_bits(&gb, in->data, in->size * 8);
-            if (get_bits(&gb, 3) != 5) {
+            bitstream_init8(&bc, in->data, in->size);
+            if (bitstream_read(&bc, 3) != 5) {
                 avpriv_report_missing_feature(bsfc,
                                               "PCE-based channel configuration 
"
                                               "without PCE as first syntax "
@@ -91,10 +91,10 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, 
AVPacket *out)
                 goto fail;
             }
             init_put_bits(&pb, pce_data, MAX_PCE_SIZE);
-            pce_size = avpriv_copy_pce_data(&pb, &gb)/8;
+            pce_size = avpriv_copy_pce_data(&pb, &bc)/8;
             flush_put_bits(&pb);
-            in->size -= get_bits_count(&gb)/8;
-            in->data += get_bits_count(&gb)/8;
+            in->size -= bitstream_tell(&bc)/8;
+            in->data += bitstream_tell(&bc)/8;
         }
 
         extradata = av_packet_new_side_data(in, AV_PKT_DATA_NEW_EXTRADATA,
diff --git a/libavcodec/aac_parser.c b/libavcodec/aac_parser.c
index eae120a..d2c4272 100644
--- a/libavcodec/aac_parser.c
+++ b/libavcodec/aac_parser.c
@@ -23,13 +23,13 @@
 #include "parser.h"
 #include "aac_ac3_parser.h"
 #include "aacadtsdec.h"
-#include "get_bits.h"
+#include "bitstream.h"
 #include "mpeg4audio.h"
 
 static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
         int *need_next_header, int *new_frame_start)
 {
-    GetBitContext bits;
+    BitstreamContext bits;
     AACADTSHeaderInfo hdr;
     int size;
     union {
@@ -38,7 +38,8 @@ static int aac_sync(uint64_t state, AACAC3ParseContext 
*hdr_info,
     } tmp;
 
     tmp.u64 = av_be2ne64(state);
-    init_get_bits(&bits, tmp.u8+8-AAC_ADTS_HEADER_SIZE, AAC_ADTS_HEADER_SIZE * 
8);
+    bitstream_init8(&bits, tmp.u8 + 8 - AAC_ADTS_HEADER_SIZE,
+                    AAC_ADTS_HEADER_SIZE);
 
     if ((size = avpriv_aac_parse_header(&bits, &hdr)) < 0)
         return 0;
diff --git a/libavcodec/aacadtsdec.c b/libavcodec/aacadtsdec.c
index 2994bce..904a4db 100644
--- a/libavcodec/aacadtsdec.c
+++ b/libavcodec/aacadtsdec.c
@@ -23,39 +23,39 @@
 
 #include "aac_ac3_parser.h"
 #include "aacadtsdec.h"
-#include "get_bits.h"
+#include "bitstream.h"
 #include "mpeg4audio.h"
 
-int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
+int avpriv_aac_parse_header(BitstreamContext *bc, AACADTSHeaderInfo *hdr)
 {
     int size, rdb, ch, sr;
     int aot, crc_abs;
 
-    if (get_bits(gbc, 12) != 0xfff)
+    if (bitstream_read(bc, 12) != 0xfff)
         return AAC_AC3_PARSE_ERROR_SYNC;
 
-    skip_bits1(gbc);             /* id */
-    skip_bits(gbc, 2);           /* layer */
-    crc_abs = get_bits1(gbc);    /* protection_absent */
-    aot     = get_bits(gbc, 2);  /* profile_objecttype */
-    sr      = get_bits(gbc, 4);  /* sample_frequency_index */
+    bitstream_skip(bc, 1);             /* id */
+    bitstream_skip(bc, 2);             /* layer */
+    crc_abs = bitstream_read_bit(bc);  /* protection_absent */
+    aot     = bitstream_read(bc, 2);   /* profile_objecttype */
+    sr      = bitstream_read(bc, 4);   /* sample_frequency_index */
     if (!avpriv_mpeg4audio_sample_rates[sr])
         return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
-    skip_bits1(gbc);             /* private_bit */
-    ch = get_bits(gbc, 3);       /* channel_configuration */
+    bitstream_skip(bc, 1);             /* private_bit */
+    ch = bitstream_read(bc, 3);        /* channel_configuration */
 
-    skip_bits1(gbc);             /* original/copy */
-    skip_bits1(gbc);             /* home */
+    bitstream_skip(bc, 1);             /* original/copy */
+    bitstream_skip(bc, 1);             /* home */
 
     /* adts_variable_header */
-    skip_bits1(gbc);             /* copyright_identification_bit */
-    skip_bits1(gbc);             /* copyright_identification_start */
-    size = get_bits(gbc, 13);    /* aac_frame_length */
+    bitstream_skip(bc, 1);              /* copyright_identification_bit */
+    bitstream_skip(bc, 1);              /* copyright_identification_start */
+    size = bitstream_read(bc, 13);      /* aac_frame_length */
     if (size < AAC_ADTS_HEADER_SIZE)
         return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
 
-    skip_bits(gbc, 11);          /* adts_buffer_fullness */
-    rdb = get_bits(gbc, 2);      /* number_of_raw_data_blocks_in_frame */
+    bitstream_skip(bc, 11);             /* adts_buffer_fullness */
+    rdb = bitstream_read(bc, 2);        /* number_of_raw_data_blocks_in_frame 
*/
 
     hdr->object_type    = aot + 1;
     hdr->chan_config    = ch;
diff --git a/libavcodec/aacadtsdec.h b/libavcodec/aacadtsdec.h
index 6319efc..b871cc2 100644
--- a/libavcodec/aacadtsdec.h
+++ b/libavcodec/aacadtsdec.h
@@ -24,7 +24,8 @@
 #define AVCODEC_AACADTSDEC_H
 
 #include <stdint.h>
-#include "get_bits.h"
+
+#include "bitstream.h"
 
 #define AAC_ADTS_HEADER_SIZE 7
 
@@ -43,12 +44,12 @@ typedef struct AACADTSHeaderInfo {
  * Parse AAC frame header.
  * Parse the ADTS frame header to the end of the variable header, which is
  * the first 54 bits.
- * @param[in]  gbc BitContext containing the first 54 bits of the frame.
+ * @param[in]  bc  BitstreamContext containing the first 54 bits of the frame.
  * @param[out] hdr Pointer to struct where header info is written.
  * @return Returns 0 on success, -1 if there is a sync word mismatch,
  * -2 if the version element is invalid, -3 if the sample rate
  * element is invalid, or -4 if the bit rate element is invalid.
  */
-int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr);
+int avpriv_aac_parse_header(BitstreamContext *bc, AACADTSHeaderInfo *hdr);
 
 #endif /* AVCODEC_AACADTSDEC_H */
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index 6a06062..53fa039 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -82,13 +82,14 @@
 
 #include "libavutil/float_dsp.h"
 #include "avcodec.h"
+#include "bitstream.h"
 #include "internal.h"
-#include "get_bits.h"
 #include "fft.h"
 #include "imdct15.h"
 #include "lpc.h"
 #include "kbdwin.h"
 #include "sinewin.h"
+#include "vlc.h"
 
 #include "aac.h"
 #include "aactab.h"
@@ -630,7 +631,7 @@ static ChannelElement *get_che(AACContext *ac, int type, 
int elem_id)
  */
 static void decode_channel_map(uint8_t layout_map[][3],
                                enum ChannelPosition type,
-                               GetBitContext *gb, int n)
+                               BitstreamContext *bc, int n)
 {
     while (n--) {
         enum RawDataBlockType syn_ele;
@@ -638,10 +639,10 @@ static void decode_channel_map(uint8_t layout_map[][3],
         case AAC_CHANNEL_FRONT:
         case AAC_CHANNEL_BACK:
         case AAC_CHANNEL_SIDE:
-            syn_ele = get_bits1(gb);
+            syn_ele = bitstream_read_bit(bc);
             break;
         case AAC_CHANNEL_CC:
-            skip_bits1(gb);
+            bitstream_skip(bc, 1);
             syn_ele = TYPE_CCE;
             break;
         case AAC_CHANNEL_LFE:
@@ -652,7 +653,7 @@ static void decode_channel_map(uint8_t layout_map[][3],
             return;
         }
         layout_map[0][0] = syn_ele;
-        layout_map[0][1] = get_bits(gb, 4);
+        layout_map[0][1] = bitstream_read(bc, 4);
         layout_map[0][2] = type;
         layout_map++;
     }
@@ -665,59 +666,59 @@ static void decode_channel_map(uint8_t layout_map[][3],
  */
 static int decode_pce(AVCodecContext *avctx, MPEG4AudioConfig *m4ac,
                       uint8_t (*layout_map)[3],
-                      GetBitContext *gb)
+                      BitstreamContext *bc)
 {
     int num_front, num_side, num_back, num_lfe, num_assoc_data, num_cc;
     int sampling_index;
     int comment_len;
     int tags;
 
-    skip_bits(gb, 2);  // object_type
+    bitstream_skip(bc, 2);  // object_type
 
-    sampling_index = get_bits(gb, 4);
+    sampling_index = bitstream_read(bc, 4);
     if (m4ac->sampling_index != sampling_index)
         av_log(avctx, AV_LOG_WARNING,
                "Sample rate index in program config element does not "
                "match the sample rate index configured by the container.\n");
 
-    num_front       = get_bits(gb, 4);
-    num_side        = get_bits(gb, 4);
-    num_back        = get_bits(gb, 4);
-    num_lfe         = get_bits(gb, 2);
-    num_assoc_data  = get_bits(gb, 3);
-    num_cc          = get_bits(gb, 4);
+    num_front       = bitstream_read(bc, 4);
+    num_side        = bitstream_read(bc, 4);
+    num_back        = bitstream_read(bc, 4);
+    num_lfe         = bitstream_read(bc, 2);
+    num_assoc_data  = bitstream_read(bc, 3);
+    num_cc          = bitstream_read(bc, 4);
 
-    if (get_bits1(gb))
-        skip_bits(gb, 4); // mono_mixdown_tag
-    if (get_bits1(gb))
-        skip_bits(gb, 4); // stereo_mixdown_tag
+    if (bitstream_read_bit(bc))
+        bitstream_skip(bc, 4); // mono_mixdown_tag
+    if (bitstream_read_bit(bc))
+        bitstream_skip(bc, 4); // stereo_mixdown_tag
 
-    if (get_bits1(gb))
-        skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround
+    if (bitstream_read_bit(bc))
+        bitstream_skip(bc, 3); // mixdown_coeff_index and pseudo_surround
 
-    decode_channel_map(layout_map       , AAC_CHANNEL_FRONT, gb, num_front);
+    decode_channel_map(layout_map,        AAC_CHANNEL_FRONT, bc, num_front);
     tags = num_front;
-    decode_channel_map(layout_map + tags, AAC_CHANNEL_SIDE,  gb, num_side);
+    decode_channel_map(layout_map + tags, AAC_CHANNEL_SIDE,  bc, num_side);
     tags += num_side;
-    decode_channel_map(layout_map + tags, AAC_CHANNEL_BACK,  gb, num_back);
+    decode_channel_map(layout_map + tags, AAC_CHANNEL_BACK,  bc, num_back);
     tags += num_back;
-    decode_channel_map(layout_map + tags, AAC_CHANNEL_LFE,   gb, num_lfe);
+    decode_channel_map(layout_map + tags, AAC_CHANNEL_LFE,   bc, num_lfe);
     tags += num_lfe;
 
-    skip_bits_long(gb, 4 * num_assoc_data);
+    bitstream_skip(bc, 4 * num_assoc_data);
 
-    decode_channel_map(layout_map + tags, AAC_CHANNEL_CC,    gb, num_cc);
+    decode_channel_map(layout_map + tags, AAC_CHANNEL_CC,    bc, num_cc);
     tags += num_cc;
 
-    align_get_bits(gb);
+    bitstream_align(bc);
 
     /* comment field, first byte is length */
-    comment_len = get_bits(gb, 8) * 8;
-    if (get_bits_left(gb) < comment_len) {
+    comment_len = bitstream_read(bc, 8) * 8;
+    if (bitstream_bits_left(bc) < comment_len) {
         av_log(avctx, AV_LOG_ERROR, overread_err);
         return AVERROR_INVALIDDATA;
     }
-    skip_bits_long(gb, comment_len);
+    bitstream_skip(bc, comment_len);
     return tags;
 }
 
@@ -730,7 +731,7 @@ static int decode_pce(AVCodecContext *avctx, 
MPEG4AudioConfig *m4ac,
  * @return  Returns error status. 0 - OK, !0 - error
  */
 static int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx,
-                                     GetBitContext *gb,
+                                     BitstreamContext *bc,
                                      MPEG4AudioConfig *m4ac,
                                      int channel_config)
 {
@@ -738,23 +739,23 @@ static int decode_ga_specific_config(AACContext *ac, 
AVCodecContext *avctx,
     uint8_t layout_map[MAX_ELEM_ID*4][3];
     int tags = 0;
 
-    if (get_bits1(gb)) { // frameLengthFlag
+    if (bitstream_read_bit(bc)) { // frameLengthFlag
         avpriv_request_sample(avctx, "960/120 MDCT window");
         return AVERROR_PATCHWELCOME;
     }
     m4ac->frame_length_short = 0;
 
-    if (get_bits1(gb))       // dependsOnCoreCoder
-        skip_bits(gb, 14);   // coreCoderDelay
-    extension_flag = get_bits1(gb);
+    if (bitstream_read_bit(bc)) // dependsOnCoreCoder
+        bitstream_skip(bc, 14); // coreCoderDelay
+    extension_flag = bitstream_read_bit(bc);
 
     if (m4ac->object_type == AOT_AAC_SCALABLE ||
         m4ac->object_type == AOT_ER_AAC_SCALABLE)
-        skip_bits(gb, 3);     // layerNr
+        bitstream_skip(bc, 3);  // layerNr
 
     if (channel_config == 0) {
-        skip_bits(gb, 4);  // element_instance_tag
-        tags = decode_pce(avctx, m4ac, layout_map, gb);
+        bitstream_skip(bc, 4);  // element_instance_tag
+        tags = decode_pce(avctx, m4ac, layout_map, bc);
         if (tags < 0)
             return tags;
     } else {
@@ -774,14 +775,14 @@ static int decode_ga_specific_config(AACContext *ac, 
AVCodecContext *avctx,
     if (extension_flag) {
         switch (m4ac->object_type) {
         case AOT_ER_BSAC:
-            skip_bits(gb, 5);    // numOfSubFrame
-            skip_bits(gb, 11);   // layer_length
+            bitstream_skip(bc, 5);  // numOfSubFrame
+            bitstream_skip(bc, 11); // layer_length
             break;
         case AOT_ER_AAC_LC:
         case AOT_ER_AAC_LTP:
         case AOT_ER_AAC_SCALABLE:
         case AOT_ER_AAC_LD:
-            res_flags = get_bits(gb, 3);
+            res_flags = bitstream_read(bc, 3);
             if (res_flags) {
                 avpriv_report_missing_feature(avctx,
                                               "AAC data resilience (flags %x)",
@@ -790,14 +791,14 @@ static int decode_ga_specific_config(AACContext *ac, 
AVCodecContext *avctx,
             }
             break;
         }
-        skip_bits1(gb);    // extensionFlag3 (TBD in version 3)
+        bitstream_skip(bc, 1); // extensionFlag3 (TBD in version 3)
     }
     switch (m4ac->object_type) {
     case AOT_ER_AAC_LC:
     case AOT_ER_AAC_LTP:
     case AOT_ER_AAC_SCALABLE:
     case AOT_ER_AAC_LD:
-        ep_config = get_bits(gb, 2);
+        ep_config = bitstream_read(bc, 2);
         if (ep_config) {
             avpriv_report_missing_feature(avctx,
                                           "epConfig %d", ep_config);
@@ -808,7 +809,7 @@ static int decode_ga_specific_config(AACContext *ac, 
AVCodecContext *avctx,
 }
 
 static int decode_eld_specific_config(AACContext *ac, AVCodecContext *avctx,
-                                     GetBitContext *gb,
+                                     BitstreamContext *bc,
                                      MPEG4AudioConfig *m4ac,
                                      int channel_config)
 {
@@ -820,8 +821,8 @@ static int decode_eld_specific_config(AACContext *ac, 
AVCodecContext *avctx,
     m4ac->ps  = 0;
     m4ac->sbr = 0;
 
-    m4ac->frame_length_short = get_bits1(gb);
-    res_flags = get_bits(gb, 3);
+    m4ac->frame_length_short = bitstream_read_bit(bc);
+    res_flags                = bitstream_read(bc, 3);
     if (res_flags) {
         avpriv_report_missing_feature(avctx,
                                       "AAC data resilience (flags %x)",
@@ -829,23 +830,23 @@ static int decode_eld_specific_config(AACContext *ac, 
AVCodecContext *avctx,
         return AVERROR_PATCHWELCOME;
     }
 
-    if (get_bits1(gb)) { // ldSbrPresentFlag
+    if (bitstream_read_bit(bc)) { // ldSbrPresentFlag
         avpriv_report_missing_feature(avctx,
                                       "Low Delay SBR");
         return AVERROR_PATCHWELCOME;
     }
 
-    while (get_bits(gb, 4) != ELDEXT_TERM) {
-        int len = get_bits(gb, 4);
+    while (bitstream_read(bc, 4) != ELDEXT_TERM) {
+        int len = bitstream_read(bc, 4);
         if (len == 15)
-            len += get_bits(gb, 8);
+            len += bitstream_read(bc, 8);
         if (len == 15 + 255)
-            len += get_bits(gb, 16);
-        if (get_bits_left(gb) < len * 8 + 4) {
+            len += bitstream_read(bc, 16);
+        if (bitstream_bits_left(bc) < len * 8 + 4) {
             av_log(avctx, AV_LOG_ERROR, overread_err);
             return AVERROR_INVALIDDATA;
         }
-        skip_bits_long(gb, 8 * len);
+        bitstream_skip(bc, 8 * len);
     }
 
     if ((ret = set_default_channel_config(avctx, layout_map,
@@ -855,7 +856,7 @@ static int decode_eld_specific_config(AACContext *ac, 
AVCodecContext *avctx,
     if (ac && (ret = output_configure(ac, layout_map, tags, OC_GLOBAL_HDR, 0)))
         return ret;
 
-    ep_config = get_bits(gb, 2);
+    ep_config = bitstream_read(bc, 2);
     if (ep_config) {
         avpriv_report_missing_feature(avctx,
                                       "epConfig %d", ep_config);
@@ -882,7 +883,7 @@ static int decode_audio_specific_config(AACContext *ac,
                                         const uint8_t *data, int bit_size,
                                         int sync_extension)
 {
-    GetBitContext gb;
+    BitstreamContext bc;
     int i, ret;
 
     ff_dlog(avctx, "extradata size %d\n", avctx->extradata_size);
@@ -890,7 +891,7 @@ static int decode_audio_specific_config(AACContext *ac,
         ff_dlog(avctx, "%02x ", avctx->extradata[i]);
     ff_dlog(avctx, "\n");
 
-    if ((ret = init_get_bits(&gb, data, bit_size)) < 0)
+    if ((ret = bitstream_init(&bc, data, bit_size)) < 0)
         return ret;
 
     if ((i = avpriv_mpeg4audio_get_config(m4ac, data, bit_size,
@@ -910,7 +911,7 @@ static int decode_audio_specific_config(AACContext *ac,
         return AVERROR_INVALIDDATA;
     }
 
-    skip_bits_long(&gb, i);
+    bitstream_skip(&bc, i);
 
     switch (m4ac->object_type) {
     case AOT_AAC_MAIN:
@@ -918,12 +919,12 @@ static int decode_audio_specific_config(AACContext *ac,
     case AOT_AAC_LTP:
     case AOT_ER_AAC_LC:
     case AOT_ER_AAC_LD:
-        if ((ret = decode_ga_specific_config(ac, avctx, &gb,
-                                            m4ac, m4ac->chan_config)) < 0)
+        if ((ret = decode_ga_specific_config(ac, avctx, &bc,
+                                             m4ac, m4ac->chan_config)) < 0)
             return ret;
         break;
     case AOT_ER_AAC_ELD:
-        if ((ret = decode_eld_specific_config(ac, avctx, &gb,
+        if ((ret = decode_eld_specific_config(ac, avctx, &bc,
                                               m4ac, m4ac->chan_config)) < 0)
             return ret;
         break;
@@ -941,7 +942,7 @@ static int decode_audio_specific_config(AACContext *ac,
             m4ac->sample_rate, m4ac->sbr,
             m4ac->ps);
 
-    return get_bits_count(&gb);
+    return bitstream_tell(&bc);
 }
 
 /**
@@ -1114,29 +1115,29 @@ static av_cold int aac_decode_init(AVCodecContext 
*avctx)
 /**
  * Skip data_stream_element; reference: table 4.10.
  */
-static int skip_data_stream_element(AACContext *ac, GetBitContext *gb)
+static int skip_data_stream_element(AACContext *ac, BitstreamContext *bc)
 {
-    int byte_align = get_bits1(gb);
-    int count = get_bits(gb, 8);
+    int byte_align = bitstream_read_bit(bc);
+    int count      = bitstream_read(bc, 8);
     if (count == 255)
-        count += get_bits(gb, 8);
+        count += bitstream_read(bc, 8);
     if (byte_align)
-        align_get_bits(gb);
+        bitstream_align(bc);
 
-    if (get_bits_left(gb) < 8 * count) {
+    if (bitstream_bits_left(bc) < 8 * count) {
         av_log(ac->avctx, AV_LOG_ERROR, overread_err);
         return AVERROR_INVALIDDATA;
     }
-    skip_bits_long(gb, 8 * count);
+    bitstream_skip(bc, 8 * count);
     return 0;
 }
 
 static int decode_prediction(AACContext *ac, IndividualChannelStream *ics,
-                             GetBitContext *gb)
+                             BitstreamContext *bc)
 {
     int sfb;
-    if (get_bits1(gb)) {
-        ics->predictor_reset_group = get_bits(gb, 5);
+    if (bitstream_read_bit(bc)) {
+        ics->predictor_reset_group = bitstream_read(bc, 5);
         if (ics->predictor_reset_group == 0 ||
             ics->predictor_reset_group > 30) {
             av_log(ac->avctx, AV_LOG_ERROR,
@@ -1145,7 +1146,7 @@ static int decode_prediction(AACContext *ac, 
IndividualChannelStream *ics,
         }
     }
     for (sfb = 0; sfb < FFMIN(ics->max_sfb, 
ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index]); sfb++) {
-        ics->prediction_used[sfb] = get_bits1(gb);
+        ics->prediction_used[sfb] = bitstream_read_bit(bc);
     }
     return 0;
 }
@@ -1154,33 +1155,33 @@ static int decode_prediction(AACContext *ac, 
IndividualChannelStream *ics,
  * Decode Long Term Prediction data; reference: table 4.xx.
  */
 static void decode_ltp(LongTermPrediction *ltp,
-                       GetBitContext *gb, uint8_t max_sfb)
+                       BitstreamContext *bc, uint8_t max_sfb)
 {
     int sfb;
 
-    ltp->lag  = get_bits(gb, 11);
-    ltp->coef = ltp_coef[get_bits(gb, 3)];
+    ltp->lag  = bitstream_read(bc, 11);
+    ltp->coef = ltp_coef[bitstream_read(bc, 3)];
     for (sfb = 0; sfb < FFMIN(max_sfb, MAX_LTP_LONG_SFB); sfb++)
-        ltp->used[sfb] = get_bits1(gb);
+        ltp->used[sfb] = bitstream_read_bit(bc);
 }
 
 /**
  * Decode Individual Channel Stream info; reference: table 4.6.
  */
 static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
-                           GetBitContext *gb)
+                           BitstreamContext *bc)
 {
     const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
     const int aot = m4ac->object_type;
     const int sampling_index = m4ac->sampling_index;
     if (aot != AOT_ER_AAC_ELD) {
-        if (get_bits1(gb)) {
+        if (bitstream_read_bit(bc)) {
             av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n");
             if (ac->avctx->err_recognition & AV_EF_BITSTREAM)
                 return AVERROR_INVALIDDATA;
         }
         ics->window_sequence[1] = ics->window_sequence[0];
-        ics->window_sequence[0] = get_bits(gb, 2);
+        ics->window_sequence[0] = bitstream_read(bc, 2);
         if (aot == AOT_ER_AAC_LD &&
             ics->window_sequence[0] != ONLY_LONG_SEQUENCE) {
             av_log(ac->avctx, AV_LOG_ERROR,
@@ -1190,15 +1191,15 @@ static int decode_ics_info(AACContext *ac, 
IndividualChannelStream *ics,
             return AVERROR_INVALIDDATA;
         }
         ics->use_kb_window[1]   = ics->use_kb_window[0];
-        ics->use_kb_window[0]   = get_bits1(gb);
+        ics->use_kb_window[0]   = bitstream_read_bit(bc);
     }
     ics->num_window_groups  = 1;
     ics->group_len[0]       = 1;
     if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
         int i;
-        ics->max_sfb = get_bits(gb, 4);
+        ics->max_sfb = bitstream_read(bc, 4);
         for (i = 0; i < 7; i++) {
-            if (get_bits1(gb)) {
+            if (bitstream_read_bit(bc)) {
                 ics->group_len[ics->num_window_groups - 1]++;
             } else {
                 ics->num_window_groups++;
@@ -1211,7 +1212,7 @@ static int decode_ics_info(AACContext *ac, 
IndividualChannelStream *ics,
         ics->tns_max_bands     = ff_tns_max_bands_128[sampling_index];
         ics->predictor_present = 0;
     } else {
-        ics->max_sfb           = get_bits(gb, 6);
+        ics->max_sfb           = bitstream_read(bc, 6);
         ics->num_windows       = 1;
         if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) {
             if (m4ac->frame_length_short) {
@@ -1231,12 +1232,12 @@ static int decode_ics_info(AACContext *ac, 
IndividualChannelStream *ics,
             ics->tns_max_bands = ff_tns_max_bands_1024[sampling_index];
         }
         if (aot != AOT_ER_AAC_ELD) {
-            ics->predictor_present     = get_bits1(gb);
+            ics->predictor_present     = bitstream_read_bit(bc);
             ics->predictor_reset_group = 0;
         }
         if (ics->predictor_present) {
             if (aot == AOT_AAC_MAIN) {
-                if (decode_prediction(ac, ics, gb)) {
+                if (decode_prediction(ac, ics, bc)) {
                     return AVERROR_INVALIDDATA;
                 }
             } else if (aot == AOT_AAC_LC ||
@@ -1250,8 +1251,8 @@ static int decode_ics_info(AACContext *ac, 
IndividualChannelStream *ics,
                            "LTP in ER AAC LD not yet implemented.\n");
                     return AVERROR_PATCHWELCOME;
                 }
-                if ((ics->ltp.present = get_bits(gb, 1)))
-                    decode_ltp(&ics->ltp, gb, ics->max_sfb);
+                if ((ics->ltp.present = bitstream_read(bc, 1)))
+                    decode_ltp(&ics->ltp, bc, ics->max_sfb);
             }
         }
     }
@@ -1276,7 +1277,7 @@ static int decode_ics_info(AACContext *ac, 
IndividualChannelStream *ics,
  * @return  Returns error status. 0 - OK, !0 - error
  */
 static int decode_band_types(AACContext *ac, enum BandType band_type[120],
-                             int band_type_run_end[120], GetBitContext *gb,
+                             int band_type_run_end[120], BitstreamContext *bc,
                              IndividualChannelStream *ics)
 {
     int g, idx = 0;
@@ -1286,15 +1287,15 @@ static int decode_band_types(AACContext *ac, enum 
BandType band_type[120],
         while (k < ics->max_sfb) {
             uint8_t sect_end = k;
             int sect_len_incr;
-            int sect_band_type = get_bits(gb, 4);
+            int sect_band_type = bitstream_read(bc, 4);
             if (sect_band_type == 12) {
                 av_log(ac->avctx, AV_LOG_ERROR, "invalid band type\n");
                 return AVERROR_INVALIDDATA;
             }
             do {
-                sect_len_incr = get_bits(gb, bits);
+                sect_len_incr = bitstream_read(bc, bits);
                 sect_end += sect_len_incr;
-                if (get_bits_left(gb) < 0) {
+                if (bitstream_bits_left(bc) < 0) {
                     av_log(ac->avctx, AV_LOG_ERROR, overread_err);
                     return AVERROR_INVALIDDATA;
                 }
@@ -1324,7 +1325,7 @@ static int decode_band_types(AACContext *ac, enum 
BandType band_type[120],
  *
  * @return  Returns error status. 0 - OK, !0 - error
  */
-static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext 
*gb,
+static int decode_scalefactors(AACContext *ac, float sf[120], BitstreamContext 
*bc,
                                unsigned int global_gain,
                                IndividualChannelStream *ics,
                                enum BandType band_type[120],
@@ -1343,7 +1344,7 @@ static int decode_scalefactors(AACContext *ac, float 
sf[120], GetBitContext *gb,
             } else if ((band_type[idx] == INTENSITY_BT) ||
                        (band_type[idx] == INTENSITY_BT2)) {
                 for (; i < run_end; i++, idx++) {
-                    offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 
60;
+                    offset[2] += bitstream_read_vlc(bc, 
vlc_scalefactors.table, 7, 3) - 60;
                     clipped_offset = av_clip(offset[2], -155, 100);
                     if (offset[2] != clipped_offset) {
                         avpriv_request_sample(ac->avctx,
@@ -1356,9 +1357,9 @@ static int decode_scalefactors(AACContext *ac, float 
sf[120], GetBitContext *gb,
             } else if (band_type[idx] == NOISE_BT) {
                 for (; i < run_end; i++, idx++) {
                     if (noise_flag-- > 0)
-                        offset[1] += get_bits(gb, 9) - 256;
+                        offset[1] += bitstream_read(bc, 9) - 256;
                     else
-                        offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 
3) - 60;
+                        offset[1] += bitstream_read_vlc(bc, 
vlc_scalefactors.table, 7, 3) - 60;
                     clipped_offset = av_clip(offset[1], -100, 155);
                     if (offset[1] != clipped_offset) {
                         avpriv_request_sample(ac->avctx,
@@ -1370,7 +1371,7 @@ static int decode_scalefactors(AACContext *ac, float 
sf[120], GetBitContext *gb,
                 }
             } else {
                 for (; i < run_end; i++, idx++) {
-                    offset[0] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 
60;
+                    offset[0] += bitstream_read_vlc(bc, 
vlc_scalefactors.table, 7, 3) - 60;
                     if (offset[0] > 255U) {
                         av_log(ac->avctx, AV_LOG_ERROR,
                                "Scalefactor (%d) out of range.\n", offset[0]);
@@ -1387,24 +1388,24 @@ static int decode_scalefactors(AACContext *ac, float 
sf[120], GetBitContext *gb,
 /**
  * Decode pulse data; reference: table 4.7.
  */
-static int decode_pulses(Pulse *pulse, GetBitContext *gb,
+static int decode_pulses(Pulse *pulse, BitstreamContext *bc,
                          const uint16_t *swb_offset, int num_swb)
 {
     int i, pulse_swb;
-    pulse->num_pulse = get_bits(gb, 2) + 1;
-    pulse_swb        = get_bits(gb, 6);
+    pulse->num_pulse = bitstream_read(bc, 2) + 1;
+    pulse_swb        = bitstream_read(bc, 6);
     if (pulse_swb >= num_swb)
         return -1;
     pulse->pos[0]    = swb_offset[pulse_swb];
-    pulse->pos[0]   += get_bits(gb, 5);
+    pulse->pos[0]   += bitstream_read(bc, 5);
     if (pulse->pos[0] > 1023)
         return -1;
-    pulse->amp[0]    = get_bits(gb, 4);
+    pulse->amp[0]    = bitstream_read(bc, 4);
     for (i = 1; i < pulse->num_pulse; i++) {
-        pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i - 1];
+        pulse->pos[i] = bitstream_read(bc, 5) + pulse->pos[i - 1];
         if (pulse->pos[i] > 1023)
             return -1;
-        pulse->amp[i] = get_bits(gb, 4);
+        pulse->amp[i] = bitstream_read(bc, 4);
     }
     return 0;
 }
@@ -1415,20 +1416,20 @@ static int decode_pulses(Pulse *pulse, GetBitContext 
*gb,
  * @return  Returns error status. 0 - OK, !0 - error
  */
 static int decode_tns(AACContext *ac, TemporalNoiseShaping *tns,
-                      GetBitContext *gb, const IndividualChannelStream *ics)
+                      BitstreamContext *bc, const IndividualChannelStream *ics)
 {
     int w, filt, i, coef_len, coef_res, coef_compress;
     const int is8 = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE;
     const int tns_max_order = is8 ? 7 : ac->oc[1].m4ac.object_type == 
AOT_AAC_MAIN ? 20 : 12;
     for (w = 0; w < ics->num_windows; w++) {
-        if ((tns->n_filt[w] = get_bits(gb, 2 - is8))) {
-            coef_res = get_bits1(gb);
+        if ((tns->n_filt[w] = bitstream_read(bc, 2 - is8))) {
+            coef_res = bitstream_read_bit(bc);
 
             for (filt = 0; filt < tns->n_filt[w]; filt++) {
                 int tmp2_idx;
-                tns->length[w][filt] = get_bits(gb, 6 - 2 * is8);
+                tns->length[w][filt] = bitstream_read(bc, 6 - 2 * is8);
 
-                if ((tns->order[w][filt] = get_bits(gb, 5 - 2 * is8)) > 
tns_max_order) {
+                if ((tns->order[w][filt] = bitstream_read(bc, 5 - 2 * is8)) > 
tns_max_order) {
                     av_log(ac->avctx, AV_LOG_ERROR,
                            "TNS filter order %d is greater than maximum %d.\n",
                            tns->order[w][filt], tns_max_order);
@@ -1436,13 +1437,13 @@ static int decode_tns(AACContext *ac, 
TemporalNoiseShaping *tns,
                     return AVERROR_INVALIDDATA;
                 }
                 if (tns->order[w][filt]) {
-                    tns->direction[w][filt] = get_bits1(gb);
-                    coef_compress = get_bits1(gb);
+                    tns->direction[w][filt] = bitstream_read_bit(bc);
+                    coef_compress           = bitstream_read_bit(bc);
                     coef_len = coef_res + 3 - coef_compress;
                     tmp2_idx = 2 * coef_compress + coef_res;
 
                     for (i = 0; i < tns->order[w][filt]; i++)
-                        tns->coef[w][filt][i] = 
tns_tmp2_map[tmp2_idx][get_bits(gb, coef_len)];
+                        tns->coef[w][filt][i] = 
tns_tmp2_map[tmp2_idx][bitstream_read(bc, coef_len)];
                 }
             }
         }
@@ -1457,14 +1458,14 @@ static int decode_tns(AACContext *ac, 
TemporalNoiseShaping *tns,
  *                      [1] mask is decoded from bitstream; [2] mask is all 1s;
  *                      [3] reserved for scalable AAC
  */
-static void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb,
+static void decode_mid_side_stereo(ChannelElement *cpe, BitstreamContext *bc,
                                    int ms_present)
 {
     int idx;
     int max_idx = cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb;
     if (ms_present == 1) {
         for (idx = 0; idx < max_idx; idx++)
-            cpe->ms_mask[idx] = get_bits1(gb);
+            cpe->ms_mask[idx] = bitstream_read_bit(bc);
     } else if (ms_present == 2) {
         memset(cpe->ms_mask, 1, max_idx * sizeof(cpe->ms_mask[0]));
     }
@@ -1551,7 +1552,7 @@ static inline float *VMUL4S(float *dst, const float *v, 
unsigned idx,
  * @return  Returns error status. 0 - OK, !0 - error
  */
 static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
-                                       GetBitContext *gb, const float sf[120],
+                                       BitstreamContext *bc, const float 
sf[120],
                                        int pulse_present, const Pulse *pulse,
                                        const IndividualChannelStream *ics,
                                        enum BandType band_type[120])
@@ -1596,7 +1597,6 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                 const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
                 const uint16_t *cb_vector_idx = 
ff_aac_codebook_vector_idx[cbt_m1];
                 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table;
-                OPEN_READER(re, gb);
 
                 switch (cbt_m1 >> 1) {
                 case 0:
@@ -1608,8 +1608,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                             int code;
                             unsigned cb_idx;
 
-                            UPDATE_CACHE(re, gb);
-                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
+                            code = bitstream_read_vlc(bc, vlc_tab, 8, 2);
                             cb_idx = cb_vector_idx[code];
                             cf = VMUL4(cf, vq, cb_idx, sf + idx);
                         } while (len -= 4);
@@ -1627,12 +1626,11 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                             unsigned cb_idx;
                             uint32_t bits;
 
-                            UPDATE_CACHE(re, gb);
-                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
+                            code = bitstream_read_vlc(bc, vlc_tab, 8, 2);
                             cb_idx = cb_vector_idx[code];
                             nnz = cb_idx >> 8 & 15;
-                            bits = nnz ? GET_CACHE(re, gb) : 0;
-                            LAST_SKIP_BITS(re, gb, nnz);
+                            bits = nnz ? bitstream_peek(bc, 32) : 0;
+                            bitstream_skip(bc, nnz);
                             cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx);
                         } while (len -= 4);
                     }
@@ -1647,8 +1645,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                             int code;
                             unsigned cb_idx;
 
-                            UPDATE_CACHE(re, gb);
-                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
+                            code = bitstream_read_vlc(bc, vlc_tab, 8, 2);
                             cb_idx = cb_vector_idx[code];
                             cf = VMUL2(cf, vq, cb_idx, sf + idx);
                         } while (len -= 2);
@@ -1667,12 +1664,10 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                             unsigned cb_idx;
                             unsigned sign;
 
-                            UPDATE_CACHE(re, gb);
-                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
+                            code = bitstream_read_vlc(bc, vlc_tab, 8, 2);
                             cb_idx = cb_vector_idx[code];
                             nnz = cb_idx >> 8 & 15;
-                            sign = nnz ? SHOW_UBITS(re, gb, nnz) << (cb_idx >> 
12) : 0;
-                            LAST_SKIP_BITS(re, gb, nnz);
+                            sign = nnz ? bitstream_read(bc, nnz) << (cb_idx >> 
12) : 0;
                             cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx);
                         } while (len -= 2);
                     }
@@ -1691,8 +1686,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                             uint32_t bits;
                             int j;
 
-                            UPDATE_CACHE(re, gb);
-                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
+                            code = bitstream_read_vlc(bc, vlc_tab, 8, 2);
 
                             if (!code) {
                                 *icf++ = 0;
@@ -1703,8 +1697,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                             cb_idx = cb_vector_idx[code];
                             nnz = cb_idx >> 12;
                             nzt = cb_idx >> 8;
-                            bits = SHOW_UBITS(re, gb, nnz) << (32-nnz);
-                            LAST_SKIP_BITS(re, gb, nnz);
+                            bits = bitstream_read(bc, nnz) << (32 - nnz);
 
                             for (j = 0; j < 2; j++) {
                                 if (nzt & 1<<j) {
@@ -1712,8 +1705,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                                     int n;
                                     /* The total length of escape_sequence 
must be < 22 bits according
                                        to the specification (i.e. max is 
111111110xxxxxxxxxxxx). */
-                                    UPDATE_CACHE(re, gb);
-                                    b = GET_CACHE(re, gb);
+                                    b = bitstream_peek(bc, 32);
                                     b = 31 - av_log2(~b);
 
                                     if (b > 8) {
@@ -1721,10 +1713,9 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                                         return AVERROR_INVALIDDATA;
                                     }
 
-                                    SKIP_BITS(re, gb, b + 1);
+                                    bitstream_skip(bc, b + 1);
                                     b += 4;
-                                    n = (1 << b) + SHOW_UBITS(re, gb, b);
-                                    LAST_SKIP_BITS(re, gb, b);
+                                    n = (1 << b) + bitstream_read(bc, b);
                                     *icf++ = cbrt_tab[n] | (bits & 1U<<31);
                                     bits <<= 1;
                                 } else {
@@ -1739,8 +1730,6 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
                         ac->fdsp.vector_fmul_scalar(cfo, cfo, sf[idx], 
off_len);
                     }
                 }
-
-                CLOSE_READER(re, gb);
             }
         }
         coef += g_len << 7;
@@ -1762,6 +1751,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, 
float coef[1024],
             }
         }
     }
+
     return 0;
 }
 
@@ -1860,7 +1850,7 @@ static void apply_prediction(AACContext *ac, 
SingleChannelElement *sce)
  * @return  Returns error status. 0 - OK, !0 - error
  */
 static int decode_ics(AACContext *ac, SingleChannelElement *sce,
-                      GetBitContext *gb, int common_window, int scale_flag)
+                      BitstreamContext *bc, int common_window, int scale_flag)
 {
     Pulse pulse;
     TemporalNoiseShaping    *tns = &sce->tns;
@@ -1880,50 +1870,50 @@ static int decode_ics(AACContext *ac, 
SingleChannelElement *sce,
      */
     pulse.num_pulse = 0;
 
-    global_gain = get_bits(gb, 8);
+    global_gain = bitstream_read(bc, 8);
 
     if (!common_window && !scale_flag) {
-        if (decode_ics_info(ac, ics, gb) < 0)
+        if (decode_ics_info(ac, ics, bc) < 0)
             return AVERROR_INVALIDDATA;
     }
 
     if ((ret = decode_band_types(ac, sce->band_type,
-                                 sce->band_type_run_end, gb, ics)) < 0)
+                                 sce->band_type_run_end, bc, ics)) < 0)
         return ret;
-    if ((ret = decode_scalefactors(ac, sce->sf, gb, global_gain, ics,
-                                  sce->band_type, sce->band_type_run_end)) < 0)
+    if ((ret = decode_scalefactors(ac, sce->sf, bc, global_gain, ics,
+                                   sce->band_type, sce->band_type_run_end)) < 
0)
         return ret;
 
     pulse_present = 0;
     if (!scale_flag) {
-        if (!eld_syntax && (pulse_present = get_bits1(gb))) {
+        if (!eld_syntax && (pulse_present = bitstream_read_bit(bc))) {
             if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
                 av_log(ac->avctx, AV_LOG_ERROR,
                        "Pulse tool not allowed in eight short sequence.\n");
                 return AVERROR_INVALIDDATA;
             }
-            if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) {
+            if (decode_pulses(&pulse, bc, ics->swb_offset, ics->num_swb)) {
                 av_log(ac->avctx, AV_LOG_ERROR,
                        "Pulse data corrupt or invalid.\n");
                 return AVERROR_INVALIDDATA;
             }
         }
-        tns->present = get_bits1(gb);
+        tns->present = bitstream_read_bit(bc);
         if (tns->present && !er_syntax)
-            if (decode_tns(ac, tns, gb, ics) < 0)
+            if (decode_tns(ac, tns, bc, ics) < 0)
                 return AVERROR_INVALIDDATA;
-        if (!eld_syntax && get_bits1(gb)) {
+        if (!eld_syntax && bitstream_read_bit(bc)) {
             avpriv_request_sample(ac->avctx, "SSR");
             return AVERROR_PATCHWELCOME;
         }
         // I see no textual basis in the spec for this occurring after SSR gain
         // control, but this is what both reference and real implementations do
         if (tns->present && er_syntax)
-            if (decode_tns(ac, tns, gb, ics) < 0)
+            if (decode_tns(ac, tns, bc, ics) < 0)
                 return AVERROR_INVALIDDATA;
     }
 
-    if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present,
+    if (decode_spectrum_and_dequant(ac, out, bc, sce->sf, pulse_present,
                                     &pulse, ics, sce->band_type) < 0)
         return AVERROR_INVALIDDATA;
 
@@ -2009,32 +1999,32 @@ static void apply_intensity_stereo(AACContext *ac,
  *
  * @return  Returns error status. 0 - OK, !0 - error
  */
-static int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe)
+static int decode_cpe(AACContext *ac, BitstreamContext *bc, ChannelElement 
*cpe)
 {
     int i, ret, common_window, ms_present = 0;
     int eld_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD;
 
-    common_window = eld_syntax || get_bits1(gb);
+    common_window = eld_syntax || bitstream_read_bit(bc);
     if (common_window) {
-        if (decode_ics_info(ac, &cpe->ch[0].ics, gb))
+        if (decode_ics_info(ac, &cpe->ch[0].ics, bc))
             return AVERROR_INVALIDDATA;
         i = cpe->ch[1].ics.use_kb_window[0];
         cpe->ch[1].ics = cpe->ch[0].ics;
         cpe->ch[1].ics.use_kb_window[1] = i;
         if (cpe->ch[1].ics.predictor_present &&
             (ac->oc[1].m4ac.object_type != AOT_AAC_MAIN))
-            if ((cpe->ch[1].ics.ltp.present = get_bits(gb, 1)))
-                decode_ltp(&cpe->ch[1].ics.ltp, gb, cpe->ch[1].ics.max_sfb);
-        ms_present = get_bits(gb, 2);
+            if ((cpe->ch[1].ics.ltp.present = bitstream_read(bc, 1)))
+                decode_ltp(&cpe->ch[1].ics.ltp, bc, cpe->ch[1].ics.max_sfb);
+        ms_present = bitstream_read(bc, 2);
         if (ms_present == 3) {
             av_log(ac->avctx, AV_LOG_ERROR, "ms_present = 3 is reserved.\n");
             return AVERROR_INVALIDDATA;
         } else if (ms_present)
-            decode_mid_side_stereo(cpe, gb, ms_present);
+            decode_mid_side_stereo(cpe, bc, ms_present);
     }
-    if ((ret = decode_ics(ac, &cpe->ch[0], gb, common_window, 0)))
+    if ((ret = decode_ics(ac, &cpe->ch[0], bc, common_window, 0)))
         return ret;
-    if ((ret = decode_ics(ac, &cpe->ch[1], gb, common_window, 0)))
+    if ((ret = decode_ics(ac, &cpe->ch[1], bc, common_window, 0)))
         return ret;
 
     if (common_window) {
@@ -2062,7 +2052,7 @@ static const float cce_scale[] = {
  *
  * @return  Returns error status. 0 - OK, !0 - error
  */
-static int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che)
+static int decode_cce(AACContext *ac, BitstreamContext *bc, ChannelElement 
*che)
 {
     int num_gain = 0;
     int c, g, sfb, ret;
@@ -2071,25 +2061,25 @@ static int decode_cce(AACContext *ac, GetBitContext 
*gb, ChannelElement *che)
     SingleChannelElement *sce = &che->ch[0];
     ChannelCoupling     *coup = &che->coup;
 
-    coup->coupling_point = 2 * get_bits1(gb);
-    coup->num_coupled = get_bits(gb, 3);
+    coup->coupling_point = 2 * bitstream_read_bit(bc);
+    coup->num_coupled    = bitstream_read(bc, 3);
     for (c = 0; c <= coup->num_coupled; c++) {
         num_gain++;
-        coup->type[c] = get_bits1(gb) ? TYPE_CPE : TYPE_SCE;
-        coup->id_select[c] = get_bits(gb, 4);
+        coup->type[c]      = bitstream_read_bit(bc) ? TYPE_CPE : TYPE_SCE;
+        coup->id_select[c] = bitstream_read(bc, 4);
         if (coup->type[c] == TYPE_CPE) {
-            coup->ch_select[c] = get_bits(gb, 2);
+            coup->ch_select[c] = bitstream_read(bc, 2);
             if (coup->ch_select[c] == 3)
                 num_gain++;
         } else
             coup->ch_select[c] = 2;
     }
-    coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1);
+    coup->coupling_point += bitstream_read_bit(bc) || (coup->coupling_point >> 
1);
 
-    sign  = get_bits(gb, 1);
-    scale = cce_scale[get_bits(gb, 2)];
+    sign  = bitstream_read(bc, 1);
+    scale = cce_scale[bitstream_read(bc, 2)];
 
-    if ((ret = decode_ics(ac, sce, gb, 0, 0)))
+    if ((ret = decode_ics(ac, sce, bc, 0, 0)))
         return ret;
 
     for (c = 0; c < num_gain; c++) {
@@ -2098,8 +2088,8 @@ static int decode_cce(AACContext *ac, GetBitContext *gb, 
ChannelElement *che)
         int gain = 0;
         float gain_cache = 1.0;
         if (c) {
-            cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb);
-            gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0;
+            cge = coup->coupling_point == AFTER_IMDCT ? 1 : 
bitstream_read_bit(bc);
+            gain = cge ? bitstream_read_vlc(bc, vlc_scalefactors.table, 7, 3) 
- 60 : 0;
             gain_cache = powf(scale, -gain);
         }
         if (coup->coupling_point == AFTER_IMDCT) {
@@ -2109,7 +2099,7 @@ static int decode_cce(AACContext *ac, GetBitContext *gb, 
ChannelElement *che)
                 for (sfb = 0; sfb < sce->ics.max_sfb; sfb++, idx++) {
                     if (sce->band_type[idx] != ZERO_BT) {
                         if (!cge) {
-                            int t = get_vlc2(gb, vlc_scalefactors.table, 7, 3) 
- 60;
+                            int t = bitstream_read_vlc(bc, 
vlc_scalefactors.table, 7, 3) - 60;
                             if (t) {
                                 int s = 1;
                                 t = gain += t;
@@ -2135,15 +2125,15 @@ static int decode_cce(AACContext *ac, GetBitContext 
*gb, ChannelElement *che)
  * @return  Returns number of bytes consumed.
  */
 static int decode_drc_channel_exclusions(DynamicRangeControl *che_drc,
-                                         GetBitContext *gb)
+                                         BitstreamContext *bc)
 {
     int i;
     int num_excl_chan = 0;
 
     do {
         for (i = 0; i < 7; i++)
-            che_drc->exclude_mask[num_excl_chan++] = get_bits1(gb);
-    } while (num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb));
+            che_drc->exclude_mask[num_excl_chan++] = bitstream_read_bit(bc);
+    } while (num_excl_chan < MAX_CHANNELS - 7 && bitstream_read_bit(bc));
 
     return num_excl_chan / 7;
 }
@@ -2154,46 +2144,46 @@ static int 
decode_drc_channel_exclusions(DynamicRangeControl *che_drc,
  * @return  Returns number of bytes consumed.
  */
 static int decode_dynamic_range(DynamicRangeControl *che_drc,
-                                GetBitContext *gb)
+                                BitstreamContext *bc)
 {
     int n             = 1;
     int drc_num_bands = 1;
     int i;
 
     /* pce_tag_present? */
-    if (get_bits1(gb)) {
-        che_drc->pce_instance_tag  = get_bits(gb, 4);
-        skip_bits(gb, 4); // tag_reserved_bits
+    if (bitstream_read_bit(bc)) {
+        che_drc->pce_instance_tag  = bitstream_read(bc, 4);
+        bitstream_skip(bc, 4); // tag_reserved_bits
         n++;
     }
 
     /* excluded_chns_present? */
-    if (get_bits1(gb)) {
-        n += decode_drc_channel_exclusions(che_drc, gb);
+    if (bitstream_read_bit(bc)) {
+        n += decode_drc_channel_exclusions(che_drc, bc);
     }
 
     /* drc_bands_present? */
-    if (get_bits1(gb)) {
-        che_drc->band_incr            = get_bits(gb, 4);
-        che_drc->interpolation_scheme = get_bits(gb, 4);
+    if (bitstream_read_bit(bc)) {
+        che_drc->band_incr            = bitstream_read(bc, 4);
+        che_drc->interpolation_scheme = bitstream_read(bc, 4);
         n++;
         drc_num_bands += che_drc->band_incr;
         for (i = 0; i < drc_num_bands; i++) {
-            che_drc->band_top[i] = get_bits(gb, 8);
+            che_drc->band_top[i] = bitstream_read(bc, 8);
             n++;
         }
     }
 
     /* prog_ref_level_present? */
-    if (get_bits1(gb)) {
-        che_drc->prog_ref_level = get_bits(gb, 7);
-        skip_bits1(gb); // prog_ref_level_reserved_bits
+    if (bitstream_read_bit(bc)) {
+        che_drc->prog_ref_level = bitstream_read(bc, 7);
+        bitstream_skip(bc, 1); // prog_ref_level_reserved_bits
         n++;
     }
 
     for (i = 0; i < drc_num_bands; i++) {
-        che_drc->dyn_rng_sgn[i] = get_bits1(gb);
-        che_drc->dyn_rng_ctl[i] = get_bits(gb, 7);
+        che_drc->dyn_rng_sgn[i] = bitstream_read_bit(bc);
+        che_drc->dyn_rng_ctl[i] = bitstream_read(bc, 7);
         n++;
     }
 
@@ -2207,12 +2197,12 @@ static int decode_dynamic_range(DynamicRangeControl 
*che_drc,
  *
  * @return Returns number of bytes consumed
  */
-static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt,
+static int decode_extension_payload(AACContext *ac, BitstreamContext *bc, int 
cnt,
                                     ChannelElement *che, enum RawDataBlockType 
elem_type)
 {
     int crc_flag = 0;
     int res = cnt;
-    switch (get_bits(gb, 4)) { // extension type
+    switch (bitstream_read(bc, 4)) { // extension type
     case EXT_SBR_DATA_CRC:
         crc_flag++;
     case EXT_SBR_DATA:
@@ -2221,11 +2211,11 @@ static int decode_extension_payload(AACContext *ac, 
GetBitContext *gb, int cnt,
             return res;
         } else if (!ac->oc[1].m4ac.sbr) {
             av_log(ac->avctx, AV_LOG_ERROR, "SBR signaled to be not-present 
but was found in the bitstream.\n");
-            skip_bits_long(gb, 8 * cnt - 4);
+            bitstream_skip(bc, 8 * cnt - 4);
             return res;
         } else if (ac->oc[1].m4ac.sbr == -1 && ac->oc[1].status == OC_LOCKED) {
             av_log(ac->avctx, AV_LOG_ERROR, "Implicit SBR was found with a 
first occurrence after the first frame.\n");
-            skip_bits_long(gb, 8 * cnt - 4);
+            bitstream_skip(bc, 8 * cnt - 4);
             return res;
         } else if (ac->oc[1].m4ac.ps == -1 && ac->oc[1].status < OC_LOCKED && 
ac->avctx->channels == 1) {
             ac->oc[1].m4ac.sbr = 1;
@@ -2237,16 +2227,16 @@ static int decode_extension_payload(AACContext *ac, 
GetBitContext *gb, int cnt,
             ac->oc[1].m4ac.sbr = 1;
             ac->avctx->profile = FF_PROFILE_AAC_HE;
         }
-        res = ff_decode_sbr_extension(ac, &che->sbr, gb, crc_flag, cnt, 
elem_type);
+        res = ff_decode_sbr_extension(ac, &che->sbr, bc, crc_flag, cnt, 
elem_type);
         break;
     case EXT_DYNAMIC_RANGE:
-        res = decode_dynamic_range(&ac->che_drc, gb);
+        res = decode_dynamic_range(&ac->che_drc, bc);
         break;
     case EXT_FILL:
     case EXT_FILL_DATA:
     case EXT_DATA_ELEMENT:
     default:
-        skip_bits_long(gb, 8 * cnt - 4);
+        bitstream_skip(bc, 8 * cnt - 4);
         break;
     };
     return res;
@@ -2699,14 +2689,14 @@ static void spectral_to_sample(AACContext *ac)
     }
 }
 
-static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
+static int parse_adts_frame_header(AACContext *ac, BitstreamContext *bc)
 {
     int size;
     AACADTSHeaderInfo hdr_info;
     uint8_t layout_map[MAX_ELEM_ID*4][3];
     int layout_map_tags, ret;
 
-    size = avpriv_aac_parse_header(gb, &hdr_info);
+    size = avpriv_aac_parse_header(bc, &hdr_info);
     if (size > 0) {
         if (hdr_info.num_aac_frames != 1) {
             avpriv_report_missing_feature(ac->avctx,
@@ -2739,13 +2729,13 @@ static int parse_adts_frame_header(AACContext *ac, 
GetBitContext *gb)
             ac->oc[1].m4ac.ps  = -1;
         }
         if (!hdr_info.crc_absent)
-            skip_bits(gb, 16);
+            bitstream_skip(bc, 16);
     }
     return size;
 }
 
 static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
-                               int *got_frame_ptr, GetBitContext *gb)
+                               int *got_frame_ptr, BitstreamContext *bc)
 {
     AACContext *ac = avctx->priv_data;
     const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
@@ -2784,16 +2774,16 @@ static int aac_decode_er_frame(AVCodecContext *avctx, 
void *data,
             return AVERROR_INVALIDDATA;
         }
         if (aot != AOT_ER_AAC_ELD)
-            skip_bits(gb, 4);
+            bitstream_skip(bc, 4);
         switch (elem_type) {
         case TYPE_SCE:
-            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
+            err = decode_ics(ac, &che->ch[0], bc, 0, 0);
             break;
         case TYPE_CPE:
-            err = decode_cpe(ac, gb, che);
+            err = decode_cpe(ac, bc, che);
             break;
         case TYPE_LFE:
-            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
+            err = decode_ics(ac, &che->ch[0], bc, 0, 0);
             break;
         }
         if (err < 0)
@@ -2806,12 +2796,12 @@ static int aac_decode_er_frame(AVCodecContext *avctx, 
void *data,
     ac->frame->sample_rate = avctx->sample_rate;
     *got_frame_ptr = 1;
 
-    skip_bits_long(gb, get_bits_left(gb));
+    bitstream_skip(bc, bitstream_bits_left(bc));
     return 0;
 }
 
 static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
-                                int *got_frame_ptr, GetBitContext *gb)
+                                int *got_frame_ptr, BitstreamContext *bc)
 {
     AACContext *ac = avctx->priv_data;
     ChannelElement *che = NULL, *che_prev = NULL;
@@ -2821,8 +2811,8 @@ static int aac_decode_frame_int(AVCodecContext *avctx, 
void *data,
 
     ac->frame = data;
 
-    if (show_bits(gb, 12) == 0xfff) {
-        if ((err = parse_adts_frame_header(ac, gb)) < 0) {
+    if (bitstream_peek(bc, 12) == 0xfff) {
+        if ((err = parse_adts_frame_header(ac, bc)) < 0) {
             av_log(avctx, AV_LOG_ERROR, "Error decoding AAC frame header.\n");
             goto fail;
         }
@@ -2843,8 +2833,8 @@ static int aac_decode_frame_int(AVCodecContext *avctx, 
void *data,
 
     ac->tags_mapped = 0;
     // parse
-    while ((elem_type = get_bits(gb, 3)) != TYPE_END) {
-        elem_id = get_bits(gb, 4);
+    while ((elem_type = bitstream_read(bc, 3)) != TYPE_END) {
+        elem_id = bitstream_read(bc, 4);
 
         if (!avctx->channels && elem_type != TYPE_PCE) {
             err = AVERROR_INVALIDDATA;
@@ -2864,33 +2854,33 @@ static int aac_decode_frame_int(AVCodecContext *avctx, 
void *data,
         switch (elem_type) {
 
         case TYPE_SCE:
-            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
+            err = decode_ics(ac, &che->ch[0], bc, 0, 0);
             audio_found = 1;
             break;
 
         case TYPE_CPE:
-            err = decode_cpe(ac, gb, che);
+            err = decode_cpe(ac, bc, che);
             audio_found = 1;
             break;
 
         case TYPE_CCE:
-            err = decode_cce(ac, gb, che);
+            err = decode_cce(ac, bc, che);
             break;
 
         case TYPE_LFE:
-            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
+            err = decode_ics(ac, &che->ch[0], bc, 0, 0);
             audio_found = 1;
             break;
 
         case TYPE_DSE:
-            err = skip_data_stream_element(ac, gb);
+            err = skip_data_stream_element(ac, bc);
             break;
 
         case TYPE_PCE: {
             uint8_t layout_map[MAX_ELEM_ID*4][3];
             int tags;
             push_output_configuration(ac);
-            tags = decode_pce(avctx, &ac->oc[1].m4ac, layout_map, gb);
+            tags = decode_pce(avctx, &ac->oc[1].m4ac, layout_map, bc);
             if (tags < 0) {
                 err = tags;
                 break;
@@ -2908,14 +2898,14 @@ static int aac_decode_frame_int(AVCodecContext *avctx, 
void *data,
 
         case TYPE_FIL:
             if (elem_id == 15)
-                elem_id += get_bits(gb, 8) - 1;
-            if (get_bits_left(gb) < 8 * elem_id) {
+                elem_id += bitstream_read(bc, 8) - 1;
+            if (bitstream_bits_left(bc) < 8 * elem_id) {
                     av_log(avctx, AV_LOG_ERROR, overread_err);
                     err = AVERROR_INVALIDDATA;
                     goto fail;
             }
             while (elem_id > 0)
-                elem_id -= decode_extension_payload(ac, gb, elem_id, che_prev, 
elem_type_prev);
+                elem_id -= decode_extension_payload(ac, bc, elem_id, che_prev, 
elem_type_prev);
             err = 0; /* FIXME */
             break;
 
@@ -2930,7 +2920,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, 
void *data,
         if (err)
             goto fail;
 
-        if (get_bits_left(gb) < 3) {
+        if (bitstream_bits_left(bc) < 3) {
             av_log(avctx, AV_LOG_ERROR, overread_err);
             err = AVERROR_INVALIDDATA;
             goto fail;
@@ -2971,7 +2961,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void 
*data,
     AACContext *ac = avctx->priv_data;
     const uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
-    GetBitContext gb;
+    BitstreamContext bc;
     int buf_consumed;
     int buf_offset;
     int err;
@@ -2997,7 +2987,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void 
*data,
         }
     }
 
-    if ((err = init_get_bits(&gb, buf, buf_size * 8)) < 0)
+    if ((err = bitstream_init(&bc, buf, buf_size * 8)) < 0)
         return err;
 
     switch (ac->oc[1].m4ac.object_type) {
@@ -3005,15 +2995,15 @@ static int aac_decode_frame(AVCodecContext *avctx, void 
*data,
     case AOT_ER_AAC_LTP:
     case AOT_ER_AAC_LD:
     case AOT_ER_AAC_ELD:
-        err = aac_decode_er_frame(avctx, data, got_frame_ptr, &gb);
+        err = aac_decode_er_frame(avctx, data, got_frame_ptr, &bc);
         break;
     default:
-        err = aac_decode_frame_int(avctx, data, got_frame_ptr, &gb);
+        err = aac_decode_frame_int(avctx, data, got_frame_ptr, &bc);
     }
     if (err < 0)
         return err;
 
-    buf_consumed = (get_bits_count(&gb) + 7) >> 3;
+    buf_consumed = (bitstream_tell(&bc) + 7) >> 3;
     for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
         if (buf[buf_offset])
             break;
@@ -3055,28 +3045,28 @@ struct LATMContext {
     int frame_length;        ///< frame length for fixed frame length
 };
 
-static inline uint32_t latm_get_value(GetBitContext *b)
+static inline uint32_t latm_get_value(BitstreamContext *bc)
 {
-    int length = get_bits(b, 2);
+    int length = bitstream_read(bc, 2);
 
-    return get_bits_long(b, (length+1)*8);
+    return bitstream_read(bc, (length + 1) * 8);
 }
 
 static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
-                                             GetBitContext *gb, int asclen)
+                                             BitstreamContext *bc, int asclen)
 {
     AACContext *ac        = &latmctx->aac_ctx;
     AVCodecContext *avctx = ac->avctx;
     MPEG4AudioConfig m4ac = { 0 };
-    int config_start_bit  = get_bits_count(gb);
+    int config_start_bit  = bitstream_tell(bc);
     int sync_extension    = 0;
     int bits_consumed, esize;
 
     if (asclen) {
         sync_extension = 1;
-        asclen         = FFMIN(asclen, get_bits_left(gb));
+        asclen         = FFMIN(asclen, bitstream_bits_left(bc));
     } else
-        asclen         = get_bits_left(gb);
+        asclen         = bitstream_bits_left(bc);
 
     if (config_start_bit % 8) {
         avpriv_request_sample(latmctx->aac_ctx.avctx,
@@ -3086,7 +3076,7 @@ static int latm_decode_audio_specific_config(struct 
LATMContext *latmctx,
     if (asclen <= 0)
         return AVERROR_INVALIDDATA;
     bits_consumed = decode_audio_specific_config(NULL, avctx, &m4ac,
-                                         gb->buffer + (config_start_bit / 8),
+                                         bc->buffer + (config_start_bit / 8),
                                          asclen, sync_extension);
 
     if (bits_consumed < 0)
@@ -3109,32 +3099,32 @@ static int latm_decode_audio_specific_config(struct 
LATMContext *latmctx,
         }
 
         avctx->extradata_size = esize;
-        memcpy(avctx->extradata, gb->buffer + (config_start_bit/8), esize);
+        memcpy(avctx->extradata, bc->buffer + (config_start_bit / 8), esize);
         memset(avctx->extradata+esize, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
-    skip_bits_long(gb, bits_consumed);
+    bitstream_skip(bc, bits_consumed);
 
     return bits_consumed;
 }
 
 static int read_stream_mux_config(struct LATMContext *latmctx,
-                                  GetBitContext *gb)
+                                  BitstreamContext *bc)
 {
-    int ret, audio_mux_version = get_bits(gb, 1);
+    int ret, audio_mux_version = bitstream_read(bc, 1);
 
     latmctx->audio_mux_version_A = 0;
     if (audio_mux_version)
-        latmctx->audio_mux_version_A = get_bits(gb, 1);
+        latmctx->audio_mux_version_A = bitstream_read(bc, 1);
 
     if (!latmctx->audio_mux_version_A) {
 
         if (audio_mux_version)
-            latm_get_value(gb);                 // taraFullness
+            latm_get_value(bc);                 // taraFullness
 
-        skip_bits(gb, 1);                       // allStreamSameTimeFraming
-        skip_bits(gb, 6);                       // numSubFrames
+        bitstream_skip(bc, 1);                  // allStreamSameTimeFraming
+        bitstream_skip(bc, 6);                  // numSubFrames
         // numPrograms
-        if (get_bits(gb, 4)) {                  // numPrograms
+        if (bitstream_read(bc, 4)) {            // numPrograms
             avpriv_request_sample(latmctx->aac_ctx.avctx, "Multiple programs");
             return AVERROR_PATCHWELCOME;
         }
@@ -3142,69 +3132,69 @@ static int read_stream_mux_config(struct LATMContext 
*latmctx,
         // for each program (which there is only on in DVB)
 
         // for each layer (which there is only on in DVB)
-        if (get_bits(gb, 3)) {                   // numLayer
+        if (bitstream_read(bc, 3)) {            // numLayer
             avpriv_request_sample(latmctx->aac_ctx.avctx, "Multiple layers");
             return AVERROR_PATCHWELCOME;
         }
 
-        // for all but first stream: use_same_config = get_bits(gb, 1);
+        // for all but first stream: use_same_config = bitstream_read(bc, 1);
         if (!audio_mux_version) {
-            if ((ret = latm_decode_audio_specific_config(latmctx, gb, 0)) < 0)
+            if ((ret = latm_decode_audio_specific_config(latmctx, bc, 0)) < 0)
                 return ret;
         } else {
-            int ascLen = latm_get_value(gb);
-            if ((ret = latm_decode_audio_specific_config(latmctx, gb, ascLen)) 
< 0)
+            int ascLen = latm_get_value(bc);
+            if ((ret = latm_decode_audio_specific_config(latmctx, bc, ascLen)) 
< 0)
                 return ret;
             ascLen -= ret;
-            skip_bits_long(gb, ascLen);
+            bitstream_skip(bc, ascLen);
         }
 
-        latmctx->frame_length_type = get_bits(gb, 3);
+        latmctx->frame_length_type = bitstream_read(bc, 3);
         switch (latmctx->frame_length_type) {
         case 0:
-            skip_bits(gb, 8);       // latmBufferFullness
+            bitstream_skip(bc, 8);       // latmBufferFullness
             break;
         case 1:
-            latmctx->frame_length = get_bits(gb, 9);
+            latmctx->frame_length = bitstream_read(bc, 9);
             break;
         case 3:
         case 4:
         case 5:
-            skip_bits(gb, 6);       // CELP frame length table index
+            bitstream_skip(bc, 6);       // CELP frame length table index
             break;
         case 6:
         case 7:
-            skip_bits(gb, 1);       // HVXC frame length table index
+            bitstream_skip(bc, 1);       // HVXC frame length table index
             break;
         }
 
-        if (get_bits(gb, 1)) {                  // other data
+        if (bitstream_read(bc, 1)) {     // other data
             if (audio_mux_version) {
-                latm_get_value(gb);             // other_data_bits
+                latm_get_value(bc);      // other_data_bits
             } else {
                 int esc;
                 do {
-                    esc = get_bits(gb, 1);
-                    skip_bits(gb, 8);
+                    esc = bitstream_read(bc, 1);
+                    bitstream_skip(bc, 8);
                 } while (esc);
             }
         }
 
-        if (get_bits(gb, 1))                     // crc present
-            skip_bits(gb, 8);                    // config_crc
+        if (bitstream_read(bc, 1))       // crc present
+            bitstream_skip(bc, 8);       // config_crc
     }
 
     return 0;
 }
 
-static int read_payload_length_info(struct LATMContext *ctx, GetBitContext *gb)
+static int read_payload_length_info(struct LATMContext *ctx, BitstreamContext 
*bc)
 {
     uint8_t tmp;
 
     if (ctx->frame_length_type == 0) {
         int mux_slot_length = 0;
         do {
-            tmp = get_bits(gb, 8);
+            tmp = bitstream_read(bc, 8);
             mux_slot_length += tmp;
         } while (tmp == 255);
         return mux_slot_length;
@@ -3213,18 +3203,18 @@ static int read_payload_length_info(struct LATMContext 
*ctx, GetBitContext *gb)
     } else if (ctx->frame_length_type == 3 ||
                ctx->frame_length_type == 5 ||
                ctx->frame_length_type == 7) {
-        skip_bits(gb, 2);          // mux_slot_length_coded
+        bitstream_skip(bc, 2); // mux_slot_length_coded
     }
     return 0;
 }
 
 static int read_audio_mux_element(struct LATMContext *latmctx,
-                                  GetBitContext *gb)
+                                  BitstreamContext *bc)
 {
     int err;
-    uint8_t use_same_mux = get_bits(gb, 1);
+    uint8_t use_same_mux = bitstream_read(bc, 1);
     if (!use_same_mux) {
-        if ((err = read_stream_mux_config(latmctx, gb)) < 0)
+        if ((err = read_stream_mux_config(latmctx, bc)) < 0)
             return err;
     } else if (!latmctx->aac_ctx.avctx->extradata) {
         av_log(latmctx->aac_ctx.avctx, AV_LOG_DEBUG,
@@ -3232,14 +3222,14 @@ static int read_audio_mux_element(struct LATMContext 
*latmctx,
         return AVERROR(EAGAIN);
     }
     if (latmctx->audio_mux_version_A == 0) {
-        int mux_slot_length_bytes = read_payload_length_info(latmctx, gb);
-        if (mux_slot_length_bytes * 8 > get_bits_left(gb)) {
+        int mux_slot_length_bytes = read_payload_length_info(latmctx, bc);
+        if (mux_slot_length_bytes * 8 > bitstream_bits_left(bc)) {
             av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR, "incomplete frame\n");
             return AVERROR_INVALIDDATA;
-        } else if (mux_slot_length_bytes * 8 + 256 < get_bits_left(gb)) {
+        } else if (mux_slot_length_bytes * 8 + 256 < bitstream_bits_left(bc)) {
             av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR,
                    "frame length mismatch %d << %d\n",
-                   mux_slot_length_bytes * 8, get_bits_left(gb));
+                   mux_slot_length_bytes * 8, bitstream_bits_left(bc));
             return AVERROR_INVALIDDATA;
         }
     }
@@ -3252,21 +3242,21 @@ static int latm_decode_frame(AVCodecContext *avctx, 
void *out,
 {
     struct LATMContext *latmctx = avctx->priv_data;
     int                 muxlength, err;
-    GetBitContext       gb;
+    BitstreamContext    bc;
 
-    if ((err = init_get_bits(&gb, avpkt->data, avpkt->size * 8)) < 0)
+    if ((err = bitstream_init(&bc, avpkt->data, avpkt->size * 8)) < 0)
         return err;
 
     // check for LOAS sync word
-    if (get_bits(&gb, 11) != LOAS_SYNC_WORD)
+    if (bitstream_read(&bc, 11) != LOAS_SYNC_WORD)
         return AVERROR_INVALIDDATA;
 
-    muxlength = get_bits(&gb, 13) + 3;
+    muxlength = bitstream_read(&bc, 13) + 3;
     // not enough data, the parser should have sorted this
     if (muxlength > avpkt->size)
         return AVERROR_INVALIDDATA;
 
-    if ((err = read_audio_mux_element(latmctx, &gb)) < 0)
+    if ((err = read_audio_mux_element(latmctx, &bc)) < 0)
         return err;
 
     if (!latmctx->initialized) {
@@ -3285,7 +3275,7 @@ static int latm_decode_frame(AVCodecContext *avctx, void 
*out,
         }
     }
 
-    if (show_bits(&gb, 12) == 0xfff) {
+    if (bitstream_peek(&bc, 12) == 0xfff) {
         av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR,
                "ADTS header detected, probably as result of configuration "
                "misparsing\n");
@@ -3297,10 +3287,10 @@ static int latm_decode_frame(AVCodecContext *avctx, 
void *out,
     case AOT_ER_AAC_LTP:
     case AOT_ER_AAC_LD:
     case AOT_ER_AAC_ELD:
-        err = aac_decode_er_frame(avctx, out, got_frame_ptr, &gb);
+        err = aac_decode_er_frame(avctx, out, got_frame_ptr, &bc);
         break;
     default:
-        err = aac_decode_frame_int(avctx, out, got_frame_ptr, &gb);
+        err = aac_decode_frame_int(avctx, out, got_frame_ptr, &bc);
     }
     if (err < 0)
         return err;
diff --git a/libavcodec/aacps.c b/libavcodec/aacps.c
index df069c3..815bf79 100644
--- a/libavcodec/aacps.c
+++ b/libavcodec/aacps.c
@@ -20,11 +20,13 @@
  */
 
 #include <stdint.h>
+
 #include "libavutil/common.h"
 #include "libavutil/internal.h"
 #include "libavutil/mathematics.h"
+
 #include "avcodec.h"
-#include "get_bits.h"
+#include "bitstream.h"
 #include "aacps.h"
 #include "aacps_tablegen.h"
 #include "aacpsdata.c"
@@ -77,13 +79,13 @@ static VLC vlc_ps[10];
  * bitstream. \
  * \
  * @param avctx contains the current codec context \
- * @param gb    pointer to the input bitstream \
+ * @param bc    pointer to the input bitstream \
  * @param ps    pointer to the Parametric Stereo context \
  * @param PAR   pointer to the parameter to be read \
  * @param e     envelope to decode \
  * @param dt    1: time delta-coded, 0: frequency delta-coded \
  */ \
-static int read_ ## PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, 
PSContext *ps, \
+static int read_ ## PAR ## _data(AVCodecContext *avctx, BitstreamContext *bc, 
PSContext *ps, \
                         int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, 
int dt) \
 { \
     int b, num = ps->nr_ ## PAR ## _par; \
@@ -92,7 +94,7 @@ static int read_ ## PAR ## _data(AVCodecContext *avctx, 
GetBitContext *gb, PSCon
         int e_prev = e ? e - 1 : ps->num_env_old - 1; \
         e_prev = FFMAX(e_prev, 0); \
         for (b = 0; b < num; b++) { \
-            int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, 9, 3) - OFFSET; 
\
+            int val = PAR[e_prev][b] + bitstream_read_vlc(bc, vlc_table, 9, 3) 
- OFFSET; \
             if (MASK) val &= MASK; \
             PAR[e][b] = val; \
             if (ERR_CONDITION) \
@@ -101,7 +103,7 @@ static int read_ ## PAR ## _data(AVCodecContext *avctx, 
GetBitContext *gb, PSCon
     } else { \
         int val = 0; \
         for (b = 0; b < num; b++) { \
-            val += get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
+            val += bitstream_read_vlc(bc, vlc_table, 9, 3) - OFFSET; \
             if (MASK) val &= MASK; \
             PAR[e][b] = val; \
             if (ERR_CONDITION) \
@@ -118,25 +120,25 @@ READ_PAR_DATA(iid,    huff_offset[table_idx],    0, 
FFABS(ps->iid_par[e][b]) > 7
 READ_PAR_DATA(icc,    huff_offset[table_idx],    0, ps->icc_par[e][b] > 7U)
 READ_PAR_DATA(ipdopd,                      0, 0x07, 0)
 
-static int ps_read_extension_data(GetBitContext *gb, PSContext *ps, int 
ps_extension_id)
+static int ps_read_extension_data(BitstreamContext *bc, PSContext *ps, int 
ps_extension_id)
 {
     int e;
-    int count = get_bits_count(gb);
+    int count = bitstream_tell(bc);
 
     if (ps_extension_id)
         return 0;
 
-    ps->enable_ipdopd = get_bits1(gb);
+    ps->enable_ipdopd = bitstream_read_bit(bc);
     if (ps->enable_ipdopd) {
         for (e = 0; e < ps->num_env; e++) {
-            int dt = get_bits1(gb);
-            read_ipdopd_data(NULL, gb, ps, ps->ipd_par, dt ? huff_ipd_dt : 
huff_ipd_df, e, dt);
-            dt = get_bits1(gb);
-            read_ipdopd_data(NULL, gb, ps, ps->opd_par, dt ? huff_opd_dt : 
huff_opd_df, e, dt);
+            int dt = bitstream_read_bit(bc);
+            read_ipdopd_data(NULL, bc, ps, ps->ipd_par, dt ? huff_ipd_dt : 
huff_ipd_df, e, dt);
+            dt = bitstream_read_bit(bc);
+            read_ipdopd_data(NULL, bc, ps, ps->opd_par, dt ? huff_opd_dt : 
huff_opd_df, e, dt);
         }
     }
-    skip_bits1(gb);      //reserved_ps
-    return get_bits_count(gb) - count;
+    bitstream_skip(bc, 1);      // reserved_ps
+    return bitstream_tell(bc) - count;
 }
 
 static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist)
@@ -148,19 +150,19 @@ static void ipdopd_reset(int8_t *ipd_hist, int8_t 
*opd_hist)
     }
 }
 
-int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host, PSContext 
*ps, int bits_left)
+int ff_ps_read_data(AVCodecContext *avctx, BitstreamContext *bc_host, 
PSContext *ps, int bits_left)
 {
     int e;
-    int bit_count_start = get_bits_count(gb_host);
+    int bit_count_start = bitstream_tell(bc_host);
     int header;
     int bits_consumed;
-    GetBitContext gbc = *gb_host, *gb = &gbc;
+    BitstreamContext bcc = *bc_host, *bc = &bcc;
 
-    header = get_bits1(gb);
+    header = bitstream_read_bit(bc);
     if (header) {     //enable_ps_header
-        ps->enable_iid = get_bits1(gb);
+        ps->enable_iid = bitstream_read_bit(bc);
         if (ps->enable_iid) {
-            int iid_mode = get_bits(gb, 3);
+            int iid_mode = bitstream_read(bc, 3);
             if (iid_mode > 5) {
                 av_log(avctx, AV_LOG_ERROR, "iid_mode %d is reserved.\n",
                        iid_mode);
@@ -170,9 +172,9 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext 
*gb_host, PSContext *ps
             ps->iid_quant     = iid_mode > 2;
             ps->nr_ipdopd_par = nr_iidopd_par_tab[iid_mode];
         }
-        ps->enable_icc = get_bits1(gb);
+        ps->enable_icc = bitstream_read_bit(bc);
         if (ps->enable_icc) {
-            ps->icc_mode = get_bits(gb, 3);
+            ps->icc_mode = bitstream_read(bc, 3);
             if (ps->icc_mode > 5) {
                 av_log(avctx, AV_LOG_ERROR, "icc_mode %d is reserved.\n",
                        ps->icc_mode);
@@ -180,25 +182,25 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext 
*gb_host, PSContext *ps
             }
             ps->nr_icc_par = nr_iidicc_par_tab[ps->icc_mode];
         }
-        ps->enable_ext = get_bits1(gb);
+        ps->enable_ext = bitstream_read_bit(bc);
     }
 
-    ps->frame_class = get_bits1(gb);
+    ps->frame_class = bitstream_read_bit(bc);
     ps->num_env_old = ps->num_env;
-    ps->num_env     = num_env_tab[ps->frame_class][get_bits(gb, 2)];
+    ps->num_env     = num_env_tab[ps->frame_class][bitstream_read(bc, 2)];
 
     ps->border_position[0] = -1;
     if (ps->frame_class) {
         for (e = 1; e <= ps->num_env; e++)
-            ps->border_position[e] = get_bits(gb, 5);
+            ps->border_position[e] = bitstream_read(bc, 5);
     } else
         for (e = 1; e <= ps->num_env; e++)
             ps->border_position[e] = (e * numQMFSlots >> 
ff_log2_tab[ps->num_env]) - 1;
 
     if (ps->enable_iid) {
         for (e = 0; e < ps->num_env; e++) {
-            int dt = get_bits1(gb);
-            if (read_iid_data(avctx, gb, ps, ps->iid_par, 
huff_iid[2*dt+ps->iid_quant], e, dt))
+            int dt = bitstream_read_bit(bc);
+            if (read_iid_data(avctx, bc, ps, ps->iid_par, huff_iid[2 * dt + 
ps->iid_quant], e, dt))
                 goto err;
         }
     } else
@@ -206,28 +208,28 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext 
*gb_host, PSContext *ps
 
     if (ps->enable_icc)
         for (e = 0; e < ps->num_env; e++) {
-            int dt = get_bits1(gb);
-            if (read_icc_data(avctx, gb, ps, ps->icc_par, dt ? huff_icc_dt : 
huff_icc_df, e, dt))
+            int dt = bitstream_read_bit(bc);
+            if (read_icc_data(avctx, bc, ps, ps->icc_par, dt ? huff_icc_dt : 
huff_icc_df, e, dt))
                 goto err;
         }
     else
         memset(ps->icc_par, 0, sizeof(ps->icc_par));
 
     if (ps->enable_ext) {
-        int cnt = get_bits(gb, 4);
+        int cnt = bitstream_read(bc, 4);
         if (cnt == 15) {
-            cnt += get_bits(gb, 8);
+            cnt += bitstream_read(bc, 8);
         }
         cnt *= 8;
         while (cnt > 7) {
-            int ps_extension_id = get_bits(gb, 2);
-            cnt -= 2 + ps_read_extension_data(gb, ps, ps_extension_id);
+            int ps_extension_id = bitstream_read(bc, 2);
+            cnt -= 2 + ps_read_extension_data(bc, ps, ps_extension_id);
         }
         if (cnt < 0) {
             av_log(avctx, AV_LOG_ERROR, "ps extension overflow %d\n", cnt);
             goto err;
         }
-        skip_bits(gb, cnt);
+        bitstream_skip(bc, cnt);
     }
 
     ps->enable_ipdopd &= !PS_BASELINE;
@@ -267,15 +269,15 @@ int ff_ps_read_data(AVCodecContext *avctx, GetBitContext 
*gb_host, PSContext *ps
     if (header)
         ps->start = 1;
 
-    bits_consumed = get_bits_count(gb) - bit_count_start;
+    bits_consumed = bitstream_tell(bc) - bit_count_start;
     if (bits_consumed <= bits_left) {
-        skip_bits_long(gb_host, bits_consumed);
+        bitstream_skip(bc_host, bits_consumed);
         return bits_consumed;
     }
     av_log(avctx, AV_LOG_ERROR, "Expected to read %d PS bits actually read 
%d.\n", bits_left, bits_consumed);
 err:
     ps->start = 0;
-    skip_bits_long(gb_host, bits_left);
+    bitstream_skip(bc_host, bits_left);
     memset(ps->iid_par, 0, sizeof(ps->iid_par));
     memset(ps->icc_par, 0, sizeof(ps->icc_par));
     memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
diff --git a/libavcodec/aacps.h b/libavcodec/aacps.h
index e8a195a..9440daf 100644
--- a/libavcodec/aacps.h
+++ b/libavcodec/aacps.h
@@ -26,7 +26,7 @@
 
 #include "aacpsdsp.h"
 #include "avcodec.h"
-#include "get_bits.h"
+#include "bitstream.h"
 
 #define PS_MAX_NUM_ENV 5
 #define PS_MAX_NR_IIDICC 34
@@ -78,7 +78,7 @@ typedef struct PSContext {
 
 void ff_ps_init(void);
 void ff_ps_ctx_init(PSContext *ps);
-int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, 
int bits_left);
+int ff_ps_read_data(AVCodecContext *avctx, BitstreamContext *bc, PSContext 
*ps, int bits_left);
 int ff_ps_apply(AVCodecContext *avctx, PSContext *ps, float L[2][38][64], 
float R[2][38][64], int top);
 
 #endif /* AVCODEC_PS_H */
diff --git a/libavcodec/aacsbr.c b/libavcodec/aacsbr.c
index 3e3432c..1d2b427 100644
--- a/libavcodec/aacsbr.c
+++ b/libavcodec/aacsbr.c
@@ -30,9 +30,12 @@
 #include "sbr.h"
 #include "aacsbr.h"
 #include "aacsbrdata.h"
+#include "bitstream.h"
 #include "fft.h"
 #include "aacps.h"
 #include "sbrdsp.h"
+#include "vlc.h"
+
 #include "libavutil/internal.h"
 #include "libavutil/libm.h"
 
@@ -221,9 +224,9 @@ static void sbr_make_f_tablelim(SpectralBandReplication 
*sbr)
     }
 }
 
-static unsigned int read_sbr_header(SpectralBandReplication *sbr, 
GetBitContext *gb)
+static unsigned int read_sbr_header(SpectralBandReplication *sbr, 
BitstreamContext *bc)
 {
-    unsigned int cnt = get_bits_count(gb);
+    unsigned int cnt = bitstream_tell(bc);
     uint8_t bs_header_extra_1;
     uint8_t bs_header_extra_2;
     int old_bs_limiter_bands = sbr->bs_limiter_bands;
@@ -234,19 +237,19 @@ static unsigned int 
read_sbr_header(SpectralBandReplication *sbr, GetBitContext
     // Save last spectrum parameters variables to compare to new ones
     memcpy(&old_spectrum_params, &sbr->spectrum_params, 
sizeof(SpectrumParameters));
 
-    sbr->bs_amp_res_header              = get_bits1(gb);
-    sbr->spectrum_params.bs_start_freq  = get_bits(gb, 4);
-    sbr->spectrum_params.bs_stop_freq   = get_bits(gb, 4);
-    sbr->spectrum_params.bs_xover_band  = get_bits(gb, 3);
-                                          skip_bits(gb, 2); // bs_reserved
+    sbr->bs_amp_res_header              = bitstream_read_bit(bc);
+    sbr->spectrum_params.bs_start_freq  = bitstream_read(bc, 4);
+    sbr->spectrum_params.bs_stop_freq   = bitstream_read(bc, 4);
+    sbr->spectrum_params.bs_xover_band  = bitstream_read(bc, 3);
+    bitstream_skip(bc, 2); // bs_reserved
 
-    bs_header_extra_1 = get_bits1(gb);
-    bs_header_extra_2 = get_bits1(gb);
+    bs_header_extra_1 = bitstream_read_bit(bc);
+    bs_header_extra_2 = bitstream_read_bit(bc);
 
     if (bs_header_extra_1) {
-        sbr->spectrum_params.bs_freq_scale  = get_bits(gb, 2);
-        sbr->spectrum_params.bs_alter_scale = get_bits1(gb);
-        sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2);
+        sbr->spectrum_params.bs_freq_scale  = bitstream_read(bc, 2);
+        sbr->spectrum_params.bs_alter_scale = bitstream_read_bit(bc);
+        sbr->spectrum_params.bs_noise_bands = bitstream_read(bc, 2);
     } else {
         sbr->spectrum_params.bs_freq_scale  = 2;
         sbr->spectrum_params.bs_alter_scale = 1;
@@ -258,10 +261,10 @@ static unsigned int 
read_sbr_header(SpectralBandReplication *sbr, GetBitContext
         sbr->reset = 1;
 
     if (bs_header_extra_2) {
-        sbr->bs_limiter_bands  = get_bits(gb, 2);
-        sbr->bs_limiter_gains  = get_bits(gb, 2);
-        sbr->bs_interpol_freq  = get_bits1(gb);
-        sbr->bs_smoothing_mode = get_bits1(gb);
+        sbr->bs_limiter_bands  = bitstream_read(bc, 2);
+        sbr->bs_limiter_gains  = bitstream_read(bc, 2);
+        sbr->bs_interpol_freq  = bitstream_read_bit(bc);
+        sbr->bs_smoothing_mode = bitstream_read_bit(bc);
     } else {
         sbr->bs_limiter_bands  = 2;
         sbr->bs_limiter_gains  = 2;
@@ -272,7 +275,7 @@ static unsigned int read_sbr_header(SpectralBandReplication 
*sbr, GetBitContext
     if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset)
         sbr_make_f_tablelim(sbr);
 
-    return get_bits_count(gb) - cnt;
+    return bitstream_tell(bc) - cnt;
 }
 
 static int array_min_int16(const int16_t *array, int nel)
@@ -610,12 +613,13 @@ static int sbr_make_f_derived(AACContext *ac, 
SpectralBandReplication *sbr)
     return 0;
 }
 
-static av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec,
-                                              int elements)
+static av_always_inline void bitstream_read_bit_vector(BitstreamContext *bc,
+                                                       uint8_t *vec,
+                                                       int elements)
 {
     int i;
     for (i = 0; i < elements; i++) {
-        vec[i] = get_bits1(gb);
+        vec[i] = bitstream_read_bit(bc);
     }
 }
 
@@ -625,7 +629,7 @@ static const int8_t ceil_log2[] = {
 };
 
 static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr,
-                         GetBitContext *gb, SBRData *ch_data)
+                         BitstreamContext *bc, SBRData *ch_data)
 {
     int i;
     int bs_pointer = 0;
@@ -638,9 +642,9 @@ static int read_sbr_grid(AACContext *ac, 
SpectralBandReplication *sbr,
     ch_data->bs_amp_res = sbr->bs_amp_res_header;
     ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
 
-    switch (ch_data->bs_frame_class = get_bits(gb, 2)) {
+    switch (ch_data->bs_frame_class = bitstream_read(bc, 2)) {
     case FIXFIX:
-        ch_data->bs_num_env                 = 1 << get_bits(gb, 2);
+        ch_data->bs_num_env                 = 1 << bitstream_read(bc, 2);
         num_rel_lead                        = ch_data->bs_num_env - 1;
         if (ch_data->bs_num_env == 1)
             ch_data->bs_amp_res = 0;
@@ -660,44 +664,44 @@ static int read_sbr_grid(AACContext *ac, 
SpectralBandReplication *sbr,
         for (i = 0; i < num_rel_lead; i++)
             ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail;
 
-        ch_data->bs_freq_res[1] = get_bits1(gb);
+        ch_data->bs_freq_res[1] = bitstream_read_bit(bc);
         for (i = 1; i < ch_data->bs_num_env; i++)
             ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1];
         break;
     case FIXVAR:
-        abs_bord_trail                     += get_bits(gb, 2);
-        num_rel_trail                       = get_bits(gb, 2);
+        abs_bord_trail                     += bitstream_read(bc, 2);
+        num_rel_trail                       = bitstream_read(bc, 2);
         ch_data->bs_num_env                 = num_rel_trail + 1;
         ch_data->t_env[0]                   = 0;
         ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
 
         for (i = 0; i < num_rel_trail; i++)
             ch_data->t_env[ch_data->bs_num_env - 1 - i] =
-                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) 
- 2;
+                ch_data->t_env[ch_data->bs_num_env - i] - 2 * 
bitstream_read(bc, 2) - 2;
 
-        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
+        bs_pointer = bitstream_read(bc, ceil_log2[ch_data->bs_num_env]);
 
         for (i = 0; i < ch_data->bs_num_env; i++)
-            ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb);
+            ch_data->bs_freq_res[ch_data->bs_num_env - i] = 
bitstream_read_bit(bc);
         break;
     case VARFIX:
-        ch_data->t_env[0]                   = get_bits(gb, 2);
-        num_rel_lead                        = get_bits(gb, 2);
+        ch_data->t_env[0]                   = bitstream_read(bc, 2);
+        num_rel_lead                        = bitstream_read(bc, 2);
         ch_data->bs_num_env                 = num_rel_lead + 1;
         ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
 
         for (i = 0; i < num_rel_lead; i++)
-            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 
2;
+            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * bitstream_read(bc, 
2) + 2;
 
-        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
+        bs_pointer = bitstream_read(bc, ceil_log2[ch_data->bs_num_env]);
 
-        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
+        bitstream_read_bit_vector(bc, ch_data->bs_freq_res + 1, 
ch_data->bs_num_env);
         break;
     case VARVAR:
-        ch_data->t_env[0]                   = get_bits(gb, 2);
-        abs_bord_trail                     += get_bits(gb, 2);
-        num_rel_lead                        = get_bits(gb, 2);
-        num_rel_trail                       = get_bits(gb, 2);
+        ch_data->t_env[0]                   = bitstream_read(bc, 2);
+        abs_bord_trail                     += bitstream_read(bc, 2);
+        num_rel_lead                        = bitstream_read(bc, 2);
+        num_rel_trail                       = bitstream_read(bc, 2);
         ch_data->bs_num_env                 = num_rel_lead + num_rel_trail + 1;
 
         if (ch_data->bs_num_env > 5) {
@@ -710,14 +714,14 @@ static int read_sbr_grid(AACContext *ac, 
SpectralBandReplication *sbr,
         ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
 
         for (i = 0; i < num_rel_lead; i++)
-            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 
2;
+            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * bitstream_read(bc, 
2) + 2;
         for (i = 0; i < num_rel_trail; i++)
             ch_data->t_env[ch_data->bs_num_env - 1 - i] =
-                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) 
- 2;
+                ch_data->t_env[ch_data->bs_num_env - i] - 2 * 
bitstream_read(bc, 2) - 2;
 
-        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
+        bs_pointer = bitstream_read(bc, ceil_log2[ch_data->bs_num_env]);
 
-        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
+        bitstream_read_bit_vector(bc, ch_data->bs_freq_res + 1, 
ch_data->bs_num_env);
         break;
     }
 
@@ -784,25 +788,25 @@ static void copy_sbr_grid(SBRData *dst, const SBRData 
*src) {
 }
 
 /// Read how the envelope and noise floor data is delta coded
-static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb,
+static void read_sbr_dtdf(SpectralBandReplication *sbr, BitstreamContext *bc,
                           SBRData *ch_data)
 {
-    get_bits1_vector(gb, ch_data->bs_df_env,   ch_data->bs_num_env);
-    get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
+    bitstream_read_bit_vector(bc, ch_data->bs_df_env,   ch_data->bs_num_env);
+    bitstream_read_bit_vector(bc, ch_data->bs_df_noise, ch_data->bs_num_noise);
 }
 
 /// Read inverse filtering data
-static void read_sbr_invf(SpectralBandReplication *sbr, GetBitContext *gb,
+static void read_sbr_invf(SpectralBandReplication *sbr, BitstreamContext *bc,
                           SBRData *ch_data)
 {
     int i;
 
     memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * 
sizeof(uint8_t));
     for (i = 0; i < sbr->n_q; i++)
-        ch_data->bs_invf_mode[0][i] = get_bits(gb, 2);
+        ch_data->bs_invf_mode[0][i] = bitstream_read(bc, 2);
 }
 
-static void read_sbr_envelope(SpectralBandReplication *sbr, GetBitContext *gb,
+static void read_sbr_envelope(SpectralBandReplication *sbr, BitstreamContext 
*bc,
                               SBRData *ch_data, int ch)
 {
     int bits;
@@ -847,22 +851,26 @@ static void read_sbr_envelope(SpectralBandReplication 
*sbr, GetBitContext *gb,
             // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame
             if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) {
                 for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++)
-                    ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][j] + 
delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav);
+                    ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][j] + 
delta *
+                                                  (bitstream_read_vlc(bc, 
t_huff, 9, 3) - t_lav);
             } else if (ch_data->bs_freq_res[i + 1]) {
                 for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
                     k = (j + odd) >> 1; // find k such that f_tablelow[k] <= 
f_tablehigh[j] < f_tablelow[k + 1]
-                    ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][k] + 
delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav);
+                    ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][k] + 
delta *
+                                                  (bitstream_read_vlc(bc, 
t_huff, 9, 3) - t_lav);
                 }
             } else {
                 for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
                     k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] 
== f_tablelow[j]
-                    ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][k] + 
delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav);
+                    ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][k] + 
delta *
+                                                  (bitstream_read_vlc(bc, 
t_huff, 9, 3) - t_lav);
                 }
             }
         } else {
-            ch_data->env_facs[i + 1][0] = delta * get_bits(gb, bits); // 
bs_env_start_value_balance
+            ch_data->env_facs[i + 1][0] = delta * bitstream_read(bc, bits); // 
bs_env_start_value_balance
             for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++)
-                ch_data->env_facs[i + 1][j] = ch_data->env_facs[i + 1][j - 1] 
+ delta * (get_vlc2(gb, f_huff, 9, 3) - f_lav);
+                ch_data->env_facs[i + 1][j] = ch_data->env_facs[i + 1][j - 1] 
+ delta *
+                                              (bitstream_read_vlc(bc, f_huff, 
9, 3) - f_lav);
         }
     }
 
@@ -871,7 +879,7 @@ static void read_sbr_envelope(SpectralBandReplication *sbr, 
GetBitContext *gb,
            sizeof(ch_data->env_facs[0]));
 }
 
-static void read_sbr_noise(SpectralBandReplication *sbr, GetBitContext *gb,
+static void read_sbr_noise(SpectralBandReplication *sbr, BitstreamContext *bc,
                            SBRData *ch_data, int ch)
 {
     int i, j;
@@ -894,11 +902,13 @@ static void read_sbr_noise(SpectralBandReplication *sbr, 
GetBitContext *gb,
     for (i = 0; i < ch_data->bs_num_noise; i++) {
         if (ch_data->bs_df_noise[i]) {
             for (j = 0; j < sbr->n_q; j++)
-                ch_data->noise_facs[i + 1][j] = ch_data->noise_facs[i][j] + 
delta * (get_vlc2(gb, t_huff, 9, 2) - t_lav);
+                ch_data->noise_facs[i + 1][j] = ch_data->noise_facs[i][j] + 
delta *
+                                                (bitstream_read_vlc(bc, 
t_huff, 9, 2) - t_lav);
         } else {
-            ch_data->noise_facs[i + 1][0] = delta * get_bits(gb, 5); // 
bs_noise_start_value_balance or bs_noise_start_value_level
+            ch_data->noise_facs[i + 1][0] = delta * bitstream_read(bc, 5); // 
bs_noise_start_value_balance or bs_noise_start_value_level
             for (j = 1; j < sbr->n_q; j++)
-                ch_data->noise_facs[i + 1][j] = ch_data->noise_facs[i + 1][j - 
1] + delta * (get_vlc2(gb, f_huff, 9, 3) - f_lav);
+                ch_data->noise_facs[i + 1][j] = ch_data->noise_facs[i + 1][j - 
1] + delta *
+                                                (bitstream_read_vlc(bc, 
f_huff, 9, 3) - f_lav);
         }
     }
 
@@ -908,31 +918,31 @@ static void read_sbr_noise(SpectralBandReplication *sbr, 
GetBitContext *gb,
 }
 
 static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
-                               GetBitContext *gb,
+                               BitstreamContext *bc,
                                int bs_extension_id, int *num_bits_left)
 {
     switch (bs_extension_id) {
     case EXTENSION_ID_PS:
         if (!ac->oc[1].m4ac.ps) {
             av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be 
not-present but was found in the bitstream.\n");
-            skip_bits_long(gb, *num_bits_left); // bs_fill_bits
+            bitstream_skip(bc, *num_bits_left); // bs_fill_bits
             *num_bits_left = 0;
         } else {
 #if 1
-            *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps, 
*num_bits_left);
+            *num_bits_left -= ff_ps_read_data(ac->avctx, bc, &sbr->ps, 
*num_bits_left);
             ac->avctx->profile = FF_PROFILE_AAC_HE_V2;
 #else
             avpriv_report_missing_feature(ac->avctx, "Parametric Stereo");
-            skip_bits_long(gb, *num_bits_left); // bs_fill_bits
+            bitstream_skip(bc, *num_bits_left); // bs_fill_bits
             *num_bits_left = 0;
 #endif
         }
         break;
     default:
         // some files contain 0-padding
-        if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, 
*num_bits_left))
+        if (bs_extension_id || *num_bits_left > 16 || bitstream_peek(bc, 
*num_bits_left))
             avpriv_request_sample(ac->avctx, "Reserved SBR extensions");
-        skip_bits_long(gb, *num_bits_left); // bs_fill_bits
+        bitstream_skip(bc, *num_bits_left); // bs_fill_bits
         *num_bits_left = 0;
         break;
     }
@@ -940,105 +950,105 @@ static void read_sbr_extension(AACContext *ac, 
SpectralBandReplication *sbr,
 
 static int read_sbr_single_channel_element(AACContext *ac,
                                             SpectralBandReplication *sbr,
-                                            GetBitContext *gb)
+                                            BitstreamContext *bc)
 {
-    if (get_bits1(gb)) // bs_data_extra
-        skip_bits(gb, 4); // bs_reserved
+    if (bitstream_read_bit(bc)) // bs_data_extra
+        bitstream_skip(bc, 4);  // bs_reserved
 
-    if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]))
+    if (read_sbr_grid(ac, sbr, bc, &sbr->data[0]))
         return -1;
-    read_sbr_dtdf(sbr, gb, &sbr->data[0]);
-    read_sbr_invf(sbr, gb, &sbr->data[0]);
-    read_sbr_envelope(sbr, gb, &sbr->data[0], 0);
-    read_sbr_noise(sbr, gb, &sbr->data[0], 0);
+    read_sbr_dtdf(sbr, bc, &sbr->data[0]);
+    read_sbr_invf(sbr, bc, &sbr->data[0]);
+    read_sbr_envelope(sbr, bc, &sbr->data[0], 0);
+    read_sbr_noise(sbr, bc, &sbr->data[0], 0);
 
-    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
-        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
+    if ((sbr->data[0].bs_add_harmonic_flag = bitstream_read_bit(bc)))
+        bitstream_read_bit_vector(bc, sbr->data[0].bs_add_harmonic, sbr->n[1]);
 
     return 0;
 }
 
 static int read_sbr_channel_pair_element(AACContext *ac,
                                           SpectralBandReplication *sbr,
-                                          GetBitContext *gb)
+                                          BitstreamContext *bc)
 {
-    if (get_bits1(gb))    // bs_data_extra
-        skip_bits(gb, 8); // bs_reserved
+    if (bitstream_read_bit(bc)) // bs_data_extra
+        bitstream_skip(bc, 8);  // bs_reserved
 
-    if ((sbr->bs_coupling = get_bits1(gb))) {
-        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]))
+    if ((sbr->bs_coupling = bitstream_read_bit(bc))) {
+        if (read_sbr_grid(ac, sbr, bc, &sbr->data[0]))
             return -1;
         copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
-        read_sbr_dtdf(sbr, gb, &sbr->data[0]);
-        read_sbr_dtdf(sbr, gb, &sbr->data[1]);
-        read_sbr_invf(sbr, gb, &sbr->data[0]);
+        read_sbr_dtdf(sbr, bc, &sbr->data[0]);
+        read_sbr_dtdf(sbr, bc, &sbr->data[1]);
+        read_sbr_invf(sbr, bc, &sbr->data[0]);
         memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], 
sizeof(sbr->data[1].bs_invf_mode[0]));
         memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], 
sizeof(sbr->data[1].bs_invf_mode[0]));
-        read_sbr_envelope(sbr, gb, &sbr->data[0], 0);
-        read_sbr_noise(sbr, gb, &sbr->data[0], 0);
-        read_sbr_envelope(sbr, gb, &sbr->data[1], 1);
-        read_sbr_noise(sbr, gb, &sbr->data[1], 1);
+        read_sbr_envelope(sbr, bc, &sbr->data[0], 0);
+        read_sbr_noise(sbr, bc, &sbr->data[0], 0);
+        read_sbr_envelope(sbr, bc, &sbr->data[1], 1);
+        read_sbr_noise(sbr, bc, &sbr->data[1], 1);
     } else {
-        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) ||
-            read_sbr_grid(ac, sbr, gb, &sbr->data[1]))
+        if (read_sbr_grid(ac, sbr, bc, &sbr->data[0]) ||
+            read_sbr_grid(ac, sbr, bc, &sbr->data[1]))
             return -1;
-        read_sbr_dtdf(sbr, gb, &sbr->data[0]);
-        read_sbr_dtdf(sbr, gb, &sbr->data[1]);
-        read_sbr_invf(sbr, gb, &sbr->data[0]);
-        read_sbr_invf(sbr, gb, &sbr->data[1]);
-        read_sbr_envelope(sbr, gb, &sbr->data[0], 0);
-        read_sbr_envelope(sbr, gb, &sbr->data[1], 1);
-        read_sbr_noise(sbr, gb, &sbr->data[0], 0);
-        read_sbr_noise(sbr, gb, &sbr->data[1], 1);
+        read_sbr_dtdf(sbr, bc, &sbr->data[0]);
+        read_sbr_dtdf(sbr, bc, &sbr->data[1]);
+        read_sbr_invf(sbr, bc, &sbr->data[0]);
+        read_sbr_invf(sbr, bc, &sbr->data[1]);
+        read_sbr_envelope(sbr, bc, &sbr->data[0], 0);
+        read_sbr_envelope(sbr, bc, &sbr->data[1], 1);
+        read_sbr_noise(sbr, bc, &sbr->data[0], 0);
+        read_sbr_noise(sbr, bc, &sbr->data[1], 1);
     }
 
-    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
-        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
-    if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
-        get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
+    if ((sbr->data[0].bs_add_harmonic_flag = bitstream_read_bit(bc)))
+        bitstream_read_bit_vector(bc, sbr->data[0].bs_add_harmonic, sbr->n[1]);
+    if ((sbr->data[1].bs_add_harmonic_flag = bitstream_read_bit(bc)))
+        bitstream_read_bit_vector(bc, sbr->data[1].bs_add_harmonic, sbr->n[1]);
 
     return 0;
 }
 
 static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr,
-                                  GetBitContext *gb, int id_aac)
+                                  BitstreamContext *bc, int id_aac)
 {
-    unsigned int cnt = get_bits_count(gb);
+    unsigned int cnt = bitstream_tell(bc);
 
     if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
-        if (read_sbr_single_channel_element(ac, sbr, gb)) {
+        if (read_sbr_single_channel_element(ac, sbr, bc)) {
             sbr_turnoff(sbr);
-            return get_bits_count(gb) - cnt;
+            return bitstream_tell(bc) - cnt;
         }
     } else if (id_aac == TYPE_CPE) {
-        if (read_sbr_channel_pair_element(ac, sbr, gb)) {
+        if (read_sbr_channel_pair_element(ac, sbr, bc)) {
             sbr_turnoff(sbr);
-            return get_bits_count(gb) - cnt;
+            return bitstream_tell(bc) - cnt;
         }
     } else {
         av_log(ac->avctx, AV_LOG_ERROR,
             "Invalid bitstream - cannot apply SBR to element type %d\n", 
id_aac);
         sbr_turnoff(sbr);
-        return get_bits_count(gb) - cnt;
+        return bitstream_tell(bc) - cnt;
     }
-    if (get_bits1(gb)) { // bs_extended_data
-        int num_bits_left = get_bits(gb, 4); // bs_extension_size
+    if (bitstream_read_bit(bc)) { // bs_extended_data
+        int num_bits_left = bitstream_read(bc, 4); // bs_extension_size
         if (num_bits_left == 15)
-            num_bits_left += get_bits(gb, 8); // bs_esc_count
+            num_bits_left += bitstream_read(bc, 8); // bs_esc_count
 
         num_bits_left <<= 3;
         while (num_bits_left > 7) {
             num_bits_left -= 2;
-            read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); 
// bs_extension_id
+            read_sbr_extension(ac, sbr, bc, bitstream_read(bc, 2), 
&num_bits_left); // bs_extension_id
         }
         if (num_bits_left < 0) {
             av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
         }
         if (num_bits_left > 0)
-            skip_bits(gb, num_bits_left);
+            bitstream_skip(bc, num_bits_left);
     }
 
-    return get_bits_count(gb) - cnt;
+    return bitstream_tell(bc) - cnt;
 }
 
 static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr)
@@ -1063,12 +1073,12 @@ static void sbr_reset(AACContext *ac, 
SpectralBandReplication *sbr)
  * @return  Returns number of bytes consumed from the TYPE_FIL element.
  */
 int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
-                            GetBitContext *gb_host, int crc, int cnt, int 
id_aac)
+                            BitstreamContext *bc_host, int crc, int cnt, int 
id_aac)
 {
     unsigned int num_sbr_bits = 0, num_align_bits;
     unsigned bytes_read;
-    GetBitContext gbc = *gb_host, *gb = &gbc;
-    skip_bits_long(gb_host, cnt*8 - 4);
+    BitstreamContext bcc = *bc_host, *bc = &bcc;
+    bitstream_skip(bc_host, cnt * 8 - 4);
 
     sbr->reset = 0;
 
@@ -1078,7 +1088,7 @@ int ff_decode_sbr_extension(AACContext *ac, 
SpectralBandReplication *sbr,
         ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate;
 
     if (crc) {
-        skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check
+        bitstream_skip(bc, 10); // bs_sbr_crc_bits; TODO - implement CRC check
         num_sbr_bits += 10;
     }
 
@@ -1088,14 +1098,14 @@ int ff_decode_sbr_extension(AACContext *ac, 
SpectralBandReplication *sbr,
     sbr->kx_and_m_pushed = 1;
 
     num_sbr_bits++;
-    if (get_bits1(gb)) // bs_header_flag
-        num_sbr_bits += read_sbr_header(sbr, gb);
+    if (bitstream_read_bit(bc)) // bs_header_flag
+        num_sbr_bits += read_sbr_header(sbr, bc);
 
     if (sbr->reset)
         sbr_reset(ac, sbr);
 
     if (sbr->start)
-        num_sbr_bits  += read_sbr_data(ac, sbr, gb, id_aac);
+        num_sbr_bits  += read_sbr_data(ac, sbr, bc, id_aac);
 
     num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7;
     bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3);
diff --git a/libavcodec/aacsbr.h b/libavcodec/aacsbr.h
index 9bc5e29..0a8cb2c 100644
--- a/libavcodec/aacsbr.h
+++ b/libavcodec/aacsbr.h
@@ -29,8 +29,8 @@
 #ifndef AVCODEC_AACSBR_H
 #define AVCODEC_AACSBR_H
 
-#include "get_bits.h"
 #include "aac.h"
+#include "bitstream.h"
 #include "sbr.h"
 
 /** Initialize SBR. */
@@ -41,7 +41,7 @@ void ff_aac_sbr_ctx_init(AACContext *ac, 
SpectralBandReplication *sbr);
 void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr);
 /** Decode one SBR element. */
 int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
-                            GetBitContext *gb, int crc, int cnt, int id_aac);
+                            BitstreamContext *bc, int crc, int cnt, int 
id_aac);
 /** Apply one SBR element to one AAC element. */
 void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
                   float* L, float *R);
-- 
2.7.3

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

Reply via email to