shithub: libvpx

Download patch

ref: 1f7d810a72a290f3c52e518a72e130d42e69f3e1
parent: 7a645e4e12a527c23ca4393218a874c9439e5287
parent: 1e6be7bc7575776a62ccf5e3a3dc098d0c172b77
author: Jingning Han <jingning@google.com>
date: Tue May 21 11:59:58 EDT 2013

Merge "Deprecate 4x4 intra modes from bit-stream" into experimental

--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -103,7 +103,6 @@
                          vp9_reader *r) {
   VP9_COMMON *const cm = &pbi->common;
   MACROBLOCKD *const xd = &pbi->mb;
-  const int mis = cm->mode_info_stride;
   m->mbmi.ref_frame = INTRA_FRAME;
 
   // Read segmentation map if it is being updated explicitly this frame
@@ -138,14 +137,18 @@
 #else
   if (m->mbmi.mode == I4X4_PRED) {
 #endif
-    int i;
-    for (i = 0; i < 4; ++i) {
-      const B_PREDICTION_MODE a = above_block_mode(m, i, mis);
-      const B_PREDICTION_MODE l = xd->left_available ||
-                                  (i & 1) ?
-                                  left_block_mode(m, i) : B_DC_PRED;
-      m->bmi[i].as_mode.first = read_kf_bmode(r, cm->kf_bmode_prob[a][l]);
-    }
+    int idx, idy;
+    int bw = 1 << b_width_log2(m->mbmi.sb_type);
+    int bh = 1 << b_height_log2(m->mbmi.sb_type);
+    // FIXME(jingning): fix intra4x4 rate-distortion optimization, then
+    // use bw and bh as the increment values.
+#if !CONFIG_AB4X4 || CONFIG_AB4X4
+    bw = 1, bh = 1;
+#endif
+    for (idy = 0; idy < 2; idy += bh)
+      for (idx = 0; idx < 2; idx += bw)
+        m->bmi[idy * 2 + idx].as_mode.first =
+            read_kf_sb_ymode(r, cm->sb_kf_ymode_prob[cm->kf_ymode_probs_index]);
   }
 
   m->mbmi.uv_mode = read_uv_mode(r, cm->kf_uv_mode_prob[m->mbmi.mode]);
@@ -854,12 +857,19 @@
 #else
     if (mbmi->mode == I4X4_PRED) {
 #endif
-      int j = 0;
-      do {
-        int m = read_bmode(r, cm->fc.bmode_prob);
-        mi->bmi[j].as_mode.first = m;
-        cm->fc.bmode_counts[m]++;
-      } while (++j < 4);
+      int idx, idy;
+      // FIXME(jingning): fix intra4x4 rate-distortion optimization, then
+      // use bw and bh as the increment values.
+#if !CONFIG_AB4X4 || CONFIG_AB4X4
+      bw = 1, bh = 1;
+#endif
+      for (idy = 0; idy < 2; idy += bh) {
+        for (idx = 0; idx < 2; idx += bw) {
+          int m = read_sb_ymode(r, cm->fc.sb_ymode_prob);
+          mi->bmi[idy * 2 + idx].as_mode.first = m;
+          cm->fc.sb_ymode_counts[m]++;
+        }
+      }
     }
 
     mbmi->uv_mode = read_uv_mode(r, cm->fc.uv_mode_prob[mbmi->mode]);
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -369,10 +369,11 @@
   write_token(bc, vp9_uv_mode_tree, p, vp9_uv_mode_encodings + m);
 }
 
-
+#if !CONFIG_AB4X4
 static void write_bmode(vp9_writer *bc, int m, const vp9_prob *p) {
   write_token(bc, vp9_bmode_tree, p, vp9_bmode_encodings + m);
 }
