Merge "[decoder] Optimize context buffer re-allocation"
This commit is contained in:
commit
cbdfdb947c
@ -57,6 +57,7 @@ static int alloc_seg_map(VP9_COMMON *cm, int seg_map_size) {
|
||||
if (cm->seg_map_array[i] == NULL)
|
||||
return 1;
|
||||
}
|
||||
cm->seg_map_alloc_size = seg_map_size;
|
||||
|
||||
// Init the index.
|
||||
cm->seg_map_idx = 0;
|
||||
@ -118,25 +119,36 @@ void vp9_free_context_buffers(VP9_COMMON *cm) {
|
||||
}
|
||||
|
||||
int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) {
|
||||
vp9_free_context_buffers(cm);
|
||||
int new_mi_size;
|
||||
|
||||
vp9_set_mb_mi(cm, width, height);
|
||||
if (cm->alloc_mi(cm, cm->mi_stride * calc_mi_size(cm->mi_rows)))
|
||||
goto fail;
|
||||
new_mi_size = cm->mi_stride * calc_mi_size(cm->mi_rows);
|
||||
if (cm->mi_alloc_size < new_mi_size) {
|
||||
cm->free_mi(cm);
|
||||
if (cm->alloc_mi(cm, new_mi_size))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
// Create the segmentation map structure and set to 0.
|
||||
free_seg_map(cm);
|
||||
if (alloc_seg_map(cm, cm->mi_rows * cm->mi_cols))
|
||||
goto fail;
|
||||
if (cm->seg_map_alloc_size < cm->mi_rows * cm->mi_cols) {
|
||||
// Create the segmentation map structure and set to 0.
|
||||
free_seg_map(cm);
|
||||
if (alloc_seg_map(cm, cm->mi_rows * cm->mi_cols))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
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;
|
||||
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;
|
||||
|
||||
cm->above_seg_context = (PARTITION_CONTEXT *)vpx_calloc(
|
||||
mi_cols_aligned_to_sb(cm->mi_cols), sizeof(*cm->above_seg_context));
|
||||
if (!cm->above_seg_context) goto fail;
|
||||
vpx_free(cm->above_seg_context);
|
||||
cm->above_seg_context = (PARTITION_CONTEXT *)vpx_calloc(
|
||||
mi_cols_aligned_to_sb(cm->mi_cols), sizeof(*cm->above_seg_context));
|
||||
if (!cm->above_seg_context) goto fail;
|
||||
cm->above_context_alloc_cols = cm->mi_cols;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -220,6 +220,7 @@ typedef struct VP9Common {
|
||||
uint8_t *seg_map_array[NUM_PING_PONG_BUFFERS];
|
||||
uint8_t *last_frame_seg_map;
|
||||
uint8_t *current_frame_seg_map;
|
||||
int seg_map_alloc_size;
|
||||
|
||||
INTERP_FILTER interp_filter;
|
||||
|
||||
@ -276,6 +277,7 @@ typedef struct VP9Common {
|
||||
|
||||
PARTITION_CONTEXT *above_seg_context;
|
||||
ENTROPY_CONTEXT *above_context;
|
||||
int above_context_alloc_cols;
|
||||
} VP9_COMMON;
|
||||
|
||||
// TODO(hkuang): Don't need to lock the whole pool after implementing atomic
|
||||
|
@ -50,7 +50,6 @@ static void initialize_dec(void) {
|
||||
|
||||
static void vp9_dec_setup_mi(VP9_COMMON *cm) {
|
||||
cm->mi = cm->mip + cm->mi_stride + 1;
|
||||
memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip));
|
||||
cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
|
||||
memset(cm->mi_grid_base, 0,
|
||||
cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mi_grid_base));
|
||||
|
Loading…
x
Reference in New Issue
Block a user