]> granicus.if.org Git - libvpx/commitdiff
Adapt color sensitiviy threshold to luma signal energy
authorYaowu Xu <yaowu@google.com>
Mon, 2 Mar 2015 23:35:58 +0000 (15:35 -0800)
committerYaowu Xu <yaowu@google.com>
Tue, 3 Mar 2015 19:15:13 +0000 (11:15 -0800)
Instead using only a fixed threshold, this commit adapts the threshold
for color sensitivity decision to luma signal energy: chroma channel's
sse is at least 1/6 of that in luma for color sensitivity flag to be
set to active.

This recoups a large portion of the speed loss due to accounting for
chroma component costs in RTC mode decision.

Change-Id: Ie01f747f6037dba6a1d1ed3e10b71a0ef1abc42c

vp9/encoder/vp9_encodeframe.c

index 63ca2d34d754fdcaedbc8beaff2f4be76bbefc29..cf3ff46b47b79c72d37b29168f2f72413950275d 100644 (file)
@@ -593,8 +593,8 @@ static const MV search_pos[9] = {
   {1, -1}, {1, 0}, {1, 1},
 };
 
-static void motion_estimation(VP9_COMP *cpi, MACROBLOCK *x,
-                              BLOCK_SIZE bsize) {
+static unsigned int motion_estimation(VP9_COMP *cpi, MACROBLOCK *x,
+                                      BLOCK_SIZE bsize) {
   MACROBLOCKD *xd = &x->e_mbd;
   DECLARE_ALIGNED(16, int16_t, hbuf[128]);
   DECLARE_ALIGNED(16, int16_t, vbuf[128]);
@@ -610,6 +610,7 @@ static void motion_estimation(VP9_COMP *cpi, MACROBLOCK *x,
   uint8_t const *ref_buf, *src_buf;
   MV *tmp_mv = &xd->mi[0].src_mi->mbmi.mv[0].as_mv;
   int best_sad;
+  unsigned int best_sse;
   MV this_mv;
 
   // Set up prediction 1-D reference set
@@ -659,10 +660,12 @@ static void motion_estimation(VP9_COMP *cpi, MACROBLOCK *x,
     }
   }
 
+  ref_buf = xd->plane[0].pre[0].buf + tmp_mv->row * ref_stride + tmp_mv->col;
+  cpi->fn_ptr[bsize].vf(src_buf, src_stride, ref_buf, ref_stride, &best_sse);
   tmp_mv->row *= 8;
   tmp_mv->col *= 8;
-
   x->pred_mv[LAST_FRAME] = *tmp_mv;
+  return best_sse;
 }
 #endif
 
@@ -709,7 +712,10 @@ static void choose_partitioning(VP9_COMP *cpi,
 
   if (!is_key_frame) {
     MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
-    unsigned int var = 0, sse;
+    unsigned int var = 0, uv_sse;
+#if GLOBAL_MOTION
+    unsigned int y_sse;
+#endif
     vp9_setup_pre_planes(xd, 0, yv12, mi_row, mi_col,
         &cm->frame_refs[LAST_FRAME - 1].sf);
     mbmi->ref_frame[0] = LAST_FRAME;
@@ -719,7 +725,7 @@ static void choose_partitioning(VP9_COMP *cpi,
     mbmi->interp_filter = BILINEAR;
 
 #if GLOBAL_MOTION
-    motion_estimation(cpi, x, BLOCK_64X64);
+    y_sse = motion_estimation(cpi, x, BLOCK_64X64);
 #endif
 
     vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64);
@@ -729,9 +735,13 @@ static void choose_partitioning(VP9_COMP *cpi,
       struct macroblockd_plane *pd = &xd->plane[i];
       const BLOCK_SIZE bs = get_plane_block_size(BLOCK_64X64, pd);
       var += cpi->fn_ptr[bs].vf(p->src.buf, p->src.stride,
-                                pd->dst.buf, pd->dst.stride, &sse);
-      if (sse > 2048)
-        x->color_sensitivity[i - 1] = 1;
+                                pd->dst.buf, pd->dst.stride, &uv_sse);
+
+#if GLOBAL_MOTION
+      x->color_sensitivity[i - 1] = uv_sse * 6 > y_sse;
+#else
+      x->color_sensitivity[i - 1] = (uv_sse > 2048);
+#endif
     }
 
     d = xd->plane[0].dst.buf;