shithub: libvpx

Download patch

ref: 6058c9ce0cd8305b13a4766370c67059f789b816
parent: 2c3c54f7475021e2fbc62998b042e54efa9f142c
parent: e83d36c053199693eadac5774b47d17416cb8954
author: John Koleszar <jkoleszar@google.com>
date: Fri Jul 8 20:05:09 EDT 2011

Merge remote branch 'origin/master' into experimental

Change-Id: Ica63d16cb39e2d65a3414f0b9f86c8a64112dfa3

--- a/vp8/common/arm/arm_systemdependent.c
+++ b/vp8/common/arm/arm_systemdependent.c
@@ -24,14 +24,17 @@
 #if CONFIG_RUNTIME_CPU_DETECT
     VP8_COMMON_RTCD *rtcd = &ctx->rtcd;
     int flags = arm_cpu_caps();
-    int has_edsp = flags & HAS_EDSP;
-    int has_media = flags & HAS_MEDIA;
-    int has_neon = flags & HAS_NEON;
     rtcd->flags = flags;
 
     /* Override default functions with fastest ones for this CPU. */
+#if HAVE_ARMV5TE
+    if (flags & HAS_EDSP)
+    {
+    }
+#endif
+
 #if HAVE_ARMV6
-    if (has_media)
+    if (flags & HAS_MEDIA)
     {
         rtcd->subpix.sixtap16x16   = vp8_sixtap_predict16x16_armv6;
         rtcd->subpix.sixtap8x8     = vp8_sixtap_predict8x8_armv6;
@@ -66,7 +69,7 @@
 #endif
 
 #if HAVE_ARMV7
-    if (has_neon)
+    if (flags & HAS_NEON)
     {
         rtcd->subpix.sixtap16x16   = vp8_sixtap_predict16x16_neon;
         rtcd->subpix.sixtap8x8     = vp8_sixtap_predict8x8_neon;
--- a/vp8/decoder/arm/arm_dsystemdependent.c
+++ b/vp8/decoder/arm/arm_dsystemdependent.c
@@ -21,12 +21,15 @@
 {
 #if CONFIG_RUNTIME_CPU_DETECT
     int flags = pbi->common.rtcd.flags;
-    int has_edsp = flags & HAS_EDSP;
-    int has_media = flags & HAS_MEDIA;
-    int has_neon = flags & HAS_NEON;
 
+#if HAVE_ARMV5TE
+    if (flags & HAS_EDSP)
+    {
+    }
+#endif
+
 #if HAVE_ARMV6
-    if (has_media)
+    if (flags & HAS_MEDIA)
     {
         pbi->dequant.block               = vp8_dequantize_b_v6;
         pbi->dequant.idct_add            = vp8_dequant_idct_add_v6;
@@ -38,7 +41,7 @@
 #endif
 
 #if HAVE_ARMV7
-    if (has_neon)
+    if (flags & HAS_NEON)
     {
         pbi->dequant.block               = vp8_dequantize_b_neon;
         pbi->dequant.idct_add            = vp8_dequant_idct_add_neon;
--- a/vp8/encoder/arm/arm_csystemdependent.c
+++ b/vp8/encoder/arm/arm_csystemdependent.c
@@ -22,12 +22,15 @@
 {
 #if CONFIG_RUNTIME_CPU_DETECT
     int flags = cpi->common.rtcd.flags;
-    int has_edsp = flags & HAS_EDSP;
-    int has_media = flags & HAS_MEDIA;
-    int has_neon = flags & HAS_NEON;
 
+#if HAVE_ARMV5TE
+    if (flags & HAS_EDSP)
+    {
+    }
+#endif
+
 #if HAVE_ARMV6
-    if (has_media)
+    if (flags & HAS_MEDIA)
     {
         cpi->rtcd.variance.sad16x16              = vp8_sad16x16_armv6;
         /*cpi->rtcd.variance.sad16x8               = vp8_sad16x8_c;
@@ -74,7 +77,7 @@
 #endif
 
 #if HAVE_ARMV7
-    if (has_neon)
+    if (flags & HAS_NEON)
     {
         cpi->rtcd.variance.sad16x16              = vp8_sad16x16_neon;
         cpi->rtcd.variance.sad16x8               = vp8_sad16x8_neon;
@@ -124,7 +127,7 @@
 
 #if HAVE_ARMV7
 #if CONFIG_RUNTIME_CPU_DETECT
-    if (has_neon)
+    if (flags & HAS_NEON)
 #endif
     {
         vp8_yv12_copy_partial_frame_ptr = vpxyv12_copy_partial_frame_neon;
--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -431,6 +431,7 @@
     int num00;
 
     int_mv tmp_mv;
+    int_mv ref_mv_full;
 
     int tmp_err;
     int step_param = 3;                                       //3;          // Dont search over full range for first pass
@@ -447,7 +448,9 @@
 
     // Initial step/diamond search centred on best mv
     tmp_mv.as_int = 0;
-    tmp_err = cpi->diamond_search_sad(x, b, d, ref_mv, &tmp_mv, step_param,
+    ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3;
+    ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3;
+    tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param,
                                       x->sadperbit16, &num00, &v_fn_ptr,
                                       x->mvcost, ref_mv);
     if ( tmp_err < INT_MAX-new_mv_mode_penalty )
@@ -472,7 +475,7 @@
             num00--;
         else
         {
-            tmp_err = cpi->diamond_search_sad(x, b, d, ref_mv, &tmp_mv,
+            tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv,
                                               step_param + n, x->sadperbit16,
                                               &num00, &v_fn_ptr, x->mvcost,
                                               ref_mv);
--- a/vp8/encoder/mcomp.c
+++ b/vp8/encoder/mcomp.c
@@ -834,7 +834,7 @@
     unsigned char *what = (*(b->base_src) + b->src);
     int what_stride = b->src_stride;
     int in_what_stride = d->pre_stride;
-    int br = ref_mv->as_mv.row >> 3, bc = ref_mv->as_mv.col >> 3;
+    int br = ref_mv->as_mv.row, bc = ref_mv->as_mv.col;
     int_mv this_mv;
     unsigned int bestsad = 0x7fffffff;
     unsigned int thissad;
@@ -1011,8 +1011,8 @@
     int best_site = 0;
     int last_site = 0;
 
-    int ref_row = ref_mv->as_mv.row >> 3;
-    int ref_col = ref_mv->as_mv.col >> 3;
+    int ref_row = ref_mv->as_mv.row;
+    int ref_col = ref_mv->as_mv.col;
     int this_row_offset;
     int this_col_offset;
     search_site *ss;
@@ -1130,8 +1130,8 @@
     int best_site = 0;
     int last_site = 0;
 
-    int ref_row = ref_mv->as_mv.row >> 3;
-    int ref_col = ref_mv->as_mv.col >> 3;
+    int ref_row = ref_mv->as_mv.row;
+    int ref_col = ref_mv->as_mv.col;
     int this_row_offset;
     int this_col_offset;
     search_site *ss;
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -585,13 +585,6 @@
 
             vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
                         x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
-
-            /* adjust mvp to make sure it is within MV range */
-            vp8_clamp_mv(&mvp,
-                         best_ref_mv.as_mv.col - (MAX_FULL_PEL_VAL<<3),
-                         best_ref_mv.as_mv.col + (MAX_FULL_PEL_VAL<<3),
-                         best_ref_mv.as_mv.row - (MAX_FULL_PEL_VAL<<3),
-                         best_ref_mv.as_mv.row + (MAX_FULL_PEL_VAL<<3));
         }
 
         switch (this_mode)
@@ -654,11 +647,12 @@
             int further_steps;
             int n = 0;
             int sadpb = x->sadperbit16;
+            int_mv mvp_full;
 
-            int col_min;
-            int col_max;
-            int row_min;
-            int row_max;
+            int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.col & 7)?1:0);
+            int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.row & 7)?1:0);
+            int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL;
+            int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL;
 
             int tmp_col_min = x->mv_col_min;
             int tmp_col_max = x->mv_col_max;
@@ -676,20 +670,19 @@
                 //adjust search range according to sr from mv prediction
                 if(sr > step_param)
                     step_param = sr;
+
+                mvp_full.as_mv.col = mvp.as_mv.col>>3;
+                mvp_full.as_mv.row = mvp.as_mv.row>>3;
+
+                /* adjust mvp to make sure it is within MV range */
+                vp8_clamp_mv(&mvp_full, col_min, col_max, row_min, row_max);
             }else
             {
                 mvp.as_int = best_ref_mv.as_int;
+                mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3;
+                mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3;
             }
 
-            col_min = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) - MAX_FULL_PEL_VAL)
-                                                 :((best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL);
-            col_max = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) + MAX_FULL_PEL_VAL)
-                                                 :((best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL);
-            row_min = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) - MAX_FULL_PEL_VAL)
-                                                 :((best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL);
-            row_max = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) + MAX_FULL_PEL_VAL)
-                                                 :((best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL);
-
             // Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
             if (x->mv_col_min < col_min )
                 x->mv_col_min = col_min;
@@ -704,7 +697,7 @@
 
             if (cpi->sf.search_method == HEX)
             {
-                bestsme = vp8_hex_search(x, b, d, &mvp, &d->bmi.mv, step_param,
+                bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, step_param,
                                       sadpb, &cpi->fn_ptr[BLOCK_16X16],
                                       x->mvsadcost, x->mvcost, &best_ref_mv);
                 mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
@@ -711,7 +704,7 @@
             }
             else
             {
-                bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv,
+                bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv,
                                       step_param, sadpb, &num00,
                                       &cpi->fn_ptr[BLOCK_16X16],
                                       x->mvcost, &best_ref_mv);
@@ -733,7 +726,7 @@
                     else
                     {
                         thissme =
-                        cpi->diamond_search_sad(x, b, d, &mvp,
+                        cpi->diamond_search_sad(x, b, d, &mvp_full,
                                                 &d->bmi.mv,
                                                 step_param + n,
                                                 sadpb, &num00,
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -1201,7 +1201,11 @@
 
                 {
                     int sadpb = x->sadperbit4;
+                    int_mv mvp_full;
 
+                    mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3;
+                    mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3;
+
                     // find first label
                     n = vp8_mbsplit_offset[segmentation][i];
 
@@ -1209,7 +1213,7 @@
                     e = &x->e_mbd.block[n];
 
                     {
-                        bestsme = cpi->diamond_search_sad(x, c, e, &bsi->mvp,
+                        bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full,
                                                 &mode_mv[NEW4X4], step_param,
                                                 sadpb, &num00, v_fn_ptr,
                                                 x->mvcost, bsi->ref_mv);
@@ -1226,7 +1230,7 @@
                             else
                             {
                                 thissme = cpi->diamond_search_sad(x, c, e,
-                                                    &bsi->mvp, &temp_mv,
+                                                    &mvp_full, &temp_mv,
                                                     step_param + n, sadpb,
                                                     &num00, v_fn_ptr,
                                                     x->mvcost, bsi->ref_mv);
@@ -1245,12 +1249,7 @@
                     // Should we do a full search (best quality only)
                     if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000)
                     {
-                        int_mv full_mvp;
-
-                        full_mvp.as_mv.row = bsi->mvp.as_mv.row >>3;
-                        full_mvp.as_mv.col = bsi->mvp.as_mv.col >>3;
-
-                        thissme = cpi->full_search_sad(x, c, e, &full_mvp,
+                        thissme = cpi->full_search_sad(x, c, e, &mvp_full,
                                                        sadpb, 16, v_fn_ptr,
                                                        x->mvcost, bsi->ref_mv);
 
@@ -1398,14 +1397,10 @@
 
         if (bsi.segment_rd < best_rd)
         {
-            int col_min = (best_ref_mv->as_mv.col < 0)?(-((abs(best_ref_mv->as_mv.col))>>3) - MAX_FULL_PEL_VAL)
-                                                      :((best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL);
-            int col_max = (best_ref_mv->as_mv.col < 0)?(-((abs(best_ref_mv->as_mv.col))>>3) + MAX_FULL_PEL_VAL)
-                                                      :((best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL);
-            int row_min = (best_ref_mv->as_mv.row < 0)?(-((abs(best_ref_mv->as_mv.row))>>3) - MAX_FULL_PEL_VAL)
-                                                      :((best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL);
-            int row_max = (best_ref_mv->as_mv.row < 0)?(-((abs(best_ref_mv->as_mv.row))>>3) + MAX_FULL_PEL_VAL)
-                                                      :((best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL);
+            int col_min = (best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv->as_mv.col & 7)?1:0);
+            int row_min = (best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv->as_mv.row & 7)?1:0);
+            int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL;
+            int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL;
 
             int tmp_col_min = x->mv_col_min;
             int tmp_col_max = x->mv_col_max;
@@ -1947,13 +1942,6 @@
 
             vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
                         x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
-
-            /* adjust mvp to make sure it is within MV range */
-            vp8_clamp_mv(&mvp,
-                         best_ref_mv.as_mv.col - (MAX_FULL_PEL_VAL<<3),
-                         best_ref_mv.as_mv.col + (MAX_FULL_PEL_VAL<<3),
-                         best_ref_mv.as_mv.row - (MAX_FULL_PEL_VAL<<3),
-                         best_ref_mv.as_mv.row + (MAX_FULL_PEL_VAL<<3));
         }
 
         // Check to see if the testing frequency for this mode is at its max
@@ -2084,15 +2072,12 @@
                                   we will do a final 1-away diamond refining search  */
 
             int sadpb = x->sadperbit16;
+            int_mv mvp_full;
 
-            int col_min = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) - MAX_FULL_PEL_VAL)
-                                                     :((best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL);
-            int col_max = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) + MAX_FULL_PEL_VAL)
-                                                     :((best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL);
-            int row_min = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) - MAX_FULL_PEL_VAL)
-                                                     :((best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL);
-            int row_max = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) + MAX_FULL_PEL_VAL)
-                                                     :((best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL);
+            int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.col & 7)?1:0);
+            int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.row & 7)?1:0);
+            int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL;
+            int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL;
 
             int tmp_col_min = x->mv_col_min;
             int tmp_col_max = x->mv_col_max;
@@ -2099,6 +2084,12 @@
             int tmp_row_min = x->mv_row_min;
             int tmp_row_max = x->mv_row_max;
 
+            mvp_full.as_mv.col = mvp.as_mv.col>>3;
+            mvp_full.as_mv.row = mvp.as_mv.row>>3;
+
+            /* adjust mvp to make sure it is within MV range */
+            vp8_clamp_mv(&mvp_full, col_min, col_max, row_min, row_max);
+
             // Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
             if (x->mv_col_min < col_min )
                 x->mv_col_min = col_min;
@@ -2115,7 +2106,7 @@
 
             // Initial step/diamond search
             {
-                bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv,
+                bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv,
                                         step_param, sadpb, &num00,
                                         &cpi->fn_ptr[BLOCK_16X16],
                                         x->mvcost, &best_ref_mv);
@@ -2140,7 +2131,7 @@
                         num00--;
                     else
                     {
-                        thissme = cpi->diamond_search_sad(x, b, d, &mvp,
+                        thissme = cpi->diamond_search_sad(x, b, d, &mvp_full,
                                     &d->bmi.mv, step_param + n, sadpb, &num00,
                                     &cpi->fn_ptr[BLOCK_16X16], x->mvcost,
                                     &best_ref_mv);
--- a/vp8/encoder/temporal_filter.c
+++ b/vp8/encoder/temporal_filter.c
@@ -157,6 +157,7 @@
     BLOCK *b = &x->block[0];
     BLOCKD *d = &x->e_mbd.block[0];
     int_mv best_ref_mv1;
+    int_mv best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
 
     int *mvcost[2]    = { &dummy_cost[mv_max+1], &dummy_cost[mv_max+1] };
     int *mvsadcost[2] = { &dummy_cost[mv_max+1], &dummy_cost[mv_max+1] };
@@ -170,6 +171,8 @@
     int pre_stride = d->pre_stride;
 
     best_ref_mv1.as_int = 0;
+    best_ref_mv1_full.as_mv.col = best_ref_mv1.as_mv.col >>3;
+    best_ref_mv1_full.as_mv.row = best_ref_mv1.as_mv.row >>3;
 
     // Setup frame pointers
     b->base_src = &arf_frame->y_buffer;
@@ -197,7 +200,7 @@
     /*cpi->sf.search_method == HEX*/
     // TODO Check that the 16x16 vf & sdf are selected here
     bestsme = vp8_hex_search(x, b, d,
-        &best_ref_mv1, &d->bmi.mv,
+        &best_ref_mv1_full, &d->bmi.mv,
         step_param,
         sadpb,
         &cpi->fn_ptr[BLOCK_16X16],