Merge "remove postproc invokes" into experimental
diff --git a/build/make/Makefile b/build/make/Makefile
index b5d0d52..92113cc 100644
--- a/build/make/Makefile
+++ b/build/make/Makefile
@@ -103,60 +103,55 @@
 .PHONY: testdata
 testdata::
 
-xform_obj_prefix:=.objs/$(TOOLCHAIN)/
-xform_obj_path=$(if $(1),$(addprefix $(xform_obj_prefix),$(subst /,_,$(1))),$(xform_obj_prefix))
-xform_obj_path_o_d=$(call xform_obj_path,$(1)).o $(call xform_obj_path,$(1)).d
-define obj_rules_template
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.c.d: $(1)%.c
-	$(if $(quiet),@echo "    [DEP] $$@")
-	$(qexec)mkdir -p $$(dir $$@)
-	$(qexec)$(CC) $$(INTERNAL_CFLAGS) $$(CFLAGS) -M $$< | $(fmt_deps) > $$@
+$(BUILD_PFX)%.c.d: %.c
+	$(if $(quiet),@echo "    [DEP] $@")
+	$(qexec)mkdir -p $(dir $@)
+	$(qexec)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) -M $< | $(fmt_deps) > $@
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.c.o: $(1)%.c
-	$(if $(quiet),@echo "    [CC] $$@")
-	$(qexec)$(CC) $$(INTERNAL_CFLAGS) $$(CFLAGS) -c -o $$@ $$<
+$(BUILD_PFX)%.c.o: %.c
+	$(if $(quiet),@echo "    [CC] $@")
+	$(qexec)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) -c -o $@ $<
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.cc.d: $(1)%.cc
-	$(if $(quiet),@echo "    [DEP] $$@")
-	$(qexec)mkdir -p $$(dir $$@)
-	$(qexec)$(CXX) $$(INTERNAL_CFLAGS) $$(CXXFLAGS) -M $$< | $(fmt_deps) > $$@
+$(BUILD_PFX)%.cc.d: %.cc
+	$(if $(quiet),@echo "    [DEP] $@")
+	$(qexec)mkdir -p $(dir $@)
+	$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -M $< | $(fmt_deps) > $@
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.cc.o: $(1)%.cc
-	$(if $(quiet),@echo "    [CXX] $$@")
-	$(qexec)$(CXX) $$(INTERNAL_CFLAGS) $$(CXXFLAGS) -c -o $$@ $$<
+$(BUILD_PFX)%.cc.o: %.cc
+	$(if $(quiet),@echo "    [CXX] $@")
+	$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -c -o $@ $<
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.asm.d: $(1)%.asm
-	$(if $(quiet),@echo "    [DEP] $$@")
-	$(qexec)mkdir -p $$(dir $$@)
+$(BUILD_PFX)%.asm.d: %.asm
+	$(if $(quiet),@echo "    [DEP] $@")
+	$(qexec)mkdir -p $(dir $@)
 	$(qexec)$(SRC_PATH_BARE)/build/make/gen_asm_deps.sh \
-            --build-pfx=$(BUILD_PFX) --depfile=$$@ $$(ASFLAGS) $$< > $$@
+            --build-pfx=$(BUILD_PFX) --depfile=$@ $(ASFLAGS) $< > $@
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.asm.o: $(1)%.asm
-	$(if $(quiet),@echo "    [AS] $$@")
-	$(qexec)$(AS) $$(ASFLAGS) -o $$@ $$<
+$(BUILD_PFX)%.asm.o: %.asm
+	$(if $(quiet),@echo "    [AS] $@")
+	$(qexec)$(AS) $(ASFLAGS) -o $@ $<
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.s.d: $(1)%.s
-	$(if $(quiet),@echo "    [DEP] $$@")
-	$(qexec)mkdir -p $$(dir $$@)
+$(BUILD_PFX)%.s.d: %.s
+	$(if $(quiet),@echo "    [DEP] $@")
+	$(qexec)mkdir -p $(dir $@)
 	$(qexec)$(SRC_PATH_BARE)/build/make/gen_asm_deps.sh \
