OLD | NEW |
1 // Copyright 2010 Google Inc. All Rights Reserved. | 1 // Copyright 2010 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // This code is licensed under the same terms as WebM: | 3 // This code is licensed under the same terms as WebM: |
4 // Software License Agreement: http://www.webmproject.org/license/software/ | 4 // Software License Agreement: http://www.webmproject.org/license/software/ |
5 // Additional IP Rights Grant: http://www.webmproject.org/license/additional/ | 5 // Additional IP Rights Grant: http://www.webmproject.org/license/additional/ |
6 // ----------------------------------------------------------------------------- | 6 // ----------------------------------------------------------------------------- |
7 // | 7 // |
8 // main entry for the decoder | 8 // main entry for the decoder |
9 // | 9 // |
10 // Author: Skal (pascal.massimino@gmail.com) | 10 // Author: Skal (pascal.massimino@gmail.com) |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 } | 229 } |
230 } | 230 } |
231 for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) { | 231 for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) { |
232 if (VP8Get(br)) { | 232 if (VP8Get(br)) { |
233 hdr->mode_lf_delta_[i] = VP8GetSignedValue(br, 6); | 233 hdr->mode_lf_delta_[i] = VP8GetSignedValue(br, 6); |
234 } | 234 } |
235 } | 235 } |
236 } | 236 } |
237 } | 237 } |
238 dec->filter_type_ = (hdr->level_ == 0) ? 0 : hdr->simple_ ? 1 : 2; | 238 dec->filter_type_ = (hdr->level_ == 0) ? 0 : hdr->simple_ ? 1 : 2; |
239 if (dec->filter_type_ > 0) { // precompute filter levels per segment | |
240 if (dec->segment_hdr_.use_segment_) { | |
241 int s; | |
242 for (s = 0; s < NUM_MB_SEGMENTS; ++s) { | |
243 int strength = dec->segment_hdr_.filter_strength_[s]; | |
244 if (!dec->segment_hdr_.absolute_delta_) { | |
245 strength += hdr->level_; | |
246 } | |
247 dec->filter_levels_[s] = strength; | |
248 } | |
249 } else { | |
250 dec->filter_levels_[0] = hdr->level_; | |
251 } | |
252 } | |
253 return !br->eof_; | 239 return !br->eof_; |
254 } | 240 } |
255 | 241 |
256 // Topmost call | 242 // Topmost call |
257 int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) { | 243 int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) { |
258 const uint8_t* buf; | 244 const uint8_t* buf; |
259 size_t buf_size; | 245 size_t buf_size; |
260 VP8FrameHeader* frm_hdr; | 246 VP8FrameHeader* frm_hdr; |
261 VP8PictureHeader* pic_hdr; | 247 VP8PictureHeader* pic_hdr; |
262 VP8BitReader* br; | 248 VP8BitReader* br; |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 #endif | 437 #endif |
452 | 438 |
453 // sanitized state | 439 // sanitized state |
454 dec->ready_ = 1; | 440 dec->ready_ = 1; |
455 return 1; | 441 return 1; |
456 } | 442 } |
457 | 443 |
458 //------------------------------------------------------------------------------ | 444 //------------------------------------------------------------------------------ |
459 // Residual decoding (Paragraph 13.2 / 13.3) | 445 // Residual decoding (Paragraph 13.2 / 13.3) |
460 | 446 |
461 static const uint8_t kBands[16 + 1] = { | 447 static const int kBands[16 + 1] = { |
462 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, | 448 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, |
463 0 // extra entry as sentinel | 449 0 // extra entry as sentinel |
464 }; | 450 }; |
465 | 451 |
466 static const uint8_t kCat3[] = { 173, 148, 140, 0 }; | 452 static const uint8_t kCat3[] = { 173, 148, 140, 0 }; |
467 static const uint8_t kCat4[] = { 176, 155, 140, 135, 0 }; | 453 static const uint8_t kCat4[] = { 176, 155, 140, 135, 0 }; |
468 static const uint8_t kCat5[] = { 180, 157, 141, 134, 130, 0 }; | 454 static const uint8_t kCat5[] = { 180, 157, 141, 134, 130, 0 }; |
469 static const uint8_t kCat6[] = | 455 static const uint8_t kCat6[] = |
470 { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 }; | 456 { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 }; |
471 static const uint8_t* const kCat3456[] = { kCat3, kCat4, kCat5, kCat6 }; | 457 static const uint8_t* const kCat3456[] = { kCat3, kCat4, kCat5, kCat6 }; |
472 static const uint8_t kZigzag[16] = { | 458 static const uint8_t kZigzag[16] = { |
473 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 | 459 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 |
474 }; | 460 }; |
475 | 461 |
476 typedef const uint8_t (*ProbaArray)[NUM_CTX][NUM_PROBAS]; // for const-casting | 462 typedef const uint8_t (*ProbaArray)[NUM_CTX][NUM_PROBAS]; // for const-casting |
| 463 typedef const uint8_t (*ProbaCtxArray)[NUM_PROBAS]; |
| 464 |
| 465 // See section 13-2: http://tools.ietf.org/html/rfc6386#section-13.2 |
| 466 static int GetLargeValue(VP8BitReader* const br, const uint8_t* const p) { |
| 467 int v; |
| 468 if (!VP8GetBit(br, p[3])) { |
| 469 if (!VP8GetBit(br, p[4])) { |
| 470 v = 2; |
| 471 } else { |
| 472 v = 3 + VP8GetBit(br, p[5]); |
| 473 } |
| 474 } else { |
| 475 if (!VP8GetBit(br, p[6])) { |
| 476 if (!VP8GetBit(br, p[7])) { |
| 477 v = 5 + VP8GetBit(br, 159); |
| 478 } else { |
| 479 v = 7 + 2 * VP8GetBit(br, 165); |
| 480 v += VP8GetBit(br, 145); |
| 481 } |
| 482 } else { |
| 483 const uint8_t* tab; |
| 484 const int bit1 = VP8GetBit(br, p[8]); |
| 485 const int bit0 = VP8GetBit(br, p[9 + bit1]); |
| 486 const int cat = 2 * bit1 + bit0; |
| 487 v = 0; |
| 488 for (tab = kCat3456[cat]; *tab; ++tab) { |
| 489 v += v + VP8GetBit(br, *tab); |
| 490 } |
| 491 v += 3 + (8 << cat); |
| 492 } |
| 493 } |
| 494 return v; |
| 495 } |
477 | 496 |
478 // Returns the position of the last non-zero coeff plus one | 497 // Returns the position of the last non-zero coeff plus one |
479 // (and 0 if there's no coeff at all) | 498 // (and 0 if there's no coeff at all) |
480 static int GetCoeffs(VP8BitReader* const br, ProbaArray prob, | 499 static int GetCoeffs(VP8BitReader* const br, ProbaArray prob, |
481 int ctx, const quant_t dq, int n, int16_t* out) { | 500 int ctx, const quant_t dq, int n, int16_t* out) { |
482 // n is either 0 or 1 here. kBands[n] is not necessary for extracting '*p'. | 501 // n is either 0 or 1 here. kBands[n] is not necessary for extracting '*p'. |
483 const uint8_t* p = prob[n][ctx]; | 502 const uint8_t* p = prob[n][ctx]; |
484 if (!VP8GetBit(br, p[0])) { // first EOB is more a 'CBP' bit. | 503 if (!VP8GetBit(br, p[0])) { // first EOB is more a 'CBP' bit. |
485 return 0; | 504 return 0; |
486 } | 505 } |
487 while (1) { | 506 for (; n < 16; ++n) { |
488 ++n; | 507 const ProbaCtxArray p_ctx = prob[kBands[n + 1]]; |
489 if (!VP8GetBit(br, p[1])) { | 508 if (!VP8GetBit(br, p[1])) { |
490 p = prob[kBands[n]][0]; | 509 p = p_ctx[0]; |
491 } else { // non zero coeff | 510 } else { // non zero coeff |
492 int v, j; | 511 int v; |
493 if (!VP8GetBit(br, p[2])) { | 512 if (!VP8GetBit(br, p[2])) { |
494 p = prob[kBands[n]][1]; | |
495 v = 1; | 513 v = 1; |
| 514 p = p_ctx[1]; |
496 } else { | 515 } else { |
497 if (!VP8GetBit(br, p[3])) { | 516 v = GetLargeValue(br, p); |
498 if (!VP8GetBit(br, p[4])) { | 517 p = p_ctx[2]; |
499 v = 2; | |
500 } else { | |
501 v = 3 + VP8GetBit(br, p[5]); | |
502 } | |
503 } else { | |
504 if (!VP8GetBit(br, p[6])) { | |
505 if (!VP8GetBit(br, p[7])) { | |
506 v = 5 + VP8GetBit(br, 159); | |
507 } else { | |
508 v = 7 + 2 * VP8GetBit(br, 165); | |
509 v += VP8GetBit(br, 145); | |
510 } | |
511 } else { | |
512 const uint8_t* tab; | |
513 const int bit1 = VP8GetBit(br, p[8]); | |
514 const int bit0 = VP8GetBit(br, p[9 + bit1]); | |
515 const int cat = 2 * bit1 + bit0; | |
516 v = 0; | |
517 for (tab = kCat3456[cat]; *tab; ++tab) { | |
518 v += v + VP8GetBit(br, *tab); | |
519 } | |
520 v += 3 + (8 << cat); | |
521 } | |
522 } | |
523 p = prob[kBands[n]][2]; | |
524 } | 518 } |
525 j = kZigzag[n - 1]; | 519 out[kZigzag[n]] = VP8GetSigned(br, v) * dq[n > 0]; |
526 out[j] = VP8GetSigned(br, v) * dq[j > 0]; | 520 if (n < 15 && !VP8GetBit(br, p[0])) { // EOB |
527 if (n == 16 || !VP8GetBit(br, p[0])) { // EOB | 521 return n + 1; |
528 return n; | |
529 } | 522 } |
530 } | 523 } |
531 if (n == 16) { | |
532 return 16; | |
533 } | |
534 } | 524 } |
| 525 return 16; |
535 } | 526 } |
536 | 527 |
537 // Alias-safe way of converting 4bytes to 32bits. | 528 // Alias-safe way of converting 4bytes to 32bits. |
538 typedef union { | 529 typedef union { |
539 uint8_t i8[4]; | 530 uint8_t i8[4]; |
540 uint32_t i32; | 531 uint32_t i32; |
541 } PackedNz; | 532 } PackedNz; |
542 | 533 |
543 // Table to unpack four bits into four bytes | 534 // Table to unpack four bits into four bytes |
544 static const PackedNz kUnpackTab[16] = { | 535 static const PackedNz kUnpackTab[16] = { |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
663 ParseResiduals(dec, info, token_br); | 654 ParseResiduals(dec, info, token_br); |
664 } else { | 655 } else { |
665 left->nz_ = info->nz_ = 0; | 656 left->nz_ = info->nz_ = 0; |
666 if (!dec->is_i4x4_) { | 657 if (!dec->is_i4x4_) { |
667 left->dc_nz_ = info->dc_nz_ = 0; | 658 left->dc_nz_ = info->dc_nz_ = 0; |
668 } | 659 } |
669 dec->non_zero_ = 0; | 660 dec->non_zero_ = 0; |
670 dec->non_zero_ac_ = 0; | 661 dec->non_zero_ac_ = 0; |
671 } | 662 } |
672 | 663 |
| 664 if (dec->filter_type_ > 0) { // store filter info |
| 665 VP8FInfo* const finfo = dec->f_info_ + dec->mb_x_; |
| 666 *finfo = dec->fstrengths_[dec->segment_][dec->is_i4x4_]; |
| 667 finfo->f_inner_ = (!info->skip_ || dec->is_i4x4_); |
| 668 } |
| 669 |
673 return (!token_br->eof_); | 670 return (!token_br->eof_); |
674 } | 671 } |
675 | 672 |
676 void VP8InitScanline(VP8Decoder* const dec) { | 673 void VP8InitScanline(VP8Decoder* const dec) { |
677 VP8MB* const left = dec->mb_info_ - 1; | 674 VP8MB* const left = dec->mb_info_ - 1; |
678 left->nz_ = 0; | 675 left->nz_ = 0; |
679 left->dc_nz_ = 0; | 676 left->dc_nz_ = 0; |
680 memset(dec->intra_l_, B_DC_PRED, sizeof(dec->intra_l_)); | 677 memset(dec->intra_l_, B_DC_PRED, sizeof(dec->intra_l_)); |
681 dec->filter_row_ = | 678 dec->filter_row_ = |
682 (dec->filter_type_ > 0) && | 679 (dec->filter_type_ > 0) && |
683 (dec->mb_y_ >= dec->tl_mb_y_) && (dec->mb_y_ <= dec->br_mb_y_); | 680 (dec->mb_y_ >= dec->tl_mb_y_) && (dec->mb_y_ <= dec->br_mb_y_); |
684 } | 681 } |
685 | 682 |
686 static int ParseFrame(VP8Decoder* const dec, VP8Io* io) { | 683 static int ParseFrame(VP8Decoder* const dec, VP8Io* io) { |
687 for (dec->mb_y_ = 0; dec->mb_y_ < dec->br_mb_y_; ++dec->mb_y_) { | 684 for (dec->mb_y_ = 0; dec->mb_y_ < dec->br_mb_y_; ++dec->mb_y_) { |
688 VP8BitReader* const token_br = | 685 VP8BitReader* const token_br = |
689 &dec->parts_[dec->mb_y_ & (dec->num_parts_ - 1)]; | 686 &dec->parts_[dec->mb_y_ & (dec->num_parts_ - 1)]; |
690 VP8InitScanline(dec); | 687 VP8InitScanline(dec); |
691 for (dec->mb_x_ = 0; dec->mb_x_ < dec->mb_w_; dec->mb_x_++) { | 688 for (dec->mb_x_ = 0; dec->mb_x_ < dec->mb_w_; dec->mb_x_++) { |
692 if (!VP8DecodeMB(dec, token_br)) { | 689 if (!VP8DecodeMB(dec, token_br)) { |
693 return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, | 690 return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, |
694 "Premature end-of-file encountered."); | 691 "Premature end-of-file encountered."); |
695 } | 692 } |
| 693 // Reconstruct and emit samples. |
696 VP8ReconstructBlock(dec); | 694 VP8ReconstructBlock(dec); |
697 | |
698 // Store data and save block's filtering params | |
699 VP8StoreBlock(dec); | |
700 } | 695 } |
701 if (!VP8ProcessRow(dec, io)) { | 696 if (!VP8ProcessRow(dec, io)) { |
702 return VP8SetError(dec, VP8_STATUS_USER_ABORT, "Output aborted."); | 697 return VP8SetError(dec, VP8_STATUS_USER_ABORT, "Output aborted."); |
703 } | 698 } |
704 } | 699 } |
705 if (dec->use_threads_ && !WebPWorkerSync(&dec->worker_)) { | 700 if (dec->use_threads_ && !WebPWorkerSync(&dec->worker_)) { |
706 return 0; | 701 return 0; |
707 } | 702 } |
708 | 703 |
709 // Finish | 704 // Finish |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 dec->mem_size_ = 0; | 773 dec->mem_size_ = 0; |
779 memset(&dec->br_, 0, sizeof(dec->br_)); | 774 memset(&dec->br_, 0, sizeof(dec->br_)); |
780 dec->ready_ = 0; | 775 dec->ready_ = 0; |
781 } | 776 } |
782 | 777 |
783 //------------------------------------------------------------------------------ | 778 //------------------------------------------------------------------------------ |
784 | 779 |
785 #if defined(__cplusplus) || defined(c_plusplus) | 780 #if defined(__cplusplus) || defined(c_plusplus) |
786 } // extern "C" | 781 } // extern "C" |
787 #endif | 782 #endif |
OLD | NEW |