[005/115] dnxhd: Convert to the new bitstream reader

Message ID 1465485217-7678-6-git-send-email-diego@biurrun.de
State Superseded
Headers show

Commit Message

Diego Biurrun June 9, 2016, 3:11 p.m.
From: Alexandra Hájková <alexandra@khirnov.net>

---
 libavcodec/dnxhddec.c | 46 ++++++++++++++++++++--------------------------
 1 file changed, 20 insertions(+), 26 deletions(-)

Comments

Anton Khirnov June 13, 2016, 5:23 p.m. | #1
Quoting Diego Biurrun (2016-06-09 17:11:47)
> From: Alexandra Hájková <alexandra@khirnov.net>
> 
> ---
>  libavcodec/dnxhddec.c | 46 ++++++++++++++++++++--------------------------
>  1 file changed, 20 insertions(+), 26 deletions(-)
> 
> diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
> index 50747ea..4597a92 100644
> --- a/libavcodec/dnxhddec.c
> +++ b/libavcodec/dnxhddec.c
> @@ -24,17 +24,19 @@
>  
>  #include "libavutil/imgutils.h"
>  #include "libavutil/timer.h"
> +
>  #include "avcodec.h"
> +#include "bitstream.h"
>  #include "blockdsp.h"
> -#include "get_bits.h"
>  #include "dnxhddata.h"
>  #include "idctdsp.h"
>  #include "internal.h"
>  #include "thread.h"
> +#include "vlc.h"
>  
>  typedef struct DNXHDContext {
>      AVCodecContext *avctx;
> -    GetBitContext gb;
> +    BitstreamContext bc;
>      BlockDSPContext bdsp;
>      int cid;                            ///< compression id
>      unsigned int width, height;
> @@ -230,7 +232,7 @@ static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx,
>      int i, j, index1, index2, len;
>      int level, component, sign;
>      const uint8_t *weight_matrix;
> -    OPEN_READER(bs, &ctx->gb);
> +    BitstreamContext in_bc = ctx->bc;
>  
>      if (!ctx->is_444) {
>          if (n & 2) {
> @@ -249,37 +251,30 @@ static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx,
>          }
>      }
>  
> -    UPDATE_CACHE(bs, &ctx->gb);
> -    GET_VLC(len, bs, &ctx->gb, ctx->dc_vlc.table, DNXHD_DC_VLC_BITS, 1);
> +    len = bitstream_read_vlc(&in_bc, ctx->dc_vlc.table, DNXHD_DC_VLC_BITS, 1);
>      if (len) {
> -        level = GET_CACHE(bs, &ctx->gb);
> -        LAST_SKIP_BITS(bs, &ctx->gb, len);
> -        sign  = ~level >> 31;
> -        level = (NEG_USR32(sign ^ level, len) ^ sign) - sign;
> +        level = bitstream_read_xbits(&in_bc, len);
>          ctx->last_dc[component] += level;
>      }
>      block[0] = ctx->last_dc[component];
>  
>      for (i = 1; ; i++) {
> -        UPDATE_CACHE(bs, &ctx->gb);
> -        GET_VLC(index1, bs, &ctx->gb, ctx->ac_vlc.table,
> -                DNXHD_VLC_BITS, 2);
> +        index1 = bitstream_read_vlc(&in_bc, ctx->ac_vlc.table,
> +                                    DNXHD_VLC_BITS, 2);
>          level = ctx->cid_table->ac_level[index1];
>          if (!level) /* EOB */
>              break;
>  
> -        sign = SHOW_SBITS(bs, &ctx->gb, 1);
> -        SKIP_BITS(bs, &ctx->gb, 1);
> +        sign = bitstream_read_signed(&in_bc, 1);
>  
>          if (ctx->cid_table->ac_index_flag[index1]) {
> -            level += SHOW_UBITS(bs, &ctx->gb, index_bits) << 6;
> -            SKIP_BITS(bs, &ctx->gb, index_bits);
> +            level = level + (bitstream_read(&in_bc, index_bits) << 6);
>          }
>  
>          if (ctx->cid_table->ac_run_flag[index1]) {
> -            UPDATE_CACHE(bs, &ctx->gb);
> -            GET_VLC(index2, bs, &ctx->gb, ctx->run_vlc.table,
> -                    DNXHD_VLC_BITS, 2);
> +            index2 = bitstream_read_vlc(&in_bc, ctx->run_vlc.table,
> +                                        DNXHD_VLC_BITS, 2);
> +
>              i += ctx->cid_table->run[index2];
>          }
>  
> @@ -296,8 +291,7 @@ static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx,
>  
>          block[j] = (level ^ sign) - sign;
>      }
> -
> -    CLOSE_READER(bs, &ctx->gb);
> +    ctx->bc = in_bc;
>  }
>  
>  static void dnxhd_decode_dct_block_8(DNXHDContext *ctx, int16_t *block,
> @@ -330,12 +324,12 @@ static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame,
>      int interlaced_mb = 0;
>  
>      if (ctx->mbaff) {
> -        interlaced_mb = get_bits1(&ctx->gb);
> -        qscale = get_bits(&ctx->gb, 10);
> +        interlaced_mb = bitstream_read_bit(&ctx->bc);
> +        qscale = bitstream_read(&ctx->bc, 10);
>      } else {
> -        qscale = get_bits(&ctx->gb, 11);
> +        qscale = bitstream_read(&ctx->bc, 11);
>      }
> -    skip_bits1(&ctx->gb);
> +    bitstream_skip(&ctx->bc, 1);
>  
>      for (i = 0; i < 8; i++) {
>          ctx->bdsp.clear_block(ctx->blocks[i]);
> @@ -412,7 +406,7 @@ static int dnxhd_decode_macroblocks(DNXHDContext *ctx, AVFrame *frame,
>          ctx->last_dc[0] =
>          ctx->last_dc[1] =
>          ctx->last_dc[2] = 1 << (ctx->bit_depth + 2); // for levels +2^(bitdepth-1)
> -        init_get_bits(&ctx->gb, buf + ctx->mb_scan_index[y], (buf_size - ctx->mb_scan_index[y]) << 3);
> +        bitstream_init8(&ctx->bc, buf + ctx->mb_scan_index[y], buf_size - ctx->mb_scan_index[y]);
>          for (x = 0; x < ctx->mb_width; x++) {
>              //START_TIMER;
>              dnxhd_decode_macroblock(ctx, frame, x, y);
> -- 
> 2.7.3

LGTM

Patch

diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
index 50747ea..4597a92 100644
--- a/libavcodec/dnxhddec.c
+++ b/libavcodec/dnxhddec.c
@@ -24,17 +24,19 @@ 
 
 #include "libavutil/imgutils.h"
 #include "libavutil/timer.h"
+
 #include "avcodec.h"
+#include "bitstream.h"
 #include "blockdsp.h"
-#include "get_bits.h"
 #include "dnxhddata.h"
 #include "idctdsp.h"
 #include "internal.h"
 #include "thread.h"
+#include "vlc.h"
 
 typedef struct DNXHDContext {
     AVCodecContext *avctx;
-    GetBitContext gb;
+    BitstreamContext bc;
     BlockDSPContext bdsp;
     int cid;                            ///< compression id
     unsigned int width, height;
@@ -230,7 +232,7 @@  static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx,
     int i, j, index1, index2, len;
     int level, component, sign;
     const uint8_t *weight_matrix;
-    OPEN_READER(bs, &ctx->gb);
+    BitstreamContext in_bc = ctx->bc;
 
     if (!ctx->is_444) {
         if (n & 2) {
@@ -249,37 +251,30 @@  static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx,
         }
     }
 
-    UPDATE_CACHE(bs, &ctx->gb);
-    GET_VLC(len, bs, &ctx->gb, ctx->dc_vlc.table, DNXHD_DC_VLC_BITS, 1);
+    len = bitstream_read_vlc(&in_bc, ctx->dc_vlc.table, DNXHD_DC_VLC_BITS, 1);
     if (len) {
-        level = GET_CACHE(bs, &ctx->gb);
-        LAST_SKIP_BITS(bs, &ctx->gb, len);
-        sign  = ~level >> 31;
-        level = (NEG_USR32(sign ^ level, len) ^ sign) - sign;
+        level = bitstream_read_xbits(&in_bc, len);
         ctx->last_dc[component] += level;
     }
     block[0] = ctx->last_dc[component];
 
     for (i = 1; ; i++) {
-        UPDATE_CACHE(bs, &ctx->gb);
-        GET_VLC(index1, bs, &ctx->gb, ctx->ac_vlc.table,
-                DNXHD_VLC_BITS, 2);
+        index1 = bitstream_read_vlc(&in_bc, ctx->ac_vlc.table,
+                                    DNXHD_VLC_BITS, 2);
         level = ctx->cid_table->ac_level[index1];
         if (!level) /* EOB */
             break;
 
-        sign = SHOW_SBITS(bs, &ctx->gb, 1);
-        SKIP_BITS(bs, &ctx->gb, 1);
+        sign = bitstream_read_signed(&in_bc, 1);
 
         if (ctx->cid_table->ac_index_flag[index1]) {
-            level += SHOW_UBITS(bs, &ctx->gb, index_bits) << 6;
-            SKIP_BITS(bs, &ctx->gb, index_bits);
+            level = level + (bitstream_read(&in_bc, index_bits) << 6);
         }
 
         if (ctx->cid_table->ac_run_flag[index1]) {
-            UPDATE_CACHE(bs, &ctx->gb);
-            GET_VLC(index2, bs, &ctx->gb, ctx->run_vlc.table,
-                    DNXHD_VLC_BITS, 2);
+            index2 = bitstream_read_vlc(&in_bc, ctx->run_vlc.table,
+                                        DNXHD_VLC_BITS, 2);
+
             i += ctx->cid_table->run[index2];
         }
 
@@ -296,8 +291,7 @@  static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx,
 
         block[j] = (level ^ sign) - sign;
     }
-
-    CLOSE_READER(bs, &ctx->gb);
+    ctx->bc = in_bc;
 }
 
 static void dnxhd_decode_dct_block_8(DNXHDContext *ctx, int16_t *block,
@@ -330,12 +324,12 @@  static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame,
     int interlaced_mb = 0;
 
     if (ctx->mbaff) {
-        interlaced_mb = get_bits1(&ctx->gb);
-        qscale = get_bits(&ctx->gb, 10);
+        interlaced_mb = bitstream_read_bit(&ctx->bc);
+        qscale = bitstream_read(&ctx->bc, 10);
     } else {
-        qscale = get_bits(&ctx->gb, 11);
+        qscale = bitstream_read(&ctx->bc, 11);
     }
-    skip_bits1(&ctx->gb);
+    bitstream_skip(&ctx->bc, 1);
 
     for (i = 0; i < 8; i++) {
         ctx->bdsp.clear_block(ctx->blocks[i]);
@@ -412,7 +406,7 @@  static int dnxhd_decode_macroblocks(DNXHDContext *ctx, AVFrame *frame,
         ctx->last_dc[0] =
         ctx->last_dc[1] =
         ctx->last_dc[2] = 1 << (ctx->bit_depth + 2); // for levels +2^(bitdepth-1)
-        init_get_bits(&ctx->gb, buf + ctx->mb_scan_index[y], (buf_size - ctx->mb_scan_index[y]) << 3);
+        bitstream_init8(&ctx->bc, buf + ctx->mb_scan_index[y], buf_size - ctx->mb_scan_index[y]);
         for (x = 0; x < ctx->mb_width; x++) {
             //START_TIMER;
             dnxhd_decode_macroblock(ctx, frame, x, y);