]> granicus.if.org Git - libvpx/commitdiff
MB_MODE_INFO size reduction
authorScott LaVarnway <slavarnway@google.com>
Fri, 23 Mar 2012 20:55:22 +0000 (16:55 -0400)
committerScott LaVarnway <slavarnway@google.com>
Thu, 29 Mar 2012 20:30:14 +0000 (16:30 -0400)
Reduced the size of the struct by 8 bytes, which would be
a memory savings of 64800 bytes for 1080 resolutions.  Had
an extra byte, so created an is_4x4 for B_PRED or SPLITMV
modes.  This simplified the mode checks in
vp8_reset_mb_tokens_context and vp8_decode_mb_tokens.

Change-Id: Ibec27784139abdc34d4d01f73c09f43e9e10e0f5

vp8/common/blockd.h
vp8/decoder/decodemv.c
vp8/decoder/detokenize.c

index 692f0ebd2a383ff9eeec7f2c4a20bdd91a430ee0..a4c1d920cf29f7f71d174c7ddb20b21f0230f39e 100644 (file)
@@ -150,14 +150,15 @@ typedef enum
 
 typedef struct
 {
-    MB_PREDICTION_MODE mode, uv_mode;
-    MV_REFERENCE_FRAME ref_frame;
+    uint8_t mode, uv_mode;
+    uint8_t ref_frame;
+    uint8_t is_4x4;
     int_mv mv;
 
-    unsigned char partitioning;
-    unsigned char mb_skip_coeff;                                /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */
-    unsigned char need_to_clamp_mvs;
-    unsigned char segment_id;                  /* Which set of segmentation parameters should be used for this MB */
+    uint8_t partitioning;
+    uint8_t mb_skip_coeff;                                /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */
+    uint8_t need_to_clamp_mvs;
+    uint8_t segment_id;                  /* Which set of segmentation parameters should be used for this MB */
 } MB_MODE_INFO;
 
 typedef struct
index 4ade1c09ef4c48b6b86d462b17209bcff9fc8bdc..b0e37e1085aa91c0aa62a3b8999d66920d4eee4c 100644 (file)
@@ -57,6 +57,7 @@ static void read_kf_modes(VP8D_COMP *pbi, MODE_INFO *mi)
     if (mi->mbmi.mode == B_PRED)
     {
         int i = 0;
+        mi->mbmi.is_4x4 = 1;
 
         do
         {
@@ -485,6 +486,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi)
                                                     mb_to_bottom_edge);
                         mbmi->mv.as_int = mi->bmi[15].mv.as_int;
                         mbmi->mode =  SPLITMV;
+                        mbmi->is_4x4 = 1;
                     }
                     else
                     {
@@ -557,6 +559,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi)
         if ((mbmi->mode = read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED)
         {
             int j = 0;
+            mbmi->is_4x4 = 1;
             do
             {
                 mi->bmi[j].as_mode = read_bmode(bc, pbi->common.fc.bmode_prob);
@@ -603,6 +606,7 @@ static void decode_mb_mode_mvs(VP8D_COMP *pbi, MODE_INFO *mi,
     else
         mi->mbmi.mb_skip_coeff = 0;
 
+    mi->mbmi.is_4x4 = 0;
     if(pbi->common.frame_type == KEY_FRAME)
         read_kf_modes(pbi, mi);
     else
index c5752ee0b188e82ef9e4b5a2eef810c44f71078e..0c39848b8a2333cdeab48a43637d8024be27d7a8 100644 (file)
 
 void vp8_reset_mb_tokens_context(MACROBLOCKD *x)
 {
+    ENTROPY_CONTEXT *a_ctx = ((ENTROPY_CONTEXT *)x->above_context);
+    ENTROPY_CONTEXT *l_ctx = ((ENTROPY_CONTEXT *)x->left_context);
+
+    vpx_memset(a_ctx, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
+    vpx_memset(l_ctx, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
+
     /* Clear entropy contexts for Y2 blocks */
-    if (x->mode_info_context->mbmi.mode != B_PRED &&
-        x->mode_info_context->mbmi.mode != SPLITMV)
-    {
-        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
-        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
-    }
-    else
+    if (!x->mode_info_context->mbmi.is_4x4)
     {
-        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
-        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
+        a_ctx[8] = l_ctx[8] = 0;
     }
 }
 
@@ -187,8 +186,7 @@ int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
 
     qcoeff_ptr = &x->qcoeff[0];
 
-    if (x->mode_info_context->mbmi.mode != B_PRED &&
-        x->mode_info_context->mbmi.mode != SPLITMV)
+    if (!x->mode_info_context->mbmi.is_4x4)
     {
         a = a_ctx + 8;
         l = l_ctx + 8;