---
 libavcodec/rv10.c |  84 ++++++++++++++++++-----------------
 libavcodec/rv30.c |  31 ++++++-------
 libavcodec/rv34.c | 130 ++++++++++++++++++++++++++++--------------------------
 libavcodec/rv34.h |   8 ++--
 libavcodec/rv40.c |  64 ++++++++++++++-------------
 5 files changed, 165 insertions(+), 152 deletions(-)

diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c
index 3b5f4df..e816bc2 100644
--- a/libavcodec/rv10.c
+++ b/libavcodec/rv10.c
@@ -30,6 +30,7 @@
 #include "libavutil/imgutils.h"
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "error_resilience.h"
 #include "h263.h"
 #include "h263data.h"
@@ -40,6 +41,7 @@
 #include "mpeg4video.h"
 #include "mpegvideodata.h"
 #include "rv10.h"
+#include "vlc.h"
 
 #define RV_GET_MAJOR_VER(x)  ((x) >> 28)
 #define RV_GET_MINOR_VER(x) (((x) >> 20) & 0xFF)
@@ -200,39 +202,39 @@ int ff_rv_decode_dc(MpegEncContext *s, int n)
     int code;
 
     if (n < 4) {
-        code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
+        code = bitstream_read_vlc(&s->bc, rv_dc_lum.table, DC_VLC_BITS, 2);
         if (code < 0) {
             /* XXX: I don't understand why they use LONGER codes than
              * necessary. The following code would be completely useless
              * if they had thought about it !!! */
-            code = get_bits(&s->gb, 7);
+            code = bitstream_read(&s->bc, 7);
             if (code == 0x7c) {
-                code = (int8_t) (get_bits(&s->gb, 7) + 1);
+                code = (int8_t) (bitstream_read(&s->bc, 7) + 1);
             } else if (code == 0x7d) {
-                code = -128 + get_bits(&s->gb, 7);
+                code = -128 + bitstream_read(&s->bc, 7);
             } else if (code == 0x7e) {
-                if (get_bits1(&s->gb) == 0)
-                    code = (int8_t) (get_bits(&s->gb, 8) + 1);
+                if (bitstream_read_bit(&s->bc) == 0)
+                    code = (int8_t) (bitstream_read(&s->bc, 8) + 1);
                 else
-                    code = (int8_t) (get_bits(&s->gb, 8));
+                    code = (int8_t) (bitstream_read(&s->bc, 8));
             } else if (code == 0x7f) {
-                skip_bits(&s->gb, 11);
+                bitstream_skip(&s->bc, 11);
                 code = 1;
             }
         } else {
             code -= 128;
         }
     } else {
-        code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
+        code = bitstream_read_vlc(&s->bc, rv_dc_chrom.table, DC_VLC_BITS, 2);
         /* same remark */
         if (code < 0) {
-            code = get_bits(&s->gb, 9);
+            code = bitstream_read(&s->bc, 9);
             if (code == 0x1fc) {
-                code = (int8_t) (get_bits(&s->gb, 7) + 1);
+                code = (int8_t) (bitstream_read(&s->bc, 7) + 1);
             } else if (code == 0x1fd) {
-                code = -128 + get_bits(&s->gb, 7);
+                code = -128 + bitstream_read(&s->bc, 7);
             } else if (code == 0x1fe) {
-                skip_bits(&s->gb, 9);
+                bitstream_skip(&s->bc, 9);
                 code = 1;
             } else {
                 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
@@ -250,9 +252,9 @@ static int rv10_decode_picture_header(MpegEncContext *s)
 {
     int mb_count, pb_frame, marker, mb_xy;
 
-    marker = get_bits1(&s->gb);
+    marker = bitstream_read_bit(&s->bc);
 
-    if (get_bits1(&s->gb))
+    if (bitstream_read_bit(&s->bc))
         s->pict_type = AV_PICTURE_TYPE_P;
     else
         s->pict_type = AV_PICTURE_TYPE_I;
@@ -260,7 +262,7 @@ static int rv10_decode_picture_header(MpegEncContext *s)
     if (!marker)
         av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
 
-    pb_frame = get_bits1(&s->gb);
+    pb_frame = bitstream_read_bit(&s->bc);
 
     ff_dlog(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
 
@@ -269,7 +271,7 @@ static int rv10_decode_picture_header(MpegEncContext *s)
         return AVERROR_PATCHWELCOME;
     }
 
-    s->qscale = get_bits(&s->gb, 5);
+    s->qscale = bitstream_read(&s->bc, 5);
     if (s->qscale == 0) {
         av_log(s->avctx, AV_LOG_ERROR, "Invalid qscale value: 0\n");
         return AVERROR_INVALIDDATA;
@@ -278,9 +280,9 @@ static int rv10_decode_picture_header(MpegEncContext *s)
     if (s->pict_type == AV_PICTURE_TYPE_I) {
         if (s->rv10_version == 3) {
             /* specific MPEG like DC coding not used */
-            s->last_dc[0] = get_bits(&s->gb, 8);
-            s->last_dc[1] = get_bits(&s->gb, 8);
-            s->last_dc[2] = get_bits(&s->gb, 8);
+            s->last_dc[0] = bitstream_read(&s->bc, 8);
+            s->last_dc[1] = bitstream_read(&s->bc, 8);
+            s->last_dc[2] = bitstream_read(&s->bc, 8);
             ff_dlog(s->avctx, "DC:%d %d %d\n", s->last_dc[0],
                     s->last_dc[1], s->last_dc[2]);
         }
@@ -289,16 +291,16 @@ static int rv10_decode_picture_header(MpegEncContext *s)
      * to display the macroblocks is coded here */
 
     mb_xy = s->mb_x + s->mb_y * s->mb_width;
-    if (show_bits(&s->gb, 12) == 0 || (mb_xy && mb_xy < s->mb_num)) {
-        s->mb_x  = get_bits(&s->gb, 6); /* mb_x */
-        s->mb_y  = get_bits(&s->gb, 6); /* mb_y */
-        mb_count = get_bits(&s->gb, 12);
+    if (bitstream_peek(&s->bc, 12) == 0 || (mb_xy && mb_xy < s->mb_num)) {
+        s->mb_x  = bitstream_read(&s->bc, 6); /* mb_x */
+        s->mb_y  = bitstream_read(&s->bc, 6); /* mb_y */
+        mb_count = bitstream_read(&s->bc, 12);
     } else {
         s->mb_x  = 0;
         s->mb_y  = 0;
         mb_count = s->mb_width * s->mb_height;
     }
-    skip_bits(&s->gb, 3);   /* ignored */
+    bitstream_skip(&s->bc, 3);   /* ignored */
     s->f_code          = 1;
     s->unrestricted_mv = 1;
 
@@ -311,7 +313,7 @@ static int rv20_decode_picture_header(RVDecContext *rv)
     int seq, mb_pos, i, ret;
     int rpr_bits;
 
-    i = get_bits(&s->gb, 2);
+    i = bitstream_read(&s->bc, 2);
     switch (i) {
     case 0:
         s->pict_type = AV_PICTURE_TYPE_I;
@@ -335,31 +337,31 @@ static int rv20_decode_picture_header(RVDecContext *rv)
         return AVERROR_INVALIDDATA;
     }
 
-    if (get_bits1(&s->gb)) {
+    if (bitstream_read_bit(&s->bc)) {
         av_log(s->avctx, AV_LOG_ERROR, "reserved bit set\n");
         return AVERROR_INVALIDDATA;
     }
 
-    s->qscale = get_bits(&s->gb, 5);
+    s->qscale = bitstream_read(&s->bc, 5);
     if (s->qscale == 0) {
         av_log(s->avctx, AV_LOG_ERROR, "Invalid qscale value: 0\n");
         return AVERROR_INVALIDDATA;
     }
 
     if (RV_GET_MINOR_VER(rv->sub_id) >= 2)
-        s->loop_filter = get_bits1(&s->gb);
+        s->loop_filter = bitstream_read_bit(&s->bc);
 
     if (RV_GET_MINOR_VER(rv->sub_id) <= 1)
-        seq = get_bits(&s->gb, 8) << 7;
+        seq = bitstream_read(&s->bc, 8) << 7;
     else
-        seq = get_bits(&s->gb, 13) << 2;
+        seq = bitstream_read(&s->bc, 13) << 2;
 
     rpr_bits = s->avctx->extradata[1] & 7;
     if (rpr_bits) {
         int f, new_w, new_h;
         rpr_bits = FFMIN((rpr_bits >> 1) + 1, 3);
 
-        f = get_bits(&s->gb, rpr_bits);
+        f = bitstream_read(&s->bc, rpr_bits);
 
         if (f) {
             if (s->avctx->extradata_size < 8 + 2 * f) {
@@ -420,11 +422,11 @@ static int rv20_decode_picture_header(RVDecContext *rv)
         }
     }
 
-    s->no_rounding = get_bits1(&s->gb);
+    s->no_rounding = bitstream_read_bit(&s->bc);
 
     if (RV_GET_MINOR_VER(rv->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B)
         // binary decoder reads 3+2 bits here but they don't seem to be used
-        skip_bits(&s->gb, 5);
+        bitstream_skip(&s->bc, 5);
 
     s->f_code          = 1;
     s->unrestricted_mv = 1;
@@ -539,7 +541,7 @@ static int rv10_decode_packet(AVCodecContext *avctx, const 
uint8_t *buf,
     int mb_count, mb_pos, left, start_mb_x, active_bits_size, ret;
 
     active_bits_size = buf_size * 8;
-    init_get_bits(&s->gb, buf, FFMAX(buf_size, buf_size2) * 8);
+    bitstream_init8(&s->bc, buf, FFMAX(buf_size, buf_size2));
     if (s->codec_id == AV_CODEC_ID_RV10)
         mb_count = rv10_decode_picture_header(s);
     else
@@ -627,23 +629,23 @@ static int rv10_decode_packet(AVCodecContext *avctx, 
const uint8_t *buf,
         // Repeat the slice end check from ff_h263_decode_mb with our active
         // bitstream size
         if (ret != SLICE_ERROR) {
-            int v = show_bits(&s->gb, 16);
+            int v = bitstream_peek(&s->bc, 16);
 
-            if (get_bits_count(&s->gb) + 16 > active_bits_size)
-                v >>= get_bits_count(&s->gb) + 16 - active_bits_size;
+            if (bitstream_tell(&s->bc) + 16 > active_bits_size)
+                v >>= bitstream_tell(&s->bc) + 16 - active_bits_size;
 
             if (!v)
                 ret = SLICE_END;
         }
-        if (ret != SLICE_ERROR && active_bits_size < get_bits_count(&s->gb) &&
-            8 * buf_size2 >= get_bits_count(&s->gb)) {
+        if (ret != SLICE_ERROR && active_bits_size < bitstream_tell(&s->bc) &&
+            8 * buf_size2 >= bitstream_tell(&s->bc)) {
             active_bits_size = buf_size2 * 8;
             av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n",
                    8 * buf_size, active_bits_size);
             ret = SLICE_OK;
         }
 
-        if (ret == SLICE_ERROR || active_bits_size < get_bits_count(&s->gb)) {
+        if (ret == SLICE_ERROR || active_bits_size < bitstream_tell(&s->bc)) {
             av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x,
                    s->mb_y);
             return AVERROR_INVALIDDATA;
diff --git a/libavcodec/rv30.c b/libavcodec/rv30.c
index bf22df5..d400cf4 100644
--- a/libavcodec/rv30.c
+++ b/libavcodec/rv30.c
@@ -25,6 +25,7 @@
  */
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "mpegutils.h"
 #include "mpegvideo.h"
 #include "golomb.h"
@@ -33,7 +34,7 @@
 #include "rv30data.h"
 
 
-static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, 
SliceInfo *si)
+static int rv30_parse_slice_header(RV34DecContext *r, BitstreamContext *bc, 
SliceInfo *si)
 {
     AVCodecContext *avctx = r->s.avctx;
     int mb_bits;
@@ -42,16 +43,16 @@ static int rv30_parse_slice_header(RV34DecContext *r, 
GetBitContext *gb, SliceIn
     int rpr;
 
     memset(si, 0, sizeof(SliceInfo));
-    if(get_bits(gb, 3))
+    if(bitstream_read(bc, 3))
         return -1;
-    si->type = get_bits(gb, 2);
+    si->type = bitstream_read(bc, 2);
     if(si->type == 1) si->type = 0;
-    if(get_bits1(gb))
+    if(bitstream_read_bit(bc))
         return -1;
-    si->quant = get_bits(gb, 5);
-    skip_bits1(gb);
-    si->pts = get_bits(gb, 13);
-    rpr = get_bits(gb, r->rpr);
+    si->quant = bitstream_read(bc, 5);
+    bitstream_skip(bc, 1);
+    si->pts = bitstream_read(bc, 13);
+    rpr = bitstream_read(bc, r->rpr);
     if(rpr){
         if (avctx->extradata_size < rpr * 2 + 8) {
             av_log(avctx, AV_LOG_ERROR,
@@ -66,22 +67,22 @@ static int rv30_parse_slice_header(RV34DecContext *r, 
GetBitContext *gb, SliceIn
     si->width  = w;
     si->height = h;
     mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
-    mb_bits = ff_rv34_get_start_offset(gb, mb_size);
-    si->start = get_bits(gb, mb_bits);
-    skip_bits1(gb);
+    mb_bits = ff_rv34_get_start_offset(bc, mb_size);
+    si->start = bitstream_read(bc, mb_bits);
+    bitstream_skip(bc, 1);
     return 0;
 }
 
 /**
  * Decode 4x4 intra types array.
  */
-static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, 
int8_t *dst)
+static int rv30_decode_intra_types(RV34DecContext *r, BitstreamContext *bc, 
int8_t *dst)
 {
     int i, j, k;
 
     for(i = 0; i < 4; i++, dst += r->intra_types_stride - 4){
         for(j = 0; j < 4; j+= 2){
-            unsigned code = svq3_get_ue_golomb(gb) << 1;
+            unsigned code = svq3_get_ue_golomb(bc) << 1;
             if(code >= 81*2){
                 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction 
code\n");
                 return -1;
@@ -108,8 +109,8 @@ static int rv30_decode_mb_info(RV34DecContext *r)
     static const int rv30_p_types[6] = { RV34_MB_SKIP, RV34_MB_P_16x16, 
RV34_MB_P_8x8, -1, RV34_MB_TYPE_INTRA, RV34_MB_TYPE_INTRA16x16 };
     static const int rv30_b_types[6] = { RV34_MB_SKIP, RV34_MB_B_DIRECT, 
RV34_MB_B_FORWARD, RV34_MB_B_BACKWARD, RV34_MB_TYPE_INTRA, 
RV34_MB_TYPE_INTRA16x16 };
     MpegEncContext *s = &r->s;
-    GetBitContext *gb = &s->gb;
-    unsigned code     = svq3_get_ue_golomb(gb);
+    BitstreamContext *bc = &s->bc;
+    unsigned code     = svq3_get_ue_golomb(bc);
 
     if (code > 11) {
         av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n");
diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
index 5fa71d8..75eef13 100644
--- a/libavcodec/rv34.c
+++ b/libavcodec/rv34.c
@@ -27,6 +27,7 @@
 #include "libavutil/internal.h"
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "error_resilience.h"
 #include "mpegutils.h"
 #include "mpegvideo.h"
@@ -37,6 +38,7 @@
 #include "qpeldsp.h"
 #include "rectangle.h"
 #include "thread.h"
+#include "vlc.h"
 
 #include "rv34vlc.h"
 #include "rv34data.h"
@@ -184,7 +186,7 @@ static av_cold void rv34_init_tables(void)
 /**
  * Decode coded block pattern.
  */
-static int rv34_decode_cbp(GetBitContext *gb, RV34VLC *vlc, int table)
+static int rv34_decode_cbp(BitstreamContext *bc, RV34VLC *vlc, int table)
 {
     int pattern, code, cbp=0;
     int ones;
@@ -193,7 +195,7 @@ static int rv34_decode_cbp(GetBitContext *gb, RV34VLC *vlc, 
int table)
     const int *curshift = shifts;
     int i, t, mask;
 
-    code = get_vlc2(gb, vlc->cbppattern[table].table, 9, 2);
+    code = bitstream_read_vlc(bc, vlc->cbppattern[table].table, 9, 2);
     pattern = code & 0xF;
     code >>= 4;
 
@@ -201,13 +203,14 @@ static int rv34_decode_cbp(GetBitContext *gb, RV34VLC 
*vlc, int table)
 
     for(mask = 8; mask; mask >>= 1, curshift++){
         if(pattern & mask)
-            cbp |= get_vlc2(gb, vlc->cbp[table][ones].table, 
vlc->cbp[table][ones].bits, 1) << curshift[0];
+            cbp |= bitstream_read_vlc(bc, vlc->cbp[table][ones].table,
+                                      vlc->cbp[table][ones].bits, 1) << 
curshift[0];
     }
 
     for(i = 0; i < 4; i++){
         t = (modulo_three_table[code] >> (6 - 2*i)) & 3;
         if(t == 1)
-            cbp |= cbp_masks[get_bits1(gb)] << i;
+            cbp |= cbp_masks[bitstream_read_bit(bc)] << i;
         if(t == 2)
             cbp |= cbp_masks[2] << i;
     }
@@ -217,18 +220,19 @@ static int rv34_decode_cbp(GetBitContext *gb, RV34VLC 
*vlc, int table)
 /**
  * Get one coefficient value from the bitstream and store it.
  */
-static inline void decode_coeff(int16_t *dst, int coef, int esc, GetBitContext 
*gb, VLC* vlc, int q)
+static inline void decode_coeff(int16_t *dst, int coef, int esc, 
BitstreamContext *bc,
+                                VLC* vlc, int q)
 {
     if(coef){
         if(coef == esc){
-            coef = get_vlc2(gb, vlc->table, 9, 2);
+            coef = bitstream_read_vlc(bc, vlc->table, 9, 2);
             if(coef > 23){
                 coef -= 23;
-                coef = 22 + ((1 << coef) | get_bits(gb, coef));
+                coef = 22 + ((1 << coef) | bitstream_read(bc, coef));
             }
             coef += esc;
         }
-        if(get_bits1(gb))
+        if(bitstream_read_bit(bc))
             coef = -coef;
         *dst = (coef*q + 8) >> 4;
     }
@@ -237,39 +241,39 @@ static inline void decode_coeff(int16_t *dst, int coef, 
int esc, GetBitContext *
 /**
  * Decode 2x2 subblock of coefficients.
  */
-static inline void decode_subblock(int16_t *dst, int code, const int 
is_block2, GetBitContext *gb, VLC *vlc, int q)
+static inline void decode_subblock(int16_t *dst, int code, const int 
is_block2, BitstreamContext *bc, VLC *vlc, int q)
 {
     int flags = modulo_three_table[code];
 
-    decode_coeff(    dst+0*4+0, (flags >> 6)    , 3, gb, vlc, q);
+    decode_coeff(    dst+0*4+0, (flags >> 6)    , 3, bc, vlc, q);
     if(is_block2){
-        decode_coeff(dst+1*4+0, (flags >> 4) & 3, 2, gb, vlc, q);
-        decode_coeff(dst+0*4+1, (flags >> 2) & 3, 2, gb, vlc, q);
+        decode_coeff(dst+1*4+0, (flags >> 4) & 3, 2, bc, vlc, q);
+        decode_coeff(dst+0*4+1, (flags >> 2) & 3, 2, bc, vlc, q);
     }else{
-        decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, gb, vlc, q);
-        decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, gb, vlc, q);
+        decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, bc, vlc, q);
+        decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, bc, vlc, q);
     }
-    decode_coeff(    dst+1*4+1, (flags >> 0) & 3, 2, gb, vlc, q);
+    decode_coeff(    dst+1*4+1, (flags >> 0) & 3, 2, bc, vlc, q);
 }
 
 /**
  * Decode a single coefficient.
  */
-static inline void decode_subblock1(int16_t *dst, int code, GetBitContext *gb, 
VLC *vlc, int q)
+static inline void decode_subblock1(int16_t *dst, int code, BitstreamContext 
*bc, VLC *vlc, int q)
 {
     int coeff = modulo_three_table[code] >> 6;
-    decode_coeff(dst, coeff, 3, gb, vlc, q);
+    decode_coeff(dst, coeff, 3, bc, vlc, q);
 }
 
-static inline void decode_subblock3(int16_t *dst, int code, GetBitContext *gb, 
VLC *vlc,
+static inline void decode_subblock3(int16_t *dst, int code, BitstreamContext 
*bc, VLC *vlc,
                                     int q_dc, int q_ac1, int q_ac2)
 {
     int flags = modulo_three_table[code];
 
-    decode_coeff(dst+0*4+0, (flags >> 6)    , 3, gb, vlc, q_dc);
-    decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, gb, vlc, q_ac1);
-    decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, gb, vlc, q_ac1);
-    decode_coeff(dst+1*4+1, (flags >> 0) & 3, 2, gb, vlc, q_ac2);
+    decode_coeff(dst+0*4+0, (flags >> 6)    , 3, bc, vlc, q_dc);
+    decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, bc, vlc, q_ac1);
+    decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, bc, vlc, q_ac1);
+    decode_coeff(dst+1*4+1, (flags >> 0) & 3, 2, bc, vlc, q_ac2);
 }
 
 /**
@@ -283,36 +287,37 @@ static inline void decode_subblock3(int16_t *dst, int 
code, GetBitContext *gb, V
  *  o--o
  */
 
-static int rv34_decode_block(int16_t *dst, GetBitContext *gb, RV34VLC *rvlc, 
int fc, int sc, int q_dc, int q_ac1, int q_ac2)
+static int rv34_decode_block(int16_t *dst, BitstreamContext *bc, RV34VLC *rvlc,
+                             int fc, int sc, int q_dc, int q_ac1, int q_ac2)
 {
     int code, pattern, has_ac = 1;
 
-    code = get_vlc2(gb, rvlc->first_pattern[fc].table, 9, 2);
+    code = bitstream_read_vlc(bc, rvlc->first_pattern[fc].table, 9, 2);
 
     pattern = code & 0x7;
 
     code >>= 3;
 
     if (modulo_three_table[code] & 0x3F) {
-        decode_subblock3(dst, code, gb, &rvlc->coefficient, q_dc, q_ac1, 
q_ac2);
+        decode_subblock3(dst, code, bc, &rvlc->coefficient, q_dc, q_ac1, 
q_ac2);
     } else {
-        decode_subblock1(dst, code, gb, &rvlc->coefficient, q_dc);
+        decode_subblock1(dst, code, bc, &rvlc->coefficient, q_dc);
         if (!pattern)
             return 0;
         has_ac = 0;
     }
 
     if(pattern & 4){
-        code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2);
-        decode_subblock(dst + 4*0+2, code, 0, gb, &rvlc->coefficient, q_ac2);
+        code = bitstream_read_vlc(bc, rvlc->second_pattern[sc].table, 9, 2);
+        decode_subblock(dst + 4*0+2, code, 0, bc, &rvlc->coefficient, q_ac2);
     }
     if(pattern & 2){ // Looks like coefficients 1 and 2 are swapped for this 
block
-        code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2);
-        decode_subblock(dst + 4*2+0, code, 1, gb, &rvlc->coefficient, q_ac2);
+        code = bitstream_read_vlc(bc, rvlc->second_pattern[sc].table, 9, 2);
+        decode_subblock(dst + 4*2+0, code, 1, bc, &rvlc->coefficient, q_ac2);
     }
     if(pattern & 1){
-        code = get_vlc2(gb, rvlc->third_pattern[sc].table, 9, 2);
-        decode_subblock(dst + 4*2+2, code, 0, gb, &rvlc->coefficient, q_ac2);
+        code = bitstream_read_vlc(bc, rvlc->third_pattern[sc].table, 9, 2);
+        decode_subblock(dst + 4*2+2, code, 0, bc, &rvlc->coefficient, q_ac2);
     }
     return has_ac | pattern;
 }
@@ -326,7 +331,7 @@ static int rv34_decode_block(int16_t *dst, GetBitContext 
*gb, RV34VLC *rvlc, int
  * Decode starting slice position.
  * @todo Maybe replace with ff_h263_decode_mba() ?
  */
-int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
+int ff_rv34_get_start_offset(BitstreamContext *bc, int mb_size)
 {
     int i;
     for(i = 0; i < 5; i++)
@@ -352,25 +357,25 @@ static inline RV34VLC* choose_vlc_set(int quant, int mod, 
int type)
 static int rv34_decode_intra_mb_header(RV34DecContext *r, int8_t *intra_types)
 {
     MpegEncContext *s = &r->s;
-    GetBitContext *gb = &s->gb;
+    BitstreamContext *bc = &s->bc;
     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
     int t;
 
-    r->is16 = get_bits1(gb);
+    r->is16 = bitstream_read_bit(bc);
     if(r->is16){
         s->current_picture_ptr->mb_type[mb_pos] = MB_TYPE_INTRA16x16;
         r->block_type = RV34_MB_TYPE_INTRA16x16;
-        t = get_bits(gb, 2);
+        t = bitstream_read(bc, 2);
         fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, 
sizeof(intra_types[0]));
         r->luma_vlc   = 2;
     }else{
         if(!r->rv30){
-            if(!get_bits1(gb))
+            if(!bitstream_read_bit(bc))
                 av_log(s->avctx, AV_LOG_ERROR, "Need DQUANT\n");
         }
         s->current_picture_ptr->mb_type[mb_pos] = MB_TYPE_INTRA;
         r->block_type = RV34_MB_TYPE_INTRA;
-        if(r->decode_intra_types(r, gb, intra_types) < 0)
+        if(r->decode_intra_types(r, bc, intra_types) < 0)
             return -1;
         r->luma_vlc   = 1;
     }
@@ -378,7 +383,7 @@ static int rv34_decode_intra_mb_header(RV34DecContext *r, 
int8_t *intra_types)
     r->chroma_vlc = 0;
     r->cur_vlcs   = choose_vlc_set(r->si.quant, r->si.vlc_set, 0);
 
-    return rv34_decode_cbp(gb, r->cur_vlcs, r->is16);
+    return rv34_decode_cbp(bc, r->cur_vlcs, r->is16);
 }
 
 /**
@@ -387,7 +392,7 @@ static int rv34_decode_intra_mb_header(RV34DecContext *r, 
int8_t *intra_types)
 static int rv34_decode_inter_mb_header(RV34DecContext *r, int8_t *intra_types)
 {
     MpegEncContext *s = &r->s;
-    GetBitContext *gb = &s->gb;
+    BitstreamContext *bc = &s->bc;
     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
     int i, t;
 
@@ -413,11 +418,11 @@ static int rv34_decode_inter_mb_header(RV34DecContext *r, 
int8_t *intra_types)
 
     if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){
         if(r->is16){
-            t = get_bits(gb, 2);
+            t = bitstream_read(bc, 2);
             fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, 
sizeof(intra_types[0]));
             r->luma_vlc   = 2;
         }else{
-            if(r->decode_intra_types(r, gb, intra_types) < 0)
+            if(r->decode_intra_types(r, bc, intra_types) < 0)
                 return -1;
             r->luma_vlc   = 1;
         }
@@ -435,7 +440,7 @@ static int rv34_decode_inter_mb_header(RV34DecContext *r, 
int8_t *intra_types)
         }
     }
 
-    return rv34_decode_cbp(gb, r->cur_vlcs, r->is16);
+    return rv34_decode_cbp(bc, r->cur_vlcs, r->is16);
 }
 
 /** @} */ //bitstream functions
@@ -847,15 +852,15 @@ static const int num_mvs[RV34_MB_TYPES] = { 0, 0, 1, 4, 
1, 1, 0, 0, 2, 2, 2, 1 }
 static int rv34_decode_mv(RV34DecContext *r, int block_type)
 {
     MpegEncContext *s = &r->s;
-    GetBitContext *gb = &s->gb;
+    BitstreamContext *bc = &s->bc;
     int i, j, k, l;
     int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
     int next_bt;
 
     memset(r->dmv, 0, sizeof(r->dmv));
     for(i = 0; i < num_mvs[block_type]; i++){
-        r->dmv[i][0] = svq3_get_se_golomb(gb);
-        r->dmv[i][1] = svq3_get_se_golomb(gb);
+        r->dmv[i][0] = svq3_get_se_golomb(bc);
+        r->dmv[i][1] = svq3_get_se_golomb(bc);
     }
     switch(block_type){
     case RV34_MB_TYPE_INTRA:
@@ -1002,7 +1007,7 @@ static inline void rv34_process_block(RV34DecContext *r,
 {
     MpegEncContext *s = &r->s;
     int16_t *ptr = s->block[0];
-    int has_ac = rv34_decode_block(ptr, &s->gb, r->cur_vlcs,
+    int has_ac = rv34_decode_block(ptr, &s->bc, r->cur_vlcs,
                                    fc, sc, q_dc, q_ac, q_ac);
     if(has_ac){
         r->rdsp.rv34_idct_add(pdst, stride, ptr);
@@ -1016,7 +1021,7 @@ static void rv34_output_i16x16(RV34DecContext *r, int8_t 
*intra_types, int cbp)
 {
     LOCAL_ALIGNED_16(int16_t, block16, [16]);
     MpegEncContext *s    = &r->s;
-    GetBitContext  *gb   = &s->gb;
+    BitstreamContext  *bc   = &s->bc;
     int             q_dc = rv34_qscale_tab[ r->luma_dc_quant_i[s->qscale] ],
                     q_ac = rv34_qscale_tab[s->qscale];
     uint8_t        *dst  = s->dest[0];
@@ -1025,7 +1030,7 @@ static void rv34_output_i16x16(RV34DecContext *r, int8_t 
*intra_types, int cbp)
 
     memset(block16, 0, 16 * sizeof(*block16));
 
-    has_ac = rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, 
q_ac);
+    has_ac = rv34_decode_block(block16, bc, r->cur_vlcs, 3, 0, q_dc, q_dc, 
q_ac);
     if(has_ac)
         r->rdsp.rv34_inv_transform(block16);
     else
@@ -1040,7 +1045,7 @@ static void rv34_output_i16x16(RV34DecContext *r, int8_t 
*intra_types, int cbp)
             int dc = block16[i + j*4];
 
             if(cbp & 1){
-                has_ac = rv34_decode_block(ptr, gb, r->cur_vlcs, r->luma_vlc, 
0, q_ac, q_ac, q_ac);
+                has_ac = rv34_decode_block(ptr, bc, r->cur_vlcs, r->luma_vlc, 
0, q_ac, q_ac, q_ac);
             }else
                 has_ac = 0;
 
@@ -1184,7 +1189,7 @@ static int rv34_set_deblock_coef(RV34DecContext *r)
 static int rv34_decode_inter_macroblock(RV34DecContext *r, int8_t *intra_types)
 {
     MpegEncContext *s   = &r->s;
-    GetBitContext  *gb  = &s->gb;
+    BitstreamContext  *bc  = &s->bc;
     uint8_t        *dst = s->dest[0];
     int16_t        *ptr = s->block[0];
     int          mb_pos = s->mb_x + s->mb_y * s->mb_stride;
@@ -1230,7 +1235,7 @@ static int rv34_decode_inter_macroblock(RV34DecContext 
*r, int8_t *intra_types)
         memset(block16, 0, 16 * sizeof(*block16));
         q_dc = rv34_qscale_tab[ r->luma_dc_quant_p[s->qscale] ];
         q_ac = rv34_qscale_tab[s->qscale];
-        if (rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, 
q_ac))
+        if (rv34_decode_block(block16, bc, r->cur_vlcs, 3, 0, q_dc, q_dc, 
q_ac))
             r->rdsp.rv34_inv_transform(block16);
         else
             r->rdsp.rv34_inv_transform_dc(block16);
@@ -1242,7 +1247,7 @@ static int rv34_decode_inter_macroblock(RV34DecContext 
*r, int8_t *intra_types)
                 int      dc   = block16[i + j*4];
 
                 if(cbp & 1){
-                    has_ac = rv34_decode_block(ptr, gb, r->cur_vlcs, 
r->luma_vlc, 0, q_ac, q_ac, q_ac);
+                    has_ac = rv34_decode_block(ptr, bc, r->cur_vlcs, 
r->luma_vlc, 0, q_ac, q_ac, q_ac);
                 }else
                     has_ac = 0;
 
@@ -1338,8 +1343,8 @@ static int check_slice_end(RV34DecContext *r, 
MpegEncContext *s)
         return 1;
     if(r->s.mb_skip_run > 1)
         return 0;
-    bits = get_bits_left(&s->gb);
-    if(bits < 0 || (bits < 8 && !show_bits(&s->gb, bits)))
+    bits = bitstream_bits_left(&s->bc);
+    if(bits < 0 || (bits < 8 && !bitstream_peek(&s->bc, bits)))
         return 1;
     return 0;
 }
@@ -1394,12 +1399,12 @@ static int rv34_decoder_realloc(RV34DecContext *r)
 static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, 
int buf_size)
 {
     MpegEncContext *s = &r->s;
-    GetBitContext *gb = &s->gb;
+    BitstreamContext *bc = &s->bc;
     int mb_pos, slice_type;
     int res;
 
-    init_get_bits(&r->s.gb, buf, buf_size*8);
-    res = r->parse_slice_header(r, gb, &r->si);
+    bitstream_init8(&r->s.bc, buf, buf_size);
+    res = r->parse_slice_header(r, bc, &r->si);
     if(res < 0){
         av_log(s->avctx, AV_LOG_ERROR, "Incorrect or unknown slice header\n");
         return -1;
@@ -1645,8 +1650,9 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
         av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
         return AVERROR_INVALIDDATA;
     }
-    init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, 0), 
(buf_size-get_slice_offset(avctx, slices_hdr, 0))*8);
-    if(r->parse_slice_header(r, &r->s.gb, &si) < 0 || si.start){
+    bitstream_init8(&s->bc, buf+get_slice_offset(avctx, slices_hdr, 0),
+                    (buf_size-get_slice_offset(avctx, slices_hdr, 0)));
+    if(r->parse_slice_header(r, &r->s.bc, &si) < 0 || si.start){
         av_log(avctx, AV_LOG_ERROR, "First slice header is incorrect\n");
         return AVERROR_INVALIDDATA;
     }
@@ -1761,8 +1767,8 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
                 av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
                 break;
             }
-            init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, 
i+1), (buf_size-get_slice_offset(avctx, slices_hdr, i+1))*8);
-            if(r->parse_slice_header(r, &r->s.gb, &si) < 0){
+            bitstream_init8(&s->bc, buf+get_slice_offset(avctx, slices_hdr, 
i+1), (buf_size-get_slice_offset(avctx, slices_hdr, i+1)));
+            if(r->parse_slice_header(r, &r->s.bc, &si) < 0){
                 if(i+2 < slice_count)
                     size = get_slice_offset(avctx, slices_hdr, i+2) - offset;
                 else
diff --git a/libavcodec/rv34.h b/libavcodec/rv34.h
index 0ac24bf..dedef5f 100644
--- a/libavcodec/rv34.h
+++ b/libavcodec/rv34.h
@@ -28,7 +28,9 @@
 #define AVCODEC_RV34_H
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "mpegvideo.h"
+#include "vlc.h"
 
 #include "h264pred.h"
 #include "rv34dsp.h"
@@ -121,16 +123,16 @@ typedef struct RV34DecContext{
     uint8_t *tmp_b_block_uv[4];
     uint8_t *tmp_b_block_base;
 
-    int (*parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, 
SliceInfo *si);
+    int (*parse_slice_header)(struct RV34DecContext *r, BitstreamContext *bc, 
SliceInfo *si);
     int (*decode_mb_info)(struct RV34DecContext *r);
-    int (*decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, 
int8_t *dst);
+    int (*decode_intra_types)(struct RV34DecContext *r, BitstreamContext *bc, 
int8_t *dst);
     void (*loop_filter)(struct RV34DecContext *r, int row);
 }RV34DecContext;
 
 /**
  * common decoding functions
  */
-int ff_rv34_get_start_offset(GetBitContext *gb, int blocks);
+int ff_rv34_get_start_offset(BitstreamContext *bc, int blocks);
 int ff_rv34_decode_init(AVCodecContext *avctx);
 int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, 
AVPacket *avpkt);
 int ff_rv34_decode_end(AVCodecContext *avctx);
diff --git a/libavcodec/rv40.c b/libavcodec/rv40.c
index e6c77e8..129fa20 100644
--- a/libavcodec/rv40.c
+++ b/libavcodec/rv40.c
@@ -27,9 +27,11 @@
 #include "libavutil/imgutils.h"
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "mpegutils.h"
 #include "mpegvideo.h"
 #include "golomb.h"
+#include "vlc.h"
 
 #include "rv34.h"
 #include "rv40vlc2.h"
@@ -101,15 +103,15 @@ static av_cold void rv40_init_tables(void)
  * If the width/height is the standard one then it's coded as a 3-bit index.
  * Otherwise it is coded as escaped 8-bit portions.
  */
-static int get_dimension(GetBitContext *gb, const int *dim)
+static int get_dimension(BitstreamContext *bc, const int *dim)
 {
-    int t   = get_bits(gb, 3);
+    int t   = bitstream_read(bc, 3);
     int val = dim[t];
     if(val < 0)
-        val = dim[get_bits1(gb) - val];
+        val = dim[bitstream_read_bit(bc) - val];
     if(!val){
         do{
-            t = get_bits(gb, 8);
+            t = bitstream_read(bc, 8);
             val += t << 2;
         }while(t == 0xFF);
     }
@@ -119,13 +121,13 @@ static int get_dimension(GetBitContext *gb, const int 
*dim)
 /**
  * Get encoded picture size - usually this is called from 
rv40_parse_slice_header.
  */
-static void rv40_parse_picture_size(GetBitContext *gb, int *w, int *h)
+static void rv40_parse_picture_size(BitstreamContext *bc, int *w, int *h)
 {
-    *w = get_dimension(gb, rv40_standard_widths);
-    *h = get_dimension(gb, rv40_standard_heights);
+    *w = get_dimension(bc, rv40_standard_widths);
+    *h = get_dimension(bc, rv40_standard_heights);
 }
 
-static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, 
SliceInfo *si)
+static int rv40_parse_slice_header(RV34DecContext *r, BitstreamContext *bc, 
SliceInfo *si)
 {
     int mb_bits;
     int w = r->s.width, h = r->s.height;
@@ -133,25 +135,25 @@ static int rv40_parse_slice_header(RV34DecContext *r, 
GetBitContext *gb, SliceIn
     int ret;
 
     memset(si, 0, sizeof(SliceInfo));
-    if(get_bits1(gb))
+    if(bitstream_read_bit(bc))
         return AVERROR_INVALIDDATA;
-    si->type = get_bits(gb, 2);
+    si->type = bitstream_read(bc, 2);
     if(si->type == 1) si->type = 0;
-    si->quant = get_bits(gb, 5);
-    if(get_bits(gb, 2))
+    si->quant = bitstream_read(bc, 5);
+    if(bitstream_read(bc, 2))
         return AVERROR_INVALIDDATA;
-    si->vlc_set = get_bits(gb, 2);
-    skip_bits1(gb);
-    si->pts = get_bits(gb, 13);
-    if(!si->type || !get_bits1(gb))
-        rv40_parse_picture_size(gb, &w, &h);
+    si->vlc_set = bitstream_read(bc, 2);
+    bitstream_skip(bc, 1);
+    si->pts = bitstream_read(bc, 13);
+    if(!si->type || !bitstream_read_bit(bc))
+        rv40_parse_picture_size(bc, &w, &h);
     if ((ret = av_image_check_size(w, h, 0, r->s.avctx)) < 0)
         return ret;
     si->width  = w;
     si->height = h;
     mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
-    mb_bits = ff_rv34_get_start_offset(gb, mb_size);
-    si->start = get_bits(gb, mb_bits);
+    mb_bits = ff_rv34_get_start_offset(bc, mb_size);
+    si->start = bitstream_read(bc, mb_bits);
 
     return 0;
 }
@@ -159,7 +161,7 @@ static int rv40_parse_slice_header(RV34DecContext *r, 
GetBitContext *gb, SliceIn
 /**
  * Decode 4x4 intra types array.
  */
-static int rv40_decode_intra_types(RV34DecContext *r, GetBitContext *gb, 
int8_t *dst)
+static int rv40_decode_intra_types(RV34DecContext *r, BitstreamContext *bc, 
int8_t *dst)
 {
     MpegEncContext *s = &r->s;
     int i, j, k, v;
@@ -169,7 +171,7 @@ static int rv40_decode_intra_types(RV34DecContext *r, 
GetBitContext *gb, int8_t
 
     for(i = 0; i < 4; i++, dst += r->intra_types_stride){
         if(!i && s->first_slice_line){
-            pattern = get_vlc2(gb, aic_top_vlc.table, AIC_TOP_BITS, 1);
+            pattern = bitstream_read_vlc(bc, aic_top_vlc.table, AIC_TOP_BITS, 
1);
             dst[0] = (pattern >> 2) & 2;
             dst[1] = (pattern >> 1) & 2;
             dst[2] =  pattern       & 2;
@@ -192,23 +194,23 @@ static int rv40_decode_intra_types(RV34DecContext *r, 
GetBitContext *gb, int8_t
                 if(pattern == rv40_aic_table_index[k])
                     break;
             if(j < 3 && k < MODE2_PATTERNS_NUM){ //pattern is found, decoding 
2 coefficients
-                v = get_vlc2(gb, aic_mode2_vlc[k].table, AIC_MODE2_BITS, 2);
+                v = bitstream_read_vlc(bc, aic_mode2_vlc[k].table, 
AIC_MODE2_BITS, 2);
                 *ptr++ = v/9;
                 *ptr++ = v%9;
                 j++;
             }else{
                 if(B != -1 && C != -1)
-                    v = get_vlc2(gb, aic_mode1_vlc[B + C*10].table, 
AIC_MODE1_BITS, 1);
+                    v = bitstream_read_vlc(bc, aic_mode1_vlc[B + C*10].table, 
AIC_MODE1_BITS, 1);
                 else{ // tricky decoding
                     v = 0;
                     switch(C){
                     case -1: // code 0 -> 1, 1 -> 0
                         if(B < 2)
-                            v = get_bits1(gb) ^ 1;
+                            v = bitstream_read_bit(bc) ^ 1;
                         break;
                     case  0:
                     case  2: // code 0 -> 2, 1 -> 0
-                        v = (get_bits1(gb) ^ 1) << 1;
+                        v = (bitstream_read_bit(bc) ^ 1) << 1;
                         break;
                     }
                 }
@@ -225,13 +227,13 @@ static int rv40_decode_intra_types(RV34DecContext *r, 
GetBitContext *gb, int8_t
 static int rv40_decode_mb_info(RV34DecContext *r)
 {
     MpegEncContext *s = &r->s;
-    GetBitContext *gb = &s->gb;
+    BitstreamContext *bc = &s->bc;
     int q, i;
     int prev_type = 0;
     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
 
     if(!r->s.mb_skip_run)
-        r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1;
+        r->s.mb_skip_run = svq3_get_ue_golomb(bc) + 1;
 
     if(--r->s.mb_skip_run)
          return RV34_MB_SKIP;
@@ -259,17 +261,17 @@ static int rv40_decode_mb_info(RV34DecContext *r)
 
     if(s->pict_type == AV_PICTURE_TYPE_P){
         prev_type = block_num_to_ptype_vlc_num[prev_type];
-        q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
+        q = bitstream_read_vlc(bc, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 
1);
         if(q < PBTYPE_ESCAPE)
             return q;
-        q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
+        q = bitstream_read_vlc(bc, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 
1);
         av_log(s->avctx, AV_LOG_ERROR, "Dquant for P-frame\n");
     }else{
         prev_type = block_num_to_btype_vlc_num[prev_type];
-        q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
+        q = bitstream_read_vlc(bc, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 
1);
         if(q < PBTYPE_ESCAPE)
             return q;
-        q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
+        q = bitstream_read_vlc(bc, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 
1);
         av_log(s->avctx, AV_LOG_ERROR, "Dquant for B-frame\n");
     }
     return 0;
-- 
2.1.4


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

Reply via email to