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 }