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