-            --build-pfx=$(BUILD_PFX) --depfile=$$@ $$(ASFLAGS) $$< > $$@
+            --build-pfx=$(BUILD_PFX) --depfile=$@ $(ASFLAGS) $< > $@
 
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.s.o: $(1)%.s
-	$(if $(quiet),@echo "    [AS] $$@")
-	$(qexec)$(AS) $$(ASFLAGS) -o $$@ $$<
+$(BUILD_PFX)%.s.o: %.s
+	$(if $(quiet),@echo "    [AS] $@")
+	$(qexec)$(AS) $(ASFLAGS) -o $@ $<
 
 .PRECIOUS: %.c.S
 %.c.S: CFLAGS += -DINLINE_ASM
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.c.S: $(1)%.c
-	$(if $(quiet),@echo "    [GEN] $$@")
-	$(qexec)$(CC) -S $$(CFLAGS) -o $$@ $$<
+$(BUILD_PFX)%.c.S: %.c
+	$(if $(quiet),@echo "    [GEN] $@")
+	$(qexec)$(CC) -S $(CFLAGS) -o $@ $<
 
 .PRECIOUS: %.asm.s
-$(BUILD_PFX)$(call xform_obj_path,$(1))%.asm.s: $(1)%.asm
-	$(if $(quiet),@echo "    [ASM CONVERSION] $$@")
-	$(qexec)mkdir -p $$(dir $$@)
-	$(qexec)$(ASM_CONVERSION) <$$< >$$@
-endef
+$(BUILD_PFX)%.asm.s: %.asm
+	$(if $(quiet),@echo "    [ASM CONVERSION] $@")
+	$(qexec)mkdir -p $(dir $@)
+	$(qexec)$(ASM_CONVERSION) <$< >$@
 
 # If we're in debug mode, pretend we don't have GNU strip, to fall back to
 # the copy implementation
@@ -198,7 +193,7 @@
 find_file1=$(word 1,$(wildcard $(subst //,/,$(addsuffix /$(1),$(2)))))
 find_file=$(foreach f,$(1),$(call find_file1,$(strip $(f)),$(strip $(2))) )
 obj_pats=.c=.c.o $(AS_SFX)=$(AS_SFX).o .cc=.cc.o
-objs=$(addprefix $(BUILD_PFX),$(call xform_obj_path,$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) )))
+objs=$(addprefix $(BUILD_PFX),$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) ))
 
 install_map_templates=$(eval $(call install_map_template,$(1),$(2)))
 
@@ -306,10 +301,6 @@
 #
 # Configuration dependent rules
 #
-SRC_DIRS:=$(patsubst %/,%,$(sort $(dir $(SRCS))))
-$(foreach d,$(SRC_DIRS), $(eval $(call obj_rules_template,$(d)/)))
-$(eval $(call obj_rules_template)) # for ./
-
 $(call pairmap,install_map_templates,$(INSTALL_MAPS))
 
 DOCS=$(call cond_enabled,CONFIG_INSTALL_DOCS,DOCS)
diff --git a/examples.mk b/examples.mk
index e799a2b..f1cc42b 100644
--- a/examples.mk
+++ b/examples.mk
@@ -288,6 +288,3 @@
 DOCS-yes += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox)
 examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox)
 	@echo "INPUT += $^" > $@
-
-## Update the global src list
-SRCS += $(ALL_SRCS)
diff --git a/libs.mk b/libs.mk
index 64a636d..58151a6 100644
--- a/libs.mk
+++ b/libs.mk
@@ -24,20 +24,20 @@
 ifeq ($(filter icc gcc,$(TGT_CC)), $(TGT_CC))
 OFFSET_PATTERN:='^[a-zA-Z0-9_]* EQU'
 define asm_offsets_template
-$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(call xform_obj_path,$(2)).S
+$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(2).S
 	@echo "    [CREATE] $$@"
 	$$(qexec)LC_ALL=C grep $$(OFFSET_PATTERN) $$< | tr -d '$$$$\#' $$(ADS2GAS) > $$@
