Merge "rdopt: clear maybe-uninitialized variable warning" into nextgenv2
diff --git a/aom_dsp/bitwriter.h b/aom_dsp/bitwriter.h index ef529fc..b437669 100644 --- a/aom_dsp/bitwriter.h +++ b/aom_dsp/bitwriter.h
@@ -27,6 +27,10 @@ #endif #include "aom_dsp/prob.h" +#if CONFIG_RD_DEBUG +#include "av1/encoder/cost.h" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -39,6 +43,8 @@ typedef struct aom_dk_writer aom_writer; #endif +typedef struct TOKEN_STATS { int64_t cost; } TOKEN_STATS; + static INLINE void aom_start_encode(aom_writer *bc, uint8_t *buffer) { #if CONFIG_ANS (void)bc; @@ -72,10 +78,25 @@ #endif } +static INLINE void aom_write_record(aom_writer *br, int bit, int probability, + TOKEN_STATS *token_stats) { + aom_write(br, bit, probability); +#if CONFIG_RD_DEBUG + token_stats->cost += av1_cost_bit(probability, bit); +#else + (void)token_stats; +#endif +} + static INLINE void aom_write_bit(aom_writer *w, int bit) { aom_write(w, bit, 128); // aom_prob_half } +static INLINE void aom_write_bit_record(aom_writer *w, int bit, + TOKEN_STATS *token_stats) { + aom_write_record(w, bit, 128, token_stats); // aom_prob_half +} + static INLINE void aom_write_literal(aom_writer *w, int data, int bits) { int bit; @@ -92,6 +113,18 @@ } while (len); } +static INLINE void aom_write_tree_bits_record(aom_writer *w, + const aom_tree_index *tr, + const aom_prob *probs, int bits, + int len, aom_tree_index i, + TOKEN_STATS *token_stats) { + do { + const int bit = (bits >> --len) & 1; + aom_write_record(w, bit, probs[i >> 1], token_stats); + i = tr[i + bit]; + } while (len); +} + static INLINE void aom_write_tree(aom_writer *w, const aom_tree_index *tree, const aom_prob *probs, int bits, int len, aom_tree_index i) { @@ -102,6 +135,19 @@ #endif } +static INLINE void aom_write_tree_record(aom_writer *w, + const aom_tree_index *tree, + const aom_prob *probs, int bits, + int len, aom_tree_index i, + TOKEN_STATS *token_stats) { +#if CONFIG_DAALA_EC + (void)token_stats; + daala_write_tree_bits(w, tree, probs, bits, len, i); +#else + aom_write_tree_bits_record(w, tree, probs, bits, len, i, token_stats); +#endif +} + #if CONFIG_EC_MULTISYMBOL static INLINE void aom_write_symbol(aom_writer *w, int symb, aom_cdf_prob *cdf, int nsymbs) {
diff --git a/av1/common/blockd.h b/av1/common/blockd.h index 4d8f5e2..1d08cfa 100644 --- a/av1/common/blockd.h +++ b/av1/common/blockd.h
@@ -250,6 +250,11 @@ #if CONFIG_DELTA_Q int current_q_index; #endif +#if CONFIG_RD_DEBUG + int64_t txb_coeff_cost[MAX_MB_PLANE]; + int mi_row; + int mi_col; +#endif } MB_MODE_INFO; typedef struct MODE_INFO {
diff --git a/av1/common/warped_motion.c b/av1/common/warped_motion.c index 89534de..ad92150 100644 --- a/av1/common/warped_motion.c +++ b/av1/common/warped_motion.c
@@ -139,31 +139,6 @@ } } -static const int16_t filter_4tap[WARPEDPIXEL_PREC_SHIFTS][4] = { - { 0, 128, 0, 0 }, { -1, 127, 2, 0 }, { -2, 127, 4, -1 }, - { -3, 126, 6, -1 }, { -3, 125, 8, -2 }, { -4, 124, 11, -3 }, - { -5, 123, 13, -3 }, { -5, 121, 15, -3 }, { -6, 120, 18, -4 }, - { -7, 119, 20, -4 }, { -7, 118, 22, -5 }, { -8, 116, 25, -5 }, - { -8, 115, 27, -6 }, { -9, 113, 30, -6 }, { -9, 112, 32, -7 }, - { -9, 110, 34, -7 }, { -10, 108, 37, -7 }, { -10, 107, 39, -8 }, - { -10, 105, 41, -8 }, { -11, 103, 44, -8 }, { -11, 101, 47, -9 }, - { -11, 99, 49, -9 }, { -11, 97, 51, -9 }, { -11, 95, 54, -10 }, - { -11, 93, 56, -10 }, { -12, 91, 59, -10 }, { -12, 89, 61, -10 }, - { -12, 87, 64, -11 }, { -12, 85, 66, -11 }, { -12, 82, 69, -11 }, - { -12, 80, 71, -11 }, { -12, 78, 73, -11 }, { -11, 75, 75, -11 }, - { -11, 73, 78, -12 }, { -11, 71, 80, -12 }, { -11, 69, 82, -12 }, - { -11, 66, 85, -12 }, { -11, 64, 87, -12 }, { -10, 61, 89, -12 }, - { -10, 59, 91, -12 }, { -10, 56, 93, -11 }, { -10, 54, 95, -11 }, - { -9, 51, 97, -11 }, { -9, 49, 99, -11 }, { -9, 47, 101, -11 }, - { -8, 44, 103, -11 }, { -8, 41, 105, -10 }, { -8, 39, 107, -10 }, - { -7, 37, 108, -10 }, { -7, 34, 110, -9 }, { -7, 32, 112, -9 }, - { -6, 30, 113, -9 }, { -6, 27, 115, -8 }, { -5, 25, 116, -8 }, - { -5, 22, 118, -7 }, { -4, 20, 119, -7 }, { -4, 18, 120, -6 }, - { -3, 15, 121, -5 }, { -3, 13, 123, -5 }, { -3, 11, 124, -4 }, - { -2, 8, 125, -3 }, { -1, 6, 126, -3 }, { -1, 4, 127, -2 }, - { 0, 2, 127, -1 }, -}; - static const int16_t filter_ntap[WARPEDPIXEL_PREC_SHIFTS][WARPEDPIXEL_FILTER_TAPS] = { { 0, 0, 128, 0, 0, 0 }, { 0, -1, 128, 2, -1, 0 }, @@ -700,7 +675,7 @@ g = s = scale = 0.0; if (i < m) { for (k = i; k < m; k++) scale += fabs(u[k][i]); - if (scale) { + if (scale != 0.) { for (k = i; k < m; k++) { u[k][i] /= scale; s += u[k][i] * u[k][i]; @@ -721,7 +696,7 @@ g = s = scale = 0.0; if (i < m && i != n - 1) { for (k = l; k < n; k++) scale += fabs(u[i][k]); - if (scale) { + if (scale != 0.) { for (k = l; k < n; k++) { u[i][k] /= scale; s += u[i][k] * u[i][k]; @@ -743,7 +718,7 @@ for (i = n - 1; i >= 0; i--) { if (i < n - 1) { - if (g) { + if (g != 0.) { for (j = l; j < n; j++) v[j][i] = (u[i][j] / u[i][l]) / g; for (j = l; j < n; j++) { for (s = 0.0, k = l; k < n; k++) s += u[i][k] * v[k][j]; @@ -760,7 +735,7 @@ l = i + 1; g = w[i]; for (j = l; j < n; j++) u[i][j] = 0.0; - if (g) { + if (g != 0.) { g = 1.0 / g; for (j = l; j < n; j++) { for (s = 0.0, k = l; k < m; k++) s += u[k][i] * u[k][j]; @@ -848,7 +823,7 @@ } z = pythag(f, h); w[j] = z; - if (z) { + if (z != 0.) { z = 1.0 / z; c = f * z; s = h * z;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index e9e1def..026dcbc 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -442,6 +442,10 @@ // TODO(slavarnway): Generate sb_type based on bwl and bhl, instead of // passing bsize from decode_partition(). xd->mi[0]->mbmi.sb_type = bsize; +#if CONFIG_RD_DEBUG + xd->mi[0]->mbmi.mi_row = mi_row; + xd->mi[0]->mbmi.mi_col = mi_col; +#endif for (y = 0; y < y_mis; ++y) for (x = !y; x < x_mis; ++x) xd->mi[y * cm->mi_stride + x] = xd->mi[0];
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 1ed11f4..50583f5 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -665,6 +665,83 @@ } #endif // CONFIG_EXT_INTRA +static void read_tx_type(const AV1_COMMON *const cm, MACROBLOCKD *xd, + MB_MODE_INFO *mbmi, +#if CONFIG_SUPERTX + int supertx_enabled, +#endif + aom_reader *r) { + const int inter_block = is_inter_block(mbmi); + const TX_SIZE tx_size = mbmi->tx_size; + if (!FIXED_TX_TYPE) { +#if CONFIG_EXT_TX + if (get_ext_tx_types(tx_size, mbmi->sb_type, inter_block) > 1 && + cm->base_qindex > 0 && !mbmi->skip && +#if CONFIG_SUPERTX + !supertx_enabled && +#endif // CONFIG_SUPERTX + !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { + int eset = get_ext_tx_set(tx_size, mbmi->sb_type, inter_block); + FRAME_COUNTS *counts = xd->counts; + + if (inter_block) { + if (eset > 0) { + mbmi->tx_type = aom_read_tree( + r, av1_ext_tx_inter_tree[eset], + cm->fc->inter_ext_tx_prob[eset][txsize_sqr_map[tx_size]], + ACCT_STR); + if (counts) + ++counts->inter_ext_tx[eset][txsize_sqr_map[tx_size]] + [mbmi->tx_type]; + } + } else if (ALLOW_INTRA_EXT_TX) { + if (eset > 0) { + mbmi->tx_type = aom_read_tree( + r, av1_ext_tx_intra_tree[eset], + cm->fc->intra_ext_tx_prob[eset][tx_size][mbmi->mode], ACCT_STR); + if (counts) + ++counts->intra_ext_tx[eset][tx_size][mbmi->mode][mbmi->tx_type]; + } + } + } else { + mbmi->tx_type = DCT_DCT; + } +#else + if (tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip && +#if CONFIG_SUPERTX + !supertx_enabled && +#endif // CONFIG_SUPERTX + !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { + FRAME_COUNTS *counts = xd->counts; + if (inter_block) { +#if CONFIG_DAALA_EC + mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol( + r, cm->fc->inter_ext_tx_cdf[tx_size], TX_TYPES, ACCT_STR)]; +#else + mbmi->tx_type = aom_read_tree( + r, av1_ext_tx_tree, cm->fc->inter_ext_tx_prob[tx_size], ACCT_STR); +#endif + if (counts) ++counts->inter_ext_tx[tx_size][mbmi->tx_type]; + } else { + const TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode]; +#if CONFIG_DAALA_EC + mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol( + r, cm->fc->intra_ext_tx_cdf[tx_size][tx_type_nom], TX_TYPES, + ACCT_STR)]; +#else + mbmi->tx_type = aom_read_tree( + r, av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[tx_size][tx_type_nom], + ACCT_STR); +#endif + if (counts) ++counts->intra_ext_tx[tx_size][tx_type_nom][mbmi->tx_type]; + } + } else { + mbmi->tx_type = DCT_DCT; + } +#endif // CONFIG_EXT_TX + } +} + static void read_intra_frame_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd, int mi_row, int mi_col, aom_reader *r) { @@ -762,47 +839,11 @@ if (bsize >= BLOCK_8X8) read_filter_intra_mode_info(cm, xd, r); #endif // CONFIG_FILTER_INTRA - if (!FIXED_TX_TYPE) { -#if CONFIG_EXT_TX - if (get_ext_tx_types(mbmi->tx_size, mbmi->sb_type, 0) > 1 && - cm->base_qindex > 0 && !mbmi->skip && - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP) && - ALLOW_INTRA_EXT_TX) { - FRAME_COUNTS *counts = xd->counts; - int eset = get_ext_tx_set(mbmi->tx_size, mbmi->sb_type, 0); - if (eset > 0) { - mbmi->tx_type = aom_read_tree( - r, av1_ext_tx_intra_tree[eset], - cm->fc->intra_ext_tx_prob[eset][mbmi->tx_size][mbmi->mode], - ACCT_STR); - if (counts) - ++counts->intra_ext_tx[eset][mbmi->tx_size][mbmi->mode] - [mbmi->tx_type]; - } - } else { - mbmi->tx_type = DCT_DCT; - } -#else - if (mbmi->tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip && - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { - FRAME_COUNTS *counts = xd->counts; - TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode]; -#if CONFIG_DAALA_EC - mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol( - r, cm->fc->intra_ext_tx_cdf[mbmi->tx_size][tx_type_nom], TX_TYPES, - ACCT_STR)]; -#else - mbmi->tx_type = aom_read_tree( - r, av1_ext_tx_tree, - cm->fc->intra_ext_tx_prob[mbmi->tx_size][tx_type_nom], ACCT_STR); + read_tx_type(cm, xd, mbmi, +#if CONFIG_SUPERTX + 0, #endif - if (counts) - ++counts->intra_ext_tx[mbmi->tx_size][tx_type_nom][mbmi->tx_type]; - } else { - mbmi->tx_type = DCT_DCT; - } -#endif // CONFIG_EXT_TX - } + r); } static int read_mv_component(aom_reader *r, nmv_component *mvcomp, int usehp) { @@ -1871,77 +1912,11 @@ else read_intra_block_mode_info(cm, xd, mi, r); - if (!FIXED_TX_TYPE) { -#if CONFIG_EXT_TX - if (get_ext_tx_types(mbmi->tx_size, mbmi->sb_type, inter_block) > 1 && - cm->base_qindex > 0 && !mbmi->skip && + read_tx_type(cm, xd, mbmi, #if CONFIG_SUPERTX - !supertx_enabled && -#endif // CONFIG_SUPERTX - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { - int eset = get_ext_tx_set(mbmi->tx_size, mbmi->sb_type, inter_block); - FRAME_COUNTS *counts = xd->counts; - - if (inter_block) { - if (eset > 0) { - mbmi->tx_type = aom_read_tree( - r, av1_ext_tx_inter_tree[eset], - cm->fc->inter_ext_tx_prob[eset][txsize_sqr_map[mbmi->tx_size]], - ACCT_STR); - if (counts) - ++counts->inter_ext_tx[eset][txsize_sqr_map[mbmi->tx_size]] - [mbmi->tx_type]; - } - } else if (ALLOW_INTRA_EXT_TX) { - if (eset > 0) { - mbmi->tx_type = aom_read_tree( - r, av1_ext_tx_intra_tree[eset], - cm->fc->intra_ext_tx_prob[eset][mbmi->tx_size][mbmi->mode], - ACCT_STR); - if (counts) - ++counts->intra_ext_tx[eset][mbmi->tx_size][mbmi->mode] - [mbmi->tx_type]; - } - } - } else { - mbmi->tx_type = DCT_DCT; - } -#else - if (mbmi->tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip && -#if CONFIG_SUPERTX - !supertx_enabled && -#endif // CONFIG_SUPERTX - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { - FRAME_COUNTS *counts = xd->counts; - if (inter_block) { -#if CONFIG_DAALA_EC - mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol( - r, cm->fc->inter_ext_tx_cdf[mbmi->tx_size], TX_TYPES, ACCT_STR)]; -#else - mbmi->tx_type = - aom_read_tree(r, av1_ext_tx_tree, - cm->fc->inter_ext_tx_prob[mbmi->tx_size], ACCT_STR); + supertx_enabled, #endif - if (counts) ++counts->inter_ext_tx[mbmi->tx_size][mbmi->tx_type]; - } else { - const TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode]; -#if CONFIG_DAALA_EC - mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol( - r, cm->fc->intra_ext_tx_cdf[mbmi->tx_size][tx_type_nom], TX_TYPES, - ACCT_STR)]; -#else - mbmi->tx_type = aom_read_tree( - r, av1_ext_tx_tree, - cm->fc->intra_ext_tx_prob[mbmi->tx_size][tx_type_nom], ACCT_STR); -#endif - if (counts) - ++counts->intra_ext_tx[mbmi->tx_size][tx_type_nom][mbmi->tx_type]; - } - } else { - mbmi->tx_type = DCT_DCT; - } -#endif // CONFIG_EXT_TX - } + r); } void av1_read_mode_info(AV1Decoder *const pbi, MACROBLOCKD *xd,
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 0459603..7c78eda 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -717,7 +717,8 @@ static void pack_mb_tokens(aom_writer *w, const TOKENEXTRA **tp, const TOKENEXTRA *const stop, - aom_bit_depth_t bit_depth, const TX_SIZE tx_size) { + aom_bit_depth_t bit_depth, const TX_SIZE tx_size, + TOKEN_STATS *token_stats) { const TOKENEXTRA *p = *tp; #if CONFIG_VAR_TX int count = 0; @@ -745,10 +746,11 @@ #if CONFIG_EC_MULTISYMBOL /* skip one or two nodes */ - if (!p->skip_eob_node) aom_write(w, token != EOB_TOKEN, p->context_tree[0]); + if (!p->skip_eob_node) + aom_write_record(w, token != EOB_TOKEN, p->context_tree[0], token_stats); if (token != EOB_TOKEN) { - aom_write(w, token != ZERO_TOKEN, p->context_tree[1]); + aom_write_record(w, token != ZERO_TOKEN, p->context_tree[1], token_stats); if (token != ZERO_TOKEN) { aom_write_symbol(w, token - ONE_TOKEN, *p->token_cdf, @@ -760,19 +762,21 @@ if (p->skip_eob_node) coef_length -= p->skip_eob_node; else - aom_write(w, token != EOB_TOKEN, p->context_tree[0]); + aom_write_record(w, token != EOB_TOKEN, p->context_tree[0], token_stats); if (token != EOB_TOKEN) { - aom_write(w, token != ZERO_TOKEN, p->context_tree[1]); + aom_write_record(w, token != ZERO_TOKEN, p->context_tree[1], token_stats); if (token != ZERO_TOKEN) { - aom_write(w, token != ONE_TOKEN, p->context_tree[2]); + aom_write_record(w, token != ONE_TOKEN, p->context_tree[2], + token_stats); if (token != ONE_TOKEN) { const int unconstrained_len = UNCONSTRAINED_NODES - p->skip_eob_node; - aom_write_tree(w, av1_coef_con_tree, - av1_pareto8_full[p->context_tree[PIVOT_NODE] - 1], - coef_value, coef_length - unconstrained_len, 0); + aom_write_tree_record( + w, av1_coef_con_tree, + av1_pareto8_full[p->context_tree[PIVOT_NODE] - 1], coef_value, + coef_length - unconstrained_len, 0, token_stats); } } } @@ -800,12 +804,12 @@ --skip_bits; assert(!bb); } else { - aom_write(w, bb, pb[index]); + aom_write_record(w, bb, pb[index], token_stats); } } } - aom_write_bit(w, bit_string & 1); + aom_write_bit_record(w, bit_string & 1, token_stats); } ++p; @@ -824,7 +828,7 @@ MB_MODE_INFO *mbmi, int plane, BLOCK_SIZE plane_bsize, aom_bit_depth_t bit_depth, int block, int blk_row, int blk_col, - TX_SIZE tx_size) { + TX_SIZE tx_size, TOKEN_STATS *token_stats) { const struct macroblockd_plane *const pd = &xd->plane[plane]; const BLOCK_SIZE bsize = txsize_to_bsize[tx_size]; const int tx_row = blk_row >> (1 - pd->subsampling_y); @@ -840,7 +844,7 @@ : mbmi->inter_tx_size[tx_row][tx_col]; if (tx_size == plane_tx_size) { - pack_mb_tokens(w, tp, tok_end, bit_depth, tx_size); + pack_mb_tokens(w, tp, tok_end, bit_depth, tx_size, token_stats); } else { const int bsl = block_size_wide[bsize] >> (tx_size_wide_log2[0] + 1); int i; @@ -856,7 +860,7 @@ if (offsetr >= max_blocks_high || offsetc >= max_blocks_wide) continue; pack_txb_tokens(w, tp, tok_end, xd, mbmi, plane, plane_bsize, bit_depth, - block, offsetr, offsetc, sub_txs); + block, offsetr, offsetc, sub_txs, token_stats); block += step; } } @@ -1118,6 +1122,80 @@ } #endif // CONFIG_PALETTE +static void write_tx_type(const AV1_COMMON *const cm, + const MB_MODE_INFO *const mbmi, +#if CONFIG_SUPERTX + const int supertx_enabled, +#endif + aom_writer *w) { + const int is_inter = is_inter_block(mbmi); + const TX_SIZE tx_size = mbmi->tx_size; + if (!FIXED_TX_TYPE) { +#if CONFIG_EXT_TX + const BLOCK_SIZE bsize = mbmi->sb_type; + if (get_ext_tx_types(tx_size, bsize, is_inter) > 1 && cm->base_qindex > 0 && + !mbmi->skip && +#if CONFIG_SUPERTX + !supertx_enabled && +#endif // CONFIG_SUPERTX + !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { + int eset = get_ext_tx_set(tx_size, bsize, is_inter); + if (is_inter) { + assert(ext_tx_used_inter[eset][mbmi->tx_type]); + if (eset > 0) + av1_write_token( + w, av1_ext_tx_inter_tree[eset], + cm->fc->inter_ext_tx_prob[eset][txsize_sqr_map[tx_size]], + &ext_tx_inter_encodings[eset][mbmi->tx_type]); + } else if (ALLOW_INTRA_EXT_TX) { + if (eset > 0) + av1_write_token(w, av1_ext_tx_intra_tree[eset], + cm->fc->intra_ext_tx_prob[eset][tx_size][mbmi->mode], + &ext_tx_intra_encodings[eset][mbmi->tx_type]); + } + } +#else + if (tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip && +#if CONFIG_SUPERTX + !supertx_enabled && +#endif // CONFIG_SUPERTX + !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { + if (is_inter) { +#if CONFIG_DAALA_EC + aom_write_symbol(w, av1_ext_tx_ind[mbmi->tx_type], + cm->fc->inter_ext_tx_cdf[tx_size], TX_TYPES); +#else + av1_write_token(w, av1_ext_tx_tree, cm->fc->inter_ext_tx_prob[tx_size], + &ext_tx_encodings[mbmi->tx_type]); +#endif + } else { +#if CONFIG_DAALA_EC + aom_write_symbol( + w, av1_ext_tx_ind[mbmi->tx_type], + cm->fc->intra_ext_tx_cdf[tx_size] + [intra_mode_to_tx_type_context[mbmi->mode]], + TX_TYPES); +#else + av1_write_token( + w, av1_ext_tx_tree, + cm->fc + ->intra_ext_tx_prob[tx_size] + [intra_mode_to_tx_type_context[mbmi->mode]], + &ext_tx_encodings[mbmi->tx_type]); +#endif + } + } else { + if (!mbmi->skip) { +#if CONFIG_SUPERTX + if (!supertx_enabled) +#endif // CONFIG_SUPERTX + assert(mbmi->tx_type == DCT_DCT); + } + } +#endif // CONFIG_EXT_TX + } +} + static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi, #if CONFIG_SUPERTX int supertx_enabled, @@ -1531,71 +1609,11 @@ #endif // CONFIG_EXT_INTERP } - if (!FIXED_TX_TYPE) { -#if CONFIG_EXT_TX - if (get_ext_tx_types(mbmi->tx_size, bsize, is_inter) > 1 && - cm->base_qindex > 0 && !mbmi->skip && + write_tx_type(cm, mbmi, #if CONFIG_SUPERTX - !supertx_enabled && -#endif // CONFIG_SUPERTX - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { - int eset = get_ext_tx_set(mbmi->tx_size, bsize, is_inter); - if (is_inter) { - assert(ext_tx_used_inter[eset][mbmi->tx_type]); - if (eset > 0) - av1_write_token( - w, av1_ext_tx_inter_tree[eset], - cm->fc->inter_ext_tx_prob[eset][txsize_sqr_map[mbmi->tx_size]], - &ext_tx_inter_encodings[eset][mbmi->tx_type]); - } else if (ALLOW_INTRA_EXT_TX) { - if (eset > 0) - av1_write_token( - w, av1_ext_tx_intra_tree[eset], - cm->fc->intra_ext_tx_prob[eset][mbmi->tx_size][mbmi->mode], - &ext_tx_intra_encodings[eset][mbmi->tx_type]); - } - } -#else - if (mbmi->tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip && -#if CONFIG_SUPERTX - !supertx_enabled && -#endif // CONFIG_SUPERTX - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { - if (is_inter) { -#if CONFIG_DAALA_EC - aom_write_symbol(w, av1_ext_tx_ind[mbmi->tx_type], - cm->fc->inter_ext_tx_cdf[mbmi->tx_size], TX_TYPES); -#else - av1_write_token(w, av1_ext_tx_tree, - cm->fc->inter_ext_tx_prob[mbmi->tx_size], - &ext_tx_encodings[mbmi->tx_type]); + supertx_enabled, #endif - } else { -#if CONFIG_DAALA_EC - aom_write_symbol( - w, av1_ext_tx_ind[mbmi->tx_type], - cm->fc->intra_ext_tx_cdf[mbmi->tx_size] - [intra_mode_to_tx_type_context[mbmi->mode]], - TX_TYPES); -#else - av1_write_token( - w, av1_ext_tx_tree, - cm->fc - ->intra_ext_tx_prob[mbmi->tx_size] - [intra_mode_to_tx_type_context[mbmi->mode]], - &ext_tx_encodings[mbmi->tx_type]); -#endif - } - } else { - if (!mbmi->skip) { -#if CONFIG_SUPERTX - if (!supertx_enabled) -#endif // CONFIG_SUPERTX - assert(mbmi->tx_type == DCT_DCT); - } - } -#endif // CONFIG_EXT_TX - } + w); } #if CONFIG_DELTA_Q @@ -1681,38 +1699,11 @@ if (bsize >= BLOCK_8X8) write_filter_intra_mode_info(cm, mbmi, w); #endif // CONFIG_FILTER_INTRA - if (!FIXED_TX_TYPE) { -#if CONFIG_EXT_TX - if (get_ext_tx_types(mbmi->tx_size, bsize, 0) > 1 && cm->base_qindex > 0 && - !mbmi->skip && - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP) && - ALLOW_INTRA_EXT_TX) { - int eset = get_ext_tx_set(mbmi->tx_size, bsize, 0); - if (eset > 0) - av1_write_token( - w, av1_ext_tx_intra_tree[eset], - cm->fc->intra_ext_tx_prob[eset][mbmi->tx_size][mbmi->mode], - &ext_tx_intra_encodings[eset][mbmi->tx_type]); - } -#else - if (mbmi->tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip && - !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { -#if CONFIG_DAALA_EC - aom_write_symbol( - w, av1_ext_tx_ind[mbmi->tx_type], - cm->fc->intra_ext_tx_cdf[mbmi->tx_size] - [intra_mode_to_tx_type_context[mbmi->mode]], - TX_TYPES); -#else - av1_write_token( - w, av1_ext_tx_tree, - cm->fc->intra_ext_tx_prob[mbmi->tx_size] - [intra_mode_to_tx_type_context[mbmi->mode]], - &ext_tx_encodings[mbmi->tx_type]); + write_tx_type(cm, mbmi, +#if CONFIG_SUPERTX + 0, #endif - } -#endif // CONFIG_EXT_TX - } + w); } #if CONFIG_SUPERTX @@ -1725,6 +1716,20 @@ write_modes_b(cpi, tile, w, tok, tok_end, mi_row, mi_col) #endif // CONFIG_SUPERTX +#if CONFIG_RD_DEBUG +static void dump_mode_info(MODE_INFO *mi) { + printf("\nmi->mbmi.mi_row == %d\n", mi->mbmi.mi_row); + printf("&& mi->mbmi.mi_col == %d\n", mi->mbmi.mi_col); + printf("&& mi->mbmi.sb_type == %d\n", mi->mbmi.sb_type); + printf("&& mi->mbmi.tx_size == %d\n", mi->mbmi.tx_size); + if (mi->mbmi.sb_type >= BLOCK_8X8) { + printf("&& mi->mbmi.mode == %d\n", mi->mbmi.mode); + } else { + printf("&& mi->bmi[0].as_mode == %d\n", mi->bmi[0].as_mode); + } +} +#endif + static void write_modes_b(AV1_COMP *cpi, const TileInfo *const tile, aom_writer *w, const TOKENEXTRA **tok, const TOKENEXTRA *const tok_end, @@ -1737,6 +1742,9 @@ MODE_INFO *m; int plane; int bh, bw; +#if CONFIG_RD_DEBUG + int64_t txb_coeff_cost[MAX_MB_PLANE] = { 0 }; +#endif #if CONFIG_RANS (void)tok; (void)tok_end; @@ -1836,11 +1844,18 @@ #if CONFIG_EXT_TX && CONFIG_RECT_TX TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, &xd->plane[plane]) : mbmi->tx_size; - - if (is_inter_block(mbmi) && !is_rect_tx(tx_size)) { -#else - if (is_inter_block(mbmi)) { #endif + + TOKEN_STATS token_stats; + token_stats.cost = 0; + +#if CONFIG_EXT_TX && CONFIG_RECT_TX + + if (is_inter_block(mbmi) && !is_rect_tx(tx_size)) +#else + if (is_inter_block(mbmi)) +#endif + { const TX_SIZE max_tx_size = max_txsize_lookup[plane_bsize]; int block = 0; const int step = @@ -1850,7 +1865,8 @@ for (row = 0; row < num_4x4_h; row += bkh) { for (col = 0; col < num_4x4_w; col += bkw) { pack_txb_tokens(w, tok, tok_end, xd, mbmi, plane, plane_bsize, - cm->bit_depth, block, row, col, max_tx_size); + cm->bit_depth, block, row, col, max_tx_size, + &token_stats); block += step; } } @@ -1862,17 +1878,34 @@ for (row = 0; row < num_4x4_h; row += bkh) for (col = 0; col < num_4x4_w; col += bkw) - pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx); + pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx, &token_stats); } #else TX_SIZE tx = plane ? get_uv_tx_size(&m->mbmi, &xd->plane[plane]) : m->mbmi.tx_size; - pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx); + TOKEN_STATS token_stats; + token_stats.cost = 0; + pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx, &token_stats); #endif // CONFIG_VAR_TX + +#if CONFIG_RD_DEBUG + txb_coeff_cost[plane] += token_stats.cost; +#else + (void)token_stats; +#endif + assert(*tok < tok_end && (*tok)->token == EOSB_TOKEN); (*tok)++; } } +#if CONFIG_RD_DEBUG + for (plane = 0; plane < MAX_MB_PLANE; ++plane) { + if (m->mbmi.txb_coeff_cost[plane] != txb_coeff_cost[plane]) { + dump_mode_info(m); + assert(0); + } + } +#endif } static void write_partition(const AV1_COMMON *const cm, @@ -2070,9 +2103,11 @@ BLOCK_SIZE txb_size = txsize_to_bsize[tx]; int bw = num_4x4_blocks_wide_lookup[txb_size]; + TOKEN_STATS token_stats; + token_stats.cost = 0; for (row = 0; row < num_4x4_h; row += bw) for (col = 0; col < num_4x4_w; col += bw) - pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx); + pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx, &token_stats); assert(*tok < tok_end && (*tok)->token == EOSB_TOKEN); (*tok)++; }
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 8b0de2f..6f82e83 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -1634,6 +1634,10 @@ set_offsets(cpi, tile_info, x, mi_row, mi_col, bsize); mbmi = &xd->mi[0]->mbmi; mbmi->sb_type = bsize; +#if CONFIG_RD_DEBUG + mbmi->mi_row = mi_row; + mbmi->mi_col = mi_col; +#endif #if CONFIG_SUPERTX // We set tx_size here as skip blocks would otherwise not set it. // tx_size needs to be set at this point as supertx_enable in @@ -6181,11 +6185,7 @@ const struct macroblockd_plane *const pd = &xd->plane[plane]; int coeff_ctx = 1; RD_STATS this_rd_stats; - - this_rd_stats.rate = 0; - this_rd_stats.dist = 0; - this_rd_stats.sse = 0; - this_rd_stats.skip = 1; + av1_init_rd_stats(&this_rd_stats); tx_size = max_txsize_lookup[bsize]; tx_size = @@ -6240,10 +6240,7 @@ mbmi->tx_type = tx_type; #if CONFIG_VAR_TX - this_rd_stats.rate = 0; - this_rd_stats.dist = 0; - this_rd_stats.sse = 0; - this_rd_stats.skip = 1; + av1_init_rd_stats(&this_rd_stats); av1_get_entropy_contexts(bsize, tx_size, pd, ctxa, ctxl); coeff_ctx = combine_entropy_contexts(ctxa[0], ctxl[0]);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index eb91ffa..947fefd 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -2936,6 +2936,7 @@ int max_blocks_wide = block_size_wide[plane_bsize]; const int diff_stride = max_blocks_wide; const int16_t *diff = &p->src_diff[4 * (blk_row * diff_stride + blk_col)]; + int txb_coeff_cost; #if CONFIG_EXT_TX assert(tx_size < TX_SIZES); #endif // CONFIG_EXT_TX @@ -3035,9 +3036,13 @@ } } rd_stats->dist += tmp * 16; - rd_stats->rate += av1_cost_coeffs(cm, x, plane, block, coeff_ctx, tx_size, - scan_order->scan, scan_order->neighbors, 0); + txb_coeff_cost = av1_cost_coeffs(cm, x, plane, block, coeff_ctx, tx_size, + scan_order->scan, scan_order->neighbors, 0); + rd_stats->rate += txb_coeff_cost; rd_stats->skip &= (p->eobs[block] == 0); +#if CONFIG_RD_DEBUG + rd_stats->txb_coeff_cost[plane] += txb_coeff_cost; +#endif } static void select_tx_block(const AV1_COMP *cpi, MACROBLOCK *x, int blk_row, @@ -3067,12 +3072,11 @@ txfm_partition_context(tx_above + (blk_col >> 1), tx_left + (blk_row >> 1), mbmi->sb_type, tx_size); - int64_t sum_dist = 0, sum_bsse = 0; int64_t sum_rd = INT64_MAX; - int sum_rate = 0; - int all_skip = 1; int tmp_eob = 0; int zero_blk_rate; + RD_STATS sum_rd_stats; + av1_init_rd_stats(&sum_rd_stats); #if CONFIG_EXT_TX assert(tx_size < TX_SIZES); @@ -3085,10 +3089,7 @@ coeff_ctx = get_entropy_context(tx_size, pta, ptl); - rd_stats->rate = 0; - rd_stats->dist = 0; - rd_stats->sse = 0; - rd_stats->skip = 1; + av1_init_rd_stats(rd_stats); if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; @@ -3129,7 +3130,8 @@ int this_cost_valid = 1; int64_t tmp_rd = 0; - sum_rate = av1_cost_bit(cpi->common.fc->txfm_partition_prob[ctx], 1); + sum_rd_stats.rate = + av1_cost_bit(cpi->common.fc->txfm_partition_prob[ctx], 1); #if CONFIG_EXT_TX assert(tx_size < TX_SIZES); #endif // CONFIG_EXT_TX @@ -3143,12 +3145,10 @@ depth + 1, plane_bsize, ta, tl, tx_above, tx_left, &this_rd_stats, ref_best_rd - tmp_rd, &this_cost_valid); - sum_rate += this_rd_stats.rate; - sum_dist += this_rd_stats.dist; - sum_bsse += this_rd_stats.sse; - all_skip &= this_rd_stats.skip; + av1_merge_rd_stats(&sum_rd_stats, &this_rd_stats); - tmp_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); + tmp_rd = + RDCOST(x->rdmult, x->rddiv, sum_rd_stats.rate, sum_rd_stats.dist); if (this_rd < tmp_rd) break; block += sub_step; } @@ -3169,10 +3169,7 @@ if (this_rd == INT64_MAX) *is_cost_valid = 0; x->blk_skip[plane][blk_row * bw + blk_col] = rd_stats->skip; } else { - rd_stats->rate = sum_rate; - rd_stats->dist = sum_dist; - rd_stats->sse = sum_bsse; - rd_stats->skip = all_skip; + *rd_stats = sum_rd_stats; if (sum_rd == INT64_MAX) *is_cost_valid = 0; } } @@ -3186,10 +3183,7 @@ if (ref_best_rd < 0) is_cost_valid = 0; - rd_stats->rate = 0; - rd_stats->dist = 0; - rd_stats->sse = 0; - rd_stats->skip = 1; + av1_init_rd_stats(rd_stats); if (is_cost_valid) { const struct macroblockd_plane *const pd = &xd->plane[0]; @@ -3208,10 +3202,7 @@ TXFM_CONTEXT tx_left[MAX_MIB_SIZE]; RD_STATS pn_rd_stats; - pn_rd_stats.rate = 0; - pn_rd_stats.skip = 1; - pn_rd_stats.dist = 0; - pn_rd_stats.sse = 0; + av1_init_rd_stats(&pn_rd_stats); av1_get_entropy_contexts(bsize, TX_4X4, pd, ctxa, ctxl); memcpy(tx_above, xd->above_txfm_context, @@ -3225,10 +3216,7 @@ mi_height != mi_width, plane_bsize, ctxa, ctxl, tx_above, tx_left, &pn_rd_stats, ref_best_rd - this_rd, &is_cost_valid); - rd_stats->rate += pn_rd_stats.rate; - rd_stats->dist += pn_rd_stats.dist; - rd_stats->sse += pn_rd_stats.sse; - rd_stats->skip &= pn_rd_stats.skip; + av1_merge_rd_stats(rd_stats, &pn_rd_stats); this_rd += AOMMIN( RDCOST(x->rdmult, x->rddiv, pn_rd_stats.rate, pn_rd_stats.dist), RDCOST(x->rdmult, x->rddiv, 0, pn_rd_stats.sse)); @@ -3243,10 +3231,7 @@ if (!is_cost_valid) { // reset cost value - rd_stats->rate = INT_MAX; - rd_stats->dist = INT64_MAX; - rd_stats->sse = INT64_MAX; - rd_stats->skip = 0; + av1_invalid_rd_stats(rd_stats); } } @@ -3385,17 +3370,11 @@ prune = prune_tx_types(cpi, bsize, x, xd, 0); #endif - rd_stats->dist = INT64_MAX; - rd_stats->rate = INT_MAX; - rd_stats->skip = 0; - rd_stats->sse = INT64_MAX; + av1_invalid_rd_stats(rd_stats); for (tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) { RD_STATS this_rd_stats; - this_rd_stats.rate = 0; - this_rd_stats.skip = 1; - this_rd_stats.dist = 0; - this_rd_stats.sse = 0; + av1_init_rd_stats(&this_rd_stats); #if CONFIG_EXT_TX if (is_inter) { if (!ext_tx_used_inter[ext_tx_set][tx_type]) continue; @@ -3438,6 +3417,10 @@ for (idx = 0; idx < xd->n8_w; ++idx) mbmi->inter_tx_size[idy][idx] = best_tx_size[idy][idx]; mbmi->tx_size = best_tx; +#if CONFIG_RD_DEBUG + // record plane y's transform block coefficient cost + mbmi->txb_coeff_cost[0] = rd_stats->txb_coeff_cost[0]; +#endif memcpy(x->blk_skip[0], best_blk_skip, sizeof(best_blk_skip[0]) * n4); } @@ -3512,10 +3495,7 @@ if (ref_best_rd < 0) is_cost_valid = 0; - rd_stats->rate = 0; - rd_stats->dist = 0; - rd_stats->sse = 0; - rd_stats->skip = 1; + av1_init_rd_stats(rd_stats); #if CONFIG_EXT_TX && CONFIG_RECT_TX if (is_rect_tx(mbmi->tx_size)) { @@ -3544,10 +3524,7 @@ ENTROPY_CONTEXT ta[2 * MAX_MIB_SIZE]; ENTROPY_CONTEXT tl[2 * MAX_MIB_SIZE]; RD_STATS pn_rd_stats; - pn_rd_stats.rate = 0; - pn_rd_stats.skip = 1; - pn_rd_stats.dist = 0; - pn_rd_stats.sse = 0; + av1_init_rd_stats(&pn_rd_stats); av1_get_entropy_contexts(bsize, TX_4X4, pd, ta, tl); @@ -3564,10 +3541,7 @@ break; } - rd_stats->rate += pn_rd_stats.rate; - rd_stats->dist += pn_rd_stats.dist; - rd_stats->sse += pn_rd_stats.sse; - rd_stats->skip &= pn_rd_stats.skip; + av1_merge_rd_stats(rd_stats, &pn_rd_stats); this_rd = AOMMIN(RDCOST(x->rdmult, x->rddiv, rd_stats->rate, rd_stats->dist), @@ -3581,10 +3555,7 @@ if (!is_cost_valid) { // reset cost value - rd_stats->rate = INT_MAX; - rd_stats->dist = INT64_MAX; - rd_stats->sse = INT64_MAX; - rd_stats->skip = 0; + av1_invalid_rd_stats(rd_stats); } return is_cost_valid; @@ -7554,6 +7525,11 @@ #if CONFIG_VAR_TX is_cost_valid_uv = inter_block_uvrd(cpi, x, &rd_stats_uv, bsize, ref_best_rd - rdcosty); +#if CONFIG_RD_DEBUG + // record uv planes' transform block coefficient cost + mbmi->txb_coeff_cost[1] = rd_stats_uv.txb_coeff_cost[1]; + mbmi->txb_coeff_cost[2] = rd_stats_uv.txb_coeff_cost[2]; +#endif *rate_uv = rd_stats_uv.rate; distortion_uv = rd_stats_uv.dist; skippable_uv = rd_stats_uv.skip;
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h index 8c65770..cb9666a 100644 --- a/av1/encoder/rdopt.h +++ b/av1/encoder/rdopt.h
@@ -33,7 +33,53 @@ int64_t dist; int64_t sse; int skip; +#if CONFIG_RD_DEBUG + int txb_coeff_cost[MAX_MB_PLANE]; +#endif } RD_STATS; + +static INLINE void av1_init_rd_stats(RD_STATS *rd_stats) { +#if CONFIG_RD_DEBUG + int plane; +#endif + rd_stats->rate = 0; + rd_stats->dist = 0; + rd_stats->sse = 0; + rd_stats->skip = 1; +#if CONFIG_RD_DEBUG + for (plane = 0; plane < MAX_MB_PLANE; ++plane) + rd_stats->txb_coeff_cost[plane] = 0; +#endif +} + +static INLINE void av1_invalid_rd_stats(RD_STATS *rd_stats) { +#if CONFIG_RD_DEBUG + int plane; +#endif + rd_stats->rate = INT_MAX; + rd_stats->dist = INT64_MAX; + rd_stats->sse = INT64_MAX; + rd_stats->skip = 0; +#if CONFIG_RD_DEBUG + for (plane = 0; plane < MAX_MB_PLANE; ++plane) + rd_stats->txb_coeff_cost[plane] = INT_MAX; +#endif +} + +static INLINE void av1_merge_rd_stats(RD_STATS *rd_stats_dst, + const RD_STATS *rd_stats_src) { +#if CONFIG_RD_DEBUG + int plane; +#endif + rd_stats_dst->rate += rd_stats_src->rate; + rd_stats_dst->dist += rd_stats_src->dist; + rd_stats_dst->sse += rd_stats_src->sse; + rd_stats_dst->skip &= rd_stats_src->skip; +#if CONFIG_RD_DEBUG + for (plane = 0; plane < MAX_MB_PLANE; ++plane) + rd_stats_dst->txb_coeff_cost[plane] += rd_stats_src->txb_coeff_cost[plane]; +#endif +} #endif int av1_cost_coeffs(const AV1_COMMON *const cm, MACROBLOCK *x, int plane,