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;