Mercurial > libavcodec.hg
comparison h263.c @ 290:2899263586cd libavcodec
resync marker support, needed for some mp4 files
author | michaelni |
---|---|
date | Sun, 24 Mar 2002 21:25:04 +0000 |
parents | 32a3dcce2e9b |
children | ab46ebfd419f |
comparison
equal
deleted
inserted
replaced
289:648e9245546d | 290:2899263586cd |
---|---|
29 | 29 |
30 //rounded divison & shift | 30 //rounded divison & shift |
31 #define RDIV(a,b) ((a) > 0 ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b)) | 31 #define RDIV(a,b) ((a) > 0 ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b)) |
32 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) | 32 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) |
33 #define ABS(a) (((a)>=0)?(a):(-(a))) | 33 #define ABS(a) (((a)>=0)?(a):(-(a))) |
34 #define MAX(a,b) ((a) > (b) ? (a) : (b)) | |
35 #define MIN(a,b) ((a) < (b) ? (a) : (b)) | |
34 | 36 |
35 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, | 37 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, |
36 int n); | 38 int n); |
37 static void h263_encode_motion(MpegEncContext * s, int val); | 39 static void h263_encode_motion(MpegEncContext * s, int val); |
38 static void h263p_encode_umotion(MpegEncContext * s, int val); | 40 static void h263p_encode_umotion(MpegEncContext * s, int val); |
45 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 47 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
46 int n, int coded); | 48 int n, int coded); |
47 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr); | 49 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr); |
48 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, | 50 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, |
49 int dir); | 51 int dir); |
52 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); | |
53 | |
50 extern UINT32 inverse[256]; | 54 extern UINT32 inverse[256]; |
51 | 55 |
52 static UINT16 mv_penalty[MAX_FCODE][MAX_MV*2+1]; | 56 static UINT16 mv_penalty[MAX_FCODE][MAX_MV*2+1]; |
53 static UINT8 fcode_tab[MAX_MV*2+1]; | 57 static UINT8 fcode_tab[MAX_MV*2+1]; |
54 static UINT8 umv_fcode_tab[MAX_MV*2+1]; | 58 static UINT8 umv_fcode_tab[MAX_MV*2+1]; |
1260 } | 1264 } |
1261 return 0; | 1265 return 0; |
1262 | 1266 |
1263 } | 1267 } |
1264 | 1268 |
1269 static inline void memsetw(short *tab, int val, int n) | |
1270 { | |
1271 int i; | |
1272 for(i=0;i<n;i++) | |
1273 tab[i] = val; | |
1274 } | |
1275 | |
1276 static int mpeg4_resync(MpegEncContext *s) | |
1277 { | |
1278 int state, v, bits; | |
1279 int mb_num_bits= av_log2(s->mb_num - 1) + 1; | |
1280 int header_extension=0, mb_num; | |
1281 int c_wrap, c_xy, l_wrap, l_xy; | |
1282 //printf("resync at %d %d\n", s->mb_x, s->mb_y); | |
1283 //printf("%X\n", show_bits(&s->gb, 24)); | |
1284 | |
1285 if( get_bits_count(&s->gb) > s->gb.size*8-32) | |
1286 return 0; | |
1287 | |
1288 align_get_bits(&s->gb); | |
1289 state = 0xff; | |
1290 for(;;) { | |
1291 v = get_bits(&s->gb, 8); | |
1292 //printf("%X ", v); | |
1293 state = ((state << 8) | v) & 0xffff; | |
1294 if (state == 0) break; | |
1295 if( get_bits_count(&s->gb) > s->gb.size*8-32){ | |
1296 printf("resync failed\n"); | |
1297 return -1; | |
1298 } | |
1299 } | |
1300 //printf("%X\n", show_bits(&s->gb, 24)); | |
1301 bits=0; | |
1302 while(!get_bits1(&s->gb) && bits<30) bits++; | |
1303 if(s->pict_type == P_TYPE && bits != s->f_code-1) | |
1304 printf("marker does not match f_code\n"); | |
1305 //FIXME check bits for B-framess | |
1306 //printf("%X\n", show_bits(&s->gb, 24)); | |
1307 | |
1308 if(s->shape != RECT_SHAPE){ | |
1309 header_extension= get_bits1(&s->gb); | |
1310 //FIXME more stuff here | |
1311 } | |
1312 | |
1313 mb_num= get_bits(&s->gb, mb_num_bits); | |
1314 if(mb_num != s->mb_x + s->mb_y*s->mb_width){ | |
1315 printf("MB-num change not supported %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width); | |
1316 // s->mb_x= mb_num % s->mb_width; | |
1317 // s->mb_y= mb_num / s->mb_width; | |
1318 //FIXME many vars are wrong now | |
1319 } | |
1320 | |
1321 if(s->shape != BIN_ONLY_SHAPE){ | |
1322 s->qscale= get_bits(&s->gb, 5); | |
1323 h263_dc_scale(s); | |
1324 } | |
1325 | |
1326 if(s->shape == RECT_SHAPE){ | |
1327 header_extension= get_bits1(&s->gb); | |
1328 } | |
1329 if(header_extension){ | |
1330 int time_incr=0; | |
1331 printf("header extension not really supported\n"); | |
1332 while (get_bits1(&s->gb) != 0) | |
1333 time_incr++; | |
1334 | |
1335 check_marker(&s->gb, "before time_increment in video packed header"); | |
1336 s->time_increment= get_bits(&s->gb, s->time_increment_bits); | |
1337 if(s->pict_type!=B_TYPE){ | |
1338 s->time_base+= time_incr; | |
1339 s->last_non_b_time[1]= s->last_non_b_time[0]; | |
1340 s->last_non_b_time[0]= s->time_base*s->time_increment_resolution + s->time_increment; | |
1341 }else{ | |
1342 s->time= (s->last_non_b_time[1]/s->time_increment_resolution + time_incr)*s->time_increment_resolution; | |
1343 s->time+= s->time_increment; | |
1344 } | |
1345 check_marker(&s->gb, "before vop_coding_type in video packed header"); | |
1346 | |
1347 skip_bits(&s->gb, 2); /* vop coding type */ | |
1348 //FIXME not rect stuff here | |
1349 | |
1350 if(s->shape != BIN_ONLY_SHAPE){ | |
1351 skip_bits(&s->gb, 3); /* intra dc vlc threshold */ | |
1352 | |
1353 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){ | |
1354 mpeg4_decode_sprite_trajectory(s); | |
1355 } | |
1356 | |
1357 //FIXME reduced res stuff here | |
1358 | |
1359 if (s->pict_type != I_TYPE) { | |
1360 s->f_code = get_bits(&s->gb, 3); /* fcode_for */ | |
1361 if(s->f_code==0){ | |
1362 printf("Error, video packet header damaged or not MPEG4 header (f_code=0)\n"); | |
1363 return -1; // makes no sense to continue, as the MV decoding will break very quickly | |
1364 } | |
1365 } | |
1366 if (s->pict_type == B_TYPE) { | |
1367 s->b_code = get_bits(&s->gb, 3); | |
1368 } | |
1369 } | |
1370 | |
1371 } | |
1372 //FIXME new-pred stuff | |
1373 | |
1374 l_wrap= s->block_wrap[0]; | |
1375 l_xy= s->mb_y*l_wrap*2; | |
1376 c_wrap= s->block_wrap[4]; | |
1377 c_xy= s->mb_y*c_wrap; | |
1378 | |
1379 /* clean DC */ | |
1380 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*3); | |
1381 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap*2); | |
1382 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap*2); | |
1383 | |
1384 /* clean AC */ | |
1385 memset(s->ac_val[0] + l_xy, 0, l_wrap*3*16*sizeof(INT16)); | |
1386 memset(s->ac_val[1] + c_xy, 0, c_wrap*2*16*sizeof(INT16)); | |
1387 memset(s->ac_val[2] + c_xy, 0, c_wrap*2*16*sizeof(INT16)); | |
1388 | |
1389 /* clean MV */ | |
1390 memset(s->motion_val + l_xy, 0, l_wrap*3*2*sizeof(INT16)); | |
1391 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); | |
1392 s->resync_x_pos= s->mb_x; | |
1393 s->first_slice_line=1; | |
1394 | |
1395 return 0; | |
1396 } | |
1397 | |
1265 int h263_decode_mb(MpegEncContext *s, | 1398 int h263_decode_mb(MpegEncContext *s, |
1266 DCTELEM block[6][64]) | 1399 DCTELEM block[6][64]) |
1267 { | 1400 { |
1268 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | 1401 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; |
1269 INT16 *mot_val; | 1402 INT16 *mot_val; |
1270 static INT8 quant_tab[4] = { -1, -2, 1, 2 }; | 1403 static INT8 quant_tab[4] = { -1, -2, 1, 2 }; |
1404 | |
1405 if(s->resync_marker){ | |
1406 if( s->resync_x_pos == s->mb_x+1 | |
1407 || s->resync_x_pos == s->mb_x){ | |
1408 /* f*ck mpeg4 | |
1409 this is here so we dont need to slowdown h263_pred_motion with it */ | |
1410 if(s->resync_x_pos == s->mb_x+1 && s->mb_x==0){ | |
1411 int xy= s->block_index[0] - s->block_wrap[0]; | |
1412 s->motion_val[xy][0]= s->motion_val[xy+2][0]; | |
1413 s->motion_val[xy][1]= s->motion_val[xy+2][1]; | |
1414 } | |
1415 | |
1416 s->first_slice_line=0; | |
1417 s->resync_x_pos=0; // isnt needed but for cleanness sake ;) | |
1418 } | |
1419 | |
1420 if(show_aligned_bits(&s->gb, 1, 16) == 0){ | |
1421 if( mpeg4_resync(s) < 0 ) return -1; | |
1422 | |
1423 } | |
1424 } | |
1271 | 1425 |
1272 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { | 1426 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { |
1273 if (get_bits1(&s->gb)) { | 1427 if (get_bits1(&s->gb)) { |
1274 /* skip mb */ | 1428 /* skip mb */ |
1275 s->mb_intra = 0; | 1429 s->mb_intra = 0; |
1320 s->qscale += quant_tab[get_bits(&s->gb, 2)]; | 1474 s->qscale += quant_tab[get_bits(&s->gb, 2)]; |
1321 if (s->qscale < 1) | 1475 if (s->qscale < 1) |
1322 s->qscale = 1; | 1476 s->qscale = 1; |
1323 else if (s->qscale > 31) | 1477 else if (s->qscale > 31) |
1324 s->qscale = 31; | 1478 s->qscale = 31; |
1479 h263_dc_scale(s); | |
1325 } | 1480 } |
1326 s->mv_dir = MV_DIR_FORWARD; | 1481 s->mv_dir = MV_DIR_FORWARD; |
1327 if ((cbpc & 16) == 0) { | 1482 if ((cbpc & 16) == 0) { |
1328 /* 16x16 motion prediction */ | 1483 /* 16x16 motion prediction */ |
1329 s->mv_type = MV_TYPE_16X16; | 1484 s->mv_type = MV_TYPE_16X16; |
1439 s->qscale +=get_bits1(&s->gb)*4 - 2; | 1594 s->qscale +=get_bits1(&s->gb)*4 - 2; |
1440 if (s->qscale < 1) | 1595 if (s->qscale < 1) |
1441 s->qscale = 1; | 1596 s->qscale = 1; |
1442 else if (s->qscale > 31) | 1597 else if (s->qscale > 31) |
1443 s->qscale = 31; | 1598 s->qscale = 31; |
1599 h263_dc_scale(s); | |
1444 } | 1600 } |
1445 } | 1601 } |
1446 }else{ | 1602 }else{ |
1447 mb_type=4; //like 0 but no vectors coded | 1603 mb_type=4; //like 0 but no vectors coded |
1448 cbp=0; | 1604 cbp=0; |
1524 s->qscale += quant_tab[get_bits(&s->gb, 2)]; | 1680 s->qscale += quant_tab[get_bits(&s->gb, 2)]; |
1525 if (s->qscale < 1) | 1681 if (s->qscale < 1) |
1526 s->qscale = 1; | 1682 s->qscale = 1; |
1527 else if (s->qscale > 31) | 1683 else if (s->qscale > 31) |
1528 s->qscale = 31; | 1684 s->qscale = 31; |
1685 h263_dc_scale(s); | |
1529 } | 1686 } |
1530 } | 1687 } |
1531 | 1688 |
1532 /* decode each block */ | 1689 /* decode each block */ |
1533 if (s->h263_pred) { | 1690 if (s->h263_pred) { |
2248 // FIXME sadct disable bit if verid!=1 && shape not rect | 2405 // FIXME sadct disable bit if verid!=1 && shape not rect |
2249 | 2406 |
2250 if (get_bits1(&s->gb) == 1) { /* not_8_bit */ | 2407 if (get_bits1(&s->gb) == 1) { /* not_8_bit */ |
2251 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */ | 2408 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */ |
2252 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */ | 2409 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */ |
2410 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision); | |
2253 } else { | 2411 } else { |
2254 s->quant_precision = 5; | 2412 s->quant_precision = 5; |
2255 } | 2413 } |
2256 | 2414 |
2257 // FIXME a bunch of grayscale shape things | 2415 // FIXME a bunch of grayscale shape things |
2259 if(vo_ver_id != 1) | 2417 if(vo_ver_id != 1) |
2260 s->quarter_sample= get_bits1(&s->gb); | 2418 s->quarter_sample= get_bits1(&s->gb); |
2261 else s->quarter_sample=0; | 2419 else s->quarter_sample=0; |
2262 | 2420 |
2263 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n"); | 2421 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n"); |
2264 #if 0 | 2422 |
2265 if(get_bits1(&s->gb)) printf("resync disable\n"); | 2423 s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */ |
2266 #else | 2424 |
2267 skip_bits1(&s->gb); /* resync_marker_disabled */ | |
2268 #endif | |
2269 s->data_partioning= get_bits1(&s->gb); | 2425 s->data_partioning= get_bits1(&s->gb); |
2270 if(s->data_partioning){ | 2426 if(s->data_partioning){ |
2271 printf("data partitioning not supported\n"); | 2427 printf("data partitioning not supported\n"); |
2272 skip_bits1(&s->gb); // reversible vlc | 2428 skip_bits1(&s->gb); // reversible vlc |
2273 } | 2429 } |
2385 } | 2541 } |
2386 } | 2542 } |
2387 //FIXME complexity estimation stuff | 2543 //FIXME complexity estimation stuff |
2388 | 2544 |
2389 if (s->shape != BIN_ONLY_SHAPE) { | 2545 if (s->shape != BIN_ONLY_SHAPE) { |
2390 skip_bits(&s->gb, 3); /* intra dc VLC threshold */ | 2546 int t; |
2547 t=get_bits(&s->gb, 3); /* intra dc VLC threshold */ | |
2548 //printf("threshold %d\n", t); | |
2391 //FIXME interlaced specific bits | 2549 //FIXME interlaced specific bits |
2392 } | 2550 } |
2393 | 2551 |
2394 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ | 2552 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ |
2395 if(s->num_sprite_warping_points){ | 2553 if(s->num_sprite_warping_points){ |