Index: source/libvpx/vp9/common/vp9_alloccommon.c |
=================================================================== |
--- source/libvpx/vp9/common/vp9_alloccommon.c (revision 293081) |
+++ source/libvpx/vp9/common/vp9_alloccommon.c (working copy) |
@@ -17,17 +17,6 @@ |
#include "vp9/common/vp9_onyxc_int.h" |
#include "vp9/common/vp9_systemdependent.h" |
-static void clear_mi_border(const VP9_COMMON *cm, MODE_INFO *mi) { |
- int i; |
- |
- // Top border row |
- vpx_memset(mi, 0, sizeof(*mi) * cm->mi_stride); |
- |
- // Left border column |
- for (i = 1; i < cm->mi_rows + 1; ++i) |
- vpx_memset(&mi[i * cm->mi_stride], 0, sizeof(*mi)); |
-} |
- |
void vp9_set_mb_mi(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); |
@@ -41,59 +30,18 @@ |
cm->MBs = cm->mb_rows * cm->mb_cols; |
} |
-static void setup_mi(VP9_COMMON *cm) { |
- cm->mi = cm->mip + cm->mi_stride + 1; |
- cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; |
- |
- vpx_memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip)); |
- clear_mi_border(cm, cm->prev_mip); |
-} |
- |
-static int alloc_mi(VP9_COMMON *cm, int mi_size) { |
- int i; |
- |
- for (i = 0; i < 2; ++i) { |
- cm->mip_array[i] = |
- (MODE_INFO *)vpx_calloc(mi_size, sizeof(MODE_INFO)); |
- if (cm->mip_array[i] == NULL) |
- return 1; |
- } |
- |
- cm->mi_alloc_size = mi_size; |
- |
- // Init the index. |
- cm->mi_idx = 0; |
- cm->prev_mi_idx = 1; |
- |
- cm->mip = cm->mip_array[cm->mi_idx]; |
- cm->prev_mip = cm->mip_array[cm->prev_mi_idx]; |
- |
- return 0; |
-} |
- |
-static void free_mi(VP9_COMMON *cm) { |
- int i; |
- |
- for (i = 0; i < 2; ++i) { |
- vpx_free(cm->mip_array[i]); |
- cm->mip_array[i] = NULL; |
- } |
- |
- cm->mip = NULL; |
- cm->prev_mip = NULL; |
-} |
- |
void vp9_free_ref_frame_buffers(VP9_COMMON *cm) { |
int i; |
for (i = 0; i < FRAME_BUFFERS; ++i) { |
- vp9_free_frame_buffer(&cm->frame_bufs[i].buf); |
- |
if (cm->frame_bufs[i].ref_count > 0 && |
cm->frame_bufs[i].raw_frame_buffer.data != NULL) { |
cm->release_fb_cb(cm->cb_priv, &cm->frame_bufs[i].raw_frame_buffer); |
cm->frame_bufs[i].ref_count = 0; |
} |
+ vpx_free(cm->frame_bufs[i].mvs); |
+ cm->frame_bufs[i].mvs = NULL; |
+ vp9_free_frame_buffer(&cm->frame_bufs[i].buf); |
} |
vp9_free_frame_buffer(&cm->post_proc_buffer); |
@@ -100,14 +48,11 @@ |
} |
void vp9_free_context_buffers(VP9_COMMON *cm) { |
- free_mi(cm); |
- |
+ cm->free_mi(cm); |
vpx_free(cm->last_frame_seg_map); |
cm->last_frame_seg_map = NULL; |
- |
vpx_free(cm->above_context); |
cm->above_context = NULL; |
- |
vpx_free(cm->above_seg_context); |
cm->above_seg_context = NULL; |
} |
@@ -116,7 +61,7 @@ |
vp9_free_context_buffers(cm); |
vp9_set_mb_mi(cm, width, height); |
- if (alloc_mi(cm, cm->mi_stride * calc_mi_size(cm->mi_rows))) |
+ if (cm->alloc_mi(cm, cm->mi_stride * calc_mi_size(cm->mi_rows))) |
goto fail; |
cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); |
@@ -166,6 +111,16 @@ |
#endif |
VP9_ENC_BORDER_IN_PIXELS) < 0) |
goto fail; |
+ if (cm->frame_bufs[i].mvs == NULL) { |
+ cm->frame_bufs[i].mvs = |
+ (MV_REF *)vpx_calloc(cm->mi_rows * cm->mi_cols, |
+ sizeof(*cm->frame_bufs[i].mvs)); |
+ if (cm->frame_bufs[i].mvs == NULL) |
+ goto fail; |
+ |
+ cm->frame_bufs[i].mi_rows = cm->mi_rows; |
+ cm->frame_bufs[i].mi_cols = cm->mi_cols; |
+ } |
} |
init_frame_bufs(cm); |
@@ -190,25 +145,15 @@ |
vp9_free_ref_frame_buffers(cm); |
vp9_free_context_buffers(cm); |
vp9_free_internal_frame_buffers(&cm->int_frame_buffers); |
+ |
+ vpx_free(cm->fc); |
+ cm->fc = NULL; |
+ vpx_free(cm->frame_contexts); |
+ cm->frame_contexts = NULL; |
} |
void vp9_init_context_buffers(VP9_COMMON *cm) { |
- setup_mi(cm); |
+ cm->setup_mi(cm); |
if (cm->last_frame_seg_map) |
vpx_memset(cm->last_frame_seg_map, 0, cm->mi_rows * cm->mi_cols); |
} |
- |
-void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) { |
- // Swap indices. |
- const int tmp = cm->mi_idx; |
- cm->mi_idx = cm->prev_mi_idx; |
- cm->prev_mi_idx = tmp; |
- |
- // Current mip will be the prev_mip for the next frame. |
- cm->mip = cm->mip_array[cm->mi_idx]; |
- cm->prev_mip = cm->mip_array[cm->prev_mi_idx]; |
- |
- // Update the upper left visible macroblock ptrs. |
- cm->mi = cm->mip + cm->mi_stride + 1; |
- cm->prev_mi = cm->prev_mip + cm->mi_stride + 1; |
-} |