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 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 #else | 85 #else |
86 pbi->ec_enabled = 0; | 86 pbi->ec_enabled = 0; |
87 #endif | 87 #endif |
88 /* Error concealment is activated after a key frame has been | 88 /* Error concealment is activated after a key frame has been |
89 * decoded without errors when error concealment is enabled. | 89 * decoded without errors when error concealment is enabled. |
90 */ | 90 */ |
91 pbi->ec_active = 0; | 91 pbi->ec_active = 0; |
92 | 92 |
93 pbi->decoded_key_frame = 0; | 93 pbi->decoded_key_frame = 0; |
94 | 94 |
95 pbi->input_fragments = oxcf->input_fragments; | |
96 pbi->num_fragments = 0; | |
97 | |
98 /* Independent partitions is activated when a frame updates the | 95 /* Independent partitions is activated when a frame updates the |
99 * token probability table to have equal probabilities over the | 96 * token probability table to have equal probabilities over the |
100 * PREV_COEF context. | 97 * PREV_COEF context. |
101 */ | 98 */ |
102 pbi->independent_partitions = 0; | 99 pbi->independent_partitions = 0; |
103 | 100 |
104 vp8_setup_block_dptrs(&pbi->mb); | 101 vp8_setup_block_dptrs(&pbi->mb); |
105 | 102 |
106 return pbi; | 103 return pbi; |
107 } | 104 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 cm->frame_to_show = &cm->yv12_fb[cm->lst_fb_idx]; | 272 cm->frame_to_show = &cm->yv12_fb[cm->lst_fb_idx]; |
276 } | 273 } |
277 else | 274 else |
278 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx]; | 275 cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx]; |
279 | 276 |
280 cm->fb_idx_ref_cnt[cm->new_fb_idx]--; | 277 cm->fb_idx_ref_cnt[cm->new_fb_idx]--; |
281 | 278 |
282 return err; | 279 return err; |
283 } | 280 } |
284 | 281 |
285 int vp8dx_receive_compressed_data(VP8D_COMP *pbi, size_t size, | 282 int check_fragments_for_errors(VP8D_COMP *pbi) |
286 const uint8_t *source, | |
287 int64_t time_stamp) | |
288 { | 283 { |
289 #if HAVE_NEON | |
290 int64_t dx_store_reg[8]; | |
291 #endif | |
292 VP8_COMMON *cm = &pbi->common; | |
293 int retcode = -1; | |
294 | |
295 pbi->common.error.error_code = VPX_CODEC_OK; | |
296 | |
297 if (pbi->num_fragments == 0) | |
298 { | |
299 /* New frame, reset fragment pointers and sizes */ | |
300 vpx_memset((void*)pbi->fragments, 0, sizeof(pbi->fragments)); | |
301 vpx_memset(pbi->fragment_sizes, 0, sizeof(pbi->fragment_sizes)); | |
302 } | |
303 if (pbi->input_fragments && !(source == NULL && size == 0)) | |
304 { | |
305 /* Store a pointer to this fragment and return. We haven't | |
306 * received the complete frame yet, so we will wait with decoding. | |
307 */ | |
308 assert(pbi->num_fragments < MAX_PARTITIONS); | |
309 pbi->fragments[pbi->num_fragments] = source; | |
310 pbi->fragment_sizes[pbi->num_fragments] = size; | |
311 pbi->num_fragments++; | |
312 if (pbi->num_fragments > (1 << EIGHT_PARTITION) + 1) | |
313 { | |
314 pbi->common.error.error_code = VPX_CODEC_UNSUP_BITSTREAM; | |
315 pbi->common.error.setjmp = 0; | |
316 pbi->num_fragments = 0; | |
317 return -1; | |
318 } | |
319 return 0; | |
320 } | |
321 | |
322 if (!pbi->input_fragments) | |
323 { | |
324 pbi->fragments[0] = source; | |
325 pbi->fragment_sizes[0] = size; | |
326 pbi->num_fragments = 1; | |
327 } | |
328 assert(pbi->common.multi_token_partition <= EIGHT_PARTITION); | |
329 if (pbi->num_fragments == 0) | |
330 { | |
331 pbi->num_fragments = 1; | |
332 pbi->fragments[0] = NULL; | |
333 pbi->fragment_sizes[0] = 0; | |
334 } | |
335 | |
336 if (!pbi->ec_active && | 284 if (!pbi->ec_active && |
337 pbi->num_fragments <= 1 && pbi->fragment_sizes[0] == 0) | 285 pbi->num_fragments <= 1 && pbi->fragment_sizes[0] == 0) |
338 { | 286 { |
| 287 VP8_COMMON *cm = &pbi->common; |
| 288 |
339 /* If error concealment is disabled we won't signal missing frames | 289 /* If error concealment is disabled we won't signal missing frames |
340 * to the decoder. | 290 * to the decoder. |
341 */ | 291 */ |
342 if (cm->fb_idx_ref_cnt[cm->lst_fb_idx] > 1) | 292 if (cm->fb_idx_ref_cnt[cm->lst_fb_idx] > 1) |
343 { | 293 { |
344 /* The last reference shares buffer with another reference | 294 /* The last reference shares buffer with another reference |
345 * buffer. Move it to its own buffer before setting it as | 295 * buffer. Move it to its own buffer before setting it as |
346 * corrupt, otherwise we will make multiple buffers corrupt. | 296 * corrupt, otherwise we will make multiple buffers corrupt. |
347 */ | 297 */ |
348 const int prev_idx = cm->lst_fb_idx; | 298 const int prev_idx = cm->lst_fb_idx; |
349 cm->fb_idx_ref_cnt[prev_idx]--; | 299 cm->fb_idx_ref_cnt[prev_idx]--; |
350 cm->lst_fb_idx = get_free_fb(cm); | 300 cm->lst_fb_idx = get_free_fb(cm); |
351 vp8_yv12_copy_frame(&cm->yv12_fb[prev_idx], | 301 vp8_yv12_copy_frame(&cm->yv12_fb[prev_idx], |
352 &cm->yv12_fb[cm->lst_fb_idx]); | 302 &cm->yv12_fb[cm->lst_fb_idx]); |
353 } | 303 } |
354 /* This is used to signal that we are missing frames. | 304 /* This is used to signal that we are missing frames. |
355 * We do not know if the missing frame(s) was supposed to update | 305 * We do not know if the missing frame(s) was supposed to update |
356 * any of the reference buffers, but we act conservative and | 306 * any of the reference buffers, but we act conservative and |
357 * mark only the last buffer as corrupted. | 307 * mark only the last buffer as corrupted. |
358 */ | 308 */ |
359 cm->yv12_fb[cm->lst_fb_idx].corrupted = 1; | 309 cm->yv12_fb[cm->lst_fb_idx].corrupted = 1; |
360 | 310 |
361 /* Signal that we have no frame to show. */ | 311 /* Signal that we have no frame to show. */ |
362 cm->show_frame = 0; | 312 cm->show_frame = 0; |
363 | 313 |
364 pbi->num_fragments = 0; | |
365 | |
366 /* Nothing more to do. */ | 314 /* Nothing more to do. */ |
367 return 0; | 315 return 0; |
368 } | 316 } |
369 | 317 |
| 318 return 1; |
| 319 } |
| 320 |
| 321 int vp8dx_receive_compressed_data(VP8D_COMP *pbi, size_t size, |
| 322 const uint8_t *source, |
| 323 int64_t time_stamp) |
| 324 { |
| 325 #if HAVE_NEON |
| 326 int64_t dx_store_reg[8]; |
| 327 #endif |
| 328 VP8_COMMON *cm = &pbi->common; |
| 329 int retcode = -1; |
| 330 |
| 331 pbi->common.error.error_code = VPX_CODEC_OK; |
| 332 |
| 333 retcode = check_fragments_for_errors(pbi); |
| 334 if(retcode <= 0) |
| 335 return retcode; |
| 336 |
370 #if HAVE_NEON | 337 #if HAVE_NEON |
371 #if CONFIG_RUNTIME_CPU_DETECT | 338 #if CONFIG_RUNTIME_CPU_DETECT |
372 if (cm->cpu_caps & HAS_NEON) | 339 if (cm->cpu_caps & HAS_NEON) |
373 #endif | 340 #endif |
374 { | 341 { |
375 vp8_push_neon(dx_store_reg); | 342 vp8_push_neon(dx_store_reg); |
376 } | 343 } |
377 #endif | 344 #endif |
378 | 345 |
379 cm->new_fb_idx = get_free_fb (cm); | 346 cm->new_fb_idx = get_free_fb (cm); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 } | 379 } |
413 | 380 |
414 if (swap_frame_buffers (cm)) | 381 if (swap_frame_buffers (cm)) |
415 { | 382 { |
416 pbi->common.error.error_code = VPX_CODEC_ERROR; | 383 pbi->common.error.error_code = VPX_CODEC_ERROR; |
417 goto decode_exit; | 384 goto decode_exit; |
418 } | 385 } |
419 | 386 |
420 vp8_clear_system_state(); | 387 vp8_clear_system_state(); |
421 | 388 |
422 #if CONFIG_ERROR_CONCEALMENT | 389 if (cm->show_frame) |
| 390 { |
| 391 cm->current_video_frame++; |
| 392 cm->show_frame_mi = cm->mi; |
| 393 } |
| 394 |
| 395 #if CONFIG_ERROR_CONCEALMENT |
423 /* swap the mode infos to storage for future error concealment */ | 396 /* swap the mode infos to storage for future error concealment */ |
424 if (pbi->ec_enabled && pbi->common.prev_mi) | 397 if (pbi->ec_enabled && pbi->common.prev_mi) |
425 { | 398 { |
426 MODE_INFO* tmp = pbi->common.prev_mi; | 399 MODE_INFO* tmp = pbi->common.prev_mi; |
427 int row, col; | 400 int row, col; |
428 pbi->common.prev_mi = pbi->common.mi; | 401 pbi->common.prev_mi = pbi->common.mi; |
429 pbi->common.mi = tmp; | 402 pbi->common.mi = tmp; |
430 | 403 |
431 /* Propagate the segment_ids to the next frame */ | 404 /* Propagate the segment_ids to the next frame */ |
432 for (row = 0; row < pbi->common.mb_rows; ++row) | 405 for (row = 0; row < pbi->common.mb_rows; ++row) |
433 { | 406 { |
434 for (col = 0; col < pbi->common.mb_cols; ++col) | 407 for (col = 0; col < pbi->common.mb_cols; ++col) |
435 { | 408 { |
436 const int i = row*pbi->common.mode_info_stride + col; | 409 const int i = row*pbi->common.mode_info_stride + col; |
437 pbi->common.mi[i].mbmi.segment_id = | 410 pbi->common.mi[i].mbmi.segment_id = |
438 pbi->common.prev_mi[i].mbmi.segment_id; | 411 pbi->common.prev_mi[i].mbmi.segment_id; |
439 } | 412 } |
440 } | 413 } |
441 } | 414 } |
442 #endif | 415 #endif |
443 | 416 |
444 if (cm->show_frame) | |
445 cm->current_video_frame++; | |
446 | |
447 pbi->ready_for_new_data = 0; | 417 pbi->ready_for_new_data = 0; |
448 pbi->last_time_stamp = time_stamp; | 418 pbi->last_time_stamp = time_stamp; |
449 | 419 |
450 decode_exit: | 420 decode_exit: |
451 #if HAVE_NEON | 421 #if HAVE_NEON |
452 #if CONFIG_RUNTIME_CPU_DETECT | 422 #if CONFIG_RUNTIME_CPU_DETECT |
453 if (cm->cpu_caps & HAS_NEON) | 423 if (cm->cpu_caps & HAS_NEON) |
454 #endif | 424 #endif |
455 { | 425 { |
456 vp8_pop_neon(dx_store_reg); | 426 vp8_pop_neon(dx_store_reg); |
457 } | 427 } |
458 #endif | 428 #endif |
459 | 429 |
460 pbi->common.error.setjmp = 0; | 430 pbi->common.error.setjmp = 0; |
461 pbi->num_fragments = 0; | |
462 return retcode; | 431 return retcode; |
463 } | 432 } |
464 int vp8dx_get_raw_frame(VP8D_COMP *pbi, YV12_BUFFER_CONFIG *sd, int64_t *time_st
amp, int64_t *time_end_stamp, vp8_ppflags_t *flags) | 433 int vp8dx_get_raw_frame(VP8D_COMP *pbi, YV12_BUFFER_CONFIG *sd, int64_t *time_st
amp, int64_t *time_end_stamp, vp8_ppflags_t *flags) |
465 { | 434 { |
466 int ret = -1; | 435 int ret = -1; |
467 | 436 |
468 if (pbi->ready_for_new_data == 1) | 437 if (pbi->ready_for_new_data == 1) |
469 return ret; | 438 return ret; |
470 | 439 |
471 /* ie no raw frame to show!!! */ | 440 /* ie no raw frame to show!!! */ |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 for (mb_col = 0; mb_col < oci->mb_cols; mb_col++,mi++) | 483 for (mb_col = 0; mb_col < oci->mb_cols; mb_col++,mi++) |
515 { | 484 { |
516 if( mi->mbmi.ref_frame == ref_frame) | 485 if( mi->mbmi.ref_frame == ref_frame) |
517 return 1; | 486 return 1; |
518 } | 487 } |
519 mi++; | 488 mi++; |
520 } | 489 } |
521 return 0; | 490 return 0; |
522 | 491 |
523 } | 492 } |
OLD | NEW |