diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c index f44ada1b9c1449df6d5e81141e216bd6bc140b2c..e56a0b7a8c9021b6a3166224232f800515a68ecd 100644 --- a/vp9/common/vp9_alloccommon.c +++ b/vp9/common/vp9_alloccommon.c @@ -53,32 +53,41 @@ static void setup_mi(VP9_COMMON *cm) { } 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; + int i; + + for (i = 0; i < 2; ++i) { + cm->mip_array[i] = + (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->mip)); + if (cm->mip_array[i] == 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_array[i] = + (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base)); + if (cm->mi_grid_base_array[i] == 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; + // Init the index. + cm->mi_idx = 0; + cm->prev_mi_idx = 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; + cm->mip = cm->mip_array[cm->mi_idx]; + cm->prev_mip = cm->mip_array[cm->prev_mi_idx]; + cm->mi_grid_base = cm->mi_grid_base_array[cm->mi_idx]; + cm->prev_mi_grid_base = cm->mi_grid_base_array[cm->prev_mi_idx]; return 0; } static void free_mi(VP9_COMMON *cm) { - vpx_free(cm->mip); - vpx_free(cm->prev_mip); - vpx_free(cm->mi_grid_base); - vpx_free(cm->prev_mi_grid_base); + int i; + + for (i = 0; i < 2; ++i) { + vpx_free(cm->mip_array[i]); + cm->mip_array[i] = NULL; + vpx_free(cm->mi_grid_base_array[i]); + cm->mi_grid_base_array[i] = NULL; + } cm->mip = NULL; cm->prev_mip = NULL; @@ -237,13 +246,16 @@ void vp9_update_frame_size(VP9_COMMON *cm) { } 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. - 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; + cm->mip = cm->mip_array[cm->mi_idx]; + cm->prev_mip = cm->mip_array[cm->prev_mi_idx]; + cm->mi_grid_base = cm->mi_grid_base_array[cm->mi_idx]; + cm->prev_mi_grid_base = cm->mi_grid_base_array[cm->prev_mi_idx]; // Update the upper left visible macroblock ptrs. cm->mi = cm->mip + cm->mi_stride + 1; diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h index 20de434148e1aecaf1881b81f28ee74941c20c83..e1753a11b9c2c454322fe47430fd26046824ae0a 100644 --- a/vp9/common/vp9_onyxc_int.h +++ b/vp9/common/vp9_onyxc_int.h @@ -142,6 +142,11 @@ typedef struct VP9Common { /* We allocate a MODE_INFO struct for each macroblock, together with an extra row on top and column on the left to simplify prediction. */ + int mi_idx; + int prev_mi_idx; + MODE_INFO *mip_array[2]; + MODE_INFO **mi_grid_base_array[2]; + MODE_INFO *mip; /* Base of allocated array */ MODE_INFO *mi; /* Corresponds to upper left visible macroblock */ MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */