comparison mpeg12.c @ 711:dcbcf9676c9f libavcodec

optimizing mpeg1_decode_block()
author michaelni
date Mon, 30 Sep 2002 16:14:14 +0000
parents 97377ab86647
children fd0e997616fe
comparison
equal deleted inserted replaced
710:97377ab86647 711:dcbcf9676c9f
50 static void mpeg1_encode_block(MpegEncContext *s, 50 static void mpeg1_encode_block(MpegEncContext *s,
51 DCTELEM *block, 51 DCTELEM *block,
52 int component); 52 int component);
53 static void mpeg1_encode_motion(MpegEncContext *s, int val); 53 static void mpeg1_encode_motion(MpegEncContext *s, int val);
54 static void mpeg1_skip_picture(MpegEncContext *s, int pict_num); 54 static void mpeg1_skip_picture(MpegEncContext *s, int pict_num);
55 static int mpeg1_decode_block(MpegEncContext *s, 55 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
56 DCTELEM *block,
57 int n);
58 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
56 DCTELEM *block, 59 DCTELEM *block,
57 int n); 60 int n);
58 static int mpeg2_decode_block_non_intra(MpegEncContext *s, 61 static int mpeg2_decode_block_non_intra(MpegEncContext *s,
59 DCTELEM *block, 62 DCTELEM *block,
60 int n); 63 int n);
90 }else{ 93 }else{
91 if(code==rl->n){ //esc 94 if(code==rl->n){ //esc
92 run= 65; 95 run= 65;
93 level= 0; 96 level= 0;
94 }else if(code==rl->n+1){ //eob 97 }else if(code==rl->n+1){ //eob
95 run= 192; 98 run= 0;
96 level= 1; 99 level= 127;
97 }else{ 100 }else{
98 run= rl->table_run [code] + 1; 101 run= rl->table_run [code] + 1;
99 level= rl->table_level[code]; 102 level= rl->table_level[code];
100 } 103 }
101 } 104 }
930 dprintf("cbp=%x\n", cbp); 933 dprintf("cbp=%x\n", cbp);
931 934
932 if (s->mpeg2) { 935 if (s->mpeg2) {
933 if (s->mb_intra) { 936 if (s->mb_intra) {
934 for(i=0;i<6;i++) { 937 for(i=0;i<6;i++) {
935 if (cbp & (1 << (5 - i))) { 938 if (mpeg2_decode_block_intra(s, block[i], i) < 0)
936 if (mpeg2_decode_block_intra(s, block[i], i) < 0) 939 return -1;
937 return -1;
938 } else {
939 s->block_last_index[i] = -1;
940 }
941 } 940 }
942 } else { 941 } else {
943 for(i=0;i<6;i++) { 942 for(i=0;i<6;i++) {
944 if (cbp & (1 << (5 - i))) { 943 if (cbp & 32) {
945 if (mpeg2_decode_block_non_intra(s, block[i], i) < 0) 944 if (mpeg2_decode_block_non_intra(s, block[i], i) < 0)
946 return -1; 945 return -1;
947 } else { 946 } else {
948 s->block_last_index[i] = -1; 947 s->block_last_index[i] = -1;
949 } 948 }
949 cbp+=cbp;
950 } 950 }
951 } 951 }
952 } else { 952 } else {
953 for(i=0;i<6;i++) { 953 if (s->mb_intra) {
954 if (cbp & (1 << (5 - i))) { 954 for(i=0;i<6;i++) {
955 if (mpeg1_decode_block(s, block[i], i) < 0) 955 if (mpeg1_decode_block_intra(s, block[i], i) < 0)
956 return -1; 956 return -1;
957 } else { 957 }
958 s->block_last_index[i] = -1; 958 }else{
959 for(i=0;i<6;i++) {
960 if (cbp & 32) {
961 if (mpeg1_decode_block_inter(s, block[i], i) < 0)
962 return -1;
963 } else {
964 s->block_last_index[i] = -1;
965 }
966 cbp+=cbp;
959 } 967 }
960 } 968 }
961 } 969 }
962 return 0; 970 return 0;
963 } 971 }
1016 diff = (-1 << code) | (diff + 1); 1024 diff = (-1 << code) | (diff + 1);
1017 } 1025 }
1018 return diff; 1026 return diff;
1019 } 1027 }
1020 1028
1021 static int mpeg1_decode_block(MpegEncContext *s, 1029 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
1022 DCTELEM *block, 1030 DCTELEM *block,
1023 int n) 1031 int n)
1024 { 1032 {
1025 int level, dc, diff, i, j, run; 1033 int level, dc, diff, i, j, run;
1026 int code, component; 1034 int component;
1027 RLTable *rl = &rl_mpeg1; 1035 RLTable *rl = &rl_mpeg1;
1028 UINT8 * const scantable= s->intra_scantable.permutated; 1036 UINT8 * const scantable= s->intra_scantable.permutated;
1029 1037 const UINT16 *quant_matrix= s->intra_matrix;
1030 if (s->mb_intra) { 1038 const int qscale= s->qscale;
1031 /* DC coef */ 1039
1032 component = (n <= 3 ? 0 : n - 4 + 1); 1040 /* DC coef */
1033 diff = decode_dc(s, component); 1041 component = (n <= 3 ? 0 : n - 4 + 1);
1034 if (diff >= 0xffff) 1042 diff = decode_dc(s, component);
1035 return -1; 1043 if (diff >= 0xffff)
1036 dc = s->last_dc[component]; 1044 return -1;
1037 dc += diff; 1045 dc = s->last_dc[component];
1038 s->last_dc[component] = dc; 1046 dc += diff;
1039 block[0] = dc; 1047 s->last_dc[component] = dc;
1040 dprintf("dc=%d diff=%d\n", dc, diff); 1048 block[0] = dc<<3;
1041 i = 1; 1049 dprintf("dc=%d diff=%d\n", dc, diff);
1042 } else { 1050 i = 0;
1051 {
1052 OPEN_READER(re, &s->gb);
1053 /* now quantify & encode AC coefs */
1054 for(;;) {
1055 UPDATE_CACHE(re, &s->gb);
1056 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
1057
1058 if(level == 127){
1059 break;
1060 } else if(level != 0) {
1061 i += run;
1062 j = scantable[i];
1063 level= (level*qscale*quant_matrix[j])>>3;
1064 level= (level-1)|1;
1065 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1066 LAST_SKIP_BITS(re, &s->gb, 1);
1067 } else {
1068 /* escape */
1069 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
1070 UPDATE_CACHE(re, &s->gb);
1071 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
1072 if (level == -128) {
1073 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8);
1074 } else if (level == 0) {
1075 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8);
1076 }
1077 i += run;
1078 j = scantable[i];
1079 if(level<0){
1080 level= -level;
1081 level= (level*qscale*quant_matrix[j])>>3;
1082 level= (level-1)|1;
1083 level= -level;
1084 }else{
1085 level= (level*qscale*quant_matrix[j])>>3;
1086 level= (level-1)|1;
1087 }
1088 }
1089 if (i > 63){
1090 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1091 return -1;
1092 }
1093
1094 block[j] = level;
1095 }
1096 CLOSE_READER(re, &s->gb);
1097 }
1098 s->block_last_index[n] = i;
1099 return 0;
1100 }
1101
1102 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
1103 DCTELEM *block,
1104 int n)
1105 {
1106 int level, i, j, run;
1107 RLTable *rl = &rl_mpeg1;
1108 UINT8 * const scantable= s->intra_scantable.permutated;
1109 const UINT16 *quant_matrix= s->inter_matrix;
1110 const int qscale= s->qscale;
1111
1112 {
1043 int v; 1113 int v;
1044 OPEN_READER(re, &s->gb); 1114 OPEN_READER(re, &s->gb);
1045 i = 0; 1115 i = -1;
1046 /* special case for the first coef. no need to add a second vlc table */ 1116 /* special case for the first coef. no need to add a second vlc table */
1047 UPDATE_CACHE(re, &s->gb); 1117 UPDATE_CACHE(re, &s->gb);
1048 v= SHOW_UBITS(re, &s->gb, 2); 1118 v= SHOW_UBITS(re, &s->gb, 2);
1049 if (v & 2) { 1119 if (v & 2) {
1050 run = 0;
1051 level = 1 - ((v & 1) << 1);
1052 SKIP_BITS(re, &s->gb, 2); 1120 SKIP_BITS(re, &s->gb, 2);
1053 CLOSE_READER(re, &s->gb); 1121 level= (3*qscale*quant_matrix[0])>>4;
1054 goto add_coef; 1122 level= (level-1)|1;
1123 if(v&1)
1124 level= -level;
1125 block[ scantable[0] ] = level;
1126 i++;
1055 } 1127 }
1056 CLOSE_READER(re, &s->gb); 1128 CLOSE_READER(re, &s->gb);
1057 } 1129 }
1058 1130 {
1059 /* now quantify & encode AC coefs */ 1131 OPEN_READER(re, &s->gb);
1060 for(;;) { 1132 /* now quantify & encode AC coefs */
1061 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); 1133 for(;;) {
1062 if (code < 0) { 1134 UPDATE_CACHE(re, &s->gb);
1063 return -1; 1135 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
1064 } 1136
1065 if (code == 112) { 1137 if(level == 127){
1066 break; 1138 break;
1067 } else if (code == 111) { 1139 } else if(level != 0) {
1068 /* escape */ 1140 i += run;
1069 run = get_bits(&s->gb, 6); 1141 j = scantable[i];
1070 level = get_bits(&s->gb, 8); 1142 level= ((level*2+1)*qscale*quant_matrix[j])>>4;
1071 level= (level + ((-1)<<7)) ^ ((-1)<<7); //sign extension 1143 level= (level-1)|1;
1072 if (level == -128) { 1144 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1073 level = get_bits(&s->gb, 8) - 256; 1145 LAST_SKIP_BITS(re, &s->gb, 1);
1074 } else if (level == 0) { 1146 } else {
1075 level = get_bits(&s->gb, 8); 1147 /* escape */
1076 } 1148 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
1077 } else { 1149 UPDATE_CACHE(re, &s->gb);
1078 run = rl->table_run[code]; 1150 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
1079 level = rl->table_level[code]; 1151 if (level == -128) {
1080 if (get_bits1(&s->gb)) 1152 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8);
1081 level = -level; 1153 } else if (level == 0) {
1082 } 1154 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8);
1083 i += run; 1155 }
1084 if (i >= 64) 1156 i += run;
1085 return -1; 1157 j = scantable[i];
1086 add_coef: 1158 if(level<0){
1087 dprintf("%d: run=%d level=%d\n", n, run, level); 1159 level= -level;
1088 j = scantable[i]; 1160 level= ((level*2+1)*qscale*quant_matrix[j])>>4;
1089 block[j] = level; 1161 level= (level-1)|1;
1090 i++; 1162 level= -level;
1091 } 1163 }else{
1092 s->block_last_index[n] = i-1; 1164 level= ((level*2+1)*qscale*quant_matrix[j])>>4;
1165 level= (level-1)|1;
1166 }
1167 }
1168 if (i > 63){
1169 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1170 return -1;
1171 }
1172
1173 block[j] = level;
1174 }
1175 CLOSE_READER(re, &s->gb);
1176 }
1177 s->block_last_index[n] = i;
1093 return 0; 1178 return 0;
1094 } 1179 }
1095 1180
1096 /* Also does unquantization here, since I will never support mpeg2 1181 /* Also does unquantization here, since I will never support mpeg2
1097 encoding */ 1182 encoding */