Factor out zeroing above and left context.
Change-Id: I6e5d8cff869c7415a924f845c9e6ccaabe2b7a9b
This commit is contained in:
@@ -97,10 +97,13 @@ void vp10_free_postproc_buffers(VP10_COMMON *cm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void vp10_free_context_buffers(VP10_COMMON *cm) {
|
void vp10_free_context_buffers(VP10_COMMON *cm) {
|
||||||
|
int i;
|
||||||
cm->free_mi(cm);
|
cm->free_mi(cm);
|
||||||
free_seg_map(cm);
|
free_seg_map(cm);
|
||||||
vpx_free(cm->above_context);
|
for (i = 0 ; i < MAX_MB_PLANE ; i++) {
|
||||||
cm->above_context = NULL;
|
vpx_free(cm->above_context[i]);
|
||||||
|
cm->above_context[i] = NULL;
|
||||||
|
}
|
||||||
vpx_free(cm->above_seg_context);
|
vpx_free(cm->above_seg_context);
|
||||||
cm->above_seg_context = NULL;
|
cm->above_seg_context = NULL;
|
||||||
#if CONFIG_VAR_TX
|
#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) {
|
if (cm->above_context_alloc_cols < cm->mi_cols) {
|
||||||
vpx_free(cm->above_context);
|
int i;
|
||||||
cm->above_context = (ENTROPY_CONTEXT *)vpx_calloc(
|
for (i = 0 ; i < MAX_MB_PLANE ; i++) {
|
||||||
2 * mi_cols_aligned_to_sb(cm->mi_cols) * MAX_MB_PLANE,
|
vpx_free(cm->above_context[i]);
|
||||||
sizeof(*cm->above_context));
|
cm->above_context[i] = (ENTROPY_CONTEXT *)vpx_calloc(
|
||||||
if (!cm->above_context) goto fail;
|
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);
|
vpx_free(cm->above_seg_context);
|
||||||
cm->above_seg_context = (PARTITION_CONTEXT *)vpx_calloc(
|
cm->above_seg_context = (PARTITION_CONTEXT *)vpx_calloc(
|
||||||
|
@@ -313,7 +313,7 @@ typedef struct VP10Common {
|
|||||||
BufferPool *buffer_pool;
|
BufferPool *buffer_pool;
|
||||||
|
|
||||||
PARTITION_CONTEXT *above_seg_context;
|
PARTITION_CONTEXT *above_seg_context;
|
||||||
ENTROPY_CONTEXT *above_context;
|
ENTROPY_CONTEXT *above_context[MAX_MB_PLANE];
|
||||||
#if CONFIG_VAR_TX
|
#if CONFIG_VAR_TX
|
||||||
TXFM_CONTEXT *above_txfm_context;
|
TXFM_CONTEXT *above_txfm_context;
|
||||||
TXFM_CONTEXT left_txfm_context[8];
|
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) {
|
for (i = 0; i < MAX_MB_PLANE; ++i) {
|
||||||
xd->plane[i].dqcoeff = dqcoeff;
|
xd->plane[i].dqcoeff = dqcoeff;
|
||||||
xd->above_context[i] = cm->above_context +
|
xd->above_context[i] = cm->above_context[i];
|
||||||
i * sizeof(*cm->above_context) * 2 * mi_cols_aligned_to_sb(cm->mi_cols);
|
|
||||||
|
|
||||||
if (xd->plane[i].plane_type == PLANE_TYPE_Y) {
|
if (xd->plane[i].plane_type == PLANE_TYPE_Y) {
|
||||||
memcpy(xd->plane[i].seg_dequant, cm->y_dequant, sizeof(cm->y_dequant));
|
memcpy(xd->plane[i].seg_dequant, cm->y_dequant, sizeof(cm->y_dequant));
|
||||||
} else {
|
} else {
|
||||||
@@ -525,6 +523,27 @@ static INLINE int partition_plane_context(const MACROBLOCKD *xd,
|
|||||||
return (left * 2 + above) + bsl * PARTITION_PLOFFSET;
|
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
|
#if CONFIG_VAR_TX
|
||||||
static INLINE void set_txfm_ctx(TXFM_CONTEXT *txfm_ctx,
|
static INLINE void set_txfm_ctx(TXFM_CONTEXT *txfm_ctx,
|
||||||
TX_SIZE tx_size,
|
TX_SIZE tx_size,
|
||||||
|
@@ -2962,18 +2962,7 @@ static const uint8_t *decode_tiles(VP10Decoder *pbi,
|
|||||||
assert(tile_rows <= 4);
|
assert(tile_rows <= 4);
|
||||||
assert(tile_cols <= (1 << 6));
|
assert(tile_cols <= (1 << 6));
|
||||||
|
|
||||||
// Note: this memset assumes above_context[0], [1] and [2]
|
vp10_zero_above_context(cm, 0, aligned_cols);
|
||||||
// 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
|
|
||||||
|
|
||||||
get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers);
|
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_cols - tile_col - 1 : tile_col;
|
||||||
tile_data = pbi->tile_data + tile_cols * tile_row + col;
|
tile_data = pbi->tile_data + tile_cols * tile_row + col;
|
||||||
vp10_tile_set_col(&tile, tile_data->cm, col);
|
vp10_tile_set_col(&tile, tile_data->cm, col);
|
||||||
vp10_zero(tile_data->xd.left_context);
|
vp10_zero_left_context(&tile_data->xd);
|
||||||
vp10_zero(tile_data->xd.left_seg_context);
|
|
||||||
#if CONFIG_VAR_TX
|
|
||||||
vp10_zero(tile_data->xd.left_txfm_context_buffer);
|
|
||||||
#endif
|
|
||||||
for (mi_col = tile.mi_col_start; mi_col < tile.mi_col_end;
|
for (mi_col = tile.mi_col_start; mi_col < tile.mi_col_end;
|
||||||
mi_col += MI_BLOCK_SIZE) {
|
mi_col += MI_BLOCK_SIZE) {
|
||||||
decode_partition(pbi, &tile_data->xd,
|
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;
|
for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end;
|
||||||
mi_row += MI_BLOCK_SIZE) {
|
mi_row += MI_BLOCK_SIZE) {
|
||||||
vp10_zero(tile_data->xd.left_context);
|
vp10_zero_left_context(&tile_data->xd);
|
||||||
vp10_zero(tile_data->xd.left_seg_context);
|
|
||||||
#if CONFIG_VAR_TX
|
|
||||||
vp10_zero(tile_data->xd.left_txfm_context_buffer);
|
|
||||||
#endif
|
|
||||||
for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
|
for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
|
||||||
mi_col += MI_BLOCK_SIZE) {
|
mi_col += MI_BLOCK_SIZE) {
|
||||||
decode_partition(tile_data->pbi, &tile_data->xd,
|
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];
|
worker->data2 = &pbi->tile_worker_info[n];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: this memset assumes above_context[0], [1] and [2]
|
vp10_zero_above_context(cm, 0, aligned_mi_cols);
|
||||||
// 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
|
|
||||||
// Load tile data into tile_buffers
|
// Load tile data into tile_buffers
|
||||||
get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers);
|
get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers);
|
||||||
|
|
||||||
|
@@ -1710,10 +1710,7 @@ static void write_modes(VP10_COMP *cpi,
|
|||||||
|
|
||||||
for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end;
|
for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end;
|
||||||
mi_row += MI_BLOCK_SIZE) {
|
mi_row += MI_BLOCK_SIZE) {
|
||||||
vp10_zero(xd->left_seg_context);
|
vp10_zero_left_context(xd);
|
||||||
#if CONFIG_VAR_TX
|
|
||||||
vp10_zero(xd->left_txfm_context_buffer);
|
|
||||||
#endif
|
|
||||||
for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
|
for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
|
||||||
mi_col += MI_BLOCK_SIZE)
|
mi_col += MI_BLOCK_SIZE)
|
||||||
write_modes_sb(cpi, tile, w, tok, tok_end,
|
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;
|
const int tile_rows = 1 << cm->log2_tile_rows;
|
||||||
unsigned int max_tile = 0;
|
unsigned int max_tile = 0;
|
||||||
|
|
||||||
memset(cm->above_seg_context, 0,
|
vp10_zero_above_context(cm, 0, mi_cols_aligned_to_sb(cm->mi_cols));
|
||||||
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
|
|
||||||
|
|
||||||
for (tile_row = 0; tile_row < tile_rows; tile_row++) {
|
for (tile_row = 0; tile_row < tile_rows; tile_row++) {
|
||||||
for (tile_col = 0; tile_col < tile_cols; tile_col++) {
|
for (tile_col = 0; tile_col < tile_cols; tile_col++) {
|
||||||
|
@@ -3693,13 +3693,8 @@ static void encode_rd_sb_row(VP10_COMP *cpi,
|
|||||||
SPEED_FEATURES *const sf = &cpi->sf;
|
SPEED_FEATURES *const sf = &cpi->sf;
|
||||||
int mi_col;
|
int mi_col;
|
||||||
|
|
||||||
// Initialize the left context for the new SB row
|
vp10_zero_left_context(xd);
|
||||||
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
|
|
||||||
// Code each SB in the row
|
// Code each SB in the row
|
||||||
for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end;
|
for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end;
|
||||||
mi_col += MI_BLOCK_SIZE) {
|
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.
|
// Copy data over into macro block data structures.
|
||||||
vp10_setup_src_planes(x, cpi->Source, 0, 0);
|
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]
|
vp10_zero_above_context(cm, 0, aligned_mi_cols);
|
||||||
// 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_dual_ref_flags(VP10_COMP *cpi) {
|
static int check_dual_ref_flags(VP10_COMP *cpi) {
|
||||||
|
Reference in New Issue
Block a user