Mercurial > libavcodec.hg
comparison vp8.c @ 12219:274633916f8c libavcodec
Optimize partition mv decoding in VP8
author | darkshikari |
---|---|
date | Thu, 22 Jul 2010 06:29:26 +0000 |
parents | 1696e915ae2e |
children | 0f635b1f7861 |
comparison
equal
deleted
inserted
replaced
12218:1696e915ae2e | 12219:274633916f8c |
---|---|
600 x = vp8_rac_get_tree(c, vp8_small_mvtree, &p[2]); | 600 x = vp8_rac_get_tree(c, vp8_small_mvtree, &p[2]); |
601 | 601 |
602 return (x && vp56_rac_get_prob(c, p[1])) ? -x : x; | 602 return (x && vp56_rac_get_prob(c, p[1])) ? -x : x; |
603 } | 603 } |
604 | 604 |
605 static const uint8_t *get_submv_prob(const VP56mv *left, const VP56mv *top) | 605 static const uint8_t *get_submv_prob(uint32_t left, uint32_t top) |
606 { | 606 { |
607 int l_is_zero = !(left->x | left->y); | 607 if (left == top) |
608 int t_is_zero = !(top->x | top->y); | 608 return vp8_submv_prob[4-!!left]; |
609 int equal = !((left->x ^ top->x) | (left->y ^ top->y)); | 609 if (!top) |
610 | |
611 if (equal) | |
612 return l_is_zero ? vp8_submv_prob[4] : vp8_submv_prob[3]; | |
613 if (t_is_zero) | |
614 return vp8_submv_prob[2]; | 610 return vp8_submv_prob[2]; |
615 return l_is_zero ? vp8_submv_prob[1] : vp8_submv_prob[0]; | 611 return vp8_submv_prob[1-!!left]; |
616 } | 612 } |
617 | 613 |
618 /** | 614 /** |
619 * Split motion vector prediction, 16.4. | 615 * Split motion vector prediction, 16.4. |
620 * @returns the number of motion vectors parsed (2, 4 or 16) | 616 * @returns the number of motion vectors parsed (2, 4 or 16) |
623 VP8Macroblock *mb, VP56mv *base_mv) | 619 VP8Macroblock *mb, VP56mv *base_mv) |
624 { | 620 { |
625 int part_idx = mb->partitioning = | 621 int part_idx = mb->partitioning = |
626 vp8_rac_get_tree(c, vp8_mbsplit_tree, vp8_mbsplit_prob); | 622 vp8_rac_get_tree(c, vp8_mbsplit_tree, vp8_mbsplit_prob); |
627 int n, num = vp8_mbsplit_count[part_idx]; | 623 int n, num = vp8_mbsplit_count[part_idx]; |
628 const uint8_t *mbsplits = vp8_mbsplits[part_idx], | 624 VP8Macroblock *top_mb = &mb[-s->mb_stride]; |
625 VP8Macroblock *left_mb = &mb[-1]; | |
626 const uint8_t *mbsplits_left = vp8_mbsplits[left_mb->partitioning], | |
627 *mbsplits_top = vp8_mbsplits[top_mb->partitioning], | |
628 *mbsplits_cur = vp8_mbsplits[part_idx], | |
629 *firstidx = vp8_mbfirstidx[part_idx]; | 629 *firstidx = vp8_mbfirstidx[part_idx]; |
630 VP56mv *top_mv = top_mb->bmv; | |
631 VP56mv *left_mv = left_mb->bmv; | |
632 VP56mv *cur_mv = mb->bmv; | |
630 | 633 |
631 for (n = 0; n < num; n++) { | 634 for (n = 0; n < num; n++) { |
632 int k = firstidx[n]; | 635 int k = firstidx[n]; |
633 const VP56mv *left, *above; | 636 uint32_t left, above; |
634 const uint8_t *submv_prob; | 637 const uint8_t *submv_prob; |
635 | 638 |
636 if (!(k & 3)) { | 639 if (!(k & 3)) |
637 VP8Macroblock *left_mb = &mb[-1]; | 640 left = AV_RN32A(&left_mv[mbsplits_left[k + 3]]); |
638 left = &left_mb->bmv[vp8_mbsplits[left_mb->partitioning][k + 3]]; | 641 else |
639 } else | 642 left = AV_RN32A(&cur_mv[mbsplits_cur[k - 1]]); |
640 left = &mb->bmv[mbsplits[k - 1]]; | 643 if (k <= 3) |
641 if (k <= 3) { | 644 above = AV_RN32A(&top_mv[mbsplits_top[k + 12]]); |
642 VP8Macroblock *above_mb = &mb[-s->mb_stride]; | 645 else |
643 above = &above_mb->bmv[vp8_mbsplits[above_mb->partitioning][k + 12]]; | 646 above = AV_RN32A(&cur_mv[mbsplits_cur[k - 4]]); |
644 } else | |
645 above = &mb->bmv[mbsplits[k - 4]]; | |
646 | 647 |
647 submv_prob = get_submv_prob(left, above); | 648 submv_prob = get_submv_prob(left, above); |
648 | 649 |
649 switch (vp8_rac_get_tree(c, vp8_submv_ref_tree, submv_prob)) { | 650 switch (vp8_rac_get_tree(c, vp8_submv_ref_tree, submv_prob)) { |
650 case VP8_SUBMVMODE_NEW4X4: | 651 case VP8_SUBMVMODE_NEW4X4: |
651 mb->bmv[n].y = base_mv->y + read_mv_component(c, s->prob->mvc[0]); | 652 mb->bmv[n].y = base_mv->y + read_mv_component(c, s->prob->mvc[0]); |
652 mb->bmv[n].x = base_mv->x + read_mv_component(c, s->prob->mvc[1]); | 653 mb->bmv[n].x = base_mv->x + read_mv_component(c, s->prob->mvc[1]); |
653 break; | 654 break; |
654 case VP8_SUBMVMODE_ZERO4X4: | 655 case VP8_SUBMVMODE_ZERO4X4: |
655 mb->bmv[n].x = 0; | 656 AV_WN32A(&mb->bmv[n], 0); |
656 mb->bmv[n].y = 0; | |
657 break; | 657 break; |
658 case VP8_SUBMVMODE_LEFT4X4: | 658 case VP8_SUBMVMODE_LEFT4X4: |
659 mb->bmv[n] = *left; | 659 AV_WN32A(&mb->bmv[n], left); |
660 break; | 660 break; |
661 case VP8_SUBMVMODE_TOP4X4: | 661 case VP8_SUBMVMODE_TOP4X4: |
662 mb->bmv[n] = *above; | 662 AV_WN32A(&mb->bmv[n], above); |
663 break; | 663 break; |
664 } | 664 } |
665 } | 665 } |
666 | 666 |
667 return num; | 667 return num; |