]> granicus.if.org Git - libvpx/commitdiff
Adds sb-type context to probs in interintra expt
authorDeb Mukherjee <debargha@google.com>
Thu, 15 Aug 2013 18:17:50 +0000 (11:17 -0700)
committerDeb Mukherjee <debargha@google.com>
Thu, 15 Aug 2013 18:17:50 +0000 (11:17 -0700)
Adds sb_type context to the probabilities in the interintra
experiment.

Change-Id: I5dec4318fb859a550ad5e7ed83378e17ba48e8ed

vp9/common/vp9_entropymode.c
vp9/common/vp9_entropymode.h
vp9/common/vp9_onyxc_int.h
vp9/decoder/vp9_decodemv.c
vp9/encoder/vp9_bitstream.c
vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_onyx_int.h
vp9/encoder/vp9_ratectrl.c
vp9/encoder/vp9_rdopt.c

index 31b2a3540ab4e926d1daef3f0224a0d07f25147e..6753e7c9fc2d2cf3f57a851b1871edb22947e7ac 100644 (file)
@@ -335,6 +335,12 @@ static const vp9_prob default_switchable_interp_prob[VP9_SWITCHABLE_FILTERS+1]
   { 149, 144, },
 };
 
+#if CONFIG_INTERINTRA
+static const vp9_prob default_interintra_prob[BLOCK_SIZE_TYPES] = {
+  192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192
+};
+#endif
+
 void vp9_init_mbmode_probs(VP9_COMMON *cm) {
   vp9_copy(cm->fc.uv_mode_prob, default_if_uv_probs);
   vp9_copy(cm->fc.y_mode_prob, default_if_y_probs);
@@ -347,7 +353,7 @@ void vp9_init_mbmode_probs(VP9_COMMON *cm) {
   cm->fc.tx_probs = default_tx_probs;
   vp9_copy(cm->fc.mbskip_probs, default_mbskip_probs);
 #if CONFIG_INTERINTRA
-  cm->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
+  vp9_copy(cm->fc.interintra_prob, default_interintra_prob);
 #endif
 #if CONFIG_FILTERINTRA
   vp9_copy(cm->fc.filterintra_prob, vp9_default_filterintra_prob);
@@ -479,8 +485,11 @@ void vp9_adapt_mode_probs(VP9_COMMON *cm) {
 
 #if CONFIG_INTERINTRA
   if (cm->use_interintra) {
-    fc->interintra_prob = update_ct2(pre_fc->interintra_prob,
-                                     counts->interintra);
+    for (i = 0; i < BLOCK_SIZE_TYPES; ++i) {
+      if (is_interintra_allowed(i))
+        fc->interintra_prob[i] = update_ct2(pre_fc->interintra_prob[i],
+                                            counts->interintra[i]);
+    }
   }
 #endif
 #if CONFIG_FILTERINTRA
index 9be9365fcba1943e22be1844e145912c87f3e0d5..4276a35a13ff0efaef69808f1fb69363b598496b 100644 (file)
@@ -20,7 +20,6 @@
 #define VP9_SWITCHABLE_FILTERS 3   // number of switchable filters
 
 #if CONFIG_INTERINTRA
-#define VP9_DEF_INTERINTRA_PROB 192
 #define VP9_UPD_INTERINTRA_PROB 248
 #define SEPARATE_INTERINTRA_UV  0
 #endif
index f1c86e83c1528c911759f31025ac23901a8f3ab1..0981071aa11377a80f2974de14c360e18c50d092 100644 (file)
@@ -54,7 +54,7 @@ typedef struct frame_contexts {
   vp9_prob mbskip_probs[MBSKIP_CONTEXTS];
   nmv_context nmvc;
 #if CONFIG_INTERINTRA
-  vp9_prob interintra_prob;
+  vp9_prob interintra_prob[BLOCK_SIZE_TYPES];
 #endif
 #if CONFIG_FILTERINTRA
   vp9_prob filterintra_prob[TX_SIZES][VP9_INTRA_MODES];
@@ -82,7 +82,7 @@ typedef struct {
   unsigned int mbskip[MBSKIP_CONTEXTS][2];
   nmv_context_counts mv;
 #if CONFIG_INTERINTRA
-  unsigned int interintra[2];
+  unsigned int interintra[BLOCK_SIZE_TYPES][2];
 #endif
 #if CONFIG_FILTERINTRA
   unsigned int filterintra[TX_SIZES][VP9_INTRA_MODES][2];
index aacf74ad002ecc42348082d81b0f4c9267d3a318..c582662ca53abe4101c2cab36eaabc535979a57a 100644 (file)
@@ -561,9 +561,9 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi,
         && is_inter_mode(mbmi->mode)
         && (mbmi->ref_frame[1] == NONE)
         ) {
-      mbmi->ref_frame[1] = (vp9_read(r, cm->fc.interintra_prob) ?
+      mbmi->ref_frame[1] = (vp9_read(r, cm->fc.interintra_prob[bsize]) ?
                             INTRA_FRAME : NONE);
-      cm->counts.interintra[mbmi->ref_frame[1] == INTRA_FRAME]++;
+      cm->counts.interintra[bsize][mbmi->ref_frame[1] == INTRA_FRAME]++;
       if (mbmi->ref_frame[1] == INTRA_FRAME) {
         int bsg = MIN(MIN(b_width_log2(bsize), b_height_log2(bsize)), 3);
         mbmi->interintra_mode = read_intra_mode(r, cm->fc.y_mode_prob[bsg]);
@@ -774,8 +774,12 @@ void vp9_prepare_read_mode_info(VP9D_COMP* pbi, vp9_reader *r) {
 
 #if CONFIG_INTERINTRA
     if (cm->use_interintra) {
-      if (vp9_read(r, VP9_UPD_INTERINTRA_PROB))
-        cm->fc.interintra_prob = vp9_read_prob(r);
+      int b;
+      for (b = 0; b < BLOCK_SIZE_TYPES; ++b) {
+        if (is_interintra_allowed(b))
+          if (vp9_read(r, VP9_UPD_INTERINTRA_PROB))
+            vp9_diff_update_prob(r, &cm->fc.interintra_prob[b]);
+      }
     }
 #endif
 
index 22870722881a31604a9bed98dd87e0590186f278..18b51c35fa3e13221c733e99a3d6f61da9c3e762 100644 (file)
@@ -509,7 +509,8 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m, vp9_writer *bc) {
         && is_interintra_allowed(bsize)
         && is_inter_mode(mode)
         && (mi->ref_frame[1] <= INTRA_FRAME)) {
-        vp9_write(bc, mi->ref_frame[1] == INTRA_FRAME, pc->fc.interintra_prob);
+        vp9_write(bc, mi->ref_frame[1] == INTRA_FRAME,
+                  pc->fc.interintra_prob[bsize]);
         if (mi->ref_frame[1] == INTRA_FRAME) {
           const int bwl = b_width_log2(bsize),
                     bhl = b_height_log2(bsize);
@@ -1396,8 +1397,16 @@ static void write_uncompressed_header(VP9_COMP *cpi,
       fix_mcomp_filter_type(cpi);
       write_interp_filter_type(cm->mcomp_filter_type, wb);
 #if CONFIG_INTERINTRA
-      if (!cpi->dummy_packing && cm->use_interintra)
-        cm->use_interintra = (cpi->interintra_count[1] > 0);
+      if (!cpi->dummy_packing && cm->use_interintra) {
+        int b;
+        cm->use_interintra = 0;
+        for (b = 0; b < BLOCK_SIZE_TYPES; ++b) {
+          if (is_interintra_allowed(b) && cpi->interintra_count[b][1] > 0) {
+            cm->use_interintra = 1;
+            break;
+          }
+        }
+      }
       vp9_wb_write_bit(wb, cm->use_interintra);
       if (!cm->use_interintra)
         vp9_zero(cpi->interintra_count);
@@ -1454,10 +1463,14 @@ static size_t write_compressed_header(VP9_COMP *cpi, uint8_t *data) {
 
 #if CONFIG_INTERINTRA
     if (cm->use_interintra) {
-      vp9_cond_prob_update(&header_bc,
-                           &cm->fc.interintra_prob,
-                           VP9_UPD_INTERINTRA_PROB,
-                           cpi->interintra_count);
+      int b;
+      for (b = 0; b < BLOCK_SIZE_TYPES; ++b) {
+        if (is_interintra_allowed(b))
+          vp9_cond_prob_diff_update(&header_bc,
+                                    &cm->fc.interintra_prob[b],
+                                    VP9_UPD_INTERINTRA_PROB,
+                                    cpi->interintra_count[b]);
+      }
     }
 #endif
 
index ffd9a32dec34e6cf738604936941ff631924f543..3813ba37b1318f88aab449619cb2ee4870f58868 100644 (file)
@@ -443,12 +443,12 @@ static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
         const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
         const int bsl = MIN(bwl, bhl);
         ++cpi->y_mode_count[MIN(bsl, 3)][mbmi->interintra_mode];
-        ++cpi->interintra_count[1];
+        ++cpi->interintra_count[mbmi->sb_type][1];
 #if SEPARATE_INTERINTRA_UV
         ++cpi->uv_mode_count[mbmi->interintra_mode][mbmi->interintra_uv_mode];
 #endif
         } else {
-          ++cpi->interintra_count[0];
+          ++cpi->interintra_count[mbmi->sb_type][0];
         }
     }
 #endif
index 55fc4cd1c1bdfdb987b597dc34be54b6de674465..f45b613133fbbad741b4615faa385b42bd4f0b3c 100644 (file)
@@ -97,7 +97,7 @@ typedef struct {
   vp9_prob mbskip_probs[MBSKIP_CONTEXTS];
 
 #if CONFIG_INTERINTRA
-  vp9_prob interintra_prob;
+  vp9_prob interintra_prob[BLOCK_SIZE_TYPES];
 #endif
 #if CONFIG_FILTERINTRA
   vp9_prob filterintra_prob[TX_SIZES][VP9_INTRA_MODES];
@@ -500,7 +500,7 @@ typedef struct VP9_COMP {
   unsigned int partition_count[NUM_PARTITION_CONTEXTS][PARTITION_TYPES];
 
 #if CONFIG_INTERINTRA
-  unsigned int interintra_count[2];
+  unsigned int interintra_count[BLOCK_SIZE_TYPES][2];
   unsigned int interintra_select_count[2];
 #endif
 #if CONFIG_MASKED_COMPOUND_INTER
index 0454163642ecc5bf7dcdafd5ec1a877be34cb9e3..690f94e4a2af3b005788ed2e4de723881bd0aecf 100644 (file)
@@ -107,7 +107,7 @@ void vp9_save_coding_context(VP9_COMP *cpi) {
   cc->tx_probs = cm->fc.tx_probs;
   vp9_copy(cc->mbskip_probs, cm->fc.mbskip_probs);
 #if CONFIG_INTERINTRA
-  cc->interintra_prob = cm->fc.interintra_prob;
+  vp9_copy(cc->interintra_prob, cm->fc.interintra_prob);
 #endif
 #if CONFIG_FILTERINTRA
   vp9_copy(cc->filterintra_prob, cm->fc.filterintra_prob);
@@ -155,7 +155,7 @@ void vp9_restore_coding_context(VP9_COMP *cpi) {
   cm->fc.tx_probs = cc->tx_probs;
   vp9_copy(cm->fc.mbskip_probs, cc->mbskip_probs);
 #if CONFIG_INTERINTRA
-  cm->fc.interintra_prob = cc->interintra_prob;
+  vp9_copy(cm->fc.interintra_prob, cc->interintra_prob);
 #endif
 #if CONFIG_FILTERINTRA
   vp9_copy(cm->fc.filterintra_prob, cc->filterintra_prob);
index a4a37cda75702f905596db81b9d8bf659d43e0ae..9f02162298d2f2bbb704a52547f6738951ded168 100644 (file)
@@ -3268,7 +3268,7 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
   }
 
   if (!is_comp_pred) {
-    *compmode_interintra_cost = vp9_cost_bit(cm->fc.interintra_prob,
+    *compmode_interintra_cost = vp9_cost_bit(cm->fc.interintra_prob[bsize],
                                              is_comp_interintra_pred);
     if (is_comp_interintra_pred) {
       *compmode_interintra_cost += x->mbmode_cost[mbmi->interintra_mode];