Index: source/libvpx/vp9/common/vp9_alloccommon.c |
=================================================================== |
--- source/libvpx/vp9/common/vp9_alloccommon.c (revision 281795) |
+++ source/libvpx/vp9/common/vp9_alloccommon.c (working copy) |
@@ -109,7 +109,9 @@ |
} |
vp9_free_frame_buffer(&cm->post_proc_buffer); |
+} |
+void vp9_free_context_buffers(VP9_COMMON *cm) { |
free_mi(cm); |
vpx_free(cm->last_frame_seg_map); |
@@ -125,12 +127,15 @@ |
int vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) { |
const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); |
const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
+#if CONFIG_INTERNAL_STATS || CONFIG_VP9_POSTPROC |
const int ss_x = cm->subsampling_x; |
const int ss_y = cm->subsampling_y; |
+ // TODO(agrange): this should be conditionally allocated. |
if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, |
VP9_DEC_BORDER_IN_PIXELS, NULL, NULL, NULL) < 0) |
goto fail; |
+#endif |
set_mb_mi(cm, aligned_width, aligned_height); |
@@ -165,37 +170,57 @@ |
fail: |
vp9_free_frame_buffers(cm); |
+ vp9_free_context_buffers(cm); |
return 1; |
} |
+static void init_frame_bufs(VP9_COMMON *cm) { |
+ int i; |
+ |
+ cm->new_fb_idx = FRAME_BUFFERS - 1; |
+ cm->frame_bufs[cm->new_fb_idx].ref_count = 1; |
+ |
+ for (i = 0; i < REF_FRAMES; ++i) { |
+ cm->ref_frame_map[i] = i; |
+ cm->frame_bufs[i].ref_count = 1; |
+ } |
+} |
+ |
int vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) { |
- const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); |
- const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
+ int i; |
const int ss_x = cm->subsampling_x; |
const int ss_y = cm->subsampling_y; |
- int i; |
vp9_free_frame_buffers(cm); |
- for (i = 0; i < FRAME_BUFFERS; i++) { |
+ for (i = 0; i < FRAME_BUFFERS; ++i) { |
cm->frame_bufs[i].ref_count = 0; |
if (vp9_alloc_frame_buffer(&cm->frame_bufs[i].buf, width, height, |
ss_x, ss_y, VP9_ENC_BORDER_IN_PIXELS) < 0) |
goto fail; |
} |
- cm->new_fb_idx = FRAME_BUFFERS - 1; |
- cm->frame_bufs[cm->new_fb_idx].ref_count = 1; |
+ init_frame_bufs(cm); |
- for (i = 0; i < REF_FRAMES; i++) { |
- cm->ref_frame_map[i] = i; |
- cm->frame_bufs[i].ref_count = 1; |
- } |
- |
+#if CONFIG_INTERNAL_STATS || CONFIG_VP9_POSTPROC |
if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, |
VP9_ENC_BORDER_IN_PIXELS) < 0) |
goto fail; |
+#endif |
+ return 0; |
+ |
+ fail: |
+ vp9_free_frame_buffers(cm); |
+ return 1; |
+} |
+ |
+int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) { |
+ const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); |
+ const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
+ |
+ vp9_free_context_buffers(cm); |
+ |
set_mb_mi(cm, aligned_width, aligned_height); |
if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) |
@@ -224,12 +249,13 @@ |
return 0; |
fail: |
- vp9_free_frame_buffers(cm); |
+ vp9_free_context_buffers(cm); |
return 1; |
} |
void vp9_remove_common(VP9_COMMON *cm) { |
vp9_free_frame_buffers(cm); |
+ vp9_free_context_buffers(cm); |
vp9_free_internal_frame_buffers(&cm->int_frame_buffers); |
} |