shithub: libvpx

Download patch

ref: 1ea2ad1e8648e747b1352eb46622f5c453b42a6e
parent: bd49603be411c979cfa82238ced0c3eafa2b04f0
parent: fa589adc5fda876fc4ee04bebfc76c67abe3e05a
author: Adrian Grange <agrange@google.com>
date: Wed Apr 18 12:21:16 EDT 2012

Merge "Added save coding context & modified MV bounds" into experimental

--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -559,12 +559,12 @@
 
         // Set up limit values for MV components to prevent them from
         // extending beyond the UMV borders assuming 16x16 block size
-        x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
-        x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
-        x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
-                            + (VP8BORDERINPIXELS - 16);
-        x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
-                            + (VP8BORDERINPIXELS - 16);
+        x->mv_row_min = -((mb_row * 16) + VP8BORDERINPIXELS - INTERP_EXTEND);
+        x->mv_col_min = -((mb_col * 16) + VP8BORDERINPIXELS - INTERP_EXTEND);
+        x->mv_row_max = ((cm->mb_rows - mb_row) * 16 +
+                         (VP8BORDERINPIXELS - 16 - INTERP_EXTEND));
+        x->mv_col_max = ((cm->mb_cols - mb_col) * 16 +
+                         (VP8BORDERINPIXELS - 16 - INTERP_EXTEND));
 
         xd->up_available   = (mb_row != 0);
         xd->left_available = (mb_col != 0);
@@ -756,22 +756,22 @@
 
         // Set up limit values for MV components to prevent them from
         // extending beyond the UMV borders assuming 16x16 block size
-        x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
-        x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
-        x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
-                            + (VP8BORDERINPIXELS - 16);
-        x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
-                            + (VP8BORDERINPIXELS - 16);
+        x->mv_row_min = -((mb_row * 16) + VP8BORDERINPIXELS - INTERP_EXTEND);
+        x->mv_col_min = -((mb_col * 16) + VP8BORDERINPIXELS - INTERP_EXTEND);
+        x->mv_row_max = ((cm->mb_rows - mb_row) * 16 +
+                         (VP8BORDERINPIXELS - 16 - INTERP_EXTEND));
+        x->mv_col_max = ((cm->mb_cols - mb_col) * 16 +
+                         (VP8BORDERINPIXELS - 16 - INTERP_EXTEND));
 
 #if CONFIG_SUPERBLOCKS
         // Set up limit values for MV components to prevent them from
         // extending beyond the UMV borders assuming 32x32 block size
-        x->mv_row_min_sb = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
-        x->mv_row_max_sb = ((cm->mb_rows - 1 - mb_row) * 16)
-                            + (VP8BORDERINPIXELS - 32);
-        x->mv_col_min_sb = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
-        x->mv_col_max_sb = ((cm->mb_cols - 1 - mb_col) * 16)
-                            + (VP8BORDERINPIXELS - 32);
+        x->mv_row_min_sb = -((mb_row * 16) + VP8BORDERINPIXELS - INTERP_EXTEND);
+        x->mv_col_min_sb = -((mb_col * 16) + VP8BORDERINPIXELS - INTERP_EXTEND);
+        x->mv_row_max_sb = ((cm->mb_rows - mb_row) * 16 +
+                         (VP8BORDERINPIXELS - 32 - INTERP_EXTEND));
+        x->mv_col_max_sb = ((cm->mb_cols - mb_col) * 16 +
+                         (VP8BORDERINPIXELS - 32 - INTERP_EXTEND));
 #endif
 
         xd->up_available = (mb_row != 0);
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -2532,6 +2532,26 @@
     }
 }
 
+static void store_coding_context (MACROBLOCK *x, int mb_index,
+                                  int mode_index,
+                                  PARTITION_INFO *partition,
+                                  int_mv *ref_mv)
+{
+    MACROBLOCKD *xd = &x->e_mbd;
+
+    // Take a snapshot of the coding context so it can be
+    // restored if we decide to encode this way
+    x->mb_context[mb_index].best_mode_index = mode_index;
+    vpx_memcpy(&x->mb_context[mb_index].mic, xd->mode_info_context,
+               sizeof(MODE_INFO));
+    vpx_memcpy(&x->mb_context[mb_index].partition_info, partition,
+               sizeof(PARTITION_INFO));
+    x->mb_context[mb_index].best_ref_mv.as_int = ref_mv->as_int;
+
+    //x->mb_context[mb_index].rddiv = x->rddiv;
+    //x->mb_context[mb_index].rdmult = x->rdmult;
+}
+
 void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset,
                             int *returnrate, int *returndistortion, int *returnintra,
                             int *best_single_rd_diff, int *best_comp_rd_diff,
@@ -3536,6 +3556,8 @@
 
         *best_single_rd_diff = *best_comp_rd_diff = *best_hybrid_rd_diff = 0;
 
+        store_coding_context (x, mb_index, best_mode_index, &best_partition,
+                    &frame_best_ref_mv[xd->mode_info_context->mbmi.ref_frame] );
         return;
     }
 
@@ -3580,18 +3602,8 @@
     else
         *best_hybrid_rd_diff = best_rd - best_hybrid_rd;
 
-    // Take a snapshot of the coding context so it can be
-    // restored if we decide to encode this way
-    x->mb_context[mb_index].best_mode_index = best_mode_index;
-    vpx_memcpy(&x->mb_context[mb_index].mic, x->e_mbd.mode_info_context,
-               sizeof(MODE_INFO));
-    vpx_memcpy(&x->mb_context[mb_index].partition_info, &best_partition,
-               sizeof(PARTITION_INFO));
-    vpx_memcpy(&x->mb_context[mb_index].best_ref_mv,
-               &frame_best_ref_mv[xd->mode_info_context->mbmi.ref_frame],
-               sizeof(int_mv));
-    //x->mb_context[mb_index].rddiv = x->rddiv;
-    //x->mb_context[mb_index].rdmult = x->rdmult;
+    store_coding_context (x, mb_index, best_mode_index, &best_partition,
+                    &frame_best_ref_mv[xd->mode_info_context->mbmi.ref_frame] );
 }
 
 int vp8_rd_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x)