diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index 556be6aba..87d9f717e 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -244,13 +244,6 @@ typedef struct macroblockd { PARTITION_CONTEXT left_seg_context[8]; } MACROBLOCKD; -static INLINE void init_macroblockd(MACROBLOCKD *xd) { - int i; - - for (i = 0; i < MAX_MB_PLANE; ++i) - xd->plane[i].dqcoeff = xd->dqcoeff[i]; -} - static INLINE BLOCK_SIZE get_subsize(BLOCK_SIZE bsize, PARTITION_TYPE partition) { const BLOCK_SIZE subsize = subsize_lookup[partition][bsize]; diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h index f564afb9e..c49ce2785 100644 --- a/vp9/common/vp9_onyxc_int.h +++ b/vp9/common/vp9_onyxc_int.h @@ -237,24 +237,33 @@ static INLINE int mi_cols_aligned_to_sb(int n_mis) { return ALIGN_POWER_OF_TWO(n_mis, MI_BLOCK_SIZE_LOG2); } +static INLINE void init_macroblockd(VP9_COMMON *cm, MACROBLOCKD *xd) { + int i; + + for (i = 0; i < MAX_MB_PLANE; ++i) { + xd->plane[i].dqcoeff = xd->dqcoeff[i]; + xd->above_context[i] = cm->above_context + + i * sizeof(*cm->above_context) * 2 * mi_cols_aligned_to_sb(cm->mi_cols); + } + + xd->above_seg_context = cm->above_seg_context; + xd->mode_info_stride = cm->mode_info_stride; +} + static INLINE const vp9_prob* get_partition_probs(const VP9_COMMON *cm, int ctx) { return cm->frame_type == KEY_FRAME ? vp9_kf_partition_probs[ctx] : cm->fc.partition_prob[ctx]; } -static INLINE void set_skip_context( - MACROBLOCKD *xd, - ENTROPY_CONTEXT *above_context[MAX_MB_PLANE], - ENTROPY_CONTEXT left_context[MAX_MB_PLANE][16], - int mi_row, int mi_col) { +static INLINE void set_skip_context(MACROBLOCKD *xd, int mi_row, int mi_col) { const int above_idx = mi_col * 2; const int left_idx = (mi_row * 2) & 15; int i; - for (i = 0; i < MAX_MB_PLANE; i++) { + for (i = 0; i < MAX_MB_PLANE; ++i) { struct macroblockd_plane *const pd = &xd->plane[i]; - pd->above_context = above_context[i] + (above_idx >> pd->subsampling_x); - pd->left_context = left_context[i] + (left_idx >> pd->subsampling_y); + pd->above_context = &xd->above_context[i][above_idx >> pd->subsampling_x]; + pd->left_context = &xd->left_context[i][left_idx >> pd->subsampling_y]; } } diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c index 2f15bfb52..707fe5517 100644 --- a/vp9/decoder/vp9_decodeframe.c +++ b/vp9/decoder/vp9_decodeframe.c @@ -308,7 +308,7 @@ static void set_offsets(VP9_COMMON *const cm, MACROBLOCKD *const xd, for (x = !y; x < x_mis; ++x) xd->mi_8x8[y * cm->mode_info_stride + x] = xd->mi_8x8[0]; - set_skip_context(xd, xd->above_context, xd->left_context, mi_row, mi_col); + set_skip_context(xd, mi_row, mi_col); // Distance of Mb to the various image edges. These are specified to 8th pel // as they are always compared to values that are in 1/8th pel units @@ -677,17 +677,6 @@ static void setup_frame_size_with_refs(VP9_COMMON *cm, setup_display_size(cm, rb); } -static void setup_tile_context(VP9_COMMON *cm, MACROBLOCKD *const xd, - int tile_row, int tile_col) { - int i; - - for (i = 0; i < MAX_MB_PLANE; ++i) - xd->above_context[i] = cm->above_context + - i * sizeof(*cm->above_context) * 2 * mi_cols_aligned_to_sb(cm->mi_cols); - - xd->above_seg_context = cm->above_seg_context; -} - static void decode_tile(VP9D_COMP *pbi, const TileInfo *const tile, vp9_reader *r) { const int num_threads = pbi->oxcf.max_threads; @@ -797,7 +786,6 @@ static const uint8_t *decode_tiles(VP9D_COMP *pbi, const uint8_t *data, const uint8_t *data_end) { VP9_COMMON *const cm = &pbi->common; - MACROBLOCKD *const xd = &pbi->mb; const int aligned_cols = mi_cols_aligned_to_sb(cm->mi_cols); const int tile_cols = 1 << cm->log2_tile_cols; const int tile_rows = 1 << cm->log2_tile_rows; @@ -842,7 +830,6 @@ static const uint8_t *decode_tiles(VP9D_COMP *pbi, vp9_tile_init(&tile, cm, tile_row, col); setup_token_decoder(buf->data, data_end, buf->size, &cm->error, &r); - setup_tile_context(cm, xd, tile_row, col); decode_tile(pbi, &tile, &r); if (last_tile) @@ -976,12 +963,9 @@ static const uint8_t *decode_tiles_mt(VP9D_COMP *pbi, tile_data->xd = pbi->mb; tile_data->xd.corrupted = 0; vp9_tile_init(tile, tile_data->cm, 0, buf->col); - setup_token_decoder(buf->data, data_end, buf->size, &cm->error, &tile_data->bit_reader); - - setup_tile_context(cm, &tile_data->xd, 0, buf->col); - init_macroblockd(&tile_data->xd); + init_macroblockd(cm, &tile_data->xd); vp9_zero(tile_data->xd.dqcoeff); worker->had_error = 0; @@ -1309,7 +1293,8 @@ int vp9_decode_frame(VP9D_COMP *pbi, } } - xd->mode_info_stride = cm->mode_info_stride; + init_macroblockd(cm, &pbi->mb); + if (cm->coding_use_prev_mi) set_prev_mi(cm); else diff --git a/vp9/decoder/vp9_decoder.c b/vp9/decoder/vp9_decoder.c index 17b8c98c8..c954a5d0e 100644 --- a/vp9/decoder/vp9_decoder.c +++ b/vp9/decoder/vp9_decoder.c @@ -147,8 +147,6 @@ VP9D_COMP *vp9_create_decompressor(const VP9D_CONFIG *oxcf) { cm->error.setjmp = 0; pbi->decoded_key_frame = 0; - init_macroblockd(&pbi->mb); - vp9_worker_init(&pbi->lf_worker); return pbi; diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 4939e698a..0c5080b86 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -207,7 +207,7 @@ static void set_offsets(VP9_COMP *cpi, const TileInfo *const tile, const int idx_map = mb_row * cm->mb_cols + mb_col; const struct segmentation *const seg = &cm->seg; - set_skip_context(xd, xd->above_context, xd->left_context, mi_row, mi_col); + set_skip_context(xd, mi_row, mi_col); // Activity map pointer x->mb_activity_ptr = &cpi->mb_activity_map[idx_map]; @@ -2396,8 +2396,6 @@ static void init_encode_frame_mb_context(VP9_COMP *cpi) { x->act_zbin_adj = 0; cpi->seg0_idx = 0; - xd->mode_info_stride = cm->mode_info_stride; - // Copy data over into macro block data structures. vp9_setup_src_planes(x, cpi->Source, 0, 0); diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index f112fa24f..6a9c5da29 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -646,15 +646,7 @@ static void update_frame_size(VP9_COMP *cpi) { } } - { - int i; - - for (i = 0; i < MAX_MB_PLANE; ++i) - xd->above_context[i] = cm->above_context + - i * sizeof(*cm->above_context) * 2 * mi_cols_aligned_to_sb(cm->mi_cols); - } - - xd->above_seg_context = cpi->common.above_seg_context; + init_macroblockd(cm, xd); } // Table that converts 0-63 Q range values passed in outside to the Qindex