OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <assert.h> | 11 #include <assert.h> |
12 #include <limits.h> | 12 #include <limits.h> |
13 #include <stdio.h> | 13 #include <stdio.h> |
14 | 14 |
15 #include "vp9/common/vp9_onyxc_int.h" | 15 #include "vp9/common/vp9_onyxc_int.h" |
16 #if CONFIG_VP9_POSTPROC | 16 #if CONFIG_VP9_POSTPROC |
17 #include "vp9/common/vp9_postproc.h" | 17 #include "vp9/common/vp9_postproc.h" |
18 #endif | 18 #endif |
19 #include "vp9/decoder/vp9_onyxd.h" | 19 #include "vp9/decoder/vp9_onyxd.h" |
20 #include "vp9/decoder/vp9_onyxd_int.h" | 20 #include "vp9/decoder/vp9_onyxd_int.h" |
21 #include "vpx_mem/vpx_mem.h" | 21 #include "vpx_mem/vpx_mem.h" |
22 #include "vp9/common/vp9_alloccommon.h" | 22 #include "vp9/common/vp9_alloccommon.h" |
23 #include "vp9/common/vp9_loopfilter.h" | 23 #include "vp9/common/vp9_loopfilter.h" |
24 #include "vp9/common/vp9_quant_common.h" | 24 #include "vp9/common/vp9_quant_common.h" |
25 #include "vpx_scale/vpx_scale.h" | 25 #include "vpx_scale/vpx_scale.h" |
26 #include "vp9/common/vp9_systemdependent.h" | 26 #include "vp9/common/vp9_systemdependent.h" |
27 #include "vpx_ports/vpx_timer.h" | 27 #include "vpx_ports/vpx_timer.h" |
28 #include "vp9/decoder/vp9_decodframe.h" | 28 #include "vp9/decoder/vp9_decodeframe.h" |
29 #include "vp9/decoder/vp9_detokenize.h" | 29 #include "vp9/decoder/vp9_detokenize.h" |
30 #include "./vpx_scale_rtcd.h" | 30 #include "./vpx_scale_rtcd.h" |
31 | 31 |
32 #define WRITE_RECON_BUFFER 0 | 32 #define WRITE_RECON_BUFFER 0 |
33 #if WRITE_RECON_BUFFER == 1 | 33 #if WRITE_RECON_BUFFER == 1 |
34 static void recon_write_yuv_frame(const char *name, | 34 static void recon_write_yuv_frame(const char *name, |
35 const YV12_BUFFER_CONFIG *s, | 35 const YV12_BUFFER_CONFIG *s, |
36 int w, int _h) { | 36 int w, int _h) { |
37 FILE *yuv_file = fopen(name, "ab"); | 37 FILE *yuv_file = fopen(name, "ab"); |
38 const uint8_t *src = s->y_buffer; | 38 const uint8_t *src = s->y_buffer; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 void vp9_initialize_dec() { | 100 void vp9_initialize_dec() { |
101 static int init_done = 0; | 101 static int init_done = 0; |
102 | 102 |
103 if (!init_done) { | 103 if (!init_done) { |
104 vp9_initialize_common(); | 104 vp9_initialize_common(); |
105 vp9_init_quant_tables(); | 105 vp9_init_quant_tables(); |
106 init_done = 1; | 106 init_done = 1; |
107 } | 107 } |
108 } | 108 } |
109 | 109 |
| 110 static void init_macroblockd(VP9D_COMP *const pbi) { |
| 111 MACROBLOCKD *xd = &pbi->mb; |
| 112 struct macroblockd_plane *const pd = xd->plane; |
| 113 int i; |
| 114 |
| 115 for (i = 0; i < MAX_MB_PLANE; ++i) |
| 116 pd[i].dqcoeff = pbi->dqcoeff[i]; |
| 117 } |
| 118 |
110 VP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) { | 119 VP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) { |
111 VP9D_COMP *const pbi = vpx_memalign(32, sizeof(VP9D_COMP)); | 120 VP9D_COMP *const pbi = vpx_memalign(32, sizeof(VP9D_COMP)); |
112 VP9_COMMON *const cm = pbi ? &pbi->common : NULL; | 121 VP9_COMMON *const cm = pbi ? &pbi->common : NULL; |
113 | 122 |
114 if (!cm) | 123 if (!cm) |
115 return NULL; | 124 return NULL; |
116 | 125 |
117 vp9_zero(*pbi); | 126 vp9_zero(*pbi); |
118 | 127 |
| 128 // Initialize the references to not point to any frame buffers. |
| 129 memset(&cm->ref_frame_map, -1, sizeof(cm->ref_frame_map)); |
| 130 |
119 if (setjmp(cm->error.jmp)) { | 131 if (setjmp(cm->error.jmp)) { |
120 cm->error.setjmp = 0; | 132 cm->error.setjmp = 0; |
121 vp9_remove_decompressor(pbi); | 133 vp9_remove_decompressor(pbi); |
122 return NULL; | 134 return NULL; |
123 } | 135 } |
124 | 136 |
125 cm->error.setjmp = 1; | 137 cm->error.setjmp = 1; |
126 vp9_initialize_dec(); | 138 vp9_initialize_dec(); |
127 | 139 |
128 vp9_create_common(cm); | 140 vp9_create_common(cm); |
129 | 141 |
130 pbi->oxcf = *oxcf; | 142 pbi->oxcf = *oxcf; |
131 pbi->ready_for_new_data = 1; | 143 pbi->ready_for_new_data = 1; |
132 cm->current_video_frame = 0; | 144 cm->current_video_frame = 0; |
133 | 145 |
134 // vp9_init_dequantizer() is first called here. Add check in | 146 // vp9_init_dequantizer() is first called here. Add check in |
135 // frame_init_dequantizer() to avoid unnecessary calling of | 147 // frame_init_dequantizer() to avoid unnecessary calling of |
136 // vp9_init_dequantizer() for every frame. | 148 // vp9_init_dequantizer() for every frame. |
137 vp9_init_dequantizer(cm); | 149 vp9_init_dequantizer(cm); |
138 | 150 |
139 vp9_loop_filter_init(cm); | 151 vp9_loop_filter_init(cm); |
140 | 152 |
141 cm->error.setjmp = 0; | 153 cm->error.setjmp = 0; |
142 pbi->decoded_key_frame = 0; | 154 pbi->decoded_key_frame = 0; |
143 | 155 |
| 156 init_macroblockd(pbi); |
| 157 |
144 vp9_worker_init(&pbi->lf_worker); | 158 vp9_worker_init(&pbi->lf_worker); |
145 | 159 |
146 return pbi; | 160 return pbi; |
147 } | 161 } |
148 | 162 |
149 void vp9_remove_decompressor(VP9D_PTR ptr) { | 163 void vp9_remove_decompressor(VP9D_PTR ptr) { |
150 int i; | 164 int i; |
151 VP9D_COMP *const pbi = (VP9D_COMP *)ptr; | 165 VP9D_COMP *const pbi = (VP9D_COMP *)ptr; |
152 | 166 |
153 if (!pbi) | 167 if (!pbi) |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 } | 254 } |
241 | 255 |
242 return pbi->common.error.error_code; | 256 return pbi->common.error.error_code; |
243 } | 257 } |
244 | 258 |
245 | 259 |
246 int vp9_get_reference_dec(VP9D_PTR ptr, int index, YV12_BUFFER_CONFIG **fb) { | 260 int vp9_get_reference_dec(VP9D_PTR ptr, int index, YV12_BUFFER_CONFIG **fb) { |
247 VP9D_COMP *pbi = (VP9D_COMP *) ptr; | 261 VP9D_COMP *pbi = (VP9D_COMP *) ptr; |
248 VP9_COMMON *cm = &pbi->common; | 262 VP9_COMMON *cm = &pbi->common; |
249 | 263 |
250 if (index < 0 || index >= NUM_REF_FRAMES) | 264 if (index < 0 || index >= REF_FRAMES) |
251 return -1; | 265 return -1; |
252 | 266 |
253 *fb = &cm->yv12_fb[cm->ref_frame_map[index]]; | 267 *fb = &cm->yv12_fb[cm->ref_frame_map[index]]; |
254 return 0; | 268 return 0; |
255 } | 269 } |
256 | 270 |
257 /* If any buffer updating is signaled it should be done here. */ | 271 /* If any buffer updating is signaled it should be done here. */ |
258 static void swap_frame_buffers(VP9D_COMP *pbi) { | 272 static void swap_frame_buffers(VP9D_COMP *pbi) { |
259 int ref_index = 0, mask; | 273 int ref_index = 0, mask; |
260 VP9_COMMON *const cm = &pbi->common; | 274 VP9_COMMON *const cm = &pbi->common; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 372 |
359 #if WRITE_RECON_BUFFER == 2 | 373 #if WRITE_RECON_BUFFER == 2 |
360 if (cm->show_frame) | 374 if (cm->show_frame) |
361 write_dx_frame_to_file(cm->frame_to_show, | 375 write_dx_frame_to_file(cm->frame_to_show, |
362 cm->current_video_frame + 2000); | 376 cm->current_video_frame + 2000); |
363 else | 377 else |
364 write_dx_frame_to_file(cm->frame_to_show, | 378 write_dx_frame_to_file(cm->frame_to_show, |
365 cm->current_video_frame + 3000); | 379 cm->current_video_frame + 3000); |
366 #endif | 380 #endif |
367 | 381 |
368 vp9_extend_frame_inner_borders(cm->frame_to_show, | |
369 cm->subsampling_x, | |
370 cm->subsampling_y); | |
371 | |
372 #if WRITE_RECON_BUFFER == 1 | 382 #if WRITE_RECON_BUFFER == 1 |
373 if (cm->show_frame) | 383 if (cm->show_frame) |
374 recon_write_yuv_frame("recon.yuv", cm->frame_to_show, | 384 recon_write_yuv_frame("recon.yuv", cm->frame_to_show, |
375 cm->width, cm->height); | 385 cm->width, cm->height); |
376 #endif | 386 #endif |
377 | 387 |
378 vp9_clear_system_state(); | 388 vp9_clear_system_state(); |
379 | 389 |
380 cm->last_show_frame = cm->show_frame; | 390 cm->last_show_frame = cm->show_frame; |
381 if (cm->show_frame) { | 391 if (cm->show_frame) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 | 447 |
438 ret = 0; | 448 ret = 0; |
439 } else { | 449 } else { |
440 ret = -1; | 450 ret = -1; |
441 } | 451 } |
442 | 452 |
443 #endif /*!CONFIG_POSTPROC*/ | 453 #endif /*!CONFIG_POSTPROC*/ |
444 vp9_clear_system_state(); | 454 vp9_clear_system_state(); |
445 return ret; | 455 return ret; |
446 } | 456 } |
OLD | NEW |