Modify choose_tx_size_type_from_rd for lv_map exp The tx_type becomes dummy when lv_map is on. The tx_type search will be performed in av1_search_txk_type() and the results will be stored in txk_type[] In choose_tx_size_type_from_rd, we use best_txk_type[] to record the best search result within different tx_size. Change-Id: I67c489d261aecaa0092e0cc562670588c6c55941
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index f026d9b..c86a4d0 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -2173,6 +2173,13 @@ cpi->sf.use_fast_coef_costing); } +#if CONFIG_LV_MAP || CONFIG_VAR_TX +static INLINE int bsize_to_num_blk(BLOCK_SIZE bsize) { + int num_blk = 1 << (num_pels_log2_lookup[bsize] - 2 * tx_size_wide_log2[0]); + return num_blk; +} +#endif // CONFIG_LV_MAP || CONFIG_VAR_TX + static void choose_tx_size_type_from_rd(const AV1_COMP *const cpi, MACROBLOCK *x, RD_STATS *rd_stats, int64_t ref_best_rd, BLOCK_SIZE bs) { @@ -2186,6 +2193,10 @@ const TX_SIZE max_tx_size = max_txsize_lookup[bs]; TX_SIZE best_tx_size = max_tx_size; TX_TYPE best_tx_type = DCT_DCT; +#if CONFIG_LV_MAP + TX_TYPE best_txk_type[MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)]; + const int num_blk = bsize_to_num_blk(bs); +#endif // !CONFIG_LV_MAP const int tx_select = cm->tx_mode == TX_MODE_SELECT; const int is_inter = is_inter_block(mbmi); #if CONFIG_PVQ @@ -2206,8 +2217,15 @@ assert(IMPLIES(evaluate_rect_tx, is_rect_tx_allowed(xd, mbmi))); } if (evaluate_rect_tx) { + TX_TYPE tx_start = DCT_DCT; + TX_TYPE tx_end = TX_TYPES; +#if CONFIG_LV_MAP + // The tx_type becomes dummy when lv_map is on. The tx_type search will be + // performed in av1_search_txk_type() + tx_end = DCT_DCT + 1; +#endif TX_TYPE tx_type; - for (tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) { + for (tx_type = tx_start; tx_type < tx_end; ++tx_type) { #if CONFIG_REF_MV if (mbmi->ref_mv_idx > 0 && tx_type != DCT_DCT) continue; #endif // CONFIG_REF_MV @@ -2220,6 +2238,10 @@ rd = txfm_yrd(cpi, x, &this_rd_stats, ref_best_rd, bs, tx_type, rect_tx_size); if (rd < best_rd) { +#if CONFIG_LV_MAP + memcpy(best_txk_type, mbmi->txk_type, + sizeof(best_txk_type[0]) * num_blk); +#endif best_tx_type = tx_type; best_tx_size = rect_tx_size; best_rd = rd; @@ -2246,8 +2268,15 @@ last_rd = INT64_MAX; for (n = start_tx; n >= end_tx; --n) { + TX_TYPE tx_start = DCT_DCT; + TX_TYPE tx_end = TX_TYPES; +#if CONFIG_LV_MAP + // The tx_type becomes dummy when lv_map is on. The tx_type search will be + // performed in av1_search_txk_type() + tx_end = DCT_DCT + 1; +#endif TX_TYPE tx_type; - for (tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) { + for (tx_type = tx_start; tx_type < tx_end; ++tx_type) { RD_STATS this_rd_stats; if (skip_txfm_search(cpi, x, bs, tx_type, n)) continue; rd = txfm_yrd(cpi, x, &this_rd_stats, ref_best_rd, bs, tx_type, n); @@ -2263,6 +2292,10 @@ last_rd = rd; if (rd < best_rd) { +#if CONFIG_LV_MAP + memcpy(best_txk_type, mbmi->txk_type, + sizeof(best_txk_type[0]) * num_blk); +#endif best_tx_type = tx_type; best_tx_size = n; best_rd = rd; @@ -2276,6 +2309,9 @@ } mbmi->tx_size = best_tx_size; mbmi->tx_type = best_tx_type; +#if CONFIG_LV_MAP + memcpy(mbmi->txk_type, best_txk_type, sizeof(best_txk_type[0]) * num_blk); +#endif #if CONFIG_VAR_TX mbmi->min_tx_size = get_min_tx_size(mbmi->tx_size); @@ -4227,7 +4263,7 @@ TX_SIZE best_tx = max_txsize_lookup[bsize]; TX_SIZE best_min_tx_size = TX_SIZES_ALL; uint8_t best_blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE * 8]; - const int n4 = 1 << (num_pels_log2_lookup[bsize] - 2 * tx_size_wide_log2[0]); + const int n4 = bsize_to_num_blk(bsize); int idx, idy; int prune = 0; const int count32 =