comparison h263.c @ 21:20e680e7a490 libavcodec

get_bits() specialization, gives 4\speedup
author arpi_esp
date Sat, 04 Aug 2001 00:46:50 +0000
parents 1d3ac9654178
children 8e2d8dbf89a5
comparison
equal deleted inserted replaced
20:907b67420d84 21:20e680e7a490
727 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; 727 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
728 INT16 *mot_val; 728 INT16 *mot_val;
729 static UINT8 quant_tab[4] = { -1, -2, 1, 2 }; 729 static UINT8 quant_tab[4] = { -1, -2, 1, 2 };
730 730
731 if (s->pict_type == P_TYPE) { 731 if (s->pict_type == P_TYPE) {
732 if (get_bits(&s->gb, 1)) { 732 if (get_bits1(&s->gb)) {
733 /* skip mb */ 733 /* skip mb */
734 s->mb_intra = 0; 734 s->mb_intra = 0;
735 for(i=0;i<6;i++) 735 for(i=0;i<6;i++)
736 s->block_last_index[i] = -1; 736 s->block_last_index[i] = -1;
737 s->mv_dir = MV_DIR_FORWARD; 737 s->mv_dir = MV_DIR_FORWARD;
794 } 794 }
795 } 795 }
796 } else { 796 } else {
797 s->ac_pred = 0; 797 s->ac_pred = 0;
798 if (s->h263_pred) { 798 if (s->h263_pred) {
799 s->ac_pred = get_bits(&s->gb, 1); 799 s->ac_pred = get_bits1(&s->gb);
800 } 800 }
801 cbpy = get_vlc(&s->gb, &cbpy_vlc); 801 cbpy = get_vlc(&s->gb, &cbpy_vlc);
802 cbp = (cbpc & 3) | (cbpy << 2); 802 cbp = (cbpc & 3) | (cbpy << 2);
803 if (dquant) { 803 if (dquant) {
804 s->qscale += quant_tab[get_bits(&s->gb, 2)]; 804 s->qscale += quant_tab[get_bits(&s->gb, 2)];
832 if (code < 0) 832 if (code < 0)
833 return 0xffff; 833 return 0xffff;
834 834
835 if (code == 0) 835 if (code == 0)
836 return pred; 836 return pred;
837 sign = get_bits(&s->gb, 1); 837 sign = get_bits1(&s->gb);
838 shift = s->f_code - 1; 838 shift = s->f_code - 1;
839 val = (code - 1) << shift; 839 val = (code - 1) << shift;
840 if (shift > 0) 840 if (shift > 0)
841 val |= get_bits(&s->gb, shift); 841 val |= get_bits(&s->gb, shift);
842 val++; 842 val++;
904 code = get_vlc(&s->gb, &rl->vlc); 904 code = get_vlc(&s->gb, &rl->vlc);
905 if (code < 0) 905 if (code < 0)
906 return -1; 906 return -1;
907 if (code == rl->n) { 907 if (code == rl->n) {
908 /* escape */ 908 /* escape */
909 last = get_bits(&s->gb, 1); 909 last = get_bits1(&s->gb);
910 run = get_bits(&s->gb, 6); 910 run = get_bits(&s->gb, 6);
911 level = (INT8)get_bits(&s->gb, 8); 911 level = (INT8)get_bits(&s->gb, 8);
912 if (s->h263_rv10 && level == -128) { 912 if (s->h263_rv10 && level == -128) {
913 /* XXX: should patch encoder too */ 913 /* XXX: should patch encoder too */
914 level = get_bits(&s->gb, 12); 914 level = get_bits(&s->gb, 12);
916 } 916 }
917 } else { 917 } else {
918 run = rl->table_run[code]; 918 run = rl->table_run[code];
919 level = rl->table_level[code]; 919 level = rl->table_level[code];
920 last = code >= rl->last; 920 last = code >= rl->last;
921 if (get_bits(&s->gb, 1)) 921 if (get_bits1(&s->gb))
922 level = -level; 922 level = -level;
923 } 923 }
924 i += run; 924 i += run;
925 if (i >= 64) 925 if (i >= 64)
926 return -1; 926 return -1;
950 } else { 950 } else {
951 level = get_bits(&s->gb, code); 951 level = get_bits(&s->gb, code);
952 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/ 952 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
953 level = - (level ^ ((1 << code) - 1)); 953 level = - (level ^ ((1 << code) - 1));
954 if (code > 8) 954 if (code > 8)
955 get_bits(&s->gb, 1); /* marker */ 955 skip_bits1(&s->gb); /* marker */
956 } 956 }
957 957
958 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr); 958 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
959 level += pred; 959 level += pred;
960 if (level < 0) 960 if (level < 0)
1007 code = get_vlc(&s->gb, &rl->vlc); 1007 code = get_vlc(&s->gb, &rl->vlc);
1008 if (code < 0) 1008 if (code < 0)
1009 return -1; 1009 return -1;
1010 if (code == rl->n) { 1010 if (code == rl->n) {
1011 /* escape */ 1011 /* escape */
1012 if (get_bits(&s->gb, 1) != 0) { 1012 if (get_bits1(&s->gb) != 0) {
1013 if (get_bits(&s->gb, 1) != 0) { 1013 if (get_bits1(&s->gb) != 0) {
1014 /* third escape */ 1014 /* third escape */
1015 last = get_bits(&s->gb, 1); 1015 last = get_bits1(&s->gb);
1016 run = get_bits(&s->gb, 6); 1016 run = get_bits(&s->gb, 6);
1017 get_bits(&s->gb, 1); /* marker */ 1017 get_bits1(&s->gb); /* marker */
1018 level = get_bits(&s->gb, 12); 1018 level = get_bits(&s->gb, 12);
1019 level = (level << 20) >> 20; /* sign extend */ 1019 level = (level << 20) >> 20; /* sign extend */
1020 get_bits(&s->gb, 1); /* marker */ 1020 skip_bits1(&s->gb); /* marker */
1021 } else { 1021 } else {
1022 /* second escape */ 1022 /* second escape */
1023 code = get_vlc(&s->gb, &rl->vlc); 1023 code = get_vlc(&s->gb, &rl->vlc);
1024 if (code < 0 || code >= rl->n) 1024 if (code < 0 || code >= rl->n)
1025 return -1; 1025 return -1;
1026 run = rl->table_run[code]; 1026 run = rl->table_run[code];
1027 level = rl->table_level[code]; 1027 level = rl->table_level[code];
1028 last = code >= rl->last; 1028 last = code >= rl->last;
1029 run += rl->max_run[last][level] + 1; 1029 run += rl->max_run[last][level] + 1;
1030 if (get_bits(&s->gb, 1)) 1030 if (get_bits1(&s->gb))
1031 level = -level; 1031 level = -level;
1032 } 1032 }
1033 } else { 1033 } else {
1034 /* first escape */ 1034 /* first escape */
1035 code = get_vlc(&s->gb, &rl->vlc); 1035 code = get_vlc(&s->gb, &rl->vlc);
1037 return -1; 1037 return -1;
1038 run = rl->table_run[code]; 1038 run = rl->table_run[code];
1039 level = rl->table_level[code]; 1039 level = rl->table_level[code];
1040 last = code >= rl->last; 1040 last = code >= rl->last;
1041 level += rl->max_level[last][run]; 1041 level += rl->max_level[last][run];
1042 if (get_bits(&s->gb, 1)) 1042 if (get_bits1(&s->gb))
1043 level = -level; 1043 level = -level;
1044 } 1044 }
1045 } else { 1045 } else {
1046 run = rl->table_run[code]; 1046 run = rl->table_run[code];
1047 level = rl->table_level[code]; 1047 level = rl->table_level[code];
1048 last = code >= rl->last; 1048 last = code >= rl->last;
1049 if (get_bits(&s->gb, 1)) 1049 if (get_bits1(&s->gb))
1050 level = -level; 1050 level = -level;
1051 } 1051 }
1052 i += run; 1052 i += run;
1053 if (i >= 64) 1053 if (i >= 64)
1054 return -1; 1054 return -1;
1075 int format, width, height; 1075 int format, width, height;
1076 1076
1077 /* picture header */ 1077 /* picture header */
1078 if (get_bits(&s->gb, 22) != 0x20) 1078 if (get_bits(&s->gb, 22) != 0x20)
1079 return -1; 1079 return -1;
1080 get_bits(&s->gb, 8); /* picture timestamp */ 1080 skip_bits(&s->gb, 8); /* picture timestamp */
1081 1081
1082 if (get_bits(&s->gb, 1) != 1) 1082 if (get_bits1(&s->gb) != 1)
1083 return -1; /* marker */ 1083 return -1; /* marker */
1084 if (get_bits(&s->gb, 1) != 0) 1084 if (get_bits1(&s->gb) != 0)
1085 return -1; /* h263 id */ 1085 return -1; /* h263 id */
1086 get_bits(&s->gb, 1); /* split screen off */ 1086 skip_bits1(&s->gb); /* split screen off */
1087 get_bits(&s->gb, 1); /* camera off */ 1087 skip_bits1(&s->gb); /* camera off */
1088 get_bits(&s->gb, 1); /* freeze picture release off */ 1088 skip_bits1(&s->gb); /* freeze picture release off */
1089 1089
1090 format = get_bits(&s->gb, 3); 1090 format = get_bits(&s->gb, 3);
1091 1091
1092 if (format != 7) { 1092 if (format != 7) {
1093 s->h263_plus = 0; 1093 s->h263_plus = 0;
1095 width = h263_format[format][0]; 1095 width = h263_format[format][0];
1096 height = h263_format[format][1]; 1096 height = h263_format[format][1];
1097 if (!width) 1097 if (!width)
1098 return -1; 1098 return -1;
1099 1099
1100 s->pict_type = I_TYPE + get_bits(&s->gb, 1); 1100 s->pict_type = I_TYPE + get_bits1(&s->gb);
1101 1101
1102 s->unrestricted_mv = get_bits(&s->gb, 1); 1102 s->unrestricted_mv = get_bits1(&s->gb);
1103 s->h263_long_vectors = s->unrestricted_mv; 1103 s->h263_long_vectors = s->unrestricted_mv;
1104 1104
1105 if (get_bits(&s->gb, 1) != 0) 1105 if (get_bits1(&s->gb) != 0)
1106 return -1; /* SAC: off */ 1106 return -1; /* SAC: off */
1107 if (get_bits(&s->gb, 1) != 0) 1107 if (get_bits1(&s->gb) != 0)
1108 return -1; /* advanced prediction mode: off */ 1108 return -1; /* advanced prediction mode: off */
1109 if (get_bits(&s->gb, 1) != 0) 1109 if (get_bits1(&s->gb) != 0)
1110 return -1; /* not PB frame */ 1110 return -1; /* not PB frame */
1111 1111
1112 s->qscale = get_bits(&s->gb, 5); 1112 s->qscale = get_bits(&s->gb, 5);
1113 get_bits(&s->gb, 1); /* Continuous Presence Multipoint mode: off */ 1113 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
1114 } else { 1114 } else {
1115 s->h263_plus = 1; 1115 s->h263_plus = 1;
1116 /* H.263v2 */ 1116 /* H.263v2 */
1117 if (get_bits(&s->gb, 3) != 1) 1117 if (get_bits(&s->gb, 3) != 1)
1118 return -1; 1118 return -1;
1119 if (get_bits(&s->gb, 3) != 6) /* custom source format */ 1119 if (get_bits(&s->gb, 3) != 6) /* custom source format */
1120 return -1; 1120 return -1;
1121 get_bits(&s->gb, 12); 1121 skip_bits(&s->gb, 12);
1122 get_bits(&s->gb, 3); 1122 skip_bits(&s->gb, 3);
1123 s->pict_type = get_bits(&s->gb, 3) + 1; 1123 s->pict_type = get_bits(&s->gb, 3) + 1;
1124 if (s->pict_type != I_TYPE && 1124 if (s->pict_type != I_TYPE &&
1125 s->pict_type != P_TYPE) 1125 s->pict_type != P_TYPE)
1126 return -1; 1126 return -1;
1127 get_bits(&s->gb, 7); 1127 skip_bits(&s->gb, 7);
1128 get_bits(&s->gb, 4); /* aspect ratio */ 1128 skip_bits(&s->gb, 4); /* aspect ratio */
1129 width = (get_bits(&s->gb, 9) + 1) * 4; 1129 width = (get_bits(&s->gb, 9) + 1) * 4;
1130 get_bits(&s->gb, 1); 1130 skip_bits1(&s->gb);
1131 height = get_bits(&s->gb, 9) * 4; 1131 height = get_bits(&s->gb, 9) * 4;
1132 if (height == 0) 1132 if (height == 0)
1133 return -1; 1133 return -1;
1134 s->qscale = get_bits(&s->gb, 5); 1134 s->qscale = get_bits(&s->gb, 5);
1135 } 1135 }
1136 /* PEI */ 1136 /* PEI */
1137 while (get_bits(&s->gb, 1) != 0) { 1137 while (get_bits1(&s->gb) != 0) {
1138 get_bits(&s->gb, 8); 1138 skip_bits(&s->gb, 8);
1139 } 1139 }
1140 s->f_code = 1; 1140 s->f_code = 1;
1141 s->width = width; 1141 s->width = width;
1142 s->height = height; 1142 s->height = height;
1143 return 0; 1143 return 0;
1167 1167
1168 if (startcode == 0x120) { 1168 if (startcode == 0x120) {
1169 int time_increment_resolution, width, height; 1169 int time_increment_resolution, width, height;
1170 1170
1171 /* vol header */ 1171 /* vol header */
1172 get_bits(&s->gb, 1); /* random access */ 1172 skip_bits(&s->gb, 1); /* random access */
1173 get_bits(&s->gb, 8); /* vo_type */ 1173 skip_bits(&s->gb, 8); /* vo_type */
1174 get_bits(&s->gb, 1); /* is_ol_id */ 1174 skip_bits(&s->gb, 1); /* is_ol_id */
1175 get_bits(&s->gb, 4); /* vo_ver_id */ 1175 skip_bits(&s->gb, 4); /* vo_ver_id */
1176 get_bits(&s->gb, 3); /* vo_priority */ 1176 skip_bits(&s->gb, 3); /* vo_priority */
1177 1177
1178 get_bits(&s->gb, 4); /* aspect_ratio_info */ 1178 skip_bits(&s->gb, 4); /* aspect_ratio_info */
1179 get_bits(&s->gb, 1); /* vol control parameter */ 1179 skip_bits(&s->gb, 1); /* vol control parameter */
1180 get_bits(&s->gb, 2); /* vol shape */ 1180 skip_bits(&s->gb, 2); /* vol shape */
1181 get_bits(&s->gb, 1); /* marker */ 1181 skip_bits1(&s->gb); /* marker */
1182 1182
1183 time_increment_resolution = get_bits(&s->gb, 16); 1183 time_increment_resolution = get_bits(&s->gb, 16);
1184 s->time_increment_bits = log2(time_increment_resolution - 1) + 1; 1184 s->time_increment_bits = log2(time_increment_resolution - 1) + 1;
1185 get_bits(&s->gb, 1); /* marker */ 1185 skip_bits1(&s->gb); /* marker */
1186 1186
1187 get_bits(&s->gb, 1); /* vop rate */ 1187 skip_bits1(&s->gb); /* vop rate */
1188 get_bits(&s->gb, s->time_increment_bits); 1188 skip_bits(&s->gb, s->time_increment_bits);
1189 get_bits(&s->gb, 1); /* marker */ 1189 skip_bits1(&s->gb); /* marker */
1190 1190
1191 width = get_bits(&s->gb, 13); 1191 width = get_bits(&s->gb, 13);
1192 get_bits(&s->gb, 1); /* marker */ 1192 skip_bits1(&s->gb); /* marker */
1193 height = get_bits(&s->gb, 13); 1193 height = get_bits(&s->gb, 13);
1194 get_bits(&s->gb, 1); /* marker */ 1194 skip_bits1(&s->gb); /* marker */
1195 1195
1196 get_bits(&s->gb, 1); /* interfaced */ 1196 skip_bits1(&s->gb); /* interfaced */
1197 get_bits(&s->gb, 1); /* OBMC */ 1197 skip_bits1(&s->gb); /* OBMC */
1198 get_bits(&s->gb, 2); /* vol_sprite_usage */ 1198 skip_bits(&s->gb, 2); /* vol_sprite_usage */
1199 get_bits(&s->gb, 1); /* not_8_bit */ 1199 skip_bits1(&s->gb); /* not_8_bit */
1200 1200
1201 get_bits(&s->gb, 1); /* vol_quant_type */ 1201 skip_bits1(&s->gb); /* vol_quant_type */
1202 get_bits(&s->gb, 1); /* vol_quarter_pixel */ 1202 skip_bits1(&s->gb); /* vol_quarter_pixel */
1203 get_bits(&s->gb, 1); /* complexity_estimation_disabled */ 1203 skip_bits1(&s->gb); /* complexity_estimation_disabled */
1204 get_bits(&s->gb, 1); /* resync_marker_disabled */ 1204 skip_bits1(&s->gb); /* resync_marker_disabled */
1205 get_bits(&s->gb, 1); /* data_partioning_enabled */ 1205 skip_bits1(&s->gb); /* data_partioning_enabled */
1206 goto redo; 1206 goto redo;
1207 } else if (startcode != 0x1b6) { 1207 } else if (startcode != 0x1b6) {
1208 goto redo; 1208 goto redo;
1209 } 1209 }
1210 1210
1213 s->pict_type != P_TYPE) 1213 s->pict_type != P_TYPE)
1214 return -1; 1214 return -1;
1215 1215
1216 /* XXX: parse time base */ 1216 /* XXX: parse time base */
1217 time_incr = 0; 1217 time_incr = 0;
1218 while (get_bits(&s->gb, 1) != 0) 1218 while (get_bits1(&s->gb) != 0)
1219 time_incr++; 1219 time_incr++;
1220 1220
1221 get_bits(&s->gb, 1); /* marker */ 1221 skip_bits1(&s->gb); /* marker */
1222 get_bits(&s->gb, s->time_increment_bits); 1222 skip_bits(&s->gb, s->time_increment_bits);
1223 get_bits(&s->gb, 1); /* marker */ 1223 skip_bits1(&s->gb); /* marker */
1224 /* vop coded */ 1224 /* vop coded */
1225 if (get_bits(&s->gb, 1) != 1) 1225 if (get_bits1(&s->gb) != 1)
1226 return -1; 1226 return -1;
1227 1227
1228 if (s->pict_type == P_TYPE) { 1228 if (s->pict_type == P_TYPE) {
1229 /* rounding type for motion estimation */ 1229 /* rounding type for motion estimation */
1230 s->no_rounding = get_bits(&s->gb, 1); 1230 s->no_rounding = get_bits1(&s->gb);
1231 } 1231 }
1232 1232
1233 if (get_bits(&s->gb, 3) != 0) 1233 if (get_bits(&s->gb, 3) != 0)
1234 return -1; /* intra dc VLC threshold */ 1234 return -1; /* intra dc VLC threshold */
1235 1235
1247 int format; 1247 int format;
1248 1248
1249 /* picture header */ 1249 /* picture header */
1250 if (get_bits(&s->gb, 22) != 0x20) 1250 if (get_bits(&s->gb, 22) != 0x20)
1251 return -1; 1251 return -1;
1252 get_bits(&s->gb, 8); /* picture timestamp */ 1252 skip_bits(&s->gb, 8); /* picture timestamp */
1253 1253
1254 if (get_bits(&s->gb, 1) != 1) 1254 if (get_bits1(&s->gb) != 1)
1255 return -1; /* marker */ 1255 return -1; /* marker */
1256 if (get_bits(&s->gb, 1) != 0) 1256 if (get_bits1(&s->gb) != 0)
1257 return -1; /* h263 id */ 1257 return -1; /* h263 id */
1258 get_bits(&s->gb, 1); /* split screen off */ 1258 skip_bits1(&s->gb); /* split screen off */
1259 get_bits(&s->gb, 1); /* camera off */ 1259 skip_bits1(&s->gb); /* camera off */
1260 get_bits(&s->gb, 1); /* freeze picture release off */ 1260 skip_bits1(&s->gb); /* freeze picture release off */
1261 1261
1262 format = get_bits(&s->gb, 3); 1262 format = get_bits(&s->gb, 3);
1263 if (format != 7) 1263 if (format != 7)
1264 return -1; 1264 return -1;
1265 1265
1266 s->h263_plus = 0; 1266 s->h263_plus = 0;
1267 1267
1268 s->pict_type = I_TYPE + get_bits(&s->gb, 1); 1268 s->pict_type = I_TYPE + get_bits1(&s->gb);
1269 1269
1270 s->unrestricted_mv = get_bits(&s->gb, 1); 1270 s->unrestricted_mv = get_bits1(&s->gb);
1271 s->h263_long_vectors = s->unrestricted_mv; 1271 s->h263_long_vectors = s->unrestricted_mv;
1272 1272
1273 if (get_bits(&s->gb, 1) != 0) 1273 if (get_bits1(&s->gb) != 0)
1274 return -1; /* SAC: off */ 1274 return -1; /* SAC: off */
1275 if (get_bits(&s->gb, 1) != 0) 1275 if (get_bits1(&s->gb) != 0)
1276 return -1; /* advanced prediction mode: off */ 1276 return -1; /* advanced prediction mode: off */
1277 if (get_bits(&s->gb, 1) != 0) 1277 if (get_bits1(&s->gb) != 0)
1278 return -1; /* not PB frame */ 1278 return -1; /* not PB frame */
1279 1279
1280 /* skip unknown header garbage */ 1280 /* skip unknown header garbage */
1281 get_bits(&s->gb, 41); 1281 skip_bits(&s->gb, 41);
1282 1282
1283 s->qscale = get_bits(&s->gb, 5); 1283 s->qscale = get_bits(&s->gb, 5);
1284 get_bits(&s->gb, 1); /* Continuous Presence Multipoint mode: off */ 1284 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
1285 1285
1286 /* PEI */ 1286 /* PEI */
1287 while (get_bits(&s->gb, 1) != 0) { 1287 while (get_bits1(&s->gb) != 0) {
1288 get_bits(&s->gb, 8); 1288 skip_bits(&s->gb, 8);
1289 } 1289 }
1290 s->f_code = 1; 1290 s->f_code = 1;
1291 return 0; 1291 return 0;
1292 } 1292 }