Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: source/libvpx/vp9/decoder/vp9_onyxd_if.c

Issue 23600008: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/decoder/vp9_idct_blk.c ('k') | source/libvpx/vp9/decoder/vp9_onyxd_int.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 11 #include <assert.h>
12 #include <limits.h>
12 #include <stdio.h> 13 #include <stdio.h>
13 #include <assert.h>
14 14
15 #include "vp9/common/vp9_onyxc_int.h" 15 #include "vp9/common/vp9_onyxc_int.h"
16 #if CONFIG_POSTPROC 16 #if CONFIG_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"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 103
104 if (!init_done) { 104 if (!init_done) {
105 vp9_initialize_common(); 105 vp9_initialize_common();
106 vp9_init_quant_tables(); 106 vp9_init_quant_tables();
107 init_done = 1; 107 init_done = 1;
108 } 108 }
109 } 109 }
110 110
111 VP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) { 111 VP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) {
112 VP9D_COMP *const pbi = vpx_memalign(32, sizeof(VP9D_COMP)); 112 VP9D_COMP *const pbi = vpx_memalign(32, sizeof(VP9D_COMP));
113 VP9_COMMON *const cm = pbi ? &pbi->common : NULL;
113 114
114 if (!pbi) 115 if (!cm)
115 return NULL; 116 return NULL;
116 117
117 vpx_memset(pbi, 0, sizeof(VP9D_COMP)); 118 vp9_zero(*pbi);
118 119
119 if (setjmp(pbi->common.error.jmp)) { 120 if (setjmp(cm->error.jmp)) {
120 pbi->common.error.setjmp = 0; 121 cm->error.setjmp = 0;
121 vp9_remove_decompressor(pbi); 122 vp9_remove_decompressor(pbi);
122 return NULL; 123 return NULL;
123 } 124 }
124 125
125 pbi->common.error.setjmp = 1; 126 cm->error.setjmp = 1;
126 vp9_initialize_dec(); 127 vp9_initialize_dec();
127 128
128 vp9_create_common(&pbi->common); 129 vp9_create_common(cm);
129 130
130 pbi->oxcf = *oxcf; 131 pbi->oxcf = *oxcf;
131 pbi->common.current_video_frame = 0;
132 pbi->ready_for_new_data = 1; 132 pbi->ready_for_new_data = 1;
133 cm->current_video_frame = 0;
133 134
134 // vp9_init_dequantizer() is first called here. Add check in 135 // vp9_init_dequantizer() is first called here. Add check in
135 // frame_init_dequantizer() to avoid unnecessary calling of 136 // frame_init_dequantizer() to avoid unnecessary calling of
136 // vp9_init_dequantizer() for every frame. 137 // vp9_init_dequantizer() for every frame.
137 vp9_init_dequantizer(&pbi->common); 138 vp9_init_dequantizer(cm);
138 139
139 vp9_loop_filter_init(&pbi->common, &pbi->mb.lf); 140 vp9_loop_filter_init(cm);
140 141
141 pbi->common.error.setjmp = 0; 142 cm->error.setjmp = 0;
142 pbi->decoded_key_frame = 0; 143 pbi->decoded_key_frame = 0;
143 144
145 if (pbi->oxcf.max_threads > 1) {
146 vp9_worker_init(&pbi->lf_worker);
147 pbi->lf_worker.data1 = vpx_malloc(sizeof(LFWorkerData));
148 pbi->lf_worker.hook = (VP9WorkerHook)vp9_loop_filter_worker;
149 if (pbi->lf_worker.data1 == NULL || !vp9_worker_reset(&pbi->lf_worker)) {
150 vp9_remove_decompressor(pbi);
151 return NULL;
152 }
153 }
154
144 return pbi; 155 return pbi;
145 } 156 }
146 157
147 void vp9_remove_decompressor(VP9D_PTR ptr) { 158 void vp9_remove_decompressor(VP9D_PTR ptr) {
148 VP9D_COMP *const pbi = (VP9D_COMP *)ptr; 159 VP9D_COMP *const pbi = (VP9D_COMP *)ptr;
149 160
150 if (!pbi) 161 if (!pbi)
151 return; 162 return;
152 163
153 if (pbi->common.last_frame_seg_map)
154 vpx_free(pbi->common.last_frame_seg_map);
155
156 vp9_remove_common(&pbi->common); 164 vp9_remove_common(&pbi->common);
165 vp9_worker_end(&pbi->lf_worker);
166 vpx_free(pbi->lf_worker.data1);
157 vpx_free(pbi); 167 vpx_free(pbi);
158 } 168 }
159 169
160 static int equal_dimensions(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { 170 static int equal_dimensions(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) {
161 return a->y_height == b->y_height && a->y_width == b->y_width && 171 return a->y_height == b->y_height && a->y_width == b->y_width &&
162 a->uv_height == b->uv_height && a->uv_width == b->uv_width; 172 a->uv_height == b->uv_height && a->uv_width == b->uv_width;
163 } 173 }
164 174
165 vpx_codec_err_t vp9_copy_reference_dec(VP9D_PTR ptr, 175 vpx_codec_err_t vp9_copy_reference_dec(VP9D_PTR ptr,
166 VP9_REFFRAME ref_frame_flag, 176 VP9_REFFRAME ref_frame_flag,
167 YV12_BUFFER_CONFIG *sd) { 177 YV12_BUFFER_CONFIG *sd) {
168 VP9D_COMP *pbi = (VP9D_COMP *) ptr; 178 VP9D_COMP *pbi = (VP9D_COMP *) ptr;
169 VP9_COMMON *cm = &pbi->common; 179 VP9_COMMON *cm = &pbi->common;
170 int ref_fb_idx; 180 int ref_fb_idx;
171 181
172 /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the 182 /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the
173 * encoder is using the frame buffers for. This is just a stub to keep the 183 * encoder is using the frame buffers for. This is just a stub to keep the
174 * vpxenc --test-decode functionality working, and will be replaced in a 184 * vpxenc --test-decode functionality working, and will be replaced in a
175 * later commit that adds VP9-specific controls for this functionality. 185 * later commit that adds VP9-specific controls for this functionality.
176 */ 186 */
177 if (ref_frame_flag == VP9_LAST_FLAG) { 187 if (ref_frame_flag == VP9_LAST_FLAG) {
178 ref_fb_idx = pbi->common.ref_frame_map[0]; 188 ref_fb_idx = cm->ref_frame_map[0];
179 } else { 189 } else {
180 vpx_internal_error(&pbi->common.error, VPX_CODEC_ERROR, 190 vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
181 "Invalid reference frame"); 191 "Invalid reference frame");
182 return pbi->common.error.error_code; 192 return cm->error.error_code;
183 } 193 }
184 194
185 if (!equal_dimensions(&cm->yv12_fb[ref_fb_idx], sd)) { 195 if (!equal_dimensions(&cm->yv12_fb[ref_fb_idx], sd)) {
186 vpx_internal_error(&pbi->common.error, VPX_CODEC_ERROR, 196 vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
187 "Incorrect buffer dimensions"); 197 "Incorrect buffer dimensions");
188 } else { 198 } else {
189 vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd); 199 vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
190 } 200 }
191 201
192 return pbi->common.error.error_code; 202 return cm->error.error_code;
193 } 203 }
194 204
195 205
196 vpx_codec_err_t vp9_set_reference_dec(VP9D_PTR ptr, VP9_REFFRAME ref_frame_flag, 206 vpx_codec_err_t vp9_set_reference_dec(VP9D_PTR ptr, VP9_REFFRAME ref_frame_flag,
197 YV12_BUFFER_CONFIG *sd) { 207 YV12_BUFFER_CONFIG *sd) {
198 VP9D_COMP *pbi = (VP9D_COMP *) ptr; 208 VP9D_COMP *pbi = (VP9D_COMP *) ptr;
199 VP9_COMMON *cm = &pbi->common; 209 VP9_COMMON *cm = &pbi->common;
200 int *ref_fb_ptr = NULL; 210 int *ref_fb_ptr = NULL;
201 211
202 /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the 212 /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 if (index < 0 || index >= NUM_REF_FRAMES) 252 if (index < 0 || index >= NUM_REF_FRAMES)
243 return -1; 253 return -1;
244 254
245 *fb = &cm->yv12_fb[cm->ref_frame_map[index]]; 255 *fb = &cm->yv12_fb[cm->ref_frame_map[index]];
246 return 0; 256 return 0;
247 } 257 }
248 258
249 /* If any buffer updating is signaled it should be done here. */ 259 /* If any buffer updating is signaled it should be done here. */
250 static void swap_frame_buffers(VP9D_COMP *pbi) { 260 static void swap_frame_buffers(VP9D_COMP *pbi) {
251 int ref_index = 0, mask; 261 int ref_index = 0, mask;
262 VP9_COMMON *const cm = &pbi->common;
252 263
253 for (mask = pbi->refresh_frame_flags; mask; mask >>= 1) { 264 for (mask = pbi->refresh_frame_flags; mask; mask >>= 1) {
254 if (mask & 1) { 265 if (mask & 1)
255 ref_cnt_fb(pbi->common.fb_idx_ref_cnt, 266 ref_cnt_fb(cm->fb_idx_ref_cnt, &cm->ref_frame_map[ref_index],
256 &pbi->common.ref_frame_map[ref_index], 267 cm->new_fb_idx);
257 pbi->common.new_fb_idx);
258 }
259 ++ref_index; 268 ++ref_index;
260 } 269 }
261 270
262 pbi->common.frame_to_show = &pbi->common.yv12_fb[pbi->common.new_fb_idx]; 271 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
263 pbi->common.fb_idx_ref_cnt[pbi->common.new_fb_idx]--; 272 cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
264 273
265 /* Invalidate these references until the next frame starts. */ 274 // Invalidate these references until the next frame starts.
266 for (ref_index = 0; ref_index < 3; ref_index++) 275 for (ref_index = 0; ref_index < 3; ref_index++)
267 pbi->common.active_ref_idx[ref_index] = INT_MAX; 276 cm->active_ref_idx[ref_index] = INT_MAX;
268 } 277 }
269 278
270 int vp9_receive_compressed_data(VP9D_PTR ptr, 279 int vp9_receive_compressed_data(VP9D_PTR ptr,
271 uint64_t size, const uint8_t **psource, 280 uint64_t size, const uint8_t **psource,
272 int64_t time_stamp) { 281 int64_t time_stamp) {
273 VP9D_COMP *pbi = (VP9D_COMP *) ptr; 282 VP9D_COMP *pbi = (VP9D_COMP *) ptr;
274 VP9_COMMON *cm = &pbi->common; 283 VP9_COMMON *cm = &pbi->common;
275 const uint8_t *source = *psource; 284 const uint8_t *source = *psource;
276 int retcode = 0; 285 int retcode = 0;
277 286
278 /*if(pbi->ready_for_new_data == 0) 287 /*if(pbi->ready_for_new_data == 0)
279 return -1;*/ 288 return -1;*/
280 289
281 if (ptr == 0) 290 if (ptr == 0)
282 return -1; 291 return -1;
283 292
284 pbi->common.error.error_code = VPX_CODEC_OK; 293 cm->error.error_code = VPX_CODEC_OK;
285 294
286 pbi->source = source; 295 pbi->source = source;
287 pbi->source_sz = size; 296 pbi->source_sz = size;
288 297
289 if (pbi->source_sz == 0) { 298 if (pbi->source_sz == 0) {
290 /* This is used to signal that we are missing frames. 299 /* This is used to signal that we are missing frames.
291 * We do not know if the missing frame(s) was supposed to update 300 * We do not know if the missing frame(s) was supposed to update
292 * any of the reference buffers, but we act conservative and 301 * any of the reference buffers, but we act conservative and
293 * mark only the last buffer as corrupted. 302 * mark only the last buffer as corrupted.
294 * 303 *
295 * TODO(jkoleszar): Error concealment is undefined and non-normative 304 * TODO(jkoleszar): Error concealment is undefined and non-normative
296 * at this point, but if it becomes so, [0] may not always be the correct 305 * at this point, but if it becomes so, [0] may not always be the correct
297 * thing to do here. 306 * thing to do here.
298 */ 307 */
299 if (cm->active_ref_idx[0] != INT_MAX) 308 if (cm->active_ref_idx[0] != INT_MAX)
300 cm->yv12_fb[cm->active_ref_idx[0]].corrupted = 1; 309 cm->yv12_fb[cm->active_ref_idx[0]].corrupted = 1;
301 } 310 }
302 311
303 cm->new_fb_idx = get_free_fb(cm); 312 cm->new_fb_idx = get_free_fb(cm);
304 313
305 if (setjmp(pbi->common.error.jmp)) { 314 if (setjmp(cm->error.jmp)) {
306 pbi->common.error.setjmp = 0; 315 cm->error.setjmp = 0;
307 316
308 /* We do not know if the missing frame(s) was supposed to update 317 /* We do not know if the missing frame(s) was supposed to update
309 * any of the reference buffers, but we act conservative and 318 * any of the reference buffers, but we act conservative and
310 * mark only the last buffer as corrupted. 319 * mark only the last buffer as corrupted.
311 * 320 *
312 * TODO(jkoleszar): Error concealment is undefined and non-normative 321 * TODO(jkoleszar): Error concealment is undefined and non-normative
313 * at this point, but if it becomes so, [0] may not always be the correct 322 * at this point, but if it becomes so, [0] may not always be the correct
314 * thing to do here. 323 * thing to do here.
315 */ 324 */
316 if (cm->active_ref_idx[0] != INT_MAX) 325 if (cm->active_ref_idx[0] != INT_MAX)
317 cm->yv12_fb[cm->active_ref_idx[0]].corrupted = 1; 326 cm->yv12_fb[cm->active_ref_idx[0]].corrupted = 1;
318 327
319 if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) 328 if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0)
320 cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 329 cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
321 330
322 return -1; 331 return -1;
323 } 332 }
324 333
325 pbi->common.error.setjmp = 1; 334 cm->error.setjmp = 1;
326 335
327 retcode = vp9_decode_frame(pbi, psource); 336 retcode = vp9_decode_frame(pbi, psource);
328 337
329 if (retcode < 0) { 338 if (retcode < 0) {
330 pbi->common.error.error_code = VPX_CODEC_ERROR; 339 cm->error.error_code = VPX_CODEC_ERROR;
331 pbi->common.error.setjmp = 0; 340 cm->error.setjmp = 0;
332 if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) 341 if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0)
333 cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 342 cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
334 return retcode; 343 return retcode;
335 } 344 }
336 345
337 { 346 {
338 swap_frame_buffers(pbi); 347 swap_frame_buffers(pbi);
339 348
340 #if WRITE_RECON_BUFFER == 2 349 #if WRITE_RECON_BUFFER == 2
341 if (cm->show_frame) 350 if (cm->show_frame)
342 write_dx_frame_to_file(cm->frame_to_show, 351 write_dx_frame_to_file(cm->frame_to_show,
343 cm->current_video_frame); 352 cm->current_video_frame);
344 else 353 else
345 write_dx_frame_to_file(cm->frame_to_show, 354 write_dx_frame_to_file(cm->frame_to_show,
346 cm->current_video_frame + 1000); 355 cm->current_video_frame + 1000);
347 #endif 356 #endif
348 357
349 if (!pbi->do_loopfilter_inline) { 358 if (!pbi->do_loopfilter_inline) {
350 /* Apply the loop filter if appropriate. */ 359 /* Apply the loop filter if appropriate. */
351 vp9_loop_filter_frame(cm, &pbi->mb, pbi->mb.lf.filter_level, 0); 360 vp9_loop_filter_frame(cm, &pbi->mb, pbi->common.lf.filter_level, 0, 0);
352 } 361 }
353 362
354 #if WRITE_RECON_BUFFER == 2 363 #if WRITE_RECON_BUFFER == 2
355 if (cm->show_frame) 364 if (cm->show_frame)
356 write_dx_frame_to_file(cm->frame_to_show, 365 write_dx_frame_to_file(cm->frame_to_show,
357 cm->current_video_frame + 2000); 366 cm->current_video_frame + 2000);
358 else 367 else
359 write_dx_frame_to_file(cm->frame_to_show, 368 write_dx_frame_to_file(cm->frame_to_show,
360 cm->current_video_frame + 3000); 369 cm->current_video_frame + 3000);
361 #endif 370 #endif
(...skipping 22 matching lines...) Expand all
384 cm->mi = cm->mip + cm->mode_info_stride + 1; 393 cm->mi = cm->mip + cm->mode_info_stride + 1;
385 cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1; 394 cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
386 395
387 cm->current_video_frame++; 396 cm->current_video_frame++;
388 } 397 }
389 398
390 pbi->ready_for_new_data = 0; 399 pbi->ready_for_new_data = 0;
391 pbi->last_time_stamp = time_stamp; 400 pbi->last_time_stamp = time_stamp;
392 pbi->source_sz = 0; 401 pbi->source_sz = 0;
393 402
394 pbi->common.error.setjmp = 0; 403 cm->error.setjmp = 0;
395 return retcode; 404 return retcode;
396 } 405 }
397 406
398 int vp9_get_raw_frame(VP9D_PTR ptr, YV12_BUFFER_CONFIG *sd, 407 int vp9_get_raw_frame(VP9D_PTR ptr, YV12_BUFFER_CONFIG *sd,
399 int64_t *time_stamp, int64_t *time_end_stamp, 408 int64_t *time_stamp, int64_t *time_end_stamp,
400 vp9_ppflags_t *flags) { 409 vp9_ppflags_t *flags) {
401 int ret = -1; 410 int ret = -1;
402 VP9D_COMP *pbi = (VP9D_COMP *) ptr; 411 VP9D_COMP *pbi = (VP9D_COMP *) ptr;
403 412
404 if (pbi->ready_for_new_data == 1) 413 if (pbi->ready_for_new_data == 1)
405 return ret; 414 return ret;
406 415
407 /* ie no raw frame to show!!! */ 416 /* ie no raw frame to show!!! */
408 if (pbi->common.show_frame == 0) 417 if (pbi->common.show_frame == 0)
409 return ret; 418 return ret;
410 419
411 pbi->ready_for_new_data = 1; 420 pbi->ready_for_new_data = 1;
412 *time_stamp = pbi->last_time_stamp; 421 *time_stamp = pbi->last_time_stamp;
413 *time_end_stamp = 0; 422 *time_end_stamp = 0;
414 423
415 #if CONFIG_POSTPROC 424 #if CONFIG_POSTPROC
416 ret = vp9_post_proc_frame(&pbi->common, &pbi->mb.lf, sd, flags); 425 ret = vp9_post_proc_frame(&pbi->common, sd, flags);
417 #else 426 #else
418 427
419 if (pbi->common.frame_to_show) { 428 if (pbi->common.frame_to_show) {
420 *sd = *pbi->common.frame_to_show; 429 *sd = *pbi->common.frame_to_show;
421 sd->y_width = pbi->common.width; 430 sd->y_width = pbi->common.width;
422 sd->y_height = pbi->common.height; 431 sd->y_height = pbi->common.height;
423 sd->uv_height = pbi->common.height / 2; 432 sd->uv_height = pbi->common.height / 2;
424 ret = 0; 433 ret = 0;
425 } else { 434 } else {
426 ret = -1; 435 ret = -1;
427 } 436 }
428 437
429 #endif /*!CONFIG_POSTPROC*/ 438 #endif /*!CONFIG_POSTPROC*/
430 vp9_clear_system_state(); 439 vp9_clear_system_state();
431 return ret; 440 return ret;
432 } 441 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/decoder/vp9_idct_blk.c ('k') | source/libvpx/vp9/decoder/vp9_onyxd_int.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698