]> granicus.if.org Git - libvpx/commitdiff
vp9-skin detection: Refactoring.
authorMarco <marpan@google.com>
Tue, 5 Jan 2016 00:48:15 +0000 (16:48 -0800)
committerMarco <marpan@google.com>
Tue, 5 Jan 2016 00:58:06 +0000 (16:58 -0800)
Add function to compute skin map for a given block, as its
used in several places (cyclic refresh, noise estimation, and denoising).

Change-Id: Ied622908df43b6927f7fafc6c019d1867f2a24eb

vp9/encoder/vp9_aq_cyclicrefresh.c
vp9/encoder/vp9_denoiser.c
vp9/encoder/vp9_noise_estimate.c
vp9/encoder/vp9_skin_detection.c
vp9/encoder/vp9_skin_detection.h

index 7c71d9d57db4e9caa58bd86392b7ef7531d6aec2..63db214d1c1a8bd73bc677afb00875f7955baf37 100644 (file)
@@ -209,20 +209,12 @@ void vp9_cyclic_refresh_update_segment(VP9_COMP *const cpi,
   if (refresh_this_block == 0 &&
       bsize <= BLOCK_16X16 &&
       cpi->oxcf.content != VP9E_CONTENT_SCREEN) {
-    // Take center pixel in block to determine is_skin.
-    const int y_width_shift = (4 << b_width_log2_lookup[bsize]) >> 1;
-    const int y_height_shift = (4 << b_height_log2_lookup[bsize]) >> 1;
-    const int uv_width_shift = y_width_shift >> 1;
-    const int uv_height_shift = y_height_shift >> 1;
-    const int stride = p[0].src.stride;
-    const int strideuv = p[1].src.stride;
-    const uint8_t ysource =
-        p[0].src.buf[y_height_shift * stride + y_width_shift];
-    const uint8_t usource =
-        p[1].src.buf[uv_height_shift * strideuv + uv_width_shift];
-    const uint8_t vsource =
-        p[2].src.buf[uv_height_shift * strideuv + uv_width_shift];
-    is_skin = vp9_skin_pixel(ysource, usource, vsource);
+    is_skin = vp9_compute_skin_block(p[0].src.buf,
+                                     p[1].src.buf,
+                                     p[2].src.buf,
+                                     p[0].src.stride,
+                                     p[1].src.stride,
+                                     bsize);
     if (is_skin)
       refresh_this_block = 1;
   }
index 93aa40ae99b77ece4b5c2fad6fced3796ee76253..6533902b32d7b55d1d64572eed5765c0097cfc99 100644 (file)
@@ -333,20 +333,12 @@ void vp9_denoiser_denoise(VP9_DENOISER *denoiser, MACROBLOCK *mb,
   int is_skin = 0;
 
   if (bs <= BLOCK_16X16 && denoiser->denoising_level >= kDenLow) {
-    // Take center pixel in block to determine is_skin.
-    const int y_width_shift = (4 << b_width_log2_lookup[bs]) >> 1;
-    const int y_height_shift = (4 << b_height_log2_lookup[bs]) >> 1;
-    const int uv_width_shift = y_width_shift >> 1;
-    const int uv_height_shift = y_height_shift >> 1;
-    const int stride = mb->plane[0].src.stride;
-    const int strideuv = mb->plane[1].src.stride;
-    const uint8_t ysource =
-      mb->plane[0].src.buf[y_height_shift * stride + y_width_shift];
-    const uint8_t usource =
-      mb->plane[1].src.buf[uv_height_shift * strideuv + uv_width_shift];
-    const uint8_t vsource =
-      mb->plane[2].src.buf[uv_height_shift * strideuv + uv_width_shift];
-    is_skin = vp9_skin_pixel(ysource, usource, vsource);
+    is_skin = vp9_compute_skin_block(mb->plane[0].src.buf,
+                                     mb->plane[1].src.buf,
+                                     mb->plane[2].src.buf,
+                                     mb->plane[0].src.stride,
+                                     mb->plane[1].src.stride,
+                                     bs);
   }
 
   mv_col = ctx->best_sse_mv.as_mv.col;
index 4befbb066f4f0b135208b7dbfe8dc81f5cf357aa..008a40afc36407431b55fa9939ed71b813d8f51a 100644 (file)
@@ -145,10 +145,6 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) {
     const uint8_t *src_u = cpi->Source->u_buffer;
     const uint8_t *src_v = cpi->Source->v_buffer;
     const int src_uvstride = cpi->Source->uv_stride;
-    const int y_width_shift = (4 << b_width_log2_lookup[bsize]) >> 1;
-    const int y_height_shift = (4 << b_height_log2_lookup[bsize]) >> 1;
-    const int uv_width_shift = y_width_shift >> 1;
-    const int uv_height_shift = y_height_shift >> 1;
     int mi_row, mi_col;
     int num_low_motion = 0;
     int frame_low_motion = 1;
@@ -173,13 +169,12 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) {
           // been encoded as zero/low motion x (= thresh_consec_zeromv) frames
           // in a row. consec_zero_mv[] defined for 8x8 blocks, so consider all
           // 4 sub-blocks for 16x16 block. Also, avoid skin blocks.
-          const uint8_t ysource =
-            src_y[y_height_shift * src_ystride + y_width_shift];
-          const uint8_t usource =
-            src_u[uv_height_shift * src_uvstride + uv_width_shift];
-          const uint8_t vsource =
-            src_v[uv_height_shift * src_uvstride + uv_width_shift];
-          int is_skin = vp9_skin_pixel(ysource, usource, vsource);
+          int is_skin = vp9_compute_skin_block(src_y,
+                                               src_u,
+                                               src_v,
+                                               src_ystride,
+                                               src_uvstride,
+                                               bsize);
           if (frame_low_motion &&
               cr->consec_zero_mv[bl_index] > thresh_consec_zeromv &&
               cr->consec_zero_mv[bl_index1] > thresh_consec_zeromv &&
index c2763b7dabc2ffdd8c3318d514436a81e71df6fd..0ca1665365d2416bdb601488a0b0ec513ee070b6 100644 (file)
@@ -48,6 +48,20 @@ int vp9_skin_pixel(const uint8_t y, const uint8_t cb, const uint8_t cr) {
     return (evaluate_skin_color_difference(cb, cr) < skin_threshold);
 }
 
+int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v,
+                           int stride, int strideuv, int bsize) {
+  // Take center pixel in block to determine is_skin.
+  const int y_width_shift = (4 << b_width_log2_lookup[bsize]) >> 1;
+  const int y_height_shift = (4 << b_height_log2_lookup[bsize]) >> 1;
+  const int uv_width_shift = y_width_shift >> 1;
+  const int uv_height_shift = y_height_shift >> 1;
+  const uint8_t ysource = y[y_height_shift * stride + y_width_shift];
+  const uint8_t usource = u[uv_height_shift * strideuv + uv_width_shift];
+  const uint8_t vsource = v[uv_height_shift * strideuv + uv_width_shift];
+  return vp9_skin_pixel(ysource, usource, vsource);
+}
+
+
 #ifdef OUTPUT_YUV_SKINMAP
 // For viewing skin map on input source.
 void vp9_compute_skin_map(VP9_COMP *const cpi, FILE *yuv_skinmap_file) {
index 0a87ef9f4275a2db02b31f82bd100a3cc9c7131b..73f7c39d9aaf1bec04184f20d358f4c728d8a005 100644 (file)
@@ -23,6 +23,9 @@ struct VP9_COMP;
 
 int vp9_skin_pixel(const uint8_t y, const uint8_t cb, const uint8_t cr);
 
+int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v,
+                           int stride, int strideuv, int bsize);
+
 #ifdef OUTPUT_YUV_SKINMAP
 // For viewing skin map on input source.
 void vp9_compute_skin_map(struct VP9_COMP *const cpi, FILE *yuv_skinmap_file);