summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinghai Shang <minghai@google.com>2015-05-27 20:24:29 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-05-27 20:24:30 +0000
commitcbdfdb947ca610a349978de0cd106ead7c86dd1e (patch)
tree519f6651508baf1546daedd1a9a6385dbf7801b9
parenta49fff632c591548d2bc3a98b00082ec19de238e (diff)
parent48bfee879705f28cc5f1fa7f3beaf0c363d29ea9 (diff)
downloadlibvpx-cbdfdb947ca610a349978de0cd106ead7c86dd1e.tar
libvpx-cbdfdb947ca610a349978de0cd106ead7c86dd1e.tar.gz
libvpx-cbdfdb947ca610a349978de0cd106ead7c86dd1e.tar.bz2
libvpx-cbdfdb947ca610a349978de0cd106ead7c86dd1e.zip
Merge "[decoder] Optimize context buffer re-allocation"
-rw-r--r--vp9/common/vp9_alloccommon.c42
-rw-r--r--vp9/common/vp9_onyxc_int.h2
-rw-r--r--vp9/decoder/vp9_decoder.c1
3 files changed, 29 insertions, 16 deletions
diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c
index 600cb13d8..8eda491de 100644
--- a/vp9/common/vp9_alloccommon.c
+++ b/vp9/common/vp9_alloccommon.c
@@ -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;
-
- // 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;
+ 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;
+ }
- 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->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_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;
+ 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;
+
+ 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;
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index 5179c6906..f710f8106 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -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
diff --git a/vp9/decoder/vp9_decoder.c b/vp9/decoder/vp9_decoder.c
index 288d8690c..cf1f23fb9 100644
--- a/vp9/decoder/vp9_decoder.c
+++ b/vp9/decoder/vp9_decoder.c
@@ -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));