Mercurial > libavcodec.hg
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 } |