-$$(BUILD_PFX)$(call xform_obj_path,$(2)).S: $(2)
-CLEAN-OBJS += $$(BUILD_PFX)$(1) $(call xform_obj_path,$(2)).S
+$$(BUILD_PFX)$(2).S: $(2)
+CLEAN-OBJS += $$(BUILD_PFX)$(1) $(2).S
 endef
 else
   ifeq ($(filter rvct,$(TGT_CC)), $(TGT_CC))
 define asm_offsets_template
 $$(BUILD_PFX)$(1): obj_int_extract
-$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(call xform_obj_path,$(2)).o
+$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(2).o
 	@echo "    [CREATE] $$@"
 	$$(qexec)./obj_int_extract rvds $$< $$(ADS2GAS) > $$@
-OBJS-yes += $$(BUILD_PFX)$(call xform_obj_path,$(2)).o
+OBJS-yes += $$(BUILD_PFX)$(2).o
 CLEAN-OBJS += $$(BUILD_PFX)$(1)
 $$(filter %$$(ASM).o,$$(OBJS-yes)): $$(BUILD_PFX)$(1)
 endef
@@ -389,9 +389,6 @@
 
 include $(SRC_PATH_BARE)/test/test.mk
 LIBVPX_TEST_SRCS=$(addprefix test/,$(call enabled,LIBVPX_TEST_SRCS))
-ifeq ($(CONFIG_VP8_DECODER),yes)
-LIBVPX_TEST_SRCS += md5_utils.h md5_utils.c
-endif
 LIBVPX_TEST_BINS=./test_libvpx
 LIBVPX_TEST_DATA=$(addprefix $(LIBVPX_TEST_DATA_PATH)/,\
                      $(call enabled,LIBVPX_TEST_DATA))
diff --git a/test/test.mk b/test/test.mk
index bc1eea7..4fb464e 100644
--- a/test/test.mk
+++ b/test/test.mk
@@ -21,6 +21,7 @@
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += keyframe_test.cc
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += resize_test.cc
 
+LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += ../md5_utils.h ../md5_utils.c
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += decode_test_driver.cc
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += decode_test_driver.h
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += ivf_video_source.h
diff --git a/vp8/vp8cx.mk b/vp8/vp8cx.mk
index 6d09921..4ff3ef2 100644
--- a/vp8/vp8cx.mk
+++ b/vp8/vp8cx.mk
@@ -101,7 +101,7 @@
 ifeq ($(CONFIG_TEMPORAL_DENOISING),yes)
 VP8_CX_SRCS-$(HAVE_SSE2) += encoder/x86/denoising_sse2.c
 ifeq ($(HAVE_SSE2),yes)
-$(call xform_obj_path_o_d,vp8/encoder/x86/denoising_sse2.c): CFLAGS += -msse2
+vp8/encoder/x86/denoising_sse2.c.o: CFLAGS += -msse2
 endif
 endif
 
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 2e0dcc0..bef4b41 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/common/vp9_seg_common.c b/vp9/common/vp9_seg_common.c
index 6ac27e3..46a6ee4 100644
--- a/vp9/common/vp9_seg_common.c
+++ b/vp9/common/vp9_seg_common.c
@@ -8,11 +8,13 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include <assert.h>
+#include "vp9/common/vp9_blockd.h"
 #include "vp9/common/vp9_seg_common.h"
 
 static const int segfeaturedata_signed[SEG_LVL_MAX] = { 1, 1, 0, 0, 0, 0 };
-static const int seg_feature_data_bits[SEG_LVL_MAX] =
-                 { QINDEX_BITS, 6, 4, 5, 8, 2 };
+static const int seg_feature_data_max[SEG_LVL_MAX] =
+                 { MAXQ, 63, 0xf, MB_MODE_COUNT - 1, 255, TX_SIZE_MAX - 1};
 
 // These functions provide access to new segment level features.
 // Eventually these function may be "optimized out" but for the moment,
@@ -45,8 +47,8 @@
   xd->segment_feature_mask[segment_id] &= ~(1 << feature_id);
 }
 
