summaryrefslogtreecommitdiff
path: root/vp9/common
diff options
context:
space:
mode:
authorhkuang <hkuang@google.com>2014-11-03 11:23:22 -0800
committerhkuang <hkuang@google.com>2014-11-05 16:14:30 -0800
commit4cc7c5a17fd371ea036428afb31606d2e6e77bf4 (patch)
tree018f7b84534faf69d670e510db1425853a51c36f /vp9/common
parent343acaa8f2233acfe427a8e3557efa7bae092d77 (diff)
downloadlibvpx-4cc7c5a17fd371ea036428afb31606d2e6e77bf4.tar
libvpx-4cc7c5a17fd371ea036428afb31606d2e6e77bf4.tar.gz
libvpx-4cc7c5a17fd371ea036428afb31606d2e6e77bf4.tar.bz2
libvpx-4cc7c5a17fd371ea036428afb31606d2e6e77bf4.zip
Totally remove prev_mi in VP9 decoder.
This will save the memory and improve the decode speed due to removing unnecessary memset of big prev_mi array for all the key frames. Decoding a all key frames 1080p video shows speed improve around 2%. Change-Id: I6284a445c1291056e3c15135c3c20d502f791c10
Diffstat (limited to 'vp9/common')
-rw-r--r--vp9/common/vp9_alloccommon.c77
-rw-r--r--vp9/common/vp9_alloccommon.h1
-rw-r--r--vp9/common/vp9_entropymode.c3
-rw-r--r--vp9/common/vp9_onyxc_int.h14
4 files changed, 13 insertions, 82 deletions
diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c
index 8a41f07f8..03959e365 100644
--- a/vp9/common/vp9_alloccommon.c
+++ b/vp9/common/vp9_alloccommon.c
@@ -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,48 +30,6 @@ void vp9_set_mb_mi(VP9_COMMON *cm, int width, int height) {
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;
@@ -101,14 +48,11 @@ void vp9_free_ref_frame_buffers(VP9_COMMON *cm) {
}
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;
}
@@ -117,7 +61,7 @@ int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) {
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);
@@ -204,22 +148,7 @@ void vp9_remove_common(VP9_COMMON *cm) {
}
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;
-}
diff --git a/vp9/common/vp9_alloccommon.h b/vp9/common/vp9_alloccommon.h
index c5b893fac..955bb9ec5 100644
--- a/vp9/common/vp9_alloccommon.h
+++ b/vp9/common/vp9_alloccommon.h
@@ -31,7 +31,6 @@ int vp9_alloc_state_buffers(struct VP9Common *cm, int width, int height);
void vp9_free_state_buffers(struct VP9Common *cm);
void vp9_set_mb_mi(struct VP9Common *cm, int width, int height);
-void vp9_swap_mi_and_prev_mi(struct VP9Common *cm);
#ifdef __cplusplus
} // extern "C"
diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c
index 1a24572ba..d7610ed28 100644
--- a/vp9/common/vp9_entropymode.c
+++ b/vp9/common/vp9_entropymode.c
@@ -464,7 +464,8 @@ void vp9_setup_past_independence(VP9_COMMON *cm) {
cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
}
- if (frame_is_intra_only(cm))
+ // prev_mip will only be allocated in encoder.
+ if (frame_is_intra_only(cm) && cm->prev_mip)
vpx_memset(cm->prev_mip, 0, cm->mi_stride * (cm->mi_rows + 1) *
sizeof(*cm->prev_mip));
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index b3a6590b2..ae69c0c00 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -96,7 +96,6 @@ typedef struct VP9Common {
#endif
YV12_BUFFER_CONFIG *frame_to_show;
-
RefCntBuffer frame_bufs[FRAME_BUFFERS];
RefCntBuffer *prev_frame;
@@ -149,17 +148,20 @@ 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;
int mi_alloc_size;
- MODE_INFO *mip_array[2];
-
MODE_INFO *mip; /* Base of allocated array */
MODE_INFO *mi; /* Corresponds to upper left visible macroblock */
+
+ // TODO(agrange): Move prev_mi into encoder structure.
+ // prev_mip and prev_mi will only be allocated in VP9 encoder.
MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */
MODE_INFO *prev_mi; /* 'mi' from last frame (points into prev_mip) */
+ // Separate mi functions between encoder and decoder.
+ int (*alloc_mi)(struct VP9Common *cm, int mi_size);
+ void (*free_mi)(struct VP9Common *cm);
+ void (*setup_mi)(struct VP9Common *cm);
+
// Whether to use previous frame's motion vectors for prediction.
int use_prev_frame_mvs;