comparison vp3.c @ 2830:4e31ad3623cf libavcodec

removed a bunch of unused, sub-optimal code
author melanson
date Sat, 13 Aug 2005 18:49:01 +0000
parents 0b4b57c4a8f5
children fd5d7c732c6b
comparison
equal deleted inserted replaced
2829:9ff4c2733422 2830:4e31ad3623cf
619 619
620 return 0; /* successful path out */ 620 return 0; /* successful path out */
621 } 621 }
622 622
623 /* 623 /*
624 * This function unpacks a single token (which should be in the range 0..31)
625 * and returns a zero run (number of zero coefficients in current DCT matrix
626 * before next non-zero coefficient), the next DCT coefficient, and the
627 * number of consecutive, non-EOB'd DCT blocks to EOB.
628 */
629 static void unpack_token(GetBitContext *gb, int token, int *zero_run,
630 DCTELEM *coeff, int *eob_run)
631 {
632 int sign;
633
634 *zero_run = 0;
635 *eob_run = 0;
636 *coeff = 0;
637
638 debug_token(" vp3 token %d: ", token);
639 switch (token) {
640
641 case 0:
642 debug_token("DCT_EOB_TOKEN, EOB next block\n");
643 *eob_run = 1;
644 break;
645
646 case 1:
647 debug_token("DCT_EOB_PAIR_TOKEN, EOB next 2 blocks\n");
648 *eob_run = 2;
649 break;
650
651 case 2:
652 debug_token("DCT_EOB_TRIPLE_TOKEN, EOB next 3 blocks\n");
653 *eob_run = 3;
654 break;
655
656 case 3:
657 debug_token("DCT_REPEAT_RUN_TOKEN, ");
658 *eob_run = get_bits(gb, 2) + 4;
659 debug_token("EOB the next %d blocks\n", *eob_run);
660 break;
661
662 case 4:
663 debug_token("DCT_REPEAT_RUN2_TOKEN, ");
664 *eob_run = get_bits(gb, 3) + 8;
665 debug_token("EOB the next %d blocks\n", *eob_run);
666 break;
667
668 case 5:
669 debug_token("DCT_REPEAT_RUN3_TOKEN, ");
670 *eob_run = get_bits(gb, 4) + 16;
671 debug_token("EOB the next %d blocks\n", *eob_run);
672 break;
673
674 case 6:
675 debug_token("DCT_REPEAT_RUN4_TOKEN, ");
676 *eob_run = get_bits(gb, 12);
677 debug_token("EOB the next %d blocks\n", *eob_run);
678 break;
679
680 case 7:
681 debug_token("DCT_SHORT_ZRL_TOKEN, ");
682 /* note that this token actually indicates that (3 extra bits) + 1 0s
683 * should be output; this case specifies a run of (3 EBs) 0s and a
684 * coefficient of 0. */
685 *zero_run = get_bits(gb, 3);
686 *coeff = 0;
687 debug_token("skip the next %d positions in output matrix\n", *zero_run + 1);
688 break;
689
690 case 8:
691 debug_token("DCT_ZRL_TOKEN, ");
692 /* note that this token actually indicates that (6 extra bits) + 1 0s
693 * should be output; this case specifies a run of (6 EBs) 0s and a
694 * coefficient of 0. */
695 *zero_run = get_bits(gb, 6);
696 *coeff = 0;
697 debug_token("skip the next %d positions in output matrix\n", *zero_run + 1);
698 break;
699
700 case 9:
701 debug_token("ONE_TOKEN, output 1\n");
702 *coeff = 1;
703 break;
704
705 case 10:
706 debug_token("MINUS_ONE_TOKEN, output -1\n");
707 *coeff = -1;
708 break;
709
710 case 11:
711 debug_token("TWO_TOKEN, output 2\n");
712 *coeff = 2;
713 break;
714
715 case 12:
716 debug_token("MINUS_TWO_TOKEN, output -2\n");
717 *coeff = -2;
718 break;
719
720 case 13:
721 case 14:
722 case 15:
723 case 16:
724 debug_token("LOW_VAL_TOKENS, ");
725 if (get_bits(gb, 1))
726 *coeff = -(3 + (token - 13));
727 else
728 *coeff = 3 + (token - 13);
729 debug_token("output %d\n", *coeff);
730 break;
731
732 case 17:
733 debug_token("DCT_VAL_CATEGORY3, ");
734 sign = get_bits(gb, 1);
735 *coeff = 7 + get_bits(gb, 1);
736 if (sign)
737 *coeff = -(*coeff);
738 debug_token("output %d\n", *coeff);
739 break;
740
741 case 18:
742 debug_token("DCT_VAL_CATEGORY4, ");
743 sign = get_bits(gb, 1);
744 *coeff = 9 + get_bits(gb, 2);
745 if (sign)
746 *coeff = -(*coeff);
747 debug_token("output %d\n", *coeff);
748 break;
749
750 case 19:
751 debug_token("DCT_VAL_CATEGORY5, ");
752 sign = get_bits(gb, 1);
753 *coeff = 13 + get_bits(gb, 3);
754 if (sign)
755 *coeff = -(*coeff);
756 debug_token("output %d\n", *coeff);
757 break;
758
759 case 20:
760 debug_token("DCT_VAL_CATEGORY6, ");
761 sign = get_bits(gb, 1);
762 *coeff = 21 + get_bits(gb, 4);
763 if (sign)
764 *coeff = -(*coeff);
765 debug_token("output %d\n", *coeff);
766 break;
767
768 case 21:
769 debug_token("DCT_VAL_CATEGORY7, ");
770 sign = get_bits(gb, 1);
771 *coeff = 37 + get_bits(gb, 5);
772 if (sign)
773 *coeff = -(*coeff);
774 debug_token("output %d\n", *coeff);
775 break;
776
777 case 22:
778 debug_token("DCT_VAL_CATEGORY8, ");
779 sign = get_bits(gb, 1);
780 *coeff = 69 + get_bits(gb, 9);
781 if (sign)
782 *coeff = -(*coeff);
783 debug_token("output %d\n", *coeff);
784 break;
785
786 case 23:
787 case 24:
788 case 25:
789 case 26:
790 case 27:
791 debug_token("DCT_RUN_CATEGORY1, ");
792 *zero_run = token - 22;
793 if (get_bits(gb, 1))
794 *coeff = -1;
795 else
796 *coeff = 1;
797 debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
798 break;
799
800 case 28:
801 debug_token("DCT_RUN_CATEGORY1B, ");
802 if (get_bits(gb, 1))
803 *coeff = -1;
804 else
805 *coeff = 1;
806 *zero_run = 6 + get_bits(gb, 2);
807 debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
808 break;
809
810 case 29:
811 debug_token("DCT_RUN_CATEGORY1C, ");
812 if (get_bits(gb, 1))
813 *coeff = -1;
814 else
815 *coeff = 1;
816 *zero_run = 10 + get_bits(gb, 3);
817 debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
818 break;
819
820 case 30:
821 debug_token("DCT_RUN_CATEGORY2, ");
822 sign = get_bits(gb, 1);
823 *coeff = 2 + get_bits(gb, 1);
824 if (sign)
825 *coeff = -(*coeff);
826 *zero_run = 1;
827 debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
828 break;
829
830 case 31:
831 debug_token("DCT_RUN_CATEGORY2, ");
832 sign = get_bits(gb, 1);
833 *coeff = 2 + get_bits(gb, 1);
834 if (sign)
835 *coeff = -(*coeff);
836 *zero_run = 2 + get_bits(gb, 1);
837 debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
838 break;
839
840 default:
841 av_log(NULL, AV_LOG_ERROR, " vp3: help! Got a bad token: %d > 31\n", token);
842 break;
843
844 }
845 }
846
847 /*
848 * This function wipes out all of the fragment data. 624 * This function wipes out all of the fragment data.
849 */ 625 */
850 static void init_frame(Vp3DecodeContext *s, GetBitContext *gb) 626 static void init_frame(Vp3DecodeContext *s, GetBitContext *gb)
851 { 627 {
852 int i; 628 int i;
981 bounding_values[x + filter_limit] = filter_limit - x; 757 bounding_values[x + filter_limit] = filter_limit - x;
982 } 758 }
983 } 759 }
984 760
985 /* 761 /*
986 * This function is used to fetch runs of 1s or 0s from the bitstream for
987 * use in determining which superblocks are fully and partially coded.
988 *
989 * Codeword RunLength
990 * 0 1
991 * 10x 2-3
992 * 110x 4-5
993 * 1110xx 6-9
994 * 11110xxx 10-17
995 * 111110xxxx 18-33
996 * 111111xxxxxxxxxxxx 34-4129
997 */
998 static int get_superblock_run_length(GetBitContext *gb)
999 {
1000
1001 if (get_bits(gb, 1) == 0)
1002 return 1;
1003
1004 else if (get_bits(gb, 1) == 0)
1005 return (2 + get_bits(gb, 1));
1006
1007 else if (get_bits(gb, 1) == 0)
1008 return (4 + get_bits(gb, 1));
1009
1010 else if (get_bits(gb, 1) == 0)
1011 return (6 + get_bits(gb, 2));
1012
1013 else if (get_bits(gb, 1) == 0)
1014 return (10 + get_bits(gb, 3));
1015
1016 else if (get_bits(gb, 1) == 0)
1017 return (18 + get_bits(gb, 4));
1018
1019 else
1020 return (34 + get_bits(gb, 12));
1021
1022 }
1023
1024 /*
1025 * This function is used to fetch runs of 1s or 0s from the bitstream for
1026 * use in determining which particular fragments are coded.
1027 *
1028 * Codeword RunLength
1029 * 0x 1-2
1030 * 10x 3-4
1031 * 110x 5-6
1032 * 1110xx 7-10
1033 * 11110xx 11-14
1034 * 11111xxxx 15-30
1035 */
1036 static int get_fragment_run_length(GetBitContext *gb)
1037 {
1038
1039 if (get_bits(gb, 1) == 0)
1040 return (1 + get_bits(gb, 1));
1041
1042 else if (get_bits(gb, 1) == 0)
1043 return (3 + get_bits(gb, 1));
1044
1045 else if (get_bits(gb, 1) == 0)
1046 return (5 + get_bits(gb, 1));
1047
1048 else if (get_bits(gb, 1) == 0)
1049 return (7 + get_bits(gb, 2));
1050
1051 else if (get_bits(gb, 1) == 0)
1052 return (11 + get_bits(gb, 2));
1053
1054 else
1055 return (15 + get_bits(gb, 4));
1056
1057 }
1058
1059 /*
1060 * This function decodes a VLC from the bitstream and returns a number
1061 * that ranges from 0..7. The number indicates which of the 8 coding
1062 * modes to use.
1063 *
1064 * VLC Number
1065 * 0 0
1066 * 10 1
1067 * 110 2
1068 * 1110 3
1069 * 11110 4
1070 * 111110 5
1071 * 1111110 6
1072 * 1111111 7
1073 *
1074 */
1075 static int get_mode_code(GetBitContext *gb)
1076 {
1077
1078 if (get_bits(gb, 1) == 0)
1079 return 0;
1080
1081 else if (get_bits(gb, 1) == 0)
1082 return 1;
1083
1084 else if (get_bits(gb, 1) == 0)
1085 return 2;
1086
1087 else if (get_bits(gb, 1) == 0)
1088 return 3;
1089
1090 else if (get_bits(gb, 1) == 0)
1091 return 4;
1092
1093 else if (get_bits(gb, 1) == 0)
1094 return 5;
1095
1096 else if (get_bits(gb, 1) == 0)
1097 return 6;
1098
1099 else
1100 return 7;
1101
1102 }
1103
1104 /*
1105 * This function extracts a motion vector from the bitstream using a VLC
1106 * scheme. 3 bits are fetched from the bitstream and 1 of 8 actions is
1107 * taken depending on the value on those 3 bits:
1108 *
1109 * 0: return 0
1110 * 1: return 1
1111 * 2: return -1
1112 * 3: if (next bit is 1) return -2, else return 2
1113 * 4: if (next bit is 1) return -3, else return 3
1114 * 5: return 4 + (next 2 bits), next bit is sign
1115 * 6: return 8 + (next 3 bits), next bit is sign
1116 * 7: return 16 + (next 4 bits), next bit is sign
1117 */
1118 static int get_motion_vector_vlc(GetBitContext *gb)
1119 {
1120 int bits;
1121
1122 bits = get_bits(gb, 3);
1123
1124 switch(bits) {
1125
1126 case 0:
1127 bits = 0;
1128 break;
1129
1130 case 1:
1131 bits = 1;
1132 break;
1133
1134 case 2:
1135 bits = -1;
1136 break;
1137
1138 case 3:
1139 if (get_bits(gb, 1) == 0)
1140 bits = 2;
1141 else
1142 bits = -2;
1143 break;
1144
1145 case 4:
1146 if (get_bits(gb, 1) == 0)
1147 bits = 3;
1148 else
1149 bits = -3;
1150 break;
1151
1152 case 5:
1153 bits = 4 + get_bits(gb, 2);
1154 if (get_bits(gb, 1) == 1)
1155 bits = -bits;
1156 break;
1157
1158 case 6:
1159 bits = 8 + get_bits(gb, 3);
1160 if (get_bits(gb, 1) == 1)
1161 bits = -bits;
1162 break;
1163
1164 case 7:
1165 bits = 16 + get_bits(gb, 4);
1166 if (get_bits(gb, 1) == 1)
1167 bits = -bits;
1168 break;
1169
1170 }
1171
1172 return bits;
1173 }
1174
1175 /*
1176 * This function fetches a 5-bit number from the stream followed by
1177 * a sign and calls it a motion vector.
1178 */
1179 static int get_motion_vector_fixed(GetBitContext *gb)
1180 {
1181
1182 int bits;
1183
1184 bits = get_bits(gb, 5);
1185
1186 if (get_bits(gb, 1) == 1)
1187 bits = -bits;
1188
1189 return bits;
1190 }
1191
1192 /*
1193 * This function unpacks all of the superblock/macroblock/fragment coding 762 * This function unpacks all of the superblock/macroblock/fragment coding
1194 * information from the bitstream. 763 * information from the bitstream.
1195 */ 764 */
1196 static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) 765 static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
1197 { 766 {
1220 * fetched the bit will be toggled again */ 789 * fetched the bit will be toggled again */
1221 bit ^= 1; 790 bit ^= 1;
1222 while (current_superblock < s->superblock_count) { 791 while (current_superblock < s->superblock_count) {
1223 if (current_run-- == 0) { 792 if (current_run-- == 0) {
1224 bit ^= 1; 793 bit ^= 1;
1225 #if 1
1226 current_run = get_vlc2(gb, 794 current_run = get_vlc2(gb,
1227 s->superblock_run_length_vlc.table, 6, 2); 795 s->superblock_run_length_vlc.table, 6, 2);
1228 if (current_run == 33) 796 if (current_run == 33)
1229 current_run += get_bits(gb, 12); 797 current_run += get_bits(gb, 12);
1230 #else
1231 current_run = get_superblock_run_length(gb);
1232 #endif
1233 debug_block_coding(" setting superblocks %d..%d to %s\n", 798 debug_block_coding(" setting superblocks %d..%d to %s\n",
1234 current_superblock, 799 current_superblock,
1235 current_superblock + current_run - 1, 800 current_superblock + current_run - 1,
1236 (bit) ? "partially coded" : "not coded"); 801 (bit) ? "partially coded" : "not coded");
1237 802
1264 /* skip any superblocks already marked as partially coded */ 829 /* skip any superblocks already marked as partially coded */
1265 if (s->superblock_coding[current_superblock] == SB_NOT_CODED) { 830 if (s->superblock_coding[current_superblock] == SB_NOT_CODED) {
1266 831
1267 if (current_run-- == 0) { 832 if (current_run-- == 0) {
1268 bit ^= 1; 833 bit ^= 1;
1269 #if 1
1270 current_run = get_vlc2(gb, 834 current_run = get_vlc2(gb,
1271 s->superblock_run_length_vlc.table, 6, 2); 835 s->superblock_run_length_vlc.table, 6, 2);
1272 if (current_run == 33) 836 if (current_run == 33)
1273 current_run += get_bits(gb, 12); 837 current_run += get_bits(gb, 12);
1274 #else
1275 current_run = get_superblock_run_length(gb);
1276 #endif
1277 } 838 }
1278 839
1279 debug_block_coding(" setting superblock %d to %s\n", 840 debug_block_coding(" setting superblock %d to %s\n",
1280 current_superblock, 841 current_superblock,
1281 (bit) ? "fully coded" : "not coded"); 842 (bit) ? "fully coded" : "not coded");
1328 889
1329 /* fragment may or may not be coded; this is the case 890 /* fragment may or may not be coded; this is the case
1330 * that cares about the fragment coding runs */ 891 * that cares about the fragment coding runs */
1331 if (current_run-- == 0) { 892 if (current_run-- == 0) {
1332 bit ^= 1; 893 bit ^= 1;
1333 #if 1
1334 current_run = get_vlc2(gb, 894 current_run = get_vlc2(gb,
1335 s->fragment_run_length_vlc.table, 5, 2); 895 s->fragment_run_length_vlc.table, 5, 2);
1336 #else
1337 current_run = get_fragment_run_length(gb);
1338 #endif
1339 } 896 }
1340 897
1341 if (bit) { 898 if (bit) {
1342 /* default mode; actual mode will be decoded in 899 /* default mode; actual mode will be decoded in
1343 * the next phase */ 900 * the next phase */
1461 1018
1462 /* mode 7 means get 3 bits for each coding mode */ 1019 /* mode 7 means get 3 bits for each coding mode */
1463 if (scheme == 7) 1020 if (scheme == 7)
1464 coding_mode = get_bits(gb, 3); 1021 coding_mode = get_bits(gb, 3);
1465 else 1022 else
1466 {
1467 #if 1
1468 coding_mode = ModeAlphabet[scheme] 1023 coding_mode = ModeAlphabet[scheme]
1469 [get_vlc2(gb, s->mode_code_vlc.table, 3, 3)]; 1024 [get_vlc2(gb, s->mode_code_vlc.table, 3, 3)];
1470 #else
1471 coding_mode = ModeAlphabet[scheme][get_mode_code(gb)];
1472 #endif
1473 }
1474 1025
1475 s->macroblock_coding[current_macroblock] = coding_mode; 1026 s->macroblock_coding[current_macroblock] = coding_mode;
1476 for (k = 0; k < 6; k++) { 1027 for (k = 0; k < 6; k++) {
1477 current_fragment = 1028 current_fragment =
1478 s->macroblock_fragments[current_macroblock * 6 + k]; 1029 s->macroblock_fragments[current_macroblock * 6 + k];
1555 1106
1556 case MODE_INTER_PLUS_MV: 1107 case MODE_INTER_PLUS_MV:
1557 case MODE_GOLDEN_MV: 1108 case MODE_GOLDEN_MV:
1558 /* all 6 fragments use the same motion vector */ 1109 /* all 6 fragments use the same motion vector */
1559 if (coding_mode == 0) { 1110 if (coding_mode == 0) {
1560 #if 1
1561 motion_x[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; 1111 motion_x[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
1562 motion_y[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; 1112 motion_y[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
1563 #else
1564 motion_x[0] = get_motion_vector_vlc(gb);
1565 motion_y[0] = get_motion_vector_vlc(gb);
1566 #endif
1567 } else { 1113 } else {
1568 #if 1
1569 motion_x[0] = fixed_motion_vector_table[get_bits(gb, 6)]; 1114 motion_x[0] = fixed_motion_vector_table[get_bits(gb, 6)];
1570 motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)]; 1115 motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)];
1571 #else
1572 motion_x[0] = get_motion_vector_fixed(gb);
1573 motion_y[0] = get_motion_vector_fixed(gb);
1574 #endif
1575 } 1116 }
1576 1117
1577 for (k = 1; k < 6; k++) { 1118 for (k = 1; k < 6; k++) {
1578 motion_x[k] = motion_x[0]; 1119 motion_x[k] = motion_x[0];
1579 motion_y[k] = motion_y[0]; 1120 motion_y[k] = motion_y[0];
1593 /* fetch 4 vectors from the bitstream, one for each 1134 /* fetch 4 vectors from the bitstream, one for each
1594 * Y fragment, then average for the C fragment vectors */ 1135 * Y fragment, then average for the C fragment vectors */
1595 motion_x[4] = motion_y[4] = 0; 1136 motion_x[4] = motion_y[4] = 0;
1596 for (k = 0; k < 4; k++) { 1137 for (k = 0; k < 4; k++) {
1597 if (coding_mode == 0) { 1138 if (coding_mode == 0) {
1598 #if 1
1599 motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; 1139 motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
1600 motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; 1140 motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
1601 #else
1602 motion_x[k] = get_motion_vector_vlc(gb);
1603 motion_y[k] = get_motion_vector_vlc(gb);
1604 #endif
1605 } else { 1141 } else {
1606 #if 1
1607 motion_x[k] = fixed_motion_vector_table[get_bits(gb, 6)]; 1142 motion_x[k] = fixed_motion_vector_table[get_bits(gb, 6)];
1608 motion_y[k] = fixed_motion_vector_table[get_bits(gb, 6)]; 1143 motion_y[k] = fixed_motion_vector_table[get_bits(gb, 6)];
1609 #else
1610 motion_x[k] = get_motion_vector_fixed(gb);
1611 motion_y[k] = get_motion_vector_fixed(gb);
1612 #endif
1613 } 1144 }
1614 motion_x[4] += motion_x[k]; 1145 motion_x[4] += motion_x[k];
1615 motion_y[4] += motion_y[k]; 1146 motion_y[4] += motion_y[k];
1616 } 1147 }
1617 1148
1742 if (!eob_run) { 1273 if (!eob_run) {
1743 /* decode a VLC into a token */ 1274 /* decode a VLC into a token */
1744 token = get_vlc2(gb, table->table, 5, 3); 1275 token = get_vlc2(gb, table->table, 5, 3);
1745 debug_vlc(" token = %2d, ", token); 1276 debug_vlc(" token = %2d, ", token);
1746 /* use the token to get a zero run, a coefficient, and an eob run */ 1277 /* use the token to get a zero run, a coefficient, and an eob run */
1747 #if 1
1748 if (token <= 6) { 1278 if (token <= 6) {
1749 eob_run = eob_run_base[token]; 1279 eob_run = eob_run_base[token];
1750 if (eob_run_get_bits[token]) 1280 if (eob_run_get_bits[token])
1751 eob_run += get_bits(gb, eob_run_get_bits[token]); 1281 eob_run += get_bits(gb, eob_run_get_bits[token]);
1752 coeff = zero_run = 0; 1282 coeff = zero_run = 0;
1759 1289
1760 zero_run = zero_run_base[token]; 1290 zero_run = zero_run_base[token];
1761 if (zero_run_get_bits[token]) 1291 if (zero_run_get_bits[token])
1762 zero_run += get_bits(gb, zero_run_get_bits[token]); 1292 zero_run += get_bits(gb, zero_run_get_bits[token]);
1763 } 1293 }
1764 #else
1765 unpack_token(gb, token, &zero_run, &coeff, &eob_run);
1766 #endif
1767 } 1294 }
1768 1295
1769 if (!eob_run) { 1296 if (!eob_run) {
1770 fragment->coeff_count += zero_run; 1297 fragment->coeff_count += zero_run;
1771 if (fragment->coeff_count < 64){ 1298 if (fragment->coeff_count < 64){
2441 */ 1968 */
2442 1969
2443 emms_c(); 1970 emms_c();
2444 } 1971 }
2445 1972
2446 /*
2447 * This function performs the final rendering of each fragment's data
2448 * onto the output frame.
2449 */
2450 static void render_fragments(Vp3DecodeContext *s,
2451 int first_fragment,
2452 int width,
2453 int height,
2454 int plane /* 0 = Y, 1 = U, 2 = V */)
2455 {
2456 int x, y;
2457 int m, n;
2458 int i = first_fragment;
2459 int16_t *dequantizer;
2460 DCTELEM __align16 block[64];
2461 unsigned char *output_plane;
2462 unsigned char *last_plane;
2463 unsigned char *golden_plane;
2464 int stride;
2465 int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef;
2466 int upper_motion_limit, lower_motion_limit;
2467 int motion_halfpel_index;
2468 uint8_t *motion_source;
2469
2470 debug_vp3(" vp3: rendering final fragments for %s\n",
2471 (plane == 0) ? "Y plane" : (plane == 1) ? "U plane" : "V plane");
2472
2473 /* set up plane-specific parameters */
2474 if (plane == 0) {
2475 output_plane = s->current_frame.data[0];
2476 last_plane = s->last_frame.data[0];
2477 golden_plane = s->golden_frame.data[0];
2478 stride = s->current_frame.linesize[0];
2479 if (!s->flipped_image) stride = -stride;
2480 upper_motion_limit = 7 * s->current_frame.linesize[0];
2481 lower_motion_limit = height * s->current_frame.linesize[0] + width - 8;
2482 } else if (plane == 1) {
2483 output_plane = s->current_frame.data[1];
2484 last_plane = s->last_frame.data[1];
2485 golden_plane = s->golden_frame.data[1];
2486 stride = s->current_frame.linesize[1];
2487 if (!s->flipped_image) stride = -stride;
2488 upper_motion_limit = 7 * s->current_frame.linesize[1];
2489 lower_motion_limit = height * s->current_frame.linesize[1] + width - 8;
2490 } else {
2491 output_plane = s->current_frame.data[2];
2492 last_plane = s->last_frame.data[2];
2493 golden_plane = s->golden_frame.data[2];
2494 stride = s->current_frame.linesize[2];
2495 if (!s->flipped_image) stride = -stride;
2496 upper_motion_limit = 7 * s->current_frame.linesize[2];
2497 lower_motion_limit = height * s->current_frame.linesize[2] + width - 8;
2498 }
2499
2500 if(ABS(stride) > 2048)
2501 return; //various tables are fixed size
2502
2503 /* for each fragment row... */
2504 for (y = 0; y < height; y += 8) {
2505
2506 /* for each fragment in a row... */
2507 for (x = 0; x < width; x += 8, i++) {
2508
2509 if ((i < 0) || (i >= s->fragment_count)) {
2510 av_log(s->avctx, AV_LOG_ERROR, " vp3:render_fragments(): bad fragment number (%d)\n", i);
2511 return;
2512 }
2513
2514 /* transform if this block was coded */
2515 if ((s->all_fragments[i].coding_method != MODE_COPY) &&
2516 !((s->avctx->flags & CODEC_FLAG_GRAY) && plane)) {
2517
2518 if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) ||
2519 (s->all_fragments[i].coding_method == MODE_GOLDEN_MV))
2520 motion_source= golden_plane;
2521 else
2522 motion_source= last_plane;
2523
2524 motion_source += s->all_fragments[i].first_pixel;
2525 motion_halfpel_index = 0;
2526
2527 /* sort out the motion vector if this fragment is coded
2528 * using a motion vector method */
2529 if ((s->all_fragments[i].coding_method > MODE_INTRA) &&
2530 (s->all_fragments[i].coding_method != MODE_USING_GOLDEN)) {
2531 int src_x, src_y;
2532 motion_x = s->all_fragments[i].motion_x;
2533 motion_y = s->all_fragments[i].motion_y;
2534 if(plane){
2535 motion_x= (motion_x>>1) | (motion_x&1);
2536 motion_y= (motion_y>>1) | (motion_y&1);
2537 }
2538
2539 src_x= (motion_x>>1) + x;
2540 src_y= (motion_y>>1) + y;
2541 if ((motion_x == 127) || (motion_y == 127))
2542 av_log(s->avctx, AV_LOG_ERROR, " help! got invalid motion vector! (%X, %X)\n", motion_x, motion_y);
2543
2544 motion_halfpel_index = motion_x & 0x01;
2545 motion_source += (motion_x >> 1);
2546
2547 motion_halfpel_index |= (motion_y & 0x01) << 1;
2548 motion_source += ((motion_y >> 1) * stride);
2549
2550 if(src_x<0 || src_y<0 || src_x + 9 >= width || src_y + 9 >= height){
2551 uint8_t *temp= s->edge_emu_buffer;
2552 if(stride<0) temp -= 9*stride;
2553 else temp += 9*stride;
2554
2555 ff_emulated_edge_mc(temp, motion_source, stride, 9, 9, src_x, src_y, width, height);
2556 motion_source= temp;
2557 }
2558 }
2559
2560
2561 /* first, take care of copying a block from either the
2562 * previous or the golden frame */
2563 if (s->all_fragments[i].coding_method != MODE_INTRA) {
2564 //Note, it is possible to implement all MC cases with put_no_rnd_pixels_l2 which would look more like the VP3 source but this would be slower as put_no_rnd_pixels_tab is better optimzed
2565 if(motion_halfpel_index != 3){
2566 s->dsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
2567 output_plane + s->all_fragments[i].first_pixel,
2568 motion_source, stride, 8);
2569 }else{
2570 int d= (motion_x ^ motion_y)>>31; // d is 0 if motion_x and _y have the same sign, else -1
2571 s->dsp.put_no_rnd_pixels_l2[1](
2572 output_plane + s->all_fragments[i].first_pixel,
2573 motion_source - d,
2574 motion_source + stride + 1 + d,
2575 stride, 8);
2576 }
2577 dequantizer = s->inter_dequant;
2578 }else{
2579 if (plane == 0)
2580 dequantizer = s->intra_y_dequant;
2581 else
2582 dequantizer = s->intra_c_dequant;
2583 }
2584
2585 /* dequantize the DCT coefficients */
2586 debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n",
2587 i, s->all_fragments[i].coding_method,
2588 DC_COEFF(i), dequantizer[0]);
2589
2590 if(s->avctx->idct_algo==FF_IDCT_VP3){
2591 Coeff *coeff= s->coeffs + i;
2592 memset(block, 0, sizeof(block));
2593 while(coeff->next){
2594 block[coeff->index]= coeff->coeff * dequantizer[coeff->index];
2595 coeff= coeff->next;
2596 }
2597 }else{
2598 Coeff *coeff= s->coeffs + i;
2599 memset(block, 0, sizeof(block));
2600 while(coeff->next){
2601 block[coeff->index]= (coeff->coeff * dequantizer[coeff->index] + 2)>>2;
2602 coeff= coeff->next;
2603 }
2604 }
2605
2606 /* invert DCT and place (or add) in final output */
2607
2608 if (s->all_fragments[i].coding_method == MODE_INTRA) {
2609 if(s->avctx->idct_algo!=FF_IDCT_VP3)
2610 block[0] += 128<<3;
2611 s->dsp.idct_put(
2612 output_plane + s->all_fragments[i].first_pixel,
2613 stride,
2614 block);
2615 } else {
2616 s->dsp.idct_add(
2617 output_plane + s->all_fragments[i].first_pixel,
2618 stride,
2619 block);
2620 }
2621
2622 debug_idct("block after idct_%s():\n",
2623 (s->all_fragments[i].coding_method == MODE_INTRA)?
2624 "put" : "add");
2625 for (m = 0; m < 8; m++) {
2626 for (n = 0; n < 8; n++) {
2627 debug_idct(" %3d", *(output_plane +
2628 s->all_fragments[i].first_pixel + (m * stride + n)));
2629 }
2630 debug_idct("\n");
2631 }
2632 debug_idct("\n");
2633
2634 } else {
2635
2636 /* copy directly from the previous frame */
2637 s->dsp.put_pixels_tab[1][0](
2638 output_plane + s->all_fragments[i].first_pixel,
2639 last_plane + s->all_fragments[i].first_pixel,
2640 stride, 8);
2641
2642 }
2643 }
2644 }
2645
2646 emms_c();
2647 }
2648
2649 static void horizontal_filter(unsigned char *first_pixel, int stride, 1973 static void horizontal_filter(unsigned char *first_pixel, int stride,
2650 int *bounding_values) 1974 int *bounding_values)
2651 { 1975 {
2652 unsigned char *end; 1976 unsigned char *end;
2653 int filter_value; 1977 int filter_value;
3231 s->fragment_width / 2, s->fragment_height / 2); 2555 s->fragment_width / 2, s->fragment_height / 2);
3232 } 2556 }
3233 STOP_TIMER("reverse_dc_prediction")} 2557 STOP_TIMER("reverse_dc_prediction")}
3234 {START_TIMER 2558 {START_TIMER
3235 2559
3236 #if 1
3237 for (i = 0; i < s->macroblock_height; i++) 2560 for (i = 0; i < s->macroblock_height; i++)
3238 render_slice(s, i); 2561 render_slice(s, i);
3239 #else
3240 render_fragments(s, 0, s->width, s->height, 0);
3241 if ((avctx->flags & CODEC_FLAG_GRAY) == 0) {
3242 render_fragments(s, s->u_fragment_start, s->width / 2, s->height / 2, 1);
3243 render_fragments(s, s->v_fragment_start, s->width / 2, s->height / 2, 2);
3244 } else {
3245 memset(s->current_frame.data[1], 0x80, s->width * s->height / 4);
3246 memset(s->current_frame.data[2], 0x80, s->width * s->height / 4);
3247 }
3248 #endif
3249 STOP_TIMER("render_fragments")} 2562 STOP_TIMER("render_fragments")}
3250 2563
3251 {START_TIMER 2564 {START_TIMER
3252 apply_loop_filter(s); 2565 apply_loop_filter(s);
3253 STOP_TIMER("apply_loop_filter")} 2566 STOP_TIMER("apply_loop_filter")}