comparison vp8.c @ 12350:db60aff8eeef libavcodec

VP8: unroll MB mode decoding tree ~50% faster MB mode decoding, plus eliminate a costly switch.
author darkshikari
date Tue, 03 Aug 2010 10:24:28 +0000
parents a18ab740d2db
children 3e02e2306209
comparison
equal deleted inserted replaced
12349:f618c62a6ddb 12350:db60aff8eeef
743 s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, vp8_pred8x8c_prob_intra); 743 s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, vp8_pred8x8c_prob_intra);
744 mb->ref_frame = VP56_FRAME_CURRENT; 744 mb->ref_frame = VP56_FRAME_CURRENT;
745 } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) { 745 } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) {
746 VP56mv near[2], best; 746 VP56mv near[2], best;
747 uint8_t cnt[4] = { 0 }; 747 uint8_t cnt[4] = { 0 };
748 uint8_t p[4];
749 748
750 // inter MB, 16.2 749 // inter MB, 16.2
751 if (vp56_rac_get_prob_branchy(c, s->prob->last)) 750 if (vp56_rac_get_prob_branchy(c, s->prob->last))
752 mb->ref_frame = vp56_rac_get_prob(c, s->prob->golden) ? 751 mb->ref_frame = vp56_rac_get_prob(c, s->prob->golden) ?
753 VP56_FRAME_GOLDEN2 /* altref */ : VP56_FRAME_GOLDEN; 752 VP56_FRAME_GOLDEN2 /* altref */ : VP56_FRAME_GOLDEN;
755 mb->ref_frame = VP56_FRAME_PREVIOUS; 754 mb->ref_frame = VP56_FRAME_PREVIOUS;
756 s->ref_count[mb->ref_frame-1]++; 755 s->ref_count[mb->ref_frame-1]++;
757 756
758 // motion vectors, 16.3 757 // motion vectors, 16.3
759 find_near_mvs(s, mb, mb_x, mb_y, near, &best, cnt); 758 find_near_mvs(s, mb, mb_x, mb_y, near, &best, cnt);
760 p[0] = vp8_mode_contexts[cnt[0]][0]; 759 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[0]][0])) {
761 p[1] = vp8_mode_contexts[cnt[1]][1]; 760 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[1]][1])) {
762 p[2] = vp8_mode_contexts[cnt[2]][2]; 761 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[2]][2])) {
763 p[3] = vp8_mode_contexts[cnt[3]][3]; 762 if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[3]][3])) {
764 mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_mvinter, p); 763 mb->mode = VP8_MVMODE_SPLIT;
765 switch (mb->mode) { 764 clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
766 case VP8_MVMODE_SPLIT: 765 mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1];
767 clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); 766 } else {
768 mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1]; 767 mb->mode = VP8_MVMODE_NEW;
769 break; 768 clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
770 case VP8_MVMODE_ZERO: 769 mb->mv.y += + read_mv_component(c, s->prob->mvc[0]);
770 mb->mv.x += + read_mv_component(c, s->prob->mvc[1]);
771 }
772 } else {
773 mb->mode = VP8_MVMODE_NEAR;
774 clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y);
775 }
776 } else {
777 mb->mode = VP8_MVMODE_NEAREST;
778 clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y);
779 }
780 } else {
781 mb->mode = VP8_MVMODE_ZERO;
771 AV_ZERO32(&mb->mv); 782 AV_ZERO32(&mb->mv);
772 break;
773 case VP8_MVMODE_NEAREST:
774 clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y);
775 break;
776 case VP8_MVMODE_NEAR:
777 clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y);
778 break;
779 case VP8_MVMODE_NEW:
780 clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
781 mb->mv.y += + read_mv_component(c, s->prob->mvc[0]);
782 mb->mv.x += + read_mv_component(c, s->prob->mvc[1]);
783 break;
784 } 783 }
785 if (mb->mode != VP8_MVMODE_SPLIT) { 784 if (mb->mode != VP8_MVMODE_SPLIT) {
786 mb->partitioning = VP8_SPLITMVMODE_NONE; 785 mb->partitioning = VP8_SPLITMVMODE_NONE;
787 mb->bmv[0] = mb->mv; 786 mb->bmv[0] = mb->mv;
788 } 787 }