Add simple motion sse to MACROBLOCK and implement data prep Add a new variable 'simple_motion_pred_sse' to MACROBLOCK. And add similar logic as for 'source_variance' to prepare the data properly for each prediction block, by avoiding duplicated calculation and handling data overwriting through the recursive RD loop. Change-Id: I14aeae0c6b5147c906a9f9df7055d01731079bb2
diff --git a/av1/encoder/block.h b/av1/encoder/block.h index 7c4cd00..7221cfb 100644 --- a/av1/encoder/block.h +++ b/av1/encoder/block.h
@@ -276,6 +276,7 @@ unsigned int max_mv_context[REF_FRAMES]; unsigned int source_variance; + unsigned int simple_motion_pred_sse; unsigned int pred_sse[REF_FRAMES]; int pred_mv_sad[REF_FRAMES];
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 0829938..28b72d9 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -535,6 +535,13 @@ return av1_edge_exists(ref->buf, ref->stride, width, height, high_bd, bd); } +static int use_pb_simple_motion_pred_sse(const AV1_COMP *const cpi) { + // TODO(debargha, yuec): Not in use, need to implement a speed feature + // utilizing this data point, and replace '0' by the corresponding speed + // feature flag. + return 0 && !frame_is_intra_only(&cpi->common); +} + static void pick_sb_modes(AV1_COMP *const cpi, TileDataEnc *tile_data, MACROBLOCK *const x, int mi_row, int mi_col, RD_STATS *rd_cost, PARTITION_TYPE partition, @@ -623,6 +630,13 @@ x->source_variance = av1_get_sby_perpixel_variance(cpi, &x->plane[0].src, bsize); } + if (use_pb_simple_motion_pred_sse(cpi)) { + const MV ref_mv_full = { .row = 0, .col = 0 }; + unsigned int var = 0; + av1_simple_motion_sse_var(cpi, x, mi_row, mi_col, bsize, ref_mv_full, 0, + &x->simple_motion_pred_sse, &var); + } + // If the threshold for disabling wedge search is zero, it means the feature // should not be used. Use a value that will always succeed in the check. if (cpi->sf.disable_wedge_search_edge_thresh == 0) { @@ -2309,6 +2323,8 @@ int use_subpixel) { assert(num_planes == 1 && "Currently simple_motion_search only supports luma plane"); + assert(!frame_is_intra_only(&cpi->common) && + "Simple motion search only enabled for non-key frames"); AV1_COMMON *const cm = &cpi->common; MACROBLOCKD *xd = &x->e_mbd; @@ -4222,6 +4238,11 @@ // Partition block source pixel variance. unsigned int pb_source_variance = UINT_MAX; + // Partition block sse after simple motion compensation, not in use now, + // but will be used for upcoming speed features + unsigned int pb_simple_motion_pred_sse = UINT_MAX; + (void)pb_simple_motion_pred_sse; + #if CONFIG_DIST_8X8 if (x->using_dist_8x8) { if (block_size_high[bsize] <= 8) partition_horz_allowed = 0; @@ -4252,6 +4273,7 @@ pick_sb_modes(cpi, tile_data, x, mi_row, mi_col, &this_rdc, PARTITION_NONE, bsize, ctx_none, best_remain_rdcost, 0); pb_source_variance = x->source_variance; + pb_simple_motion_pred_sse = x->simple_motion_pred_sse; if (none_rd) *none_rd = this_rdc.rdcost; cur_none_rd = this_rdc.rdcost; if (this_rdc.rate != INT_MAX) { @@ -4726,6 +4748,15 @@ } } + if (use_pb_simple_motion_pred_sse(cpi) && + pb_simple_motion_pred_sse == UINT_MAX) { + const MV ref_mv_full = { .row = 0, .col = 0 }; + unsigned int var = 0; + + av1_simple_motion_sse_var(cpi, x, mi_row, mi_col, bsize, ref_mv_full, 0, + &pb_simple_motion_pred_sse, &var); + } + assert(IMPLIES(!cpi->oxcf.enable_rect_partitions, !do_rectangular_split)); const int ext_partition_allowed = @@ -5438,6 +5469,7 @@ x->cb_partition_scan = 0; x->source_variance = UINT_MAX; + x->simple_motion_pred_sse = UINT_MAX; if (sf->adaptive_pred_interp_filter) { const int leaf_nodes = 256; for (int i = 0; i < leaf_nodes; ++i) { @@ -5799,6 +5831,7 @@ const int idx_str = cm->mi_stride * mi_row + mi_col; MB_MODE_INFO **mi = cm->mi_grid_visible + idx_str; x->source_variance = UINT_MAX; + x->simple_motion_pred_sse = UINT_MAX; if (sf->partition_search_type == FIXED_PARTITION || seg_skip) { set_offsets(cpi, tile_info, x, mi_row, mi_col, sb_size); const BLOCK_SIZE bsize = seg_skip ? sb_size : sf->always_this_block_size;