LCOV - code coverage report
Current view: top level - media/webrtc/trunk/webrtc/modules/video_processing/util - skin_detection.cc (source / functions) Hit Total Coverage
Test: output.info Lines: 0 26 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 3 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
       3             :  *
       4             :  *  Use of this source code is governed by a BSD-style license
       5             :  *  that can be found in the LICENSE file in the root of the source
       6             :  *  tree. An additional intellectual property rights grant can be found
       7             :  *  in the file PATENTS.  All contributing project authors may
       8             :  *  be found in the AUTHORS file in the root of the source tree.
       9             :  */
      10             : 
      11             : #include <limits.h>
      12             : #include <math.h>
      13             : 
      14             : #include "webrtc/modules/video_processing/util/skin_detection.h"
      15             : 
      16             : namespace webrtc {
      17             : 
      18             : // Fixed-point skin color model parameters.
      19             : static const int skin_mean[5][2] = {
      20             :     {7463, 9614}, {6400, 10240}, {7040, 10240}, {8320, 9280}, {6800, 9614}};
      21             : static const int skin_inv_cov[4] = {4107, 1663, 1663, 2157};  // q16
      22             : static const int skin_threshold[6] = {1570636, 1400000, 800000, 800000, 800000,
      23             :     800000};  // q18
      24             : 
      25             : // Thresholds on luminance.
      26             : static const int y_low = 40;
      27             : static const int y_high = 220;
      28             : 
      29             : // Evaluates the Mahalanobis distance measure for the input CbCr values.
      30           0 : static int EvaluateSkinColorDifference(int cb, int cr, int idx) {
      31           0 :   const int cb_q6 = cb << 6;
      32           0 :   const int cr_q6 = cr << 6;
      33             :   const int cb_diff_q12 =
      34           0 :       (cb_q6 - skin_mean[idx][0]) * (cb_q6 - skin_mean[idx][0]);
      35             :   const int cbcr_diff_q12 =
      36           0 :       (cb_q6 - skin_mean[idx][0]) * (cr_q6 - skin_mean[idx][1]);
      37             :   const int cr_diff_q12 =
      38           0 :       (cr_q6 - skin_mean[idx][1]) * (cr_q6 - skin_mean[idx][1]);
      39           0 :   const int cb_diff_q2 = (cb_diff_q12 + (1 << 9)) >> 10;
      40           0 :   const int cbcr_diff_q2 = (cbcr_diff_q12 + (1 << 9)) >> 10;
      41           0 :   const int cr_diff_q2 = (cr_diff_q12 + (1 << 9)) >> 10;
      42           0 :   const int skin_diff = skin_inv_cov[0] * cb_diff_q2 +
      43           0 :       skin_inv_cov[1] * cbcr_diff_q2 +
      44           0 :       skin_inv_cov[2] * cbcr_diff_q2 +
      45           0 :       skin_inv_cov[3] * cr_diff_q2;
      46           0 :   return skin_diff;
      47             : }
      48             : 
      49           0 : static int SkinPixel(const uint8_t y, const uint8_t cb, const uint8_t cr) {
      50           0 :   if (y < y_low || y > y_high) {
      51           0 :     return 0;
      52             :   } else {
      53             :     if (MODEL_MODE == 0) {
      54           0 :       return (EvaluateSkinColorDifference(cb, cr, 0) < skin_threshold[0]);
      55             :     } else {
      56             :       // Exit on grey.
      57             :       if (cb == 128 && cr == 128)
      58             :         return 0;
      59             :       // Exit on very strong cb.
      60             :       if (cb > 150 && cr < 110)
      61             :         return 0;
      62             :       // Exit on (another) low luminance threshold if either color is high.
      63             :       if (y < 50 && (cb > 140 || cr > 140))
      64             :         return 0;
      65             :       for (int i = 0; i < 5; i++) {
      66             :         int diff = EvaluateSkinColorDifference(cb, cr, i);
      67             :         if (diff < skin_threshold[i + 1]) {
      68             :           return 1;
      69             :         } else if (diff > (skin_threshold[i + 1] << 3)) {
      70             :           // Exit if difference is much large than the threshold.
      71             :           return 0;
      72             :         }
      73             :       }
      74             :       return 0;
      75             :     }
      76             :   }
      77             : }
      78             : 
      79           0 : bool MbHasSkinColor(const uint8_t* y_src,
      80             :                     const uint8_t* u_src,
      81             :                     const uint8_t* v_src,
      82             :                     const int stride_y,
      83             :                     const int stride_u,
      84             :                     const int stride_v,
      85             :                     const int mb_row,
      86             :                     const int mb_col) {
      87           0 :   const uint8_t* y = y_src + ((mb_row << 4) + 8) * stride_y + (mb_col << 4) + 8;
      88           0 :   const uint8_t* u = u_src + ((mb_row << 3) + 4) * stride_u + (mb_col << 3) + 4;
      89           0 :   const uint8_t* v = v_src + ((mb_row << 3) + 4) * stride_v + (mb_col << 3) + 4;
      90             :   // Use 2x2 average of center pixel to compute skin area.
      91           0 :   uint8_t y_avg = (*y + *(y + 1) + *(y + stride_y) + *(y + stride_y + 1)) >> 2;
      92           0 :   uint8_t u_avg = (*u + *(u + 1) + *(u + stride_u) + *(u + stride_u + 1)) >> 2;
      93           0 :   uint8_t v_avg = (*v + *(v + 1) + *(v + stride_v) + *(v + stride_v + 1)) >> 2;
      94           0 :   return SkinPixel(y_avg, u_avg, v_avg) == 1;
      95             : }
      96             : 
      97             : }  // namespace webrtc

Generated by: LCOV version 1.13