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);