From c2005c578b1a25fceb1e38c0462c238fe4ac9e7f Mon Sep 17 00:00:00 2001 From: Geza Lore <gezalore@gmail.com> Date: Tue, 15 Mar 2016 10:29:00 +0000 Subject: [PATCH] Factor out zeroing above and left context. Change-Id: I6e5d8cff869c7415a924f845c9e6ccaabe2b7a9b --- vp10/common/alloccommon.c | 20 +++++++++++++------- vp10/common/onyxc_int.h | 27 +++++++++++++++++++++++---- vp10/decoder/decodeframe.c | 37 +++++-------------------------------- vp10/encoder/bitstream.c | 12 ++---------- vp10/encoder/encodeframe.c | 23 ++++------------------- 5 files changed, 47 insertions(+), 72 deletions(-) diff --git a/vp10/common/alloccommon.c b/vp10/common/alloccommon.c index e14aee76fa..b3c216ec72 100644 --- a/vp10/common/alloccommon.c +++ b/vp10/common/alloccommon.c @@ -97,10 +97,13 @@ void vp10_free_postproc_buffers(VP10_COMMON *cm) { } void vp10_free_context_buffers(VP10_COMMON *cm) { + int i; cm->free_mi(cm); free_seg_map(cm); - vpx_free(cm->above_context); - cm->above_context = NULL; + for (i = 0 ; i < MAX_MB_PLANE ; i++) { + vpx_free(cm->above_context[i]); + cm->above_context[i] = NULL; + } vpx_free(cm->above_seg_context); cm->above_seg_context = NULL; #if CONFIG_VAR_TX @@ -128,11 +131,14 @@ int vp10_alloc_context_buffers(VP10_COMMON *cm, int width, int height) { } if (cm->above_context_alloc_cols < cm->mi_cols) { - vpx_free(cm->above_context); - cm->above_context = (ENTROPY_CONTEXT *)vpx_calloc( - 2 * mi_cols_aligned_to_sb(cm->mi_cols) * MAX_MB_PLANE, - sizeof(*cm->above_context)); - if (!cm->above_context) goto fail; + int i; + for (i = 0 ; i < MAX_MB_PLANE ; i++) { + vpx_free(cm->above_context[i]); + cm->above_context[i] = (ENTROPY_CONTEXT *)vpx_calloc( + 2 * mi_cols_aligned_to_sb(cm->mi_cols), + sizeof(*cm->above_context[0])); + if (!cm->above_context[i]) goto fail; + } vpx_free(cm->above_seg_context); cm->above_seg_context = (PARTITION_CONTEXT *)vpx_calloc( diff --git a/vp10/common/onyxc_int.h b/vp10/common/onyxc_int.h index bcc69f3bd8..26ae569f0f 100644 --- a/vp10/common/onyxc_int.h +++ b/vp10/common/onyxc_int.h @@ -313,7 +313,7 @@ typedef struct VP10Common { BufferPool *buffer_pool; PARTITION_CONTEXT *above_seg_context; - ENTROPY_CONTEXT *above_context; + ENTROPY_CONTEXT *above_context[MAX_MB_PLANE]; #if CONFIG_VAR_TX TXFM_CONTEXT *above_txfm_context; TXFM_CONTEXT left_txfm_context[8]; @@ -405,9 +405,7 @@ static INLINE void vp10_init_macroblockd(VP10_COMMON *cm, MACROBLOCKD *xd, for (i = 0; i < MAX_MB_PLANE; ++i) { xd->plane[i].dqcoeff = dqcoeff; - xd->above_context[i] = cm->above_context + - i * sizeof(*cm->above_context) * 2 * mi_cols_aligned_to_sb(cm->mi_cols); - + xd->above_context[i] = cm->above_context[i]; if (xd->plane[i].plane_type == PLANE_TYPE_Y) { memcpy(xd->plane[i].seg_dequant, cm->y_dequant, sizeof(cm->y_dequant)); } else { @@ -525,6 +523,27 @@ static INLINE int partition_plane_context(const MACROBLOCKD *xd, return (left * 2 + above) + bsl * PARTITION_PLOFFSET; } +static INLINE void vp10_zero_above_context(VP10_COMMON *const cm, + int mi_col_start, int mi_col_end) { + const int width = mi_col_end - mi_col_start; + int i; + + for (i = 0 ; i < MAX_MB_PLANE ; i++) + vp10_zero_array(cm->above_context[i] + 2 * mi_col_start, 2 * width); + vp10_zero_array(cm->above_seg_context + mi_col_start, width); +#if CONFIG_VAR_TX + vp10_zero_array(cm->above_txfm_context + mi_col_start, width); +#endif // CONFIG_VAR_TX +} + +static INLINE void vp10_zero_left_context(MACROBLOCKD *const xd) { + vp10_zero(xd->left_context); + vp10_zero(xd->left_seg_context); +#if CONFIG_VAR_TX + vp10_zero(xd->left_txfm_context_buffer); +#endif +} + #if CONFIG_VAR_TX static INLINE void set_txfm_ctx(TXFM_CONTEXT *txfm_ctx, TX_SIZE tx_size, diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c index ce6317ca83..0441662402 100644 --- a/vp10/decoder/decodeframe.c +++ b/vp10/decoder/decodeframe.c @@ -2962,18 +2962,7 @@ static const uint8_t *decode_tiles(VP10Decoder *pbi, assert(tile_rows <= 4); assert(tile_cols <= (1 << 6)); - // Note: this memset assumes above_context[0], [1] and [2] - // are allocated as part of the same buffer. - memset(cm->above_context, 0, - sizeof(*cm->above_context) * MAX_MB_PLANE * 2 * aligned_cols); - - memset(cm->above_seg_context, 0, - sizeof(*cm->above_seg_context) * aligned_cols); - -#if CONFIG_VAR_TX - memset(cm->above_txfm_context, 0, - sizeof(*cm->above_txfm_context) * aligned_cols); -#endif + vp10_zero_above_context(cm, 0, aligned_cols); get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers); @@ -3032,11 +3021,7 @@ static const uint8_t *decode_tiles(VP10Decoder *pbi, tile_cols - tile_col - 1 : tile_col; tile_data = pbi->tile_data + tile_cols * tile_row + col; vp10_tile_set_col(&tile, tile_data->cm, col); - vp10_zero(tile_data->xd.left_context); - vp10_zero(tile_data->xd.left_seg_context); -#if CONFIG_VAR_TX - vp10_zero(tile_data->xd.left_txfm_context_buffer); -#endif + vp10_zero_left_context(&tile_data->xd); for (mi_col = tile.mi_col_start; mi_col < tile.mi_col_end; mi_col += MI_BLOCK_SIZE) { decode_partition(pbi, &tile_data->xd, @@ -3126,11 +3111,7 @@ static int tile_worker_hook(TileWorkerData *const tile_data, for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end; mi_row += MI_BLOCK_SIZE) { - vp10_zero(tile_data->xd.left_context); - vp10_zero(tile_data->xd.left_seg_context); -#if CONFIG_VAR_TX - vp10_zero(tile_data->xd.left_txfm_context_buffer); -#endif + vp10_zero_left_context(&tile_data->xd); for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; mi_col += MI_BLOCK_SIZE) { decode_partition(tile_data->pbi, &tile_data->xd, @@ -3211,16 +3192,8 @@ static const uint8_t *decode_tiles_mt(VP10Decoder *pbi, worker->data2 = &pbi->tile_worker_info[n]; } - // Note: this memset assumes above_context[0], [1] and [2] - // are allocated as part of the same buffer. - memset(cm->above_context, 0, - sizeof(*cm->above_context) * MAX_MB_PLANE * 2 * aligned_mi_cols); - memset(cm->above_seg_context, 0, - sizeof(*cm->above_seg_context) * aligned_mi_cols); -#if CONFIG_VAR_TX - memset(cm->above_txfm_context, 0, - sizeof(*cm->above_txfm_context) * aligned_mi_cols); -#endif + vp10_zero_above_context(cm, 0, aligned_mi_cols); + // Load tile data into tile_buffers get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers); diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c index 1ef2ea5f91..f20c224b45 100644 --- a/vp10/encoder/bitstream.c +++ b/vp10/encoder/bitstream.c @@ -1710,10 +1710,7 @@ static void write_modes(VP10_COMP *cpi, for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end; mi_row += MI_BLOCK_SIZE) { - vp10_zero(xd->left_seg_context); -#if CONFIG_VAR_TX - vp10_zero(xd->left_txfm_context_buffer); -#endif + vp10_zero_left_context(xd); for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; mi_col += MI_BLOCK_SIZE) write_modes_sb(cpi, tile, w, tok, tok_end, @@ -2190,12 +2187,7 @@ static size_t encode_tiles(VP10_COMP *cpi, uint8_t *data_ptr, const int tile_rows = 1 << cm->log2_tile_rows; unsigned int max_tile = 0; - memset(cm->above_seg_context, 0, - sizeof(*cm->above_seg_context) * mi_cols_aligned_to_sb(cm->mi_cols)); -#if CONFIG_VAR_TX - memset(cm->above_txfm_context, 0, - sizeof(*cm->above_txfm_context) * mi_cols_aligned_to_sb(cm->mi_cols)); -#endif + vp10_zero_above_context(cm, 0, mi_cols_aligned_to_sb(cm->mi_cols)); for (tile_row = 0; tile_row < tile_rows; tile_row++) { for (tile_col = 0; tile_col < tile_cols; tile_col++) { diff --git a/vp10/encoder/encodeframe.c b/vp10/encoder/encodeframe.c index c6715ce79b..aafde450ba 100644 --- a/vp10/encoder/encodeframe.c +++ b/vp10/encoder/encodeframe.c @@ -3693,13 +3693,8 @@ static void encode_rd_sb_row(VP10_COMP *cpi, SPEED_FEATURES *const sf = &cpi->sf; int mi_col; - // Initialize the left context for the new SB row - memset(&xd->left_context, 0, sizeof(xd->left_context)); - memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context)); -#if CONFIG_VAR_TX - memset(xd->left_txfm_context_buffer, 0, - sizeof(xd->left_txfm_context_buffer)); -#endif + vp10_zero_left_context(xd); + // Code each SB in the row for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end; mi_col += MI_BLOCK_SIZE) { @@ -3797,19 +3792,9 @@ static void init_encode_frame_mb_context(VP10_COMP *cpi) { // Copy data over into macro block data structures. vp10_setup_src_planes(x, cpi->Source, 0, 0); - vp10_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); + vp10_setup_block_planes(xd, cm->subsampling_x, cm->subsampling_y); - // Note: this memset assumes above_context[0], [1] and [2] - // are allocated as part of the same buffer. - memset(xd->above_context[0], 0, - sizeof(*xd->above_context[0]) * - 2 * aligned_mi_cols * MAX_MB_PLANE); - memset(xd->above_seg_context, 0, - sizeof(*xd->above_seg_context) * aligned_mi_cols); -#if CONFIG_VAR_TX - memset(cm->above_txfm_context, 0, - sizeof(*xd->above_txfm_context) * aligned_mi_cols); -#endif + vp10_zero_above_context(cm, 0, aligned_mi_cols); } static int check_dual_ref_flags(VP10_COMP *cpi) { -- GitLab