Mercurial > libavcodec.hg
comparison h263.c @ 254:b4fed8b24e3a libavcodec
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
author | michaelni |
---|---|
date | Thu, 07 Mar 2002 13:27:15 +0000 |
parents | 4448dd55d415 |
children | db20b987c32d |
comparison
equal
deleted
inserted
replaced
253:4448dd55d415 | 254:b4fed8b24e3a |
---|---|
832 static VLC intra_MCBPC_vlc; | 832 static VLC intra_MCBPC_vlc; |
833 static VLC inter_MCBPC_vlc; | 833 static VLC inter_MCBPC_vlc; |
834 static VLC cbpy_vlc; | 834 static VLC cbpy_vlc; |
835 static VLC mv_vlc; | 835 static VLC mv_vlc; |
836 static VLC dc_lum, dc_chrom; | 836 static VLC dc_lum, dc_chrom; |
837 static VLC sprite_trajectory; | |
837 | 838 |
838 void init_rl(RLTable *rl) | 839 void init_rl(RLTable *rl) |
839 { | 840 { |
840 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1]; | 841 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1]; |
841 UINT8 index_run[MAX_RUN+1]; | 842 UINT8 index_run[MAX_RUN+1]; |
912 &DCtab_lum[0][1], 2, 1, | 913 &DCtab_lum[0][1], 2, 1, |
913 &DCtab_lum[0][0], 2, 1); | 914 &DCtab_lum[0][0], 2, 1); |
914 init_vlc(&dc_chrom, 9, 13, | 915 init_vlc(&dc_chrom, 9, 13, |
915 &DCtab_chrom[0][1], 2, 1, | 916 &DCtab_chrom[0][1], 2, 1, |
916 &DCtab_chrom[0][0], 2, 1); | 917 &DCtab_chrom[0][0], 2, 1); |
918 init_vlc(&sprite_trajectory, 9, 15, | |
919 &sprite_trajectory_tab[0][1], 4, 2, | |
920 &sprite_trajectory_tab[0][0], 4, 2); | |
917 } | 921 } |
918 } | 922 } |
919 | 923 |
920 int h263_decode_gob_header(MpegEncContext *s) | 924 int h263_decode_gob_header(MpegEncContext *s) |
921 { | 925 { |
947 { | 951 { |
948 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | 952 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; |
949 INT16 *mot_val; | 953 INT16 *mot_val; |
950 static INT8 quant_tab[4] = { -1, -2, 1, 2 }; | 954 static INT8 quant_tab[4] = { -1, -2, 1, 2 }; |
951 | 955 |
952 if (s->pict_type == P_TYPE) { | 956 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { |
953 if (get_bits1(&s->gb)) { | 957 if (get_bits1(&s->gb)) { |
954 /* skip mb */ | 958 /* skip mb */ |
955 s->mb_intra = 0; | 959 s->mb_intra = 0; |
956 for(i=0;i<6;i++) | 960 for(i=0;i<6;i++) |
957 s->block_last_index[i] = -1; | 961 s->block_last_index[i] = -1; |
980 dquant = cbpc & 4; | 984 dquant = cbpc & 4; |
981 s->mb_intra = 1; | 985 s->mb_intra = 1; |
982 } | 986 } |
983 | 987 |
984 if (!s->mb_intra) { | 988 if (!s->mb_intra) { |
989 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) | |
990 s->mcsel= get_bits1(&s->gb); | |
991 else s->mcsel= 0; | |
985 cbpy = get_vlc(&s->gb, &cbpy_vlc); | 992 cbpy = get_vlc(&s->gb, &cbpy_vlc); |
986 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2); | 993 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2); |
987 if (dquant) { | 994 if (dquant) { |
988 s->qscale += quant_tab[get_bits(&s->gb, 2)]; | 995 s->qscale += quant_tab[get_bits(&s->gb, 2)]; |
989 if (s->qscale < 1) | 996 if (s->qscale < 1) |
996 /* 16x16 motion prediction */ | 1003 /* 16x16 motion prediction */ |
997 s->mv_type = MV_TYPE_16X16; | 1004 s->mv_type = MV_TYPE_16X16; |
998 h263_pred_motion(s, 0, &pred_x, &pred_y); | 1005 h263_pred_motion(s, 0, &pred_x, &pred_y); |
999 if (s->umvplus_dec) | 1006 if (s->umvplus_dec) |
1000 mx = h263p_decode_umotion(s, pred_x); | 1007 mx = h263p_decode_umotion(s, pred_x); |
1001 else | 1008 else if(!s->mcsel) |
1002 mx = h263_decode_motion(s, pred_x); | 1009 mx = h263_decode_motion(s, pred_x); |
1010 else mx=0; | |
1003 if (mx >= 0xffff) | 1011 if (mx >= 0xffff) |
1004 return -1; | 1012 return -1; |
1005 | 1013 |
1006 if (s->umvplus_dec) | 1014 if (s->umvplus_dec) |
1007 my = h263p_decode_umotion(s, pred_y); | 1015 my = h263p_decode_umotion(s, pred_y); |
1008 else | 1016 else if(!s->mcsel) |
1009 my = h263_decode_motion(s, pred_y); | 1017 my = h263_decode_motion(s, pred_y); |
1018 else my=0; | |
1010 if (my >= 0xffff) | 1019 if (my >= 0xffff) |
1011 return -1; | 1020 return -1; |
1012 s->mv[0][0][0] = mx; | 1021 s->mv[0][0][0] = mx; |
1013 s->mv[0][0][1] = my; | 1022 s->mv[0][0][1] = my; |
1014 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x); | 1023 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x); |
1485 } | 1494 } |
1486 s->f_code = 1; | 1495 s->f_code = 1; |
1487 return 0; | 1496 return 0; |
1488 } | 1497 } |
1489 | 1498 |
1499 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s) | |
1500 { | |
1501 int i; | |
1502 int a= 2<<s->sprite_warping_accuracy; | |
1503 int rho= 3-s->sprite_warping_accuracy; | |
1504 int r=16/a; | |
1505 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes | |
1506 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}}; | |
1507 int sprite_ref[4][2]; | |
1508 int virtual_ref[2][2]; | |
1509 int w2, h2; | |
1510 int alpha=0, beta=0; | |
1511 int w= s->width; | |
1512 int h= s->height; | |
1513 | |
1514 for(i=0; i<s->num_sprite_warping_points; i++){ | |
1515 int length; | |
1516 int x=0, y=0; | |
1517 | |
1518 length= get_vlc(&s->gb, &sprite_trajectory); | |
1519 if(length){ | |
1520 x= get_bits(&s->gb, length); | |
1521 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/ | |
1522 x = - (x ^ ((1 << length) - 1)); | |
1523 } | |
1524 // FIXME the mpeg4 std says that here should be a marker but but divx5 doesnt have one here | |
1525 // skip_bits1(&s->gb); /* marker bit */ | |
1526 | |
1527 length= get_vlc(&s->gb, &sprite_trajectory); | |
1528 if(length){ | |
1529 y=get_bits(&s->gb, length); | |
1530 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/ | |
1531 y = - (y ^ ((1 << length) - 1)); | |
1532 } | |
1533 skip_bits1(&s->gb); /* marker bit */ | |
1534 // printf("%d %d\n", x, y); | |
1535 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"); | |
1536 d[i][0]= x; | |
1537 d[i][1]= y; | |
1538 } | |
1539 | |
1540 while((1<<alpha)<w) alpha++; | |
1541 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h' | |
1542 w2= 1<<alpha; | |
1543 h2= 1<<beta; | |
1544 | |
1545 // Note, the 4th point isnt used for GMC | |
1546 | |
1547 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]); | |
1548 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]); | |
1549 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]); | |
1550 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]); | |
1551 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]); | |
1552 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]); | |
1553 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]); | |
1554 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */ | |
1555 | |
1556 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...) | |
1557 // perhaps it should be reordered to be more readable ... | |
1558 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides | |
1559 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form | |
1560 // FIXME rounding (they should be positive but who knows ...) | |
1561 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2) | |
1562 + ((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0]) + w/2)/w; | |
1563 virtual_ref[0][1]= 16*vop_ref[0][1] | |
1564 + ((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1]) + w/2)/w; | |
1565 virtual_ref[1][0]= 16*vop_ref[0][0] | |
1566 + ((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0]) + h/2)/h; | |
1567 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) | |
1568 + ((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1]) + h/2)/h; | |
1569 | |
1570 switch(s->num_sprite_warping_points) | |
1571 { | |
1572 case 0: | |
1573 s->sprite_offset[0][0]= 0; | |
1574 s->sprite_offset[0][1]= 0; | |
1575 s->sprite_offset[1][0]= 0; | |
1576 s->sprite_offset[1][1]= 0; | |
1577 s->sprite_delta[0][0][0]= a; | |
1578 s->sprite_delta[0][0][1]= 0; | |
1579 s->sprite_delta[0][1][0]= 0; | |
1580 s->sprite_delta[0][1][1]= a; | |
1581 s->sprite_delta[1][0][0]= a; | |
1582 s->sprite_delta[1][0][1]= 0; | |
1583 s->sprite_delta[1][1][0]= 0; | |
1584 s->sprite_delta[1][1][1]= a; | |
1585 s->sprite_shift[0][0]= 0; | |
1586 s->sprite_shift[0][1]= 0; | |
1587 s->sprite_shift[1][0]= 0; | |
1588 s->sprite_shift[1][1]= 0; | |
1589 break; | |
1590 case 1: //GMC only | |
1591 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0]; | |
1592 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1]; | |
1593 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2); | |
1594 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2); | |
1595 s->sprite_delta[0][0][0]= a; | |
1596 s->sprite_delta[0][0][1]= 0; | |
1597 s->sprite_delta[0][1][0]= 0; | |
1598 s->sprite_delta[0][1][1]= a; | |
1599 s->sprite_delta[1][0][0]= a; | |
1600 s->sprite_delta[1][0][1]= 0; | |
1601 s->sprite_delta[1][1][0]= 0; | |
1602 s->sprite_delta[1][1][1]= a; | |
1603 s->sprite_shift[0][0]= 0; | |
1604 s->sprite_shift[0][1]= 0; | |
1605 s->sprite_shift[1][0]= 0; | |
1606 s->sprite_shift[1][1]= 0; | |
1607 break; | |
1608 case 2: | |
1609 case 3: //FIXME | |
1610 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho)) | |
1611 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0]) | |
1612 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])); | |
1613 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho)) | |
1614 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0]) | |
1615 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])); | |
1616 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1) | |
1617 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1) | |
1618 +2*w2*r*sprite_ref[0][0] - 16*w2); | |
1619 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) | |
1620 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1) | |
1621 +2*w2*r*sprite_ref[0][1] - 16*w2); | |
1622 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
1623 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]); | |
1624 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]); | |
1625 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
1626 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
1627 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]); | |
1628 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]); | |
1629 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
1630 s->sprite_shift[0][0]= alpha+rho; | |
1631 s->sprite_shift[0][1]= alpha+rho; | |
1632 s->sprite_shift[1][0]= alpha+rho+2; | |
1633 s->sprite_shift[1][1]= alpha+rho+2; | |
1634 break; | |
1635 // case 3: | |
1636 break; | |
1637 } | |
1638 | |
1639 } | |
1640 | |
1490 /* decode mpeg4 VOP header */ | 1641 /* decode mpeg4 VOP header */ |
1491 int mpeg4_decode_picture_header(MpegEncContext * s) | 1642 int mpeg4_decode_picture_header(MpegEncContext * s) |
1492 { | 1643 { |
1493 int time_incr, startcode, state, v; | 1644 int time_incr, startcode, state, v; |
1494 | 1645 |
1557 height = get_bits(&s->gb, 13); | 1708 height = get_bits(&s->gb, 13); |
1558 skip_bits1(&s->gb); /* marker */ | 1709 skip_bits1(&s->gb); /* marker */ |
1559 } | 1710 } |
1560 | 1711 |
1561 skip_bits1(&s->gb); /* interlaced */ | 1712 skip_bits1(&s->gb); /* interlaced */ |
1562 skip_bits1(&s->gb); /* OBMC Disable */ | 1713 if(!get_bits1(&s->gb)) printf("OBMC not supported\n"); /* OBMC Disable */ |
1563 if (vo_ver_id == 1) { | 1714 if (vo_ver_id == 1) { |
1564 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */ | 1715 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */ |
1565 } else { | 1716 } else { |
1566 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */ | 1717 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */ |
1567 } | 1718 } |
1719 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n"); | |
1568 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){ | 1720 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){ |
1569 if(s->vol_sprite_usage==STATIC_SPRITE){ | 1721 if(s->vol_sprite_usage==STATIC_SPRITE){ |
1570 s->sprite_width = get_bits(&s->gb, 13); | 1722 s->sprite_width = get_bits(&s->gb, 13); |
1571 skip_bits1(&s->gb); /* marker */ | 1723 skip_bits1(&s->gb); /* marker */ |
1572 s->sprite_height= get_bits(&s->gb, 13); | 1724 s->sprite_height= get_bits(&s->gb, 13); |
1574 s->sprite_left = get_bits(&s->gb, 13); | 1726 s->sprite_left = get_bits(&s->gb, 13); |
1575 skip_bits1(&s->gb); /* marker */ | 1727 skip_bits1(&s->gb); /* marker */ |
1576 s->sprite_top = get_bits(&s->gb, 13); | 1728 s->sprite_top = get_bits(&s->gb, 13); |
1577 skip_bits1(&s->gb); /* marker */ | 1729 skip_bits1(&s->gb); /* marker */ |
1578 } | 1730 } |
1579 s->no_sprite_wraping_points= get_bits(&s->gb, 6); | 1731 s->num_sprite_warping_points= get_bits(&s->gb, 6); |
1580 s->sprite_warping_accuracy = get_bits(&s->gb, 2); | 1732 s->sprite_warping_accuracy = get_bits(&s->gb, 2); |
1581 s->sprite_brightness_change= get_bits1(&s->gb); | 1733 s->sprite_brightness_change= get_bits1(&s->gb); |
1582 if(s->vol_sprite_usage==STATIC_SPRITE) | 1734 if(s->vol_sprite_usage==STATIC_SPRITE) |
1583 s->low_latency_sprite= get_bits1(&s->gb); | 1735 s->low_latency_sprite= get_bits1(&s->gb); |
1584 } | 1736 } |
1647 return -1; | 1799 return -1; |
1648 } | 1800 } |
1649 if(s->pict_type == S_TYPE) | 1801 if(s->pict_type == S_TYPE) |
1650 { | 1802 { |
1651 printf("S-VOP\n"); | 1803 printf("S-VOP\n"); |
1652 return -1; | 1804 // return -1; |
1653 } | 1805 } |
1654 | 1806 |
1655 /* XXX: parse time base */ | 1807 /* XXX: parse time base */ |
1656 time_incr = 0; | 1808 time_incr = 0; |
1657 while (get_bits1(&s->gb) != 0) | 1809 while (get_bits1(&s->gb) != 0) |
1695 | 1847 |
1696 if (s->shape != BIN_ONLY_SHAPE) { | 1848 if (s->shape != BIN_ONLY_SHAPE) { |
1697 skip_bits(&s->gb, 3); /* intra dc VLC threshold */ | 1849 skip_bits(&s->gb, 3); /* intra dc VLC threshold */ |
1698 //FIXME interlaced specific bits | 1850 //FIXME interlaced specific bits |
1699 } | 1851 } |
1700 | 1852 |
1701 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ | 1853 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ |
1702 if(s->no_sprite_wraping_points) printf("sprite_wraping_points not supported\n"); | 1854 if(s->num_sprite_warping_points){ |
1855 mpeg4_decode_sprite_trajectory(s); | |
1856 } | |
1703 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n"); | 1857 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n"); |
1704 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n"); | 1858 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n"); |
1705 } | 1859 } |
1706 | 1860 |
1707 if (s->shape != BIN_ONLY_SHAPE) { | 1861 if (s->shape != BIN_ONLY_SHAPE) { |
1708 /* note: we do not use quant_precision to avoid problem if no | 1862 /* note: we do not use quant_precision to avoid problem if no |
1709 MPEG4 vol header as it is found on some old opendivx | 1863 MPEG4 vol header as it is found on some old opendivx |
1710 movies */ | 1864 movies */ |
1711 s->qscale = get_bits(&s->gb, 5); | 1865 s->qscale = get_bits(&s->gb, 5); |
1714 s->f_code = get_bits(&s->gb, 3); /* fcode_for */ | 1868 s->f_code = get_bits(&s->gb, 3); /* fcode_for */ |
1715 } | 1869 } |
1716 if (s->pict_type == B_TYPE) { | 1870 if (s->pict_type == B_TYPE) { |
1717 s->b_code = get_bits(&s->gb, 3); | 1871 s->b_code = get_bits(&s->gb, 3); |
1718 } | 1872 } |
1719 | 1873 //printf("quant:%d fcode:%d\n", s->qscale, s->f_code); |
1720 if(!s->scalability){ | 1874 if(!s->scalability){ |
1721 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { | 1875 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { |
1722 skip_bits1(&s->gb); // vop shape coding type | 1876 skip_bits1(&s->gb); // vop shape coding type |
1723 } | 1877 } |
1724 } | 1878 } |