-int vp9_seg_feature_data_bits(SEG_LVL_FEATURES feature_id) {
-  return seg_feature_data_bits[feature_id];
+int vp9_seg_feature_data_max(SEG_LVL_FEATURES feature_id) {
+  return seg_feature_data_max[feature_id];
 }
 
 int vp9_is_segfeature_signed(SEG_LVL_FEATURES feature_id) {
@@ -63,6 +65,12 @@
                      int segment_id,
                      SEG_LVL_FEATURES feature_id,
                      int seg_data) {
+  assert(seg_data <= seg_feature_data_max[feature_id]);
+  if (seg_data < 0) {
+    assert(segfeaturedata_signed[feature_id]);
+    assert(-seg_data <= seg_feature_data_max[feature_id]);
+  }
+
   xd->segment_feature_data[segment_id][feature_id] = seg_data;
 }
 
diff --git a/vp9/common/vp9_seg_common.h b/vp9/common/vp9_seg_common.h
index fb0570c..20959a7 100644
--- a/vp9/common/vp9_seg_common.h
+++ b/vp9/common/vp9_seg_common.h
@@ -29,7 +29,7 @@
                             int segment_id,
                             SEG_LVL_FEATURES feature_id);
 
-int vp9_seg_feature_data_bits(SEG_LVL_FEATURES feature_id);
+int vp9_seg_feature_data_max(SEG_LVL_FEATURES feature_id);
 
 int vp9_is_segfeature_signed(SEG_LVL_FEATURES feature_id);
 
diff --git a/vp9/decoder/vp9_dboolhuff.c b/vp9/decoder/vp9_dboolhuff.c
index dc3878e..885ec0d 100644
--- a/vp9/decoder/vp9_dboolhuff.c
+++ b/vp9/decoder/vp9_dboolhuff.c
@@ -98,3 +98,15 @@
   }
   return word;
 }
+
+int vp9_decode_unsigned_max(BOOL_DECODER *br, int max) {
+  int data = 0, bit = 0, lmax = max;
+
+  while (lmax) {
+    data |= decode_bool(br, 128) << bit++;
+    lmax >>= 1;
+  }
+  if (data > max)
+    return max;
+  return data;
+}
diff --git a/vp9/decoder/vp9_dboolhuff.h b/vp9/decoder/vp9_dboolhuff.h
index d46d81b..6529170 100644
--- a/vp9/decoder/vp9_dboolhuff.h
+++ b/vp9/decoder/vp9_dboolhuff.h
@@ -150,4 +150,6 @@
   return 0;
 }
 
+extern int vp9_decode_unsigned_max(BOOL_DECODER *br, int max);
+
 #endif
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index c083323..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,
@@ -1134,13 +1141,13 @@
             // Update the feature data and mask
             vp9_enable_segfeature(xd, i, j);
 
-            data = (signed char)vp9_read_literal(
-                     &header_bc, vp9_seg_feature_data_bits(j));
+            data = vp9_decode_unsigned_max(&header_bc,
+                                           vp9_seg_feature_data_max(j));
 
             // Is the segment data signed..
             if (vp9_is_segfeature_signed(j)) {
               if (vp9_read_bit(&header_bc))
-                data = - data;
+                data = -data;
             }
           } else
             data = 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_bitstream.c b/vp9/encoder/vp9_bitstream.c
index ae8a7c6..73c1167 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -1911,19 +1911,19 @@
               // Encode the relevant feature data
               if (Data < 0) {
                 Data = - Data;
-                vp9_write_literal(&header_bc, Data,
-                                  vp9_seg_feature_data_bits(j));
+                vp9_encode_unsigned_max(&header_bc, Data,
+                                        vp9_seg_feature_data_max(j));
                 vp9_write_bit(&header_bc, 1);
               } else {
-                vp9_write_literal(&header_bc, Data,
-                                  vp9_seg_feature_data_bits(j));
+                vp9_encode_unsigned_max(&header_bc, Data,
+                                        vp9_seg_feature_data_max(j));
                 vp9_write_bit(&header_bc, 0);
               }
             }
             // Unsigned data element so no sign bit needed
             else
