]> granicus.if.org Git - libvpx/commitdiff
Call set_scaled_offsets() just before scale_mv() call.
authorDmitry Kovalev <dkovalev@google.com>
Thu, 19 Dec 2013 19:16:05 +0000 (11:16 -0800)
committerDmitry Kovalev <dkovalev@google.com>
Thu, 19 Dec 2013 22:55:13 +0000 (14:55 -0800)
Before mv scaling it is required to calculate x_offset_q4/y_offset_q4
by calling set_scaled_offsets(). Now offset configuration can not be
missed because it happens just before scale_mv().

Change-Id: I7dd1a85b85811a6cc67c46c9b01e6ccbbb06ce3a

vp9/common/vp9_reconinter.c
vp9/common/vp9_reconinter.h
vp9/encoder/vp9_rdopt.c
vp9/encoder/vp9_temporal_filter.c

index b17725243cb1b5bdfbacb1b2c664d6b572a36786..75f9532de551fd0ea9370ce348365917d8fd4290 100644 (file)
@@ -80,17 +80,23 @@ static void inter_predictor(const uint8_t *src, int src_stride,
 void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
                                uint8_t *dst, int dst_stride,
                                const MV *src_mv,
-                               const struct scale_factors *scale,
+                               struct scale_factors *scale,
                                int w, int h, int ref,
                                const struct subpix_fn_table *subpix,
-                               enum mv_precision precision) {
+                               enum mv_precision precision,
+                               int x, int y) {
   const int is_q4 = precision == MV_PRECISION_Q4;
   const MV mv_q4 = { is_q4 ? src_mv->row : src_mv->row * 2,
                      is_q4 ? src_mv->col : src_mv->col * 2 };
   const struct scale_factors_common *sfc = scale->sfc;
-  const MV32 mv = sfc->scale_mv(&mv_q4, scale);
-  const int subpel_x = mv.col & SUBPEL_MASK;
-  const int subpel_y = mv.row & SUBPEL_MASK;
+  int subpel_x, subpel_y;
+  MV32 mv;
+
+  sfc->set_scaled_offsets(scale, y, x);
+  mv = sfc->scale_mv(&mv_q4, scale);
+  subpel_x = mv.col & SUBPEL_MASK;
+  subpel_y = mv.row & SUBPEL_MASK;
+
   src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS);
 
   inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y,
index 4a302f9888fb3cc756fd9a6beb8489f482f70f58..0f95f76bbc21a6df5a816fbe8e80795266b67ba7 100644 (file)
@@ -30,10 +30,11 @@ void vp9_dec_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col,
 void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
                                uint8_t *dst, int dst_stride,
                                const MV *mv_q3,
-                               const struct scale_factors *scale,
+                               struct scale_factors *scale,
                                int w, int h, int do_avg,
                                const struct subpix_fn_table *subpix,
-                               enum mv_precision precision);
+                               enum mv_precision precision,
+                               int x, int y);
 
 static int scaled_buffer_offset(int x_offset, int y_offset, int stride,
                                 const struct scale_factors *scale) {
index 63823631c0b072d3f1d405d74369a1a5c45a9a29..9c860ab2dfcdf8b0a4aa188ae6c173e51bd02f42 100644 (file)
@@ -1496,7 +1496,8 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi,
                                        int *labelyrate,
                                        int64_t *distortion, int64_t *sse,
                                        ENTROPY_CONTEXT *ta,
-                                       ENTROPY_CONTEXT *tl) {
+                                       ENTROPY_CONTEXT *tl,
+                                       int mi_row, int mi_col) {
   int k;
   MACROBLOCKD *xd = &x->e_mbd;
   struct macroblockd_plane *const pd = &xd->plane[0];
@@ -1522,7 +1523,9 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi,
                               dst, pd->dst.stride,
                               &mi->bmi[i].as_mv[ref].as_mv,
                               &xd->scale_factor[ref],
-                              width, height, ref, &xd->subpix, MV_PRECISION_Q3);
+                              width, height, ref, &xd->subpix, MV_PRECISION_Q3,
+                              mi_col * MI_SIZE + 4 * (i % 2),
+                              mi_row * MI_SIZE + 4 * (i / 2));
   }
 
   vp9_subtract_block(height, width,
@@ -1956,7 +1959,8 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
                                     &bsi->rdstat[i][mode_idx].bdist,
                                     &bsi->rdstat[i][mode_idx].bsse,
                                     bsi->rdstat[i][mode_idx].ta,
-                                    bsi->rdstat[i][mode_idx].tl);
+                                    bsi->rdstat[i][mode_idx].tl,
+                                    mi_row, mi_col);
         if (bsi->rdstat[i][mode_idx].brdcost < INT64_MAX) {
           bsi->rdstat[i][mode_idx].brdcost += RDCOST(x->rdmult, x->rddiv,
                                             bsi->rdstat[i][mode_idx].brate, 0);
@@ -2487,8 +2491,6 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
       setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col, NULL);
     }
 
-    xd->scale_factor[ref].sfc->set_scaled_offsets(&xd->scale_factor[ref],
-                                                  mi_row, mi_col);
     frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
   }
 
@@ -2518,7 +2520,8 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
                               &frame_mv[refs[!id]].as_mv,
                               &xd->scale_factor[!id],
                               pw, ph, 0,
-                              &xd->subpix, MV_PRECISION_Q3);
+                              &xd->subpix, MV_PRECISION_Q3,
+                              mi_col * MI_SIZE, mi_row * MI_SIZE);
 
     // Compound motion search on first ref frame.
     if (id)
index 7408e6d2751cef90953b63523fe7a82513e1598d..b77d0d0092674ac0699cb0cf84448381ff23ed90 100644 (file)
@@ -40,7 +40,8 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
                                             int mv_row,
                                             int mv_col,
                                             uint8_t *pred,
-                                            struct scale_factors *scale) {
+                                            struct scale_factors *scale,
+                                            int x, int y) {
   const int which_mv = 0;
   MV mv = { mv_row, mv_col };
   enum mv_precision mv_precision_uv;
@@ -59,8 +60,7 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
                             scale,
                             16, 16,
                             which_mv,
-                            &xd->subpix, MV_PRECISION_Q3);
-
+                            &xd->subpix, MV_PRECISION_Q3, x, y);
 
   vp9_build_inter_predictor(u_mb_ptr, uv_stride,
                             &pred[256], uv_block_size,
@@ -68,7 +68,7 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
                             scale,
                             uv_block_size, uv_block_size,
                             which_mv,
-                            &xd->subpix, mv_precision_uv);
+                            &xd->subpix, mv_precision_uv, x, y);
 
   vp9_build_inter_predictor(v_mb_ptr, uv_stride,
                             &pred[512], uv_block_size,
@@ -76,7 +76,7 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
                             scale,
                             uv_block_size, uv_block_size,
                             which_mv,
-                            &xd->subpix, mv_precision_uv);
+                            &xd->subpix, mv_precision_uv, x, y);
 }
 
 void vp9_temporal_filter_apply_c(uint8_t *frame1,
@@ -296,7 +296,8 @@ static void temporal_filter_iterate_c(VP9_COMP *cpi,
            mb_uv_height,
            mbd->mi_8x8[0]->bmi[0].as_mv[0].as_mv.row,
            mbd->mi_8x8[0]->bmi[0].as_mv[0].as_mv.col,
-           predictor, scale);
+           predictor, scale,
+           mb_col * 16, mb_row * 16);
 
           // Apply the filter (YUV)
           vp9_temporal_filter_apply(f->y_buffer + mb_y_offset, f->y_stride,