Add a function for sse/var after simple motion search This function is for potential extended usage of sse/var after simple motion search by more speed up features. Change-Id: I67e5134a34eaed7e2d79a02af42839cb2522f7e7
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 1908ef4..0829938 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -70,6 +70,10 @@ const MACROBLOCK *const x, const RD_STATS *const rd_stats, unsigned int pb_source_variance); +static void simple_motion_search(AV1_COMP *const cpi, MACROBLOCK *x, int mi_row, + int mi_col, BLOCK_SIZE bsize, int ref, + MV ref_mv_full, int num_planes, + int use_subpixel); // This is used as a reference when computing the source variance for the // purposes of activity masking. @@ -222,6 +226,25 @@ return BLOCK_8X8; } +void av1_simple_motion_sse_var(AV1_COMP *cpi, MACROBLOCK *x, int mi_row, + int mi_col, BLOCK_SIZE bsize, + const MV ref_mv_full, int use_subpixel, + unsigned int *sse, unsigned int *var) { + MACROBLOCKD *xd = &x->e_mbd; + const MV_REFERENCE_FRAME ref = + cpi->rc.is_src_frame_alt_ref ? ALTREF_FRAME : LAST_FRAME; + + simple_motion_search(cpi, x, mi_row, mi_col, bsize, ref, ref_mv_full, 1, + use_subpixel); + + const uint8_t *src = x->plane[0].src.buf; + const int src_stride = x->plane[0].src.stride; + const uint8_t *dst = xd->plane[0].dst.buf; + const int dst_stride = xd->plane[0].dst.stride; + + *var = cpi->fn_ptr[bsize].vf(src, src_stride, dst, dst_stride, sse); +} + static void set_offsets_without_segment_id(const AV1_COMP *const cpi, const TileInfo *const tile, MACROBLOCK *const x, int mi_row, @@ -3540,36 +3563,30 @@ MACROBLOCKD *xd = &x->e_mbd; // Perform a single motion search in Y_PLANE to make a prediction - const MV_REFERENCE_FRAME ref = - cpi->rc.is_src_frame_alt_ref ? ALTREF_FRAME : LAST_FRAME; const int use_subpixel = 0; - const int num_planes = 1; - - const MV ref_mv_full = { .row = 0, .col = 0 }; - simple_motion_search(cpi, x, mi_row, mi_col, bsize, ref, ref_mv_full, - num_planes, use_subpixel); - aom_clear_system_state(); // Start getting the features int f_idx = 0; // Q_INDEX const int dc_q = av1_dc_quant_QTX(x->qindex, 0, xd->bd) >> (xd->bd - 8); + aom_clear_system_state(); features[f_idx++] = logf(1.0f + (float)(dc_q * dc_q) / 256.0f); // VARIANCE + unsigned int sse = 0; + unsigned int var = 0; + const MV ref_mv_full = { .row = 0, .col = 0 }; + av1_simple_motion_sse_var(cpi, x, mi_row, mi_col, bsize, ref_mv_full, + use_subpixel, &sse, &var); + aom_clear_system_state(); + features[f_idx++] = logf(1.0f + (float)var); + + // Regional const uint8_t *src = x->plane[0].src.buf; const int src_stride = x->plane[0].src.stride; const uint8_t *dst = xd->plane[0].dst.buf; const int dst_stride = xd->plane[0].dst.stride; - unsigned int sse = 0; - - // Whole block - const unsigned int var = - cpi->fn_ptr[bsize].vf(src, src_stride, dst, dst_stride, &sse); - features[f_idx++] = logf(1.0f + (float)var); - - // Regional const int bw = block_size_wide[bsize]; const int bh = block_size_high[bsize]; const BLOCK_SIZE subsize = get_partition_subsize(bsize, PARTITION_SPLIT); @@ -3581,6 +3598,7 @@ const int dst_offset = y_idx * dst_stride + x_idx; const unsigned int sub_var = cpi->fn_ptr[subsize].vf( src + src_offset, src_stride, dst + dst_offset, dst_stride, &sse); + aom_clear_system_state(); const float var_ratio = (1.0f + (float)sub_var) / (4.0f + (float)var); features[f_idx++] = var_ratio; }
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h index 7ba1b18..a2c8a57 100644 --- a/av1/encoder/rdopt.h +++ b/av1/encoder/rdopt.h
@@ -116,6 +116,10 @@ unsigned int av1_high_get_sby_perpixel_variance(const struct AV1_COMP *cpi, const struct buf_2d *ref, BLOCK_SIZE bs, int bd); +void av1_simple_motion_sse_var(AV1_COMP *cpi, MACROBLOCK *x, int mi_row, + int mi_col, BLOCK_SIZE bsize, MV ref_mv_full, + int use_subpixel, unsigned int *sse, + unsigned int *var); void av1_rd_pick_inter_mode_sb(struct AV1_COMP *cpi, struct TileDataEnc *tile_data,