Redo txfm/quant in av1_txk_search Change-Id: I622d499187f3881b274ca6cf3745f51fa0103b18
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c index 5f136b3..d0ce9a6 100644 --- a/av1/encoder/encodetxb.c +++ b/av1/encoder/encodetxb.c
@@ -734,7 +734,6 @@ TX_TYPE txk_end = TX_TYPES - 1; TX_TYPE best_tx_type = txk_start; int64_t best_rd = INT64_MAX; - int best_eob = tx_size_2d[tx_size]; const int coeff_ctx = combine_entropy_contexts(*a, *l); TX_TYPE tx_type; for (tx_type = txk_start; tx_type <= txk_end; ++tx_type) { @@ -753,7 +752,8 @@ if (x->plane[plane].eobs[block] && !xd->lossless[mbmi->segment_id]) av1_optimize_b(cm, x, plane, block, tx_size, coeff_ctx); av1_dist_block(cpi, x, plane, plane_bsize, block, blk_row, blk_col, tx_size, - &this_rd_stats.dist, &this_rd_stats.sse, 0); + &this_rd_stats.dist, &this_rd_stats.sse, + OUTPUT_HAS_PREDICTED_PIXELS); const SCAN_ORDER *scan_order = get_scan(cm, tx_size, tx_type, is_inter_block(mbmi)); this_rd_stats.rate = av1_cost_coeffs( @@ -764,13 +764,21 @@ best_rd = rd; *rd_stats = this_rd_stats; best_tx_type = tx_type; - best_eob = x->plane[plane].eobs[block]; } } if (plane == 0) mbmi->txk_type[block] = best_tx_type; - x->plane[plane].eobs[block] = best_eob; - av1_inverse_transform_block_facade(xd, plane, block, blk_row, blk_col, - best_eob); + // TODO(angiebird): Instead of re-call av1_xform_quant and av1_optimize_b, + // copy the best result in the above tx_type search for loop + av1_xform_quant(cm, x, plane, block, blk_row, blk_col, plane_bsize, tx_size, + coeff_ctx, AV1_XFORM_QUANT_FP); + if (x->plane[plane].eobs[block] && !xd->lossless[mbmi->segment_id]) + av1_optimize_b(cm, x, plane, block, tx_size, coeff_ctx); + if (!is_inter_block(mbmi)) { + // intra mode needs decoded result such that the next transform block + // can use it for prediction. + av1_inverse_transform_block_facade(xd, plane, block, blk_row, blk_col, + x->plane[plane].eobs[block]); + } return best_rd; } #endif // CONFIG_TXK_SEL