Fix issues in tx_size winner mode speed feature
Fixed issues in bitstream creation and encode_superblock() function when winner
mode speed feature 'enable_winner_mode_for_tx_size_srch' is enabled.
Change-Id: I5efdffc3a3d98dace7cf54b9b4af19c1a5a17790
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index ad1604d..31b4d27 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -516,7 +516,7 @@
seg->update_map ? cpi->segmentation_map : cm->last_frame_seg_map;
mi_addr->segment_id =
map ? get_segment_id(cm, map, bsize, mi_row, mi_col) : 0;
- reset_tx_size(x, mi_addr, cm->tx_mode);
+ reset_tx_size(x, mi_addr, x->tx_mode);
}
// Else for cyclic refresh mode update the segment map, set the segment id
// and then update the quantizer.
@@ -5230,6 +5230,9 @@
cm->delta_q_info.delta_q_present_flag = 0;
}
+ // Set the transform size appropriately before bitstream creation
+ cm->tx_mode = get_eval_tx_mode(cpi, WINNER_MODE_EVAL);
+
if (cpi->sf.tx_type_search.prune_tx_type_using_stats) {
const FRAME_UPDATE_TYPE update_type = get_frame_update_type(&cpi->gf_group);
@@ -5536,6 +5539,9 @@
const int mi_height = mi_size_high[bsize];
const int is_inter = is_inter_block(mbmi);
+ // Initialize tx_mode and tx_size_search_method
+ set_tx_size_search_method(cpi, x, cpi->sf.enable_winner_mode_for_tx_size_srch,
+ 1);
if (!is_inter) {
xd->cfl.is_chroma_reference =
is_chroma_reference(mi_row, mi_col, bsize, cm->seq_params.subsampling_x,
@@ -5620,7 +5626,7 @@
if (!dry_run) {
if (av1_allow_intrabc(cm) && is_intrabc_block(mbmi)) td->intrabc_used = 1;
- if (cm->tx_mode == TX_MODE_SELECT && !xd->lossless[mbmi->segment_id] &&
+ if (x->tx_mode == TX_MODE_SELECT && !xd->lossless[mbmi->segment_id] &&
mbmi->sb_type > BLOCK_4X4 && !(is_inter && (mbmi->skip || seg_skip))) {
if (is_inter) {
tx_partition_count_update(cm, x, bsize, mi_row, mi_col, td->counts,
@@ -5651,7 +5657,7 @@
if (xd->lossless[mbmi->segment_id]) {
intra_tx_size = TX_4X4;
} else {
- intra_tx_size = tx_size_from_tx_mode(bsize, cm->tx_mode);
+ intra_tx_size = tx_size_from_tx_mode(bsize, x->tx_mode);
}
} else {
intra_tx_size = mbmi->tx_size;
@@ -5666,7 +5672,7 @@
}
}
- if (cm->tx_mode == TX_MODE_SELECT && block_signals_txsize(mbmi->sb_type) &&
+ if (x->tx_mode == TX_MODE_SELECT && block_signals_txsize(mbmi->sb_type) &&
is_inter && !(mbmi->skip || seg_skip) &&
!xd->lossless[mbmi->segment_id]) {
if (dry_run) tx_partition_set_contexts(cm, xd, bsize, mi_row, mi_col);
@@ -5677,7 +5683,7 @@
if (xd->lossless[mbmi->segment_id]) {
tx_size = TX_4X4;
} else {
- tx_size = tx_size_from_tx_mode(bsize, cm->tx_mode);
+ tx_size = tx_size_from_tx_mode(bsize, x->tx_mode);
}
} else {
tx_size = (bsize > BLOCK_4X4) ? tx_size : TX_4X4;
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h
index 7d05019..090481e 100644
--- a/av1/encoder/rdopt.h
+++ b/av1/encoder/rdopt.h
@@ -229,7 +229,13 @@
static INLINE TX_MODE get_eval_tx_mode(const AV1_COMP *cpi,
MODE_EVAL_TYPE eval_type) {
- return select_tx_mode(cpi, cpi->tx_size_search_methods[eval_type]);
+ TX_MODE tx_mode;
+ if (cpi->sf.enable_winner_mode_for_tx_size_srch)
+ tx_mode = select_tx_mode(cpi, cpi->tx_size_search_methods[eval_type]);
+ else
+ tx_mode = select_tx_mode(cpi, cpi->tx_size_search_methods[DEFAULT_EVAL]);
+
+ return tx_mode;
}
static INLINE void set_tx_size_search_method(