Merge "Clamp decoded feature data" into experimental
diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c
index 69acbab..0eb21ca 100644
--- a/vp9/common/vp9_entropymode.c
+++ b/vp9/common/vp9_entropymode.c
@@ -448,14 +448,6 @@
 
 void vp9_init_mode_contexts(VP9_COMMON *pc) {
   vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
-
-  vpx_memcpy(pc->fc.mode_context,
-             vp9_default_mode_contexts,
-             sizeof(pc->fc.mode_context));
-  vpx_memcpy(pc->fc.mode_context_a,
-             vp9_default_mode_contexts_a,
-             sizeof(pc->fc.mode_context_a));
-
 }
 
 void vp9_accum_mv_refs(VP9_COMMON *pc,
@@ -494,11 +486,8 @@
   int (*mv_ref_ct)[4][2];
   int (*mode_context)[4];
 
-  if (pc->refresh_alt_ref_frame) {
-    mode_context = pc->fc.mode_context_a;
-  } else {
-    mode_context = pc->fc.mode_context;
-  }
+  mode_context = pc->fc.vp9_mode_contexts;
+
   mv_ref_ct = pc->fc.mv_ref_ct;
 
   for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index 18750e7..4819833 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -119,8 +119,6 @@
   vp9_prob pre_interintra_prob;
 #endif
 
-  int mode_context[INTER_MODE_CONTEXTS][4];
-  int mode_context_a[INTER_MODE_CONTEXTS][4];
   int vp9_mode_contexts[INTER_MODE_CONTEXTS][4];
   int mv_ref_ct[INTER_MODE_CONTEXTS][4][2];
 } FRAME_CONTEXT;
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 8c237b1..2adbb90 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -505,6 +505,8 @@
         vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor,
                                *(b->base_dst) + b->dst, 16, b->dst_stride);
       }
+      xd->above_context->y2 = 1;
+      xd->left_context->y2 = 1;
     }
     if (!xd->mode_info_context->mbmi.mb_skip_coeff)
       vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
@@ -861,12 +863,17 @@
     pc->ref_frame_sign_bias[ALTREF_FRAME] = 0;
 
     vp9_init_mode_contexts(&pbi->common);
+    vpx_memcpy(pbi->common.fc.vp9_mode_contexts,
+               vp9_default_mode_contexts,
+               sizeof(vp9_default_mode_contexts));
+
     vpx_memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc));
     vpx_memcpy(&pc->lfc_a, &pc->fc, sizeof(pc->fc));
 
-    vpx_memcpy(pbi->common.fc.vp9_mode_contexts,
-               pbi->common.fc.mode_context,
-               sizeof(pbi->common.fc.mode_context));
+    vpx_memcpy(pbi->common.lfc.vp9_mode_contexts,
+               vp9_default_mode_contexts_a,
+               sizeof(vp9_default_mode_contexts_a));
+
     vpx_memset(pc->prev_mip, 0,
                (pc->mb_cols + 1) * (pc->mb_rows + 1)* sizeof(MODE_INFO));
     vpx_memset(pc->mip, 0,
@@ -1251,14 +1258,8 @@
 
     if (pc->refresh_alt_ref_frame) {
       vpx_memcpy(&pc->fc, &pc->lfc_a, sizeof(pc->fc));
-      vpx_memcpy(pc->fc.vp9_mode_contexts,
-                 pc->fc.mode_context_a,
-                 sizeof(pc->fc.vp9_mode_contexts));
     } else {
       vpx_memcpy(&pc->fc, &pc->lfc, sizeof(pc->fc));
-      vpx_memcpy(pc->fc.vp9_mode_contexts,
-                 pc->fc.mode_context,
-                 sizeof(pc->fc.vp9_mode_contexts));
     }
 
     /* Buffer to buffer copy flags. */
diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c
index 8c469c4..c55e362 100644
--- a/vp9/decoder/vp9_detokenize.c
+++ b/vp9/decoder/vp9_detokenize.c
@@ -70,6 +70,8 @@
   } else {
     vpx_memset(xd->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
     vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
   }
 }
 
@@ -321,6 +323,8 @@
     eobtotal += c - 4;
     type = PLANE_TYPE_Y_NO_DC;
   } else {
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
     type = PLANE_TYPE_Y_WITH_DC;
   }
 
@@ -431,6 +435,8 @@
     eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
     type = PLANE_TYPE_Y_NO_DC;
   } else {
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
     type = PLANE_TYPE_Y_WITH_DC;
   }
 
diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c
index ec9f14e..4bf3910 100644
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -3748,7 +3748,6 @@
                       cpi->NMVcount.joints[2], cpi->NMVcount.joints[3]);
                       */
     vp9_adapt_nmv_probs(&cpi->common, cpi->mb.e_mbd.allow_high_precision_mv);
-    vp9_update_mode_context(&cpi->common);
   }
 #if CONFIG_COMP_INTERINTRA_PRED
   if (cm->frame_type != KEY_FRAME)
diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h
index 8cb77c3..b01cf21 100644
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -127,8 +127,7 @@
 #endif
 
   int mv_ref_ct[INTER_MODE_CONTEXTS][4][2];
-  int mode_context[INTER_MODE_CONTEXTS][4];
-  int mode_context_a[INTER_MODE_CONTEXTS][4];
+  int vp9_mode_contexts[INTER_MODE_CONTEXTS][4];
 
 } CODING_CONTEXT;
 
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index ab9dc71..0ceb4f6 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -17,6 +17,7 @@
 
 #include "math.h"
 #include "vp9/common/vp9_alloccommon.h"
+#include "vp9/common/vp9_modecont.h"
 #include "vp9/common/vp9_common.h"
 #include "vp9_ratectrl.h"
 #include "vp9/common/vp9_entropymode.h"
@@ -135,8 +136,7 @@
   vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
   vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
 
-  vp9_copy(cc->mode_context, cm->fc.mode_context);
-  vp9_copy(cc->mode_context_a, cm->fc.mode_context_a);
+  vp9_copy(cc->vp9_mode_contexts, cm->fc.vp9_mode_contexts);
 
   vp9_copy(cc->ymode_prob, cm->fc.ymode_prob);
 #if CONFIG_SUPERBLOCKS
@@ -194,8 +194,7 @@
   vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
   vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
 
-  vp9_copy(cm->fc.mode_context, cc->mode_context);
-  vp9_copy(cm->fc.mode_context_a, cc->mode_context_a);
+  vp9_copy(cm->fc.vp9_mode_contexts, cc->vp9_mode_contexts);
 
   vp9_copy(cm->fc.ymode_prob, cc->ymode_prob);
 #if CONFIG_SUPERBLOCKS
@@ -262,9 +261,16 @@
   cpi->common.refresh_alt_ref_frame = TRUE;
 
   vp9_init_mode_contexts(&cpi->common);
+  vpx_memcpy(cpi->common.fc.vp9_mode_contexts,
+             vp9_default_mode_contexts,
+             sizeof(vp9_default_mode_contexts));
   vpx_memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc));
   vpx_memcpy(&cpi->common.lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
 
+  vpx_memcpy(cpi->common.lfc.vp9_mode_contexts,
+             vp9_default_mode_contexts_a,
+             sizeof(vp9_default_mode_contexts_a));
+
   vpx_memset(cm->prev_mip, 0,
     (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
   vpx_memset(cm->mip, 0,
@@ -279,16 +285,10 @@
     vpx_memcpy(&cpi->common.fc,
                &cpi->common.lfc_a,
                sizeof(cpi->common.fc));
-    vpx_memcpy(cpi->common.fc.vp9_mode_contexts,
-               cpi->common.fc.mode_context_a,
-               sizeof(cpi->common.fc.vp9_mode_contexts));
   } else {
     vpx_memcpy(&cpi->common.fc,
                &cpi->common.lfc,
                sizeof(cpi->common.fc));
-    vpx_memcpy(cpi->common.fc.vp9_mode_contexts,
-               cpi->common.fc.mode_context,
-               sizeof(cpi->common.fc.vp9_mode_contexts));
   }
 }
 
diff --git a/vp9/encoder/vp9_tokenize.c b/vp9/encoder/vp9_tokenize.c
index c080408..1713cdb 100644
--- a/vp9/encoder/vp9_tokenize.c
+++ b/vp9/encoder/vp9_tokenize.c
@@ -358,8 +358,11 @@
     }
 
     plane_type = PLANE_TYPE_Y_NO_DC;
-  } else
+  } else {
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
     plane_type = PLANE_TYPE_Y_WITH_DC;
+  }
 
   if (tx_size == TX_16X16) {
     tokenize_b(cpi, xd, xd->block, t, PLANE_TYPE_Y_WITH_DC,
@@ -743,6 +746,8 @@
             TX_8X8, dry_run);
     plane_type = PLANE_TYPE_Y_NO_DC;
   } else {
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
     plane_type = PLANE_TYPE_Y_WITH_DC;
   }
 
@@ -796,6 +801,8 @@
             L + vp9_block2left[24], TX_4X4, dry_run);
     plane_type = PLANE_TYPE_Y_NO_DC;
   } else {
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
     plane_type = PLANE_TYPE_Y_WITH_DC;
   }
 
@@ -825,6 +832,8 @@
   for (b = 16; b < 24; b++)
     stuff_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, A + vp9_block2above[b],
             L + vp9_block2left[b], TX_4X4, dry_run);
+  xd->above_context->y2 = 1;
+  xd->left_context->y2 = 1;
 }
 
 void vp9_stuff_mb(VP9_COMP *cpi, MACROBLOCKD *xd, TOKENEXTRA **t, int dry_run) {
@@ -861,5 +870,7 @@
   } else {
     vpx_memset(xd->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
     vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
+    xd->above_context->y2 = 1;
+    xd->left_context->y2 = 1;
   }
 }