Index: source/libvpx/vp9/common/vp9_alloccommon.c |
=================================================================== |
--- source/libvpx/vp9/common/vp9_alloccommon.c (revision 263011) |
+++ source/libvpx/vp9/common/vp9_alloccommon.c (working copy) |
@@ -8,7 +8,6 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
- |
#include "./vpx_config.h" |
#include "vpx_mem/vpx_mem.h" |
@@ -18,70 +17,100 @@ |
#include "vp9/common/vp9_onyxc_int.h" |
#include "vp9/common/vp9_systemdependent.h" |
-void vp9_update_mode_info_border(VP9_COMMON *cm, MODE_INFO *mi) { |
- const int stride = cm->mode_info_stride; |
+static void clear_mi_border(const VP9_COMMON *cm, MODE_INFO *mi) { |
int i; |
- // Clear down top border row |
- vpx_memset(mi, 0, sizeof(MODE_INFO) * stride); |
+ // Top border row |
+ vpx_memset(mi, 0, sizeof(*mi) * cm->mi_stride); |
- // Clear left border column |
- for (i = 1; i < cm->mi_rows + 1; i++) |
- vpx_memset(&mi[i * stride], 0, sizeof(MODE_INFO)); |
+ // Left border column |
+ for (i = 1; i < cm->mi_rows + 1; ++i) |
+ vpx_memset(&mi[i * cm->mi_stride], 0, sizeof(*mi)); |
} |
-void vp9_free_frame_buffers(VP9_COMMON *cm) { |
- int i; |
+static void set_mb_mi(VP9_COMMON *cm, int aligned_width, int aligned_height) { |
+ cm->mi_cols = aligned_width >> MI_SIZE_LOG2; |
+ cm->mi_rows = aligned_height >> MI_SIZE_LOG2; |
+ cm->mi_stride = cm->mi_cols + MI_BLOCK_SIZE; |
- for (i = 0; i < FRAME_BUFFERS; i++) { |
- vp9_free_frame_buffer(&cm->frame_bufs[i].buf); |
+ cm->mb_cols = (cm->mi_cols + 1) >> 1; |
+ cm->mb_rows = (cm->mi_rows + 1) >> 1; |
+ cm->MBs = cm->mb_rows * cm->mb_cols; |
+} |
- 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; |
- } |
- } |
+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; |
+ cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1; |
+ cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; |
- vp9_free_frame_buffer(&cm->post_proc_buffer); |
+ vpx_memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip)); |
+ vpx_memset(cm->mi_grid_base, 0, cm->mi_stride * (cm->mi_rows + 1) * |
+ sizeof(*cm->mi_grid_base)); |
+ |
+ clear_mi_border(cm, cm->prev_mip); |
+} |
+ |
+static int alloc_mi(VP9_COMMON *cm, int mi_size) { |
+ cm->mip = (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->mip)); |
+ if (cm->mip == NULL) |
+ return 1; |
+ |
+ cm->prev_mip = (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->prev_mip)); |
+ if (cm->prev_mip == NULL) |
+ return 1; |
+ |
+ cm->mi_grid_base = |
+ (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base)); |
+ if (cm->mi_grid_base == NULL) |
+ return 1; |
+ |
+ cm->prev_mi_grid_base = |
+ (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base)); |
+ if (cm->prev_mi_grid_base == NULL) |
+ return 1; |
+ |
+ return 0; |
+} |
+ |
+static void free_mi(VP9_COMMON *cm) { |
vpx_free(cm->mip); |
vpx_free(cm->prev_mip); |
- vpx_free(cm->last_frame_seg_map); |
vpx_free(cm->mi_grid_base); |
vpx_free(cm->prev_mi_grid_base); |
cm->mip = NULL; |
cm->prev_mip = NULL; |
- cm->last_frame_seg_map = NULL; |
cm->mi_grid_base = NULL; |
cm->prev_mi_grid_base = NULL; |
} |
-static void set_mb_mi(VP9_COMMON *cm, int aligned_width, int aligned_height) { |
- cm->mi_cols = aligned_width >> MI_SIZE_LOG2; |
- cm->mi_rows = aligned_height >> MI_SIZE_LOG2; |
- cm->mode_info_stride = cm->mi_cols + MI_BLOCK_SIZE; |
+void vp9_free_frame_buffers(VP9_COMMON *cm) { |
+ int i; |
- cm->mb_cols = (cm->mi_cols + 1) >> 1; |
- cm->mb_rows = (cm->mi_rows + 1) >> 1; |
- cm->MBs = cm->mb_rows * cm->mb_cols; |
-} |
+ for (i = 0; i < FRAME_BUFFERS; ++i) { |
+ vp9_free_frame_buffer(&cm->frame_bufs[i].buf); |
-static void setup_mi(VP9_COMMON *cm) { |
- cm->mi = cm->mip + cm->mode_info_stride + 1; |
- cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1; |
- cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1; |
- cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1; |
+ 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_memset(cm->mip, 0, |
- cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO)); |
+ vp9_free_frame_buffer(&cm->post_proc_buffer); |
- vpx_memset(cm->mi_grid_base, 0, |
- cm->mode_info_stride * (cm->mi_rows + 1) * |
- sizeof(*cm->mi_grid_base)); |
+ free_mi(cm); |
- vp9_update_mode_info_border(cm, cm->prev_mip); |
+ 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; |
} |
int vp9_resize_frame_buffers(VP9_COMMON *cm, int width, int height) { |
@@ -89,7 +118,6 @@ |
const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
const int ss_x = cm->subsampling_x; |
const int ss_y = cm->subsampling_y; |
- int mi_size; |
if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, width, height, ss_x, ss_y, |
VP9_DEC_BORDER_IN_PIXELS, NULL, NULL, NULL) < 0) |
@@ -97,37 +125,33 @@ |
set_mb_mi(cm, aligned_width, aligned_height); |
- // Allocation |
- mi_size = cm->mode_info_stride * (cm->mi_rows + MI_BLOCK_SIZE); |
- |
- vpx_free(cm->mip); |
- cm->mip = vpx_calloc(mi_size, sizeof(MODE_INFO)); |
- if (!cm->mip) |
+ free_mi(cm); |
+ if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) |
goto fail; |
- vpx_free(cm->prev_mip); |
- cm->prev_mip = vpx_calloc(mi_size, sizeof(MODE_INFO)); |
- if (!cm->prev_mip) |
- goto fail; |
- |
- vpx_free(cm->mi_grid_base); |
- cm->mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->mi_grid_base)); |
- if (!cm->mi_grid_base) |
- goto fail; |
- |
- vpx_free(cm->prev_mi_grid_base); |
- cm->prev_mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base)); |
- if (!cm->prev_mi_grid_base) |
- goto fail; |
- |
setup_mi(cm); |
// Create the segmentation map structure and set to 0. |
vpx_free(cm->last_frame_seg_map); |
- cm->last_frame_seg_map = vpx_calloc(cm->mi_rows * cm->mi_cols, 1); |
+ cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); |
if (!cm->last_frame_seg_map) |
goto fail; |
+ 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; |
+ |
return 0; |
fail: |
@@ -136,13 +160,11 @@ |
} |
int vp9_alloc_frame_buffers(VP9_COMMON *cm, int width, int height) { |
- int i; |
- |
const int aligned_width = ALIGN_POWER_OF_TWO(width, MI_SIZE_LOG2); |
const int aligned_height = ALIGN_POWER_OF_TWO(height, MI_SIZE_LOG2); |
const int ss_x = cm->subsampling_x; |
const int ss_y = cm->subsampling_y; |
- int mi_size; |
+ int i; |
vp9_free_frame_buffers(cm); |
@@ -167,30 +189,27 @@ |
set_mb_mi(cm, aligned_width, aligned_height); |
- // Allocation |
- mi_size = cm->mode_info_stride * (cm->mi_rows + MI_BLOCK_SIZE); |
- |
- cm->mip = vpx_calloc(mi_size, sizeof(MODE_INFO)); |
- if (!cm->mip) |
+ if (alloc_mi(cm, cm->mi_stride * (cm->mi_rows + MI_BLOCK_SIZE))) |
goto fail; |
- cm->prev_mip = vpx_calloc(mi_size, sizeof(MODE_INFO)); |
- if (!cm->prev_mip) |
- goto fail; |
+ setup_mi(cm); |
- cm->mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->mi_grid_base)); |
- if (!cm->mi_grid_base) |
+ // Create the segmentation map structure and set to 0. |
+ cm->last_frame_seg_map = (uint8_t *)vpx_calloc(cm->mi_rows * cm->mi_cols, 1); |
+ if (!cm->last_frame_seg_map) |
goto fail; |
- cm->prev_mi_grid_base = vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base)); |
- if (!cm->prev_mi_grid_base) |
+ 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; |
- setup_mi(cm); |
- |
- // Create the segmentation map structure and set to 0. |
- cm->last_frame_seg_map = vpx_calloc(cm->mi_rows * cm->mi_cols, 1); |
- if (!cm->last_frame_seg_map) |
+ 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; |
return 0; |
@@ -205,10 +224,6 @@ |
vp9_free_internal_frame_buffers(&cm->int_frame_buffers); |
} |
-void vp9_initialize_common() { |
- vp9_init_neighbors(); |
-} |
- |
void vp9_update_frame_size(VP9_COMMON *cm) { |
const int aligned_width = ALIGN_POWER_OF_TWO(cm->width, MI_SIZE_LOG2); |
const int aligned_height = ALIGN_POWER_OF_TWO(cm->height, MI_SIZE_LOG2); |
@@ -220,3 +235,19 @@ |
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) { |
+ // Current mip will be the prev_mip for the next frame. |
+ MODE_INFO *temp = cm->prev_mip; |
+ MODE_INFO **temp2 = cm->prev_mi_grid_base; |
+ cm->prev_mip = cm->mip; |
+ cm->mip = temp; |
+ cm->prev_mi_grid_base = cm->mi_grid_base; |
+ cm->mi_grid_base = temp2; |
+ |
+ // 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; |
+ cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1; |
+ cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1; |
+} |