Index: source/libvpx/vp9/encoder/vp9_bitstream.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_bitstream.c (revision 293081) |
+++ source/libvpx/vp9/encoder/vp9_bitstream.c (working copy) |
@@ -79,12 +79,12 @@ |
} |
static void write_selected_tx_size(const VP9_COMMON *cm, |
- const MACROBLOCKD *xd, |
- TX_SIZE tx_size, BLOCK_SIZE bsize, |
- vp9_writer *w) { |
+ const MACROBLOCKD *xd, vp9_writer *w) { |
+ TX_SIZE tx_size = xd->mi[0].src_mi->mbmi.tx_size; |
+ BLOCK_SIZE bsize = xd->mi[0].src_mi->mbmi.sb_type; |
const TX_SIZE max_tx_size = max_txsize_lookup[bsize]; |
const vp9_prob *const tx_probs = get_tx_probs2(max_tx_size, xd, |
- &cm->fc.tx_probs); |
+ &cm->fc->tx_probs); |
vp9_write(w, tx_size != TX_4X4, tx_probs[0]); |
if (tx_size != TX_4X4 && max_tx_size >= TX_16X16) { |
vp9_write(w, tx_size != TX_8X8, tx_probs[1]); |
@@ -108,7 +108,7 @@ |
int k; |
for (k = 0; k < SKIP_CONTEXTS; ++k) |
- vp9_cond_prob_diff_update(w, &cm->fc.skip_probs[k], cm->counts.skip[k]); |
+ vp9_cond_prob_diff_update(w, &cm->fc->skip_probs[k], cm->counts.skip[k]); |
} |
static void update_switchable_interp_probs(VP9_COMMON *cm, vp9_writer *w) { |
@@ -115,7 +115,7 @@ |
int j; |
for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j) |
prob_diff_update(vp9_switchable_interp_tree, |
- cm->fc.switchable_interp_prob[j], |
+ cm->fc->switchable_interp_prob[j], |
cm->counts.switchable_interp[j], SWITCHABLE_FILTERS, w); |
} |
@@ -237,7 +237,7 @@ |
static void pack_inter_mode_mvs(VP9_COMP *cpi, const MODE_INFO *mi, |
vp9_writer *w) { |
VP9_COMMON *const cm = &cpi->common; |
- const nmv_context *nmvc = &cm->fc.nmvc; |
+ const nmv_context *nmvc = &cm->fc->nmvc; |
const MACROBLOCK *const x = &cpi->mb; |
const MACROBLOCKD *const xd = &x->e_mbd; |
const struct segmentation *const seg = &cm->seg; |
@@ -270,12 +270,12 @@ |
if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT && |
!(is_inter && |
(skip || vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)))) { |
- write_selected_tx_size(cm, xd, mbmi->tx_size, bsize, w); |
+ write_selected_tx_size(cm, xd, w); |
} |
if (!is_inter) { |
if (bsize >= BLOCK_8X8) { |
- write_intra_mode(w, mode, cm->fc.y_mode_prob[size_group_lookup[bsize]]); |
+ write_intra_mode(w, mode, cm->fc->y_mode_prob[size_group_lookup[bsize]]); |
} else { |
int idx, idy; |
const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; |
@@ -283,14 +283,14 @@ |
for (idy = 0; idy < 2; idy += num_4x4_h) { |
for (idx = 0; idx < 2; idx += num_4x4_w) { |
const PREDICTION_MODE b_mode = mi->bmi[idy * 2 + idx].as_mode; |
- write_intra_mode(w, b_mode, cm->fc.y_mode_prob[0]); |
+ write_intra_mode(w, b_mode, cm->fc->y_mode_prob[0]); |
} |
} |
} |
- write_intra_mode(w, mbmi->uv_mode, cm->fc.uv_mode_prob[mode]); |
+ write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]); |
} else { |
const int mode_ctx = mbmi->mode_context[mbmi->ref_frame[0]]; |
- const vp9_prob *const inter_probs = cm->fc.inter_mode_probs[mode_ctx]; |
+ const vp9_prob *const inter_probs = cm->fc->inter_mode_probs[mode_ctx]; |
write_ref_frames(cm, xd, w); |
// If segment skip is not enabled code the mode. |
@@ -304,7 +304,7 @@ |
if (cm->interp_filter == SWITCHABLE) { |
const int ctx = vp9_get_pred_context_switchable_interp(xd); |
vp9_write_token(w, vp9_switchable_interp_tree, |
- cm->fc.switchable_interp_prob[ctx], |
+ cm->fc->switchable_interp_prob[ctx], |
&switchable_interp_encodings[mbmi->interp_filter]); |
++cpi->interp_filter_selected[0][mbmi->interp_filter]; |
} else { |
@@ -356,7 +356,7 @@ |
write_skip(cm, xd, mbmi->segment_id, mi, w); |
if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT) |
- write_selected_tx_size(cm, xd, mbmi->tx_size, bsize, w); |
+ write_selected_tx_size(cm, xd, w); |
if (bsize >= BLOCK_8X8) { |
write_intra_mode(w, mbmi->mode, get_y_mode_probs(mi, above_mi, left_mi, 0)); |
@@ -500,7 +500,7 @@ |
static void build_tree_distribution(VP9_COMP *cpi, TX_SIZE tx_size, |
vp9_coeff_stats *coef_branch_ct, |
vp9_coeff_probs_model *coef_probs) { |
- vp9_coeff_count *coef_counts = cpi->coef_counts[tx_size]; |
+ vp9_coeff_count *coef_counts = cpi->frame_counts->coef_counts[tx_size]; |
unsigned int (*eob_branch_ct)[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] = |
cpi->common.counts.eob_branch[tx_size]; |
int i, j, k, l, m; |
@@ -528,7 +528,7 @@ |
TX_SIZE tx_size, |
vp9_coeff_stats *frame_branch_ct, |
vp9_coeff_probs_model *new_coef_probs) { |
- vp9_coeff_probs_model *old_coef_probs = cpi->common.fc.coef_probs[tx_size]; |
+ vp9_coeff_probs_model *old_coef_probs = cpi->common.fc->coef_probs[tx_size]; |
const vp9_prob upd = DIFF_UPDATE_PROB; |
const int entropy_nodes_update = UNCONSTRAINED_NODES; |
int i, j, k, l, t; |
@@ -830,13 +830,13 @@ |
for (i = 0; i < TX_SIZE_CONTEXTS; i++) { |
tx_counts_to_branch_counts_8x8(cm->counts.tx.p8x8[i], ct_8x8p); |
for (j = 0; j < TX_SIZES - 3; j++) |
- vp9_cond_prob_diff_update(w, &cm->fc.tx_probs.p8x8[i][j], ct_8x8p[j]); |
+ vp9_cond_prob_diff_update(w, &cm->fc->tx_probs.p8x8[i][j], ct_8x8p[j]); |
} |
for (i = 0; i < TX_SIZE_CONTEXTS; i++) { |
tx_counts_to_branch_counts_16x16(cm->counts.tx.p16x16[i], ct_16x16p); |
for (j = 0; j < TX_SIZES - 2; j++) |
- vp9_cond_prob_diff_update(w, &cm->fc.tx_probs.p16x16[i][j], |
+ vp9_cond_prob_diff_update(w, &cm->fc->tx_probs.p16x16[i][j], |
ct_16x16p[j]); |
} |
@@ -843,7 +843,7 @@ |
for (i = 0; i < TX_SIZE_CONTEXTS; i++) { |
tx_counts_to_branch_counts_32x32(cm->counts.tx.p32x32[i], ct_32x32p); |
for (j = 0; j < TX_SIZES - 1; j++) |
- vp9_cond_prob_diff_update(w, &cm->fc.tx_probs.p32x32[i][j], |
+ vp9_cond_prob_diff_update(w, &cm->fc->tx_probs.p32x32[i][j], |
ct_32x32p[j]); |
} |
} |
@@ -929,13 +929,11 @@ |
static size_t encode_tiles(VP9_COMP *cpi, uint8_t *data_ptr) { |
VP9_COMMON *const cm = &cpi->common; |
vp9_writer residual_bc; |
- |
int tile_row, tile_col; |
TOKENEXTRA *tok[4][1 << 6], *tok_end; |
size_t total_size = 0; |
const int tile_cols = 1 << cm->log2_tile_cols; |
const int tile_rows = 1 << cm->log2_tile_rows; |
- TileInfo tile[4][1 << 6]; |
TOKENEXTRA *pre_tok = cpi->tok; |
int tile_tok = 0; |
@@ -944,18 +942,16 @@ |
for (tile_row = 0; tile_row < tile_rows; ++tile_row) { |
for (tile_col = 0; tile_col < tile_cols; ++tile_col) { |
- vp9_tile_init(&tile[tile_row][tile_col], cm, tile_row, tile_col); |
- |
+ int tile_idx = tile_row * tile_cols + tile_col; |
tok[tile_row][tile_col] = pre_tok + tile_tok; |
pre_tok = tok[tile_row][tile_col]; |
- tile_tok = allocated_tokens(tile[tile_row][tile_col]); |
+ tile_tok = allocated_tokens(cpi->tile_data[tile_idx].tile_info); |
} |
} |
for (tile_row = 0; tile_row < tile_rows; tile_row++) { |
for (tile_col = 0; tile_col < tile_cols; tile_col++) { |
- const TileInfo * const ptile = &tile[tile_row][tile_col]; |
- |
+ int tile_idx = tile_row * tile_cols + tile_col; |
tok_end = tok[tile_row][tile_col] + cpi->tok_count[tile_row][tile_col]; |
if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) |
@@ -963,7 +959,8 @@ |
else |
vp9_start_encode(&residual_bc, data_ptr + total_size); |
- write_modes(cpi, ptile, &residual_bc, &tok[tile_row][tile_col], tok_end); |
+ write_modes(cpi, &cpi->tile_data[tile_idx].tile_info, |
+ &residual_bc, &tok[tile_row][tile_col], tok_end); |
assert(tok[tile_row][tile_col] == tok_end); |
vp9_stop_encode(&residual_bc); |
if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) { |
@@ -1161,7 +1158,7 @@ |
static size_t write_compressed_header(VP9_COMP *cpi, uint8_t *data) { |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
- FRAME_CONTEXT *const fc = &cm->fc; |
+ FRAME_CONTEXT *const fc = cm->fc; |
vp9_writer header_bc; |
vp9_start_encode(&header_bc, data); |
@@ -1178,7 +1175,7 @@ |
int i; |
for (i = 0; i < INTER_MODE_CONTEXTS; ++i) |
- prob_diff_update(vp9_inter_mode_tree, cm->fc.inter_mode_probs[i], |
+ prob_diff_update(vp9_inter_mode_tree, cm->fc->inter_mode_probs[i], |
cm->counts.inter_mode[i], INTER_MODES, &header_bc); |
vp9_zero(cm->counts.inter_mode); |
@@ -1219,7 +1216,7 @@ |
cm->counts.comp_ref[i]); |
for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) |
- prob_diff_update(vp9_intra_mode_tree, cm->fc.y_mode_prob[i], |
+ prob_diff_update(vp9_intra_mode_tree, cm->fc->y_mode_prob[i], |
cm->counts.y_mode[i], INTRA_MODES, &header_bc); |
for (i = 0; i < PARTITION_CONTEXTS; ++i) |