Remove redundant memset in encode_sb_row
Redundant memsets of x->mbmi_ext and inter_txb_hash
related structures are removed.
Encode time
cpu-used Reduction
1 0.57%
2 0.84%
3 1.48%
4 2.00%
Change-Id: Ief0f1dee1220e0ccaa5bb834f89ad47083ee6289
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 5ef2260..2974a7e 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4179,7 +4179,6 @@
const int mib_size = cm->seq_params.mib_size;
const int mib_size_log2 = cm->seq_params.mib_size_log2;
const int sb_row = (mi_row - tile_info->mi_row_start) >> mib_size_log2;
- int sb_mi_size = av1_get_sb_mi_size(cm);
#if CONFIG_COLLECT_COMPONENT_TIMING
start_timing(cpi, encode_sb_time);
@@ -4201,8 +4200,6 @@
// Code each SB in the row
for (int mi_col = tile_info->mi_col_start, sb_col_in_tile = 0;
mi_col < tile_info->mi_col_end; mi_col += mib_size, sb_col_in_tile++) {
- if (!cpi->sf.use_real_time_ref_set)
- memset(x->mbmi_ext, 0, sb_mi_size * sizeof(*x->mbmi_ext));
(*(cpi->row_mt_sync_read_ptr))(&tile_data->row_mt_sync, sb_row,
sb_col_in_tile);
if (tile_data->allow_update_cdf && (cpi->row_mt == 1) &&
@@ -4267,17 +4264,12 @@
break;
default: assert(0);
}
- x->mb_rd_record.num = x->mb_rd_record.index_start = 0;
x->color_sensitivity[0] = 0;
x->color_sensitivity[1] = 0;
- if (cpi->sf.use_inter_txb_hash) {
- av1_zero(x->txb_rd_record_8X8);
- av1_zero(x->txb_rd_record_16X16);
- av1_zero(x->txb_rd_record_32X32);
- av1_zero(x->txb_rd_record_64X64);
- av1_zero(x->txb_rd_record_intra);
- }
+ // Reset hash state for transform/mode rd hash information
+ reset_hash_records(x, cpi->sf.use_inter_txb_hash);
+
if (!use_nonrd_mode) {
av1_zero(x->picked_ref_frames_mask);
av1_zero(x->pred_mv);
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index b50af0f..4bb7aa9 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -283,26 +283,29 @@
}
// Used to reset the state of tx/mb rd hash information
-static INLINE void reset_hash_records(MACROBLOCK *const x) {
+static INLINE void reset_hash_records(MACROBLOCK *const x,
+ int use_inter_txb_hash) {
int32_t record_idx;
// Reset the state for use_inter_txb_hash
- for (record_idx = 0; record_idx < ((MAX_MIB_SIZE >> 1) * (MAX_MIB_SIZE >> 1));
- record_idx++)
- x->txb_rd_record_8X8[record_idx].num =
- x->txb_rd_record_8X8[record_idx].index_start = 0;
- for (record_idx = 0; record_idx < ((MAX_MIB_SIZE >> 2) * (MAX_MIB_SIZE >> 2));
- record_idx++)
- x->txb_rd_record_16X16[record_idx].num =
- x->txb_rd_record_16X16[record_idx].index_start = 0;
- for (record_idx = 0; record_idx < ((MAX_MIB_SIZE >> 3) * (MAX_MIB_SIZE >> 3));
- record_idx++)
- x->txb_rd_record_32X32[record_idx].num =
- x->txb_rd_record_32X32[record_idx].index_start = 0;
- for (record_idx = 0; record_idx < ((MAX_MIB_SIZE >> 4) * (MAX_MIB_SIZE >> 4));
- record_idx++)
- x->txb_rd_record_64X64[record_idx].num =
- x->txb_rd_record_64X64[record_idx].index_start = 0;
+ if (use_inter_txb_hash) {
+ for (record_idx = 0;
+ record_idx < ((MAX_MIB_SIZE >> 1) * (MAX_MIB_SIZE >> 1)); record_idx++)
+ x->txb_rd_record_8X8[record_idx].num =
+ x->txb_rd_record_8X8[record_idx].index_start = 0;
+ for (record_idx = 0;
+ record_idx < ((MAX_MIB_SIZE >> 2) * (MAX_MIB_SIZE >> 2)); record_idx++)
+ x->txb_rd_record_16X16[record_idx].num =
+ x->txb_rd_record_16X16[record_idx].index_start = 0;
+ for (record_idx = 0;
+ record_idx < ((MAX_MIB_SIZE >> 3) * (MAX_MIB_SIZE >> 3)); record_idx++)
+ x->txb_rd_record_32X32[record_idx].num =
+ x->txb_rd_record_32X32[record_idx].index_start = 0;
+ for (record_idx = 0;
+ record_idx < ((MAX_MIB_SIZE >> 4) * (MAX_MIB_SIZE >> 4)); record_idx++)
+ x->txb_rd_record_64X64[record_idx].num =
+ x->txb_rd_record_64X64[record_idx].index_start = 0;
+ }
// Reset the state for use_intra_txb_hash
x->txb_rd_record_intra.num = x->txb_rd_record_intra.index_start = 0;
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h
index b371c95..381432f 100644
--- a/av1/encoder/rdopt.h
+++ b/av1/encoder/rdopt.h
@@ -380,7 +380,7 @@
// the decisions would have been sub-optimal
// TODO(any): Move the evaluation of palette/IntraBC modes before winner
// mode is processed and clean-up the code below
- reset_hash_records(x);
+ reset_hash_records(x, cpi->sf.use_inter_txb_hash);
break;
default: assert(0);