Update intra_ext_tx_cdf per frame.
Move computing the intra_ext_tx_cdf tables per symbol to computing them only when the probabilities are updated. Change-Id: I26d5e419e103093e98a7d896c196176305b50fc9
This commit is contained in:
		@@ -1284,6 +1284,9 @@ const aom_tree_index av1_ext_tx_tree[TREE_SIZE(TX_TYPES)] = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
/* clang-format on */
 | 
					/* clang-format on */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int av1_ext_tx_ind[TX_TYPES];
 | 
				
			||||||
 | 
					int av1_ext_tx_inv[TX_TYPES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const aom_prob
 | 
					static const aom_prob
 | 
				
			||||||
    default_intra_ext_tx_prob[EXT_TX_SIZES][TX_TYPES][TX_TYPES - 1] = {
 | 
					    default_intra_ext_tx_prob[EXT_TX_SIZES][TX_TYPES][TX_TYPES - 1] = {
 | 
				
			||||||
      { { 240, 85, 128 }, { 4, 1, 248 }, { 4, 1, 8 }, { 4, 248, 128 } },
 | 
					      { { 240, 85, 128 }, { 4, 1, 248 }, { 4, 1, 8 }, { 4, 248, 128 } },
 | 
				
			||||||
@@ -1383,6 +1386,8 @@ static void init_mode_probs(FRAME_CONTEXT *fc) {
 | 
				
			|||||||
#if CONFIG_DAALA_EC
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
  av1_tree_to_cdf_1D(av1_switchable_interp_tree, fc->switchable_interp_prob,
 | 
					  av1_tree_to_cdf_1D(av1_switchable_interp_tree, fc->switchable_interp_prob,
 | 
				
			||||||
                     fc->switchable_interp_cdf, SWITCHABLE_FILTER_CONTEXTS);
 | 
					                     fc->switchable_interp_cdf, SWITCHABLE_FILTER_CONTEXTS);
 | 
				
			||||||
 | 
					  av1_tree_to_cdf_2D(av1_ext_tx_tree, fc->intra_ext_tx_prob,
 | 
				
			||||||
 | 
					                     fc->intra_ext_tx_cdf, EXT_TX_SIZES, TX_TYPES);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1578,10 +1583,15 @@ void av1_adapt_intra_frame_probs(AV1_COMMON *cm) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
					  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
				
			||||||
    for (j = 0; j < TX_TYPES; ++j)
 | 
					    for (j = 0; j < TX_TYPES; ++j) {
 | 
				
			||||||
      aom_tree_merge_probs(av1_ext_tx_tree, pre_fc->intra_ext_tx_prob[i][j],
 | 
					      aom_tree_merge_probs(av1_ext_tx_tree, pre_fc->intra_ext_tx_prob[i][j],
 | 
				
			||||||
                           counts->intra_ext_tx[i][j],
 | 
					                           counts->intra_ext_tx[i][j],
 | 
				
			||||||
                           fc->intra_ext_tx_prob[i][j]);
 | 
					                           fc->intra_ext_tx_prob[i][j]);
 | 
				
			||||||
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
 | 
					      av1_tree_to_cdf(av1_ext_tx_tree, fc->intra_ext_tx_prob[i][j],
 | 
				
			||||||
 | 
					                      fc->intra_ext_tx_cdf[i][j]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
					  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
				
			||||||
    aom_tree_merge_probs(av1_ext_tx_tree, pre_fc->inter_ext_tx_prob[i],
 | 
					    aom_tree_merge_probs(av1_ext_tx_tree, pre_fc->inter_ext_tx_prob[i],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,6 +134,7 @@ typedef struct frame_contexts {
 | 
				
			|||||||
#if CONFIG_DAALA_EC
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
  uint16_t switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
 | 
					  uint16_t switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
 | 
				
			||||||
                                [SWITCHABLE_FILTERS];
 | 
					                                [SWITCHABLE_FILTERS];
 | 
				
			||||||
 | 
					  uint16_t intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES][TX_TYPES];
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
} FRAME_CONTEXT;
 | 
					} FRAME_CONTEXT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -291,6 +292,10 @@ void av1_setup_past_independence(struct AV1Common *cm);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void av1_adapt_intra_frame_probs(struct AV1Common *cm);
 | 
					void av1_adapt_intra_frame_probs(struct AV1Common *cm);
 | 
				
			||||||
void av1_adapt_inter_frame_probs(struct AV1Common *cm);
 | 
					void av1_adapt_inter_frame_probs(struct AV1Common *cm);
 | 
				
			||||||
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
 | 
					extern int av1_ext_tx_ind[TX_TYPES];
 | 
				
			||||||
 | 
					extern int av1_ext_tx_inv[TX_TYPES];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static INLINE int av1_ceil_log2(int n) {
 | 
					static INLINE int av1_ceil_log2(int n) {
 | 
				
			||||||
  int i = 1, p = 2;
 | 
					  int i = 1, p = 2;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3519,9 +3519,14 @@ static void read_ext_tx_probs(FRAME_CONTEXT *fc, aom_reader *r) {
 | 
				
			|||||||
  int i, j, k;
 | 
					  int i, j, k;
 | 
				
			||||||
  if (aom_read(r, GROUP_DIFF_UPDATE_PROB)) {
 | 
					  if (aom_read(r, GROUP_DIFF_UPDATE_PROB)) {
 | 
				
			||||||
    for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
					    for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
				
			||||||
      for (j = 0; j < TX_TYPES; ++j)
 | 
					      for (j = 0; j < TX_TYPES; ++j) {
 | 
				
			||||||
        for (k = 0; k < TX_TYPES - 1; ++k)
 | 
					        for (k = 0; k < TX_TYPES - 1; ++k)
 | 
				
			||||||
          av1_diff_update_prob(r, &fc->intra_ext_tx_prob[i][j][k]);
 | 
					          av1_diff_update_prob(r, &fc->intra_ext_tx_prob[i][j][k]);
 | 
				
			||||||
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
 | 
					        av1_tree_to_cdf(av1_ext_tx_tree, fc->intra_ext_tx_prob[i][j],
 | 
				
			||||||
 | 
					                        fc->intra_ext_tx_cdf[i][j]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (aom_read(r, GROUP_DIFF_UPDATE_PROB)) {
 | 
					  if (aom_read(r, GROUP_DIFF_UPDATE_PROB)) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1774,9 +1774,14 @@ static void read_inter_frame_mode_info(AV1Decoder *const pbi,
 | 
				
			|||||||
        if (counts) ++counts->inter_ext_tx[mbmi->tx_size][mbmi->tx_type];
 | 
					        if (counts) ++counts->inter_ext_tx[mbmi->tx_size][mbmi->tx_type];
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        const TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode];
 | 
					        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_tree_cdf(
 | 
				
			||||||
 | 
					          r, cm->fc->intra_ext_tx_cdf[mbmi->tx_size][tx_type_nom], TX_TYPES)];
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
        mbmi->tx_type = aom_read_tree(
 | 
					        mbmi->tx_type = aom_read_tree(
 | 
				
			||||||
            r, av1_ext_tx_tree,
 | 
					            r, av1_ext_tx_tree,
 | 
				
			||||||
            cm->fc->intra_ext_tx_prob[mbmi->tx_size][tx_type_nom]);
 | 
					            cm->fc->intra_ext_tx_prob[mbmi->tx_size][tx_type_nom]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        if (counts)
 | 
					        if (counts)
 | 
				
			||||||
          ++counts->intra_ext_tx[mbmi->tx_size][tx_type_nom][mbmi->tx_type];
 | 
					          ++counts->intra_ext_tx[mbmi->tx_size][tx_type_nom][mbmi->tx_type];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,8 @@ static void initialize_dec(void) {
 | 
				
			|||||||
#if CONFIG_DAALA_EC
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
    av1_indices_from_tree(av1_switchable_interp_ind, av1_switchable_interp_inv,
 | 
					    av1_indices_from_tree(av1_switchable_interp_ind, av1_switchable_interp_inv,
 | 
				
			||||||
                          SWITCHABLE_FILTERS, av1_switchable_interp_tree);
 | 
					                          SWITCHABLE_FILTERS, av1_switchable_interp_tree);
 | 
				
			||||||
 | 
					    av1_indices_from_tree(av1_ext_tx_ind, av1_ext_tx_inv, TX_TYPES,
 | 
				
			||||||
 | 
					                          av1_ext_tx_tree);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -196,6 +196,11 @@ void av1_encode_token_init(void) {
 | 
				
			|||||||
      an in-order traversal of the av1_switchable_interp_tree structure. */
 | 
					      an in-order traversal of the av1_switchable_interp_tree structure. */
 | 
				
			||||||
  av1_indices_from_tree(av1_switchable_interp_ind, av1_switchable_interp_inv,
 | 
					  av1_indices_from_tree(av1_switchable_interp_ind, av1_switchable_interp_inv,
 | 
				
			||||||
                        SWITCHABLE_FILTERS, av1_switchable_interp_tree);
 | 
					                        SWITCHABLE_FILTERS, av1_switchable_interp_tree);
 | 
				
			||||||
 | 
					  /* This hack is necessary because the four TX_TYPES are not consecutive,
 | 
				
			||||||
 | 
					      e.g., 0, 1, 2, 3, when doing an in-order traversal of the av1_ext_tx_tree
 | 
				
			||||||
 | 
					      structure. */
 | 
				
			||||||
 | 
					  av1_indices_from_tree(av1_ext_tx_ind, av1_ext_tx_inv, TX_TYPES,
 | 
				
			||||||
 | 
					                        av1_ext_tx_tree);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -576,9 +581,14 @@ static void update_ext_tx_probs(AV1_COMMON *cm, aom_writer *w) {
 | 
				
			|||||||
  aom_write(w, do_update, GROUP_DIFF_UPDATE_PROB);
 | 
					  aom_write(w, do_update, GROUP_DIFF_UPDATE_PROB);
 | 
				
			||||||
  if (do_update) {
 | 
					  if (do_update) {
 | 
				
			||||||
    for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
					    for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
 | 
				
			||||||
      for (j = 0; j < TX_TYPES; ++j)
 | 
					      for (j = 0; j < TX_TYPES; ++j) {
 | 
				
			||||||
        prob_diff_update(av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[i][j],
 | 
					        prob_diff_update(av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[i][j],
 | 
				
			||||||
                         cm->counts.intra_ext_tx[i][j], TX_TYPES, w);
 | 
					                         cm->counts.intra_ext_tx[i][j], TX_TYPES, w);
 | 
				
			||||||
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
 | 
					        av1_tree_to_cdf(av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[i][j],
 | 
				
			||||||
 | 
					                        cm->fc->intra_ext_tx_cdf[i][j]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  savings = 0;
 | 
					  savings = 0;
 | 
				
			||||||
@@ -1452,12 +1462,20 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
 | 
				
			|||||||
                        cm->fc->inter_ext_tx_prob[mbmi->tx_size],
 | 
					                        cm->fc->inter_ext_tx_prob[mbmi->tx_size],
 | 
				
			||||||
                        &ext_tx_encodings[mbmi->tx_type]);
 | 
					                        &ext_tx_encodings[mbmi->tx_type]);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
 | 
					#if CONFIG_DAALA_EC
 | 
				
			||||||
 | 
					      aom_write_tree_cdf(
 | 
				
			||||||
 | 
					          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(
 | 
					        av1_write_token(
 | 
				
			||||||
            w, av1_ext_tx_tree,
 | 
					            w, av1_ext_tx_tree,
 | 
				
			||||||
            cm->fc
 | 
					            cm->fc
 | 
				
			||||||
                ->intra_ext_tx_prob[mbmi->tx_size]
 | 
					                ->intra_ext_tx_prob[mbmi->tx_size]
 | 
				
			||||||
                                   [intra_mode_to_tx_type_context[mbmi->mode]],
 | 
					                                   [intra_mode_to_tx_type_context[mbmi->mode]],
 | 
				
			||||||
            &ext_tx_encodings[mbmi->tx_type]);
 | 
					            &ext_tx_encodings[mbmi->tx_type]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      if (!mbmi->skip) {
 | 
					      if (!mbmi->skip) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user