+#endif
 
 static void write_kf_bmode(vp9_writer *bc, int m, const vp9_prob *p) {
   write_token(bc, vp9_kf_bmode_tree, p, vp9_kf_bmode_encodings + m);
@@ -736,11 +737,18 @@
 #else
     if (mode == I4X4_PRED) {
 #endif
-      int j = 0;
-      do {
-        write_bmode(bc, m->bmi[j].as_mode.first,
-                    pc->fc.bmode_prob);
-      } while (++j < 4);
+      int idx, idy;
+      int bw = 1 << b_width_log2(mi->sb_type);
+      int bh = 1 << b_height_log2(mi->sb_type);
+      // FIXME(jingning): fix intra4x4 rate-distortion optimization, then
+      // use bw and bh as the increment values.
+#if !CONFIG_AB4X4 || CONFIG_AB4X4
+      bw = 1, bh = 1;
+#endif
+      for (idy = 0; idy < 2; idy += bh)
+        for (idx = 0; idx < 2; idx += bw)
+          write_sb_ymode(bc, m->bmi[idy * 2 + idx].as_mode.first,
+                         pc->fc.sb_ymode_prob);
     }
     write_uv_mode(bc, mi->uv_mode,
                   pc->fc.uv_mode_prob[mode]);
@@ -883,7 +891,6 @@
                               vp9_writer *bc, int mi_row, int mi_col) {
   const VP9_COMMON *const c = &cpi->common;
   const MACROBLOCKD *const xd = &cpi->mb.e_mbd;
-  const int mis = c->mode_info_stride;
   const int ym = m->mbmi.mode;
   const int segment_id = m->mbmi.segment_id;
   int skip_coeff;
@@ -913,19 +920,18 @@
 #else
   if (ym == I4X4_PRED) {
 #endif
-    int i = 0;
-    do {
-      const B_PREDICTION_MODE a = above_block_mode(m, i, mis);
-      const B_PREDICTION_MODE l = (xd->left_available ||
-                                  (i & 1)) ?
-                                  left_block_mode(m, i) : B_DC_PRED;
-      const int bm = m->bmi[i].as_mode.first;
-
-/*#ifdef ENTROPY_STATS
-      ++intra_mode_stats [A] [L] [bm];
-#endif*/
-      write_kf_bmode(bc, bm, c->kf_bmode_prob[a][l]);
-    } while (++i < 4);
+    int idx, idy;
+    int bw = 1 << b_width_log2(m->mbmi.sb_type);
+    int bh = 1 << b_height_log2(m->mbmi.sb_type);
+    // FIXME(jingning): fix intra4x4 rate-distortion optimization, then
+    // use bw and bh as the increment values.
+#if !CONFIG_AB4X4 || CONFIG_AB4X4
+    bw = 1, bh = 1;
+#endif
+    for (idy = 0; idy < 2; idy += bh)
+      for (idx = 0; idx < 2; idx += bw)
+        sb_kfwrite_ymode(bc, m->bmi[idy * 2 + idx].as_mode.first,
+                         c->sb_kf_ymode_prob[c->kf_ymode_probs_index]);
   }
 
   write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob[ym]);
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1614,11 +1614,20 @@
   }
     ++cpi->y_uv_mode_count[m][uvm];
   if (m == I4X4_PRED) {
-    int b = 0;
-    do {
-      int m = xd->mode_info_context->bmi[b].as_mode.first;
-      ++cpi->bmode_count[m];
-    } while (++b < 4);
+    int idx, idy;
+    int bw = 1 << b_width_log2(xd->mode_info_context->mbmi.sb_type);
+    int bh = 1 << b_height_log2(xd->mode_info_context->mbmi.sb_type);
+    // FIXME(jingning): fix intra4x4 rate-distortion optimization, then
+    // use bw and bh as the increment values.
+#if !CONFIG_AB4X4 || CONFIG_AB4X4
+    bw = 1, bh = 1;
+#endif
+    for (idy = 0; idy < 2; idy += bh) {
+      for (idx = 0; idx < 2; idx += bw) {
+        int m = xd->mode_info_context->bmi[idy * 2 + idx].as_mode.first;
+        ++cpi->sb_ymode_count[m];
+      }
+    }
   }
 }