Index: source/libvpx/vp9/decoder/vp9_decoder.c |
=================================================================== |
--- source/libvpx/vp9/decoder/vp9_decoder.c (revision 293081) |
+++ source/libvpx/vp9/decoder/vp9_decoder.c (working copy) |
@@ -43,6 +43,24 @@ |
} |
} |
+static void vp9_dec_setup_mi(VP9_COMMON *cm) { |
+ cm->mi = cm->mip + cm->mi_stride + 1; |
+ vpx_memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip)); |
+} |
+ |
+static int vp9_dec_alloc_mi(VP9_COMMON *cm, int mi_size) { |
+ cm->mip = vpx_calloc(mi_size, sizeof(*cm->mip)); |
+ if (!cm->mip) |
+ return 1; |
+ cm->mi_alloc_size = mi_size; |
+ return 0; |
+} |
+ |
+static void vp9_dec_free_mi(VP9_COMMON *cm) { |
+ vpx_free(cm->mip); |
+ cm->mip = NULL; |
+} |
+ |
VP9Decoder *vp9_decoder_create() { |
VP9Decoder *const pbi = vpx_memalign(32, sizeof(*pbi)); |
VP9_COMMON *const cm = pbi ? &pbi->common : NULL; |
@@ -59,6 +77,13 @@ |
} |
cm->error.setjmp = 1; |
+ |
+ CHECK_MEM_ERROR(cm, cm->fc, |
+ (FRAME_CONTEXT *)vpx_calloc(1, sizeof(*cm->fc))); |
+ CHECK_MEM_ERROR(cm, cm->frame_contexts, |
+ (FRAME_CONTEXT *)vpx_calloc(FRAME_CONTEXTS, |
+ sizeof(*cm->frame_contexts))); |
+ |
pbi->need_resync = 1; |
initialize_dec(); |
@@ -70,6 +95,10 @@ |
cm->bit_depth = VPX_BITS_8; |
cm->dequant_bit_depth = VPX_BITS_8; |
+ cm->alloc_mi = vp9_dec_alloc_mi; |
+ cm->free_mi = vp9_dec_free_mi; |
+ cm->setup_mi = vp9_dec_setup_mi; |
+ |
// vp9_init_dequantizer() is first called here. Add check in |
// frame_init_dequantizer() to avoid unnecessary calling of |
// vp9_init_dequantizer() for every frame. |
@@ -94,9 +123,9 @@ |
for (i = 0; i < pbi->num_tile_workers; ++i) { |
VP9Worker *const worker = &pbi->tile_workers[i]; |
vp9_get_worker_interface()->end(worker); |
- vpx_free(worker->data1); |
- vpx_free(worker->data2); |
} |
+ vpx_free(pbi->tile_worker_data); |
+ vpx_free(pbi->tile_worker_info); |
vpx_free(pbi->tile_workers); |
if (pbi->num_tile_workers > 0) { |
@@ -240,6 +269,9 @@ |
&cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer); |
cm->new_fb_idx = get_free_fb(cm); |
+ // Assign a MV array to the frame buffer. |
+ cm->cur_frame = &cm->frame_bufs[cm->new_fb_idx]; |
+ |
if (setjmp(cm->error.jmp)) { |
pbi->need_resync = 1; |
cm->error.setjmp = 0; |
@@ -272,14 +304,13 @@ |
cm->last_width = cm->width; |
cm->last_height = cm->height; |
- if (!cm->show_existing_frame) |
+ if (!cm->show_existing_frame) { |
cm->last_show_frame = cm->show_frame; |
- if (cm->show_frame) { |
- if (!cm->show_existing_frame) |
- vp9_swap_mi_and_prev_mi(cm); |
+ cm->prev_frame = cm->cur_frame; |
+ } |
+ if (cm->show_frame) |
cm->current_video_frame++; |
- } |
cm->error.setjmp = 0; |
return retcode; |