Mercurial > libavcodec.hg
comparison vc1.c @ 5511:7617e066481e libavcodec
use get_unary from bitstream.h
author | alex |
---|---|
date | Wed, 08 Aug 2007 22:54:47 +0000 |
parents | 4623928e3b9e |
children | 9f8219a3b86f |
comparison
equal
deleted
inserted
replaced
5510:37bf17e052fb | 5511:7617e066481e |
---|---|
39 #define MB_INTRA_VLC_BITS 9 | 39 #define MB_INTRA_VLC_BITS 9 |
40 #define DC_VLC_BITS 9 | 40 #define DC_VLC_BITS 9 |
41 #define AC_VLC_BITS 9 | 41 #define AC_VLC_BITS 9 |
42 static const uint16_t table_mb_intra[64][2]; | 42 static const uint16_t table_mb_intra[64][2]; |
43 | 43 |
44 | |
45 /** | |
46 * Get unary code of limited length | |
47 * @todo FIXME Slow and ugly | |
48 * @param gb GetBitContext | |
49 * @param[in] stop The bitstop value (unary code of 1's or 0's) | |
50 * @param[in] len Maximum length | |
51 * @return Unary length/index | |
52 */ | |
53 static int get_prefix(GetBitContext *gb, int stop, int len) | |
54 { | |
55 #if 1 | |
56 int i; | |
57 | |
58 for(i = 0; i < len && get_bits1(gb) != stop; i++); | |
59 return i; | |
60 /* int i = 0, tmp = !stop; | |
61 | |
62 while (i != len && tmp != stop) | |
63 { | |
64 tmp = get_bits(gb, 1); | |
65 i++; | |
66 } | |
67 if (i == len && tmp != stop) return len+1; | |
68 return i;*/ | |
69 #else | |
70 unsigned int buf; | |
71 int log; | |
72 | |
73 OPEN_READER(re, gb); | |
74 UPDATE_CACHE(re, gb); | |
75 buf=GET_CACHE(re, gb); //Still not sure | |
76 if (stop) buf = ~buf; | |
77 | |
78 log= av_log2(-buf); //FIXME: -? | |
79 if (log < limit){ | |
80 LAST_SKIP_BITS(re, gb, log+1); | |
81 CLOSE_READER(re, gb); | |
82 return log; | |
83 } | |
84 | |
85 LAST_SKIP_BITS(re, gb, limit); | |
86 CLOSE_READER(re, gb); | |
87 return limit; | |
88 #endif | |
89 } | |
90 | 44 |
91 static inline int decode210(GetBitContext *gb){ | 45 static inline int decode210(GetBitContext *gb){ |
92 if (get_bits1(gb)) | 46 if (get_bits1(gb)) |
93 return 0; | 47 return 0; |
94 else | 48 else |
1129 if (pqindex < 9) v->halfpq = get_bits(gb, 1); | 1083 if (pqindex < 9) v->halfpq = get_bits(gb, 1); |
1130 else v->halfpq = 0; | 1084 else v->halfpq = 0; |
1131 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) | 1085 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
1132 v->pquantizer = get_bits(gb, 1); | 1086 v->pquantizer = get_bits(gb, 1); |
1133 v->dquantfrm = 0; | 1087 v->dquantfrm = 0; |
1134 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3); | 1088 if (v->extended_mv == 1) v->mvrange = get_unary(gb, 0, 3); |
1135 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | 1089 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 |
1136 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | 1090 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 |
1137 v->range_x = 1 << (v->k_x - 1); | 1091 v->range_x = 1 << (v->k_x - 1); |
1138 v->range_y = 1 << (v->k_y - 1); | 1092 v->range_y = 1 << (v->k_y - 1); |
1139 if (v->profile == PROFILE_ADVANCED) | 1093 if (v->profile == PROFILE_ADVANCED) |
1156 if (v->pq < 5) v->tt_index = 0; | 1110 if (v->pq < 5) v->tt_index = 0; |
1157 else if(v->pq < 13) v->tt_index = 1; | 1111 else if(v->pq < 13) v->tt_index = 1; |
1158 else v->tt_index = 2; | 1112 else v->tt_index = 2; |
1159 | 1113 |
1160 lowquant = (v->pq > 12) ? 0 : 1; | 1114 lowquant = (v->pq > 12) ? 0 : 1; |
1161 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; | 1115 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; |
1162 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) | 1116 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
1163 { | 1117 { |
1164 int scale, shift, i; | 1118 int scale, shift, i; |
1165 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)]; | 1119 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; |
1166 v->lumscale = get_bits(gb, 6); | 1120 v->lumscale = get_bits(gb, 6); |
1167 v->lumshift = get_bits(gb, 6); | 1121 v->lumshift = get_bits(gb, 6); |
1168 v->use_ic = 1; | 1122 v->use_ic = 1; |
1169 /* fill lookup tables for intensity compensation */ | 1123 /* fill lookup tables for intensity compensation */ |
1170 if(!v->lumscale) { | 1124 if(!v->lumscale) { |
1303 | 1257 |
1304 if(v->interlace){ | 1258 if(v->interlace){ |
1305 v->fcm = decode012(gb); | 1259 v->fcm = decode012(gb); |
1306 if(v->fcm) return -1; // interlaced frames/fields are not implemented | 1260 if(v->fcm) return -1; // interlaced frames/fields are not implemented |
1307 } | 1261 } |
1308 switch(get_prefix(gb, 0, 4)) { | 1262 switch(get_unary(gb, 0, 4)) { |
1309 case 0: | 1263 case 0: |
1310 v->s.pict_type = P_TYPE; | 1264 v->s.pict_type = P_TYPE; |
1311 break; | 1265 break; |
1312 case 1: | 1266 case 1: |
1313 v->s.pict_type = B_TYPE; | 1267 v->s.pict_type = B_TYPE; |
1386 } | 1340 } |
1387 break; | 1341 break; |
1388 case P_TYPE: | 1342 case P_TYPE: |
1389 if(v->postprocflag) | 1343 if(v->postprocflag) |
1390 v->postproc = get_bits1(gb); | 1344 v->postproc = get_bits1(gb); |
1391 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3); | 1345 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); |
1392 else v->mvrange = 0; | 1346 else v->mvrange = 0; |
1393 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | 1347 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 |
1394 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | 1348 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 |
1395 v->range_x = 1 << (v->k_x - 1); | 1349 v->range_x = 1 << (v->k_x - 1); |
1396 v->range_y = 1 << (v->k_y - 1); | 1350 v->range_y = 1 << (v->k_y - 1); |
1398 if (v->pq < 5) v->tt_index = 0; | 1352 if (v->pq < 5) v->tt_index = 0; |
1399 else if(v->pq < 13) v->tt_index = 1; | 1353 else if(v->pq < 13) v->tt_index = 1; |
1400 else v->tt_index = 2; | 1354 else v->tt_index = 2; |
1401 | 1355 |
1402 lowquant = (v->pq > 12) ? 0 : 1; | 1356 lowquant = (v->pq > 12) ? 0 : 1; |
1403 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; | 1357 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; |
1404 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) | 1358 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
1405 { | 1359 { |
1406 int scale, shift, i; | 1360 int scale, shift, i; |
1407 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)]; | 1361 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; |
1408 v->lumscale = get_bits(gb, 6); | 1362 v->lumscale = get_bits(gb, 6); |
1409 v->lumshift = get_bits(gb, 6); | 1363 v->lumshift = get_bits(gb, 6); |
1410 /* fill lookup tables for intensity compensation */ | 1364 /* fill lookup tables for intensity compensation */ |
1411 if(!v->lumscale) { | 1365 if(!v->lumscale) { |
1412 scale = -64; | 1366 scale = -64; |
1477 } | 1431 } |
1478 break; | 1432 break; |
1479 case B_TYPE: | 1433 case B_TYPE: |
1480 if(v->postprocflag) | 1434 if(v->postprocflag) |
1481 v->postproc = get_bits1(gb); | 1435 v->postproc = get_bits1(gb); |
1482 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3); | 1436 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); |
1483 else v->mvrange = 0; | 1437 else v->mvrange = 0; |
1484 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | 1438 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 |
1485 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | 1439 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 |
1486 v->range_x = 1 << (v->k_x - 1); | 1440 v->range_x = 1 << (v->k_x - 1); |
1487 v->range_y = 1 << (v->k_y - 1); | 1441 v->range_y = 1 << (v->k_y - 1); |
2348 if(v->pq < 8 || v->dquantfrm) { // table 59 | 2302 if(v->pq < 8 || v->dquantfrm) { // table 59 |
2349 v->s.esc3_level_length = get_bits(gb, 3); | 2303 v->s.esc3_level_length = get_bits(gb, 3); |
2350 if(!v->s.esc3_level_length) | 2304 if(!v->s.esc3_level_length) |
2351 v->s.esc3_level_length = get_bits(gb, 2) + 8; | 2305 v->s.esc3_level_length = get_bits(gb, 2) + 8; |
2352 } else { //table 60 | 2306 } else { //table 60 |
2353 v->s.esc3_level_length = get_prefix(gb, 1, 6) + 2; | 2307 v->s.esc3_level_length = get_unary(gb, 1, 6) + 2; |
2354 } | 2308 } |
2355 v->s.esc3_run_length = 3 + get_bits(gb, 2); | 2309 v->s.esc3_run_length = 3 + get_bits(gb, 2); |
2356 } | 2310 } |
2357 run = get_bits(gb, v->s.esc3_run_length); | 2311 run = get_bits(gb, v->s.esc3_run_length); |
2358 sign = get_bits(gb, 1); | 2312 sign = get_bits(gb, 1); |