]> granicus.if.org Git - libvpx/commitdiff
Reset txfm context condition for skip coded blocks
authorJingning Han <jingning@google.com>
Fri, 16 Oct 2015 00:50:13 +0000 (17:50 -0700)
committerJingning Han <jingning@google.com>
Fri, 30 Oct 2015 01:02:37 +0000 (18:02 -0700)
If a block has all coefficients quantized to zero, the codec will
assume that it uses largest transform block size.

Change-Id: Icd4e8e7cdc4b6af6974f87169e50b040ebfe9020

vp10/common/blockd.h
vp10/common/onyxc_int.h
vp10/decoder/decodemv.c
vp10/encoder/bitstream.c
vp10/encoder/encodeframe.c

index 6c018186fb872321ba3451fd9ced4f492fb8073a..b02e7c92ca97c71f768b938c2f0e827b6265afe6 100644 (file)
@@ -220,6 +220,9 @@ typedef struct macroblockd {
   TXFM_CONTEXT *above_txfm_context;
   TXFM_CONTEXT *left_txfm_context;
   TXFM_CONTEXT left_txfm_context_buffer[8];
+
+  // dimension in the unit of 8x8 block of the current block
+  int16_t n8_w, n8_h;
 #endif
 
 #if CONFIG_VP9_HIGHBITDEPTH
index 4178fe70dda2e355e449440bfc571e28eac6b866..8e41e9a89d9c7a521e6b6a00c9583603ea93289c 100644 (file)
@@ -452,6 +452,11 @@ static INLINE void set_mi_row_col(MACROBLOCKD *xd, const TileInfo *const tile,
     xd->left_mi = NULL;
     xd->left_mbmi = NULL;
   }
+
+#if CONFIG_VAR_TX
+  xd->n8_h = bh;
+  xd->n8_w = bw;
+#endif
 }
 
 static INLINE const vpx_prob *get_y_mode_probs(const VP10_COMMON *cm,
@@ -496,6 +501,14 @@ static INLINE int partition_plane_context(const MACROBLOCKD *xd,
 }
 
 #if CONFIG_VAR_TX
+static INLINE void set_txfm_ctx(TXFM_CONTEXT *txfm_ctx,
+                                TX_SIZE tx_size,
+                                int len) {
+  int i;
+  for (i = 0; i < len; ++i)
+    txfm_ctx[i] = tx_size;
+}
+
 static INLINE void txfm_partition_update(TXFM_CONTEXT *above_ctx,
                                          TXFM_CONTEXT *left_ctx,
                                          TX_SIZE tx_size) {
index a4fb8de229a247827346ed8dfc54d865db7c1f94..c478592e69262e36675c4ff48b5a85cfb4e4bdef 100644 (file)
@@ -771,6 +771,8 @@ static void read_inter_frame_mode_info(VP10Decoder *const pbi,
   inter_block = read_is_inter_block(cm, xd, mbmi->segment_id, r);
 
 #if CONFIG_VAR_TX
+  xd->above_txfm_context = cm->above_txfm_context + mi_col;
+  xd->left_txfm_context = xd->left_txfm_context_buffer + (mi_row & 0x07);
   if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT &&
       !mbmi->skip && inter_block) {
     const TX_SIZE max_tx_size = max_txsize_lookup[bsize];
@@ -779,8 +781,6 @@ static void read_inter_frame_mode_info(VP10Decoder *const pbi,
     const int width  = num_4x4_blocks_wide_lookup[bsize];
     const int height = num_4x4_blocks_high_lookup[bsize];
     int idx, idy;
-    xd->above_txfm_context = cm->above_txfm_context + mi_col;
-    xd->left_txfm_context = xd->left_txfm_context_buffer + (mi_row & 0x07);
     for (idy = 0; idy < height; idy += bs)
       for (idx = 0; idx < width; idx += bs)
         read_tx_size_inter(cm, xd, mbmi, xd->counts, max_tx_size,
@@ -800,6 +800,9 @@ static void read_inter_frame_mode_info(VP10Decoder *const pbi,
         for (idx = 0; idx < width; ++idx)
           mbmi->inter_tx_size[(idy >> 1) * 8 + (idx >> 1)] = mbmi->tx_size;
     }
+
+    set_txfm_ctx(xd->left_txfm_context, mbmi->tx_size, xd->n8_h);
+    set_txfm_ctx(xd->above_txfm_context, mbmi->tx_size, xd->n8_w);
   }
 #else
   mbmi->tx_size = read_tx_size(cm, xd, !mbmi->skip || !inter_block, r);
index 1bc3d583e2c79fee1b887556297757ff2e61bd6a..c944a89eeadb97a32610830ce8a085f9dfe841ec 100644 (file)
@@ -564,10 +564,16 @@ static void pack_inter_mode_mvs(VP10_COMP *cpi, const MODE_INFO *mi,
         for (idx = 0; idx < width; idx += bs)
           write_tx_size_inter(cm, xd, mbmi, max_tx_size, idy, idx, w);
     } else {
+      set_txfm_ctx(xd->left_txfm_context, mbmi->tx_size, xd->n8_h);
+      set_txfm_ctx(xd->above_txfm_context, mbmi->tx_size, xd->n8_w);
+
       write_selected_tx_size(cm, xd, w);
     }
+  } else {
+    set_txfm_ctx(xd->left_txfm_context, mbmi->tx_size, xd->n8_h);
+    set_txfm_ctx(xd->above_txfm_context, mbmi->tx_size, xd->n8_w);
 #else
-    write_selected_tx_size(cm, xd, w);
+  write_selected_tx_size(cm, xd, w);
 #endif
   }
 
index 32f00f750dfe7d07cb6681806b8251debb0f3adf..c816147aa8ab575edc509aaaee3d89ddeda7b3dd 100644 (file)
@@ -3279,12 +3279,11 @@ static void encode_superblock(VP10_COMP *cpi, ThreadData *td,
       int x, y;
       TX_SIZE tx_size;
       // The new intra coding scheme requires no change of transform size
-      if (is_inter_block(&mi->mbmi)) {
+      if (is_inter_block(&mi->mbmi))
         tx_size = VPXMIN(tx_mode_to_biggest_tx_size[cm->tx_mode],
                          max_txsize_lookup[bsize]);
-      } else {
+      else
         tx_size = (bsize >= BLOCK_8X8) ? mbmi->tx_size : TX_4X4;
-      }
 
       for (y = 0; y < mi_height; y++)
         for (x = 0; x < mi_width; x++)
@@ -3313,8 +3312,21 @@ static void encode_superblock(VP10_COMP *cpi, ThreadData *td,
 
 #if CONFIG_VAR_TX
   if (cm->tx_mode == TX_MODE_SELECT && mbmi->sb_type >= BLOCK_8X8 &&
-      is_inter_block(mbmi) && !(mbmi->skip || seg_skip) &&
-      !output_enabled)
-    tx_partition_set_contexts(cm, xd, bsize, mi_row, mi_col);
+      is_inter_block(mbmi) && !(mbmi->skip || seg_skip)) {
+    if (!output_enabled)
+      tx_partition_set_contexts(cm, xd, bsize, mi_row, mi_col);
+  } else {
+    TX_SIZE tx_size;
+    // The new intra coding scheme requires no change of transform size
+    if (is_inter_block(mbmi))
+      tx_size = VPXMIN(tx_mode_to_biggest_tx_size[cm->tx_mode],
+                       max_txsize_lookup[bsize]);
+    else
+      tx_size = (bsize >= BLOCK_8X8) ? mbmi->tx_size : TX_4X4;
+
+    mbmi->tx_size = tx_size;
+    set_txfm_ctx(xd->left_txfm_context, tx_size, xd->n8_h);
+    set_txfm_ctx(xd->above_txfm_context, tx_size, xd->n8_w);
+  }
 #endif
 }