-              vp9_write_literal(&header_bc, Data,
-                                vp9_seg_feature_data_bits(j));
+              vp9_encode_unsigned_max(&header_bc, Data,
+                                      vp9_seg_feature_data_max(j));
           } else
             vp9_write_bit(&header_bc, 0);
         }
diff --git a/vp9/encoder/vp9_boolhuff.c b/vp9/encoder/vp9_boolhuff.c
index 7619dfa..2689ab6 100644
--- a/vp9/encoder/vp9_boolhuff.c
+++ b/vp9/encoder/vp9_boolhuff.c
@@ -8,7 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-
+#include <assert.h>
 #include "vp9_boolhuff.h"
 
 #if defined(SECTIONBITS_OUTPUT)
@@ -64,6 +64,15 @@
     encode_bool(br, (1 & (data >> bit)), 0x80);
 }
 
+void vp9_encode_unsigned_max(BOOL_CODER *br, int data, int max) {
+  assert(data <= max);
+  while (max) {
+    encode_bool(br, data & 1, 128);
+    data >>= 1;
+    max >>= 1;
+  }
+}
+
 int vp9_recenter_nonneg(int v, int m) {
   if (v > (m << 1)) return v;
   else if (v >= m) return ((v - m) << 1);
diff --git a/vp9/encoder/vp9_boolhuff.h b/vp9/encoder/vp9_boolhuff.h
index 2fad86b..1958a41 100644
--- a/vp9/encoder/vp9_boolhuff.h
+++ b/vp9/encoder/vp9_boolhuff.h
@@ -37,6 +37,7 @@
 extern void vp9_start_encode(BOOL_CODER *bc, unsigned char *buffer);
 
 extern void vp9_encode_value(BOOL_CODER *br, int data, int bits);
+extern void vp9_encode_unsigned_max(BOOL_CODER *br, int data, int max);
 extern void vp9_stop_encode(BOOL_CODER *bc);
 extern const unsigned int vp9_prob_cost[256];
 
diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c
index 3766dd1..31fc126 100644
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -3747,7 +3747,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 4c4c226..79b35b4 100644
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -126,8 +126,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;
   }
 }
diff --git a/vp9/vp9_common.mk b/vp9/vp9_common.mk
index 0868be7..7b241ad 100644
--- a/vp9/vp9_common.mk
+++ b/vp9/vp9_common.mk
@@ -114,15 +114,15 @@
 
 VP9_COMMON_SRCS-$(HAVE_SSE4_1) += common/x86/vp9_filter_sse4.c
 ifeq ($(HAVE_SSE4_1),yes)
-$(call xform_obj_path_o_d,vp9/common/x86/vp9_filter_sse4.c): CFLAGS += -msse4
+vp9/common/x86/vp9_filter_sse4.c.o: CFLAGS += -msse4
 endif
 
 VP9_COMMON_SRCS-$(HAVE_SSE2) += common/x86/vp9_filter_sse2.c
 VP9_COMMON_SRCS-$(HAVE_SSE2) += common/x86/vp9_sadmxn_x86.c
 ifeq ($(HAVE_SSE2),yes)
-$(call xform_obj_path_o_d,vp9/common/x86/vp9_filter_sse2.c): CFLAGS += -msse2
-$(call xform_obj_path_o_d,vp9/common/x86/vp9_loopfilter_x86.c): CFLAGS += -msse2
-$(call xform_obj_path_o_d,vp9/common/x86/vp9_sadmxn_x86.c): CFLAGS += -msse2
+vp9/common/x86/vp9_filter_sse2.c.o: CFLAGS += -msse2
+vp9/common/x86/vp9_loopfilter_x86.c.o: CFLAGS += -msse2
+vp9/common/x86/vp9_sadmxn_x86.c.o: CFLAGS += -msse2
 endif
 
 VP9_COMMON_SRCS-$(ARCH_ARM)  += common/arm/vp9_arm_systemdependent.c