Commit a4812acf authored by Hui Su's avatar Hui Su

tx block rd hash: fix tx block order

Previously the tx block order, i.e. the child index, was wrong for
rectangular partition blocks.

Re-eanbles tx rd hash for rectangular blocks, encoder speed up by 7%; no
compression quality loss.

BUG=aomedia:1106

Change-Id: I615b8c56744075088943d372e607c18795cedac4
parent 140b3333
...@@ -4570,7 +4570,7 @@ static int find_tx_size_rd_records(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row, ...@@ -4570,7 +4570,7 @@ static int find_tx_size_rd_records(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row,
const int bh = block_size_high[bsize]; const int bh = block_size_high[bsize];
// Hashing is performed only for square TX sizes larger than TX_4X4 // Hashing is performed only for square TX sizes larger than TX_4X4
if (max_square_tx_size < TX_8X8 || bw != bh) return 0; if (max_square_tx_size < TX_8X8) return 0;
const int bw_mi = mi_size_wide[bsize]; const int bw_mi = mi_size_wide[bsize];
const int diff_stride = bw; const int diff_stride = bw;
...@@ -4584,13 +4584,14 @@ static int find_tx_size_rd_records(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row, ...@@ -4584,13 +4584,14 @@ static int find_tx_size_rd_records(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row,
int cur_rd_info_idx = 0; int cur_rd_info_idx = 0;
int cur_tx_depth = 0; int cur_tx_depth = 0;
uint8_t parent_idx_buf[MAX_MIB_SIZE * MAX_MIB_SIZE] = { 0 }; uint8_t parent_idx_buf[MAX_MIB_SIZE * MAX_MIB_SIZE] = { 0 };
uint8_t child_idx_buf[MAX_MIB_SIZE * MAX_MIB_SIZE] = { 0 };
int cur_tx_size = max_txsize_rect_lookup[1][bsize]; TX_SIZE cur_tx_size = max_txsize_rect_lookup[1][bsize];
while (cur_tx_depth <= MAX_VARTX_DEPTH) { while (cur_tx_depth <= MAX_VARTX_DEPTH) {
const int cur_tx_bw = tx_size_wide[cur_tx_size]; const int cur_tx_bw = tx_size_wide[cur_tx_size];
const int cur_tx_bh = tx_size_high[cur_tx_size]; const int cur_tx_bh = tx_size_high[cur_tx_size];
if (cur_tx_bw < 8 || cur_tx_bh < 8) break; if (cur_tx_bw < 8 || cur_tx_bh < 8) break;
const TX_SIZE next_tx_size = sub_tx_size_map[1][cur_tx_size];
for (int row = 0; row < bh; row += cur_tx_bh) { for (int row = 0; row < bh; row += cur_tx_bh) {
for (int col = 0; col < bw; col += cur_tx_bw) { for (int col = 0; col < bw; col += cur_tx_bw) {
if (cur_tx_bw != cur_tx_bh) { if (cur_tx_bw != cur_tx_bh) {
...@@ -4626,26 +4627,38 @@ static int find_tx_size_rd_records(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row, ...@@ -4626,26 +4627,38 @@ static int find_tx_size_rd_records(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row,
// Update the output quadtree RD info structure. // Update the output quadtree RD info structure.
av1_zero(dst_rd_info[cur_rd_info_idx].children); av1_zero(dst_rd_info[cur_rd_info_idx].children);
const int block_mi_row = row / MI_SIZE; const int this_mi_row = row / MI_SIZE;
const int block_mi_col = col / MI_SIZE; const int this_mi_col = col / MI_SIZE;
if (cur_tx_depth > 0) { if (cur_tx_depth > 0) { // Set up child pointers.
const int y_odd = (row / cur_tx_bh) % 2; const int mi_index = this_mi_row * bw_mi + this_mi_col;
const int x_odd = (col / cur_tx_bw) % 2; const int child_idx = child_idx_buf[mi_index];
const int child_idx = y_odd ? (x_odd ? 3 : 2) : (x_odd ? 1 : 0); assert(child_idx < 4);
const int mi_index = block_mi_row * bw_mi + block_mi_col;
dst_rd_info[parent_idx_buf[mi_index]].children[child_idx] = dst_rd_info[parent_idx_buf[mi_index]].children[child_idx] =
&dst_rd_info[cur_rd_info_idx]; &dst_rd_info[cur_rd_info_idx];
} }
const int tx_bh_mi = cur_tx_bh / MI_SIZE; if (cur_tx_depth < MAX_VARTX_DEPTH) { // Set up parent and child idx.
const int tx_bw_mi = cur_tx_bw / MI_SIZE; const int tx_bh_mi = cur_tx_bh / MI_SIZE;
for (int i = block_mi_row; i < block_mi_row + tx_bh_mi; ++i) { const int tx_bw_mi = cur_tx_bw / MI_SIZE;
memset(parent_idx_buf + i * bw_mi + block_mi_col, cur_rd_info_idx, for (int i = this_mi_row; i < this_mi_row + tx_bh_mi; ++i) {
tx_bw_mi); memset(parent_idx_buf + i * bw_mi + this_mi_col, cur_rd_info_idx,
tx_bw_mi);
}
int child_idx = 0;
const int next_tx_bh_mi = tx_size_wide_unit[next_tx_size];
const int next_tx_bw_mi = tx_size_wide_unit[next_tx_size];
for (int i = this_mi_row; i < this_mi_row + tx_bh_mi;
i += next_tx_bh_mi) {
for (int j = this_mi_col; j < this_mi_col + tx_bw_mi;
j += next_tx_bw_mi) {
assert(child_idx < 4);
child_idx_buf[i * bw_mi + j] = child_idx++;
}
}
} }
++cur_rd_info_idx; ++cur_rd_info_idx;
} }
} }
cur_tx_size = sub_tx_size_map[1][cur_tx_size]; cur_tx_size = next_tx_size;
++cur_tx_depth; ++cur_tx_depth;
} }
return 1; return 1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment