From 3d6b0cb825d18fba31649c4ada500b9ed15b0d4a Mon Sep 17 00:00:00 2001 From: Jerome Jiang Date: Mon, 10 Jul 2017 16:16:05 -0700 Subject: [PATCH] vp9: Move skinmap computation into multithreading loop. Change-Id: Iebc9dd293d8b1449c0674c0295349297e9b90646 --- vp9/encoder/vp9_encodeframe.c | 4 ++++ vp9/encoder/vp9_encoder.c | 1 - vp9/encoder/vp9_noise_estimate.c | 1 + vp9/encoder/vp9_skin_detection.c | 33 ++++++++++++++++++++++++-------- vp9/encoder/vp9_skin_detection.h | 3 +++ 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index dfb86d010..c22bf85e3 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -4129,6 +4129,10 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, ThreadData *td, (*(cpi->row_mt_sync_read_ptr))(&tile_data->row_mt_sync, sb_row, sb_col_in_tile); + if (cpi->use_skin_detection) { + vp9_compute_skin_sb(cpi, BLOCK_16X16, mi_row, mi_col); + } + x->source_variance = UINT_MAX; vp9_zero(x->pred_mv); vp9_rd_cost_init(&dummy_rdc); diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index aac4b51b3..badf791e8 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -3557,7 +3557,6 @@ static void encode_without_recode_loop(VP9_COMP *cpi, size_t *size, cpi->oxcf.content != VP9E_CONTENT_SCREEN && cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) { cpi->use_skin_detection = 1; - vp9_compute_skin_map(cpi, BLOCK_16X16); } vp9_set_quantizer(cm, q); diff --git a/vp9/encoder/vp9_noise_estimate.c b/vp9/encoder/vp9_noise_estimate.c index 57f4fc078..1d77767dc 100644 --- a/vp9/encoder/vp9_noise_estimate.c +++ b/vp9/encoder/vp9_noise_estimate.c @@ -172,6 +172,7 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { int mi_row, mi_col; int num_low_motion = 0; int frame_low_motion = 1; + if (cpi->use_skin_detection) vp9_compute_skin_map(cpi, BLOCK_16X16); for (mi_row = 0; mi_row < cm->mi_rows; mi_row++) { for (mi_col = 0; mi_col < cm->mi_cols; mi_col++) { int bl_index = mi_row * cm->mi_cols + mi_col; diff --git a/vp9/encoder/vp9_skin_detection.c b/vp9/encoder/vp9_skin_detection.c index 6b36a000a..c1f0293b9 100644 --- a/vp9/encoder/vp9_skin_detection.c +++ b/vp9/encoder/vp9_skin_detection.c @@ -37,8 +37,9 @@ int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v, } } -void vp9_compute_skin_map(VP9_COMP *const cpi, BLOCK_SIZE bsize) { - int mi_row, mi_col, num_bl; +void vp9_compute_skin_sb(VP9_COMP *const cpi, BLOCK_SIZE bsize, int mi_row, + int mi_col) { + int i, j, num_bl; VP9_COMMON *const cm = &cpi->common; const uint8_t *src_y = cpi->Source->y_buffer; const uint8_t *src_u = cpi->Source->u_buffer; @@ -50,13 +51,17 @@ void vp9_compute_skin_map(VP9_COMP *const cpi, BLOCK_SIZE bsize) { const int shy = (y_bsize == 8) ? 3 : 4; const int shuv = shy - 1; const int fac = y_bsize / 8; - // Loop through blocks and set skin map based on center pixel of block. - // Ignore rightmost/bottom boundary blocks. - for (mi_row = 0; mi_row < cm->mi_rows - 1; mi_row += fac) { + const int y_shift = src_ystride * (mi_row << 3) + (mi_col << 3); + const int uv_shift = src_uvstride * (mi_row << 2) + (mi_col << 2); + src_y += y_shift; + src_u += uv_shift; + src_v += uv_shift; + + for (i = mi_row; i < VPXMIN(mi_row + 7, cm->mi_rows - 1); i += fac) { num_bl = 0; - for (mi_col = 0; mi_col < cm->mi_cols - 1; mi_col += fac) { + for (j = mi_col; j < VPXMIN(mi_col + 7, cm->mi_cols - 1); j += fac) { int consec_zeromv = 0; - int bl_index = mi_row * cm->mi_cols + mi_col; + int bl_index = i * cm->mi_cols + j; int bl_index1 = bl_index + 1; int bl_index2 = bl_index + cm->mi_cols; int bl_index3 = bl_index2 + 1; @@ -67,7 +72,7 @@ void vp9_compute_skin_map(VP9_COMP *const cpi, BLOCK_SIZE bsize) { VPXMIN(cpi->consec_zero_mv[bl_index1], VPXMIN(cpi->consec_zero_mv[bl_index2], cpi->consec_zero_mv[bl_index3]))); - cpi->skin_map[mi_row * cm->mi_cols + mi_col] = + cpi->skin_map[bl_index] = vp9_compute_skin_block(src_y, src_u, src_v, src_ystride, src_uvstride, bsize, consec_zeromv, 0); num_bl++; @@ -81,6 +86,18 @@ void vp9_compute_skin_map(VP9_COMP *const cpi, BLOCK_SIZE bsize) { } } +void vp9_compute_skin_map(VP9_COMP *const cpi, BLOCK_SIZE bsize) { + int mi_row, mi_col; + VP9_COMMON *const cm = &cpi->common; + // Loop through blocks and set skin map based on center pixel of block. + // Ignore rightmost/bottom boundary blocks. + for (mi_row = 0; mi_row < cm->mi_rows - 1; mi_row += MI_BLOCK_SIZE) { + for (mi_col = 0; mi_col < cm->mi_cols - 1; mi_col += MI_BLOCK_SIZE) { + vp9_compute_skin_sb(cpi, bsize, mi_row, mi_col); + } + } +} + #ifdef OUTPUT_YUV_SKINMAP // For viewing skin map on input source. void vp9_output_skin_map(VP9_COMP *const cpi, FILE *yuv_skinmap_file) { diff --git a/vp9/encoder/vp9_skin_detection.h b/vp9/encoder/vp9_skin_detection.h index 6b5f149c9..c24d691b2 100644 --- a/vp9/encoder/vp9_skin_detection.h +++ b/vp9/encoder/vp9_skin_detection.h @@ -25,6 +25,9 @@ int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v, int stride, int strideuv, int bsize, int consec_zeromv, int curr_motion_magn); +void vp9_compute_skin_sb(struct VP9_COMP *const cpi, BLOCK_SIZE bsize, + int mi_row, int mi_col); + void vp9_compute_skin_map(struct VP9_COMP *const cpi, BLOCK_SIZE bsize); #ifdef OUTPUT_YUV_SKINMAP -- 2.40.0