comparison h263.c @ 255:db20b987c32d libavcodec

divx5-gmc support q-pel mc support neither is totally bugfree yet though :(
author michaelni
date Sat, 09 Mar 2002 13:01:16 +0000
parents b4fed8b24e3a
children 7d941b8c4e84
comparison
equal deleted inserted replaced
254:b4fed8b24e3a 255:db20b987c32d
22 #include "dsputil.h" 22 #include "dsputil.h"
23 #include "avcodec.h" 23 #include "avcodec.h"
24 #include "mpegvideo.h" 24 #include "mpegvideo.h"
25 #include "h263data.h" 25 #include "h263data.h"
26 #include "mpeg4data.h" 26 #include "mpeg4data.h"
27
28 //rounded divison & shift
29 #define RDIV(a,b) ((a) > 0 ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b))
30 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
27 31
28 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, 32 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
29 int n); 33 int n);
30 static void h263_encode_motion(MpegEncContext * s, int val); 34 static void h263_encode_motion(MpegEncContext * s, int val);
31 static void h263p_encode_umotion(MpegEncContext * s, int val); 35 static void h263p_encode_umotion(MpegEncContext * s, int val);
959 s->mb_intra = 0; 963 s->mb_intra = 0;
960 for(i=0;i<6;i++) 964 for(i=0;i<6;i++)
961 s->block_last_index[i] = -1; 965 s->block_last_index[i] = -1;
962 s->mv_dir = MV_DIR_FORWARD; 966 s->mv_dir = MV_DIR_FORWARD;
963 s->mv_type = MV_TYPE_16X16; 967 s->mv_type = MV_TYPE_16X16;
964 s->mv[0][0][0] = 0; 968 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
965 s->mv[0][0][1] = 0; 969 const int a= s->sprite_warping_accuracy;
966 s->mb_skiped = 1; 970 // int l = (1 << (s->f_code - 1)) * 32;
971
972 s->mcsel=1;
973 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
974 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
975 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
976 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
977 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
978 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
979
980 s->mb_skiped = 0;
981 }else{
982 s->mcsel=0;
983 s->mv[0][0][0] = 0;
984 s->mv[0][0][1] = 0;
985 s->mb_skiped = 1;
986 }
967 return 0; 987 return 0;
968 } 988 }
969 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc); 989 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
970 //fprintf(stderr, "\tCBPC: %d", cbpc); 990 //fprintf(stderr, "\tCBPC: %d", cbpc);
971 if (cbpc < 0) 991 if (cbpc < 0)
1005 h263_pred_motion(s, 0, &pred_x, &pred_y); 1025 h263_pred_motion(s, 0, &pred_x, &pred_y);
1006 if (s->umvplus_dec) 1026 if (s->umvplus_dec)
1007 mx = h263p_decode_umotion(s, pred_x); 1027 mx = h263p_decode_umotion(s, pred_x);
1008 else if(!s->mcsel) 1028 else if(!s->mcsel)
1009 mx = h263_decode_motion(s, pred_x); 1029 mx = h263_decode_motion(s, pred_x);
1010 else mx=0; 1030 else {
1031 const int a= s->sprite_warping_accuracy;
1032 // int l = (1 << (s->f_code - 1)) * 32;
1033 mx= RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
1034 // if (mx < -l) mx= -l;
1035 // else if (mx >= l) mx= l-1;
1036 }
1011 if (mx >= 0xffff) 1037 if (mx >= 0xffff)
1012 return -1; 1038 return -1;
1013 1039
1014 if (s->umvplus_dec) 1040 if (s->umvplus_dec)
1015 my = h263p_decode_umotion(s, pred_y); 1041 my = h263p_decode_umotion(s, pred_y);
1016 else if(!s->mcsel) 1042 else if(!s->mcsel)
1017 my = h263_decode_motion(s, pred_y); 1043 my = h263_decode_motion(s, pred_y);
1018 else my=0; 1044 else{
1045 const int a= s->sprite_warping_accuracy;
1046 // int l = (1 << (s->f_code - 1)) * 32;
1047 my= RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
1048 // if (my < -l) my= -l;
1049 // else if (my >= l) my= l-1;
1050 }
1019 if (my >= 0xffff) 1051 if (my >= 0xffff)
1020 return -1; 1052 return -1;
1021 s->mv[0][0][0] = mx; 1053 s->mv[0][0][0] = mx;
1022 s->mv[0][0][1] = my; 1054 s->mv[0][0][1] = my;
1023 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x); 1055 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x);
1508 int virtual_ref[2][2]; 1540 int virtual_ref[2][2];
1509 int w2, h2; 1541 int w2, h2;
1510 int alpha=0, beta=0; 1542 int alpha=0, beta=0;
1511 int w= s->width; 1543 int w= s->width;
1512 int h= s->height; 1544 int h= s->height;
1513 1545 //printf("SP %d\n", s->sprite_warping_accuracy);
1514 for(i=0; i<s->num_sprite_warping_points; i++){ 1546 for(i=0; i<s->num_sprite_warping_points; i++){
1515 int length; 1547 int length;
1516 int x=0, y=0; 1548 int x=0, y=0;
1517 1549
1518 length= get_vlc(&s->gb, &sprite_trajectory); 1550 length= get_vlc(&s->gb, &sprite_trajectory);
1519 if(length){ 1551 if(length){
1520 x= get_bits(&s->gb, length); 1552 x= get_bits(&s->gb, length);
1553 //printf("lx %d %d\n", length, x);
1521 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/ 1554 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
1522 x = - (x ^ ((1 << length) - 1)); 1555 x = - (x ^ ((1 << length) - 1));
1523 } 1556 }
1524 // FIXME the mpeg4 std says that here should be a marker but but divx5 doesnt have one here 1557 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
1525 // skip_bits1(&s->gb); /* marker bit */
1526 1558
1527 length= get_vlc(&s->gb, &sprite_trajectory); 1559 length= get_vlc(&s->gb, &sprite_trajectory);
1528 if(length){ 1560 if(length){
1529 y=get_bits(&s->gb, length); 1561 y=get_bits(&s->gb, length);
1562 //printf("ly %d %d\n", length, y);
1530 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/ 1563 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
1531 y = - (y ^ ((1 << length) - 1)); 1564 y = - (y ^ ((1 << length) - 1));
1532 } 1565 }
1533 skip_bits1(&s->gb); /* marker bit */ 1566 skip_bits1(&s->gb); /* marker bit */
1534 // printf("%d %d\n", x, y); 1567 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
1535 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"); 1568 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
1569 //x=y=0;
1536 d[i][0]= x; 1570 d[i][0]= x;
1537 d[i][1]= y; 1571 d[i][1]= y;
1538 } 1572 }
1539 1573
1540 while((1<<alpha)<w) alpha++; 1574 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' 1575 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; 1576 w2= 1<<alpha;
1543 h2= 1<<beta; 1577 h2= 1<<beta;
1544 1578
1545 // Note, the 4th point isnt used for GMC 1579 // Note, the 4th point isnt used for GMC
1546 1580 /*
1547 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]); 1581 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]); 1582 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]); 1583 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]); 1584 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]); 1585 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]); 1586 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
1587 */
1588 //FIXME DIVX5 vs. mpeg4 ?
1589 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
1590 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
1591 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
1592 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
1593 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
1594 sprite_ref[2][1]= a*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]); 1595 /* 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]); */ 1596 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
1555 1597
1556 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...) 1598 // 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 ... 1599 // 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 1600 // 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 1601 // 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) 1602 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; 1603 + RDIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
1563 virtual_ref[0][1]= 16*vop_ref[0][1] 1604 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; 1605 + RDIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
1565 virtual_ref[1][0]= 16*vop_ref[0][0] 1606 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; 1607 + RDIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
1567 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) 1608 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; 1609 + RDIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
1569 1610
1570 switch(s->num_sprite_warping_points) 1611 switch(s->num_sprite_warping_points)
1571 { 1612 {
1572 case 0: 1613 case 0:
1573 s->sprite_offset[0][0]= 0; 1614 s->sprite_offset[0][0]= 0;
1633 s->sprite_shift[1][1]= alpha+rho+2; 1674 s->sprite_shift[1][1]= alpha+rho+2;
1634 break; 1675 break;
1635 // case 3: 1676 // case 3:
1636 break; 1677 break;
1637 } 1678 }
1638 1679 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
1680 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
1681 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
1682 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
1683 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
1684 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
1685 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
1686 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
1687 /* try to simplify the situation */
1688 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
1689 && s->sprite_delta[0][0][1] == 0
1690 && s->sprite_delta[0][1][0] == 0
1691 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
1692 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
1693 && s->sprite_delta[1][0][1] == 0
1694 && s->sprite_delta[1][1][0] == 0
1695 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
1696 {
1697 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
1698 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
1699 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
1700 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
1701 s->sprite_delta[0][0][0]= a;
1702 s->sprite_delta[0][0][1]= 0;
1703 s->sprite_delta[0][1][0]= 0;
1704 s->sprite_delta[0][1][1]= a;
1705 s->sprite_delta[1][0][0]= a;
1706 s->sprite_delta[1][0][1]= 0;
1707 s->sprite_delta[1][1][0]= 0;
1708 s->sprite_delta[1][1][1]= a;
1709 s->sprite_shift[0][0]= 0;
1710 s->sprite_shift[0][1]= 0;
1711 s->sprite_shift[1][0]= 0;
1712 s->sprite_shift[1][1]= 0;
1713 s->real_sprite_warping_points=1;
1714 }
1715 else
1716 s->real_sprite_warping_points= s->num_sprite_warping_points;
1717
1718 //FIXME convert stuff if accurace != 3
1639 } 1719 }
1640 1720
1641 /* decode mpeg4 VOP header */ 1721 /* decode mpeg4 VOP header */
1642 int mpeg4_decode_picture_header(MpegEncContext * s) 1722 int mpeg4_decode_picture_header(MpegEncContext * s)
1643 { 1723 {
1746 // FIXME a bunch of grayscale shape things 1826 // FIXME a bunch of grayscale shape things
1747 if(get_bits1(&s->gb)) printf("Quant-Type not supported\n"); /* vol_quant_type */ //FIXME 1827 if(get_bits1(&s->gb)) printf("Quant-Type not supported\n"); /* vol_quant_type */ //FIXME
1748 if(vo_ver_id != 1) 1828 if(vo_ver_id != 1)
1749 s->quarter_sample= get_bits1(&s->gb); 1829 s->quarter_sample= get_bits1(&s->gb);
1750 else s->quarter_sample=0; 1830 else s->quarter_sample=0;
1751 if(s->quarter_sample) printf("Quarter sample not supported\n");
1752 #if 0 1831 #if 0
1753 if(get_bits1(&s->gb)) printf("Complexity est disabled\n"); 1832 if(get_bits1(&s->gb)) printf("Complexity est disabled\n");
1754 if(get_bits1(&s->gb)) printf("resync disable\n"); 1833 if(get_bits1(&s->gb)) printf("resync disable\n");
1755 #else 1834 #else
1756 skip_bits1(&s->gb); /* complexity_estimation_disabled */ 1835 skip_bits1(&s->gb); /* complexity_estimation_disabled */
1784 } 1863 }
1785 } 1864 }
1786 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7); 1865 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
1787 goto redo; 1866 goto redo;
1788 } else if (startcode == 0x1b2) { //userdata 1867 } else if (startcode == 0x1b2) { //userdata
1868 char buf[256];
1869 int i;
1870 int e;
1871 int ver, build;
1872
1789 //printf("user Data %X\n", show_bits(&s->gb, 32)); 1873 //printf("user Data %X\n", show_bits(&s->gb, 32));
1874 buf[0]= show_bits(&s->gb, 8);
1875 for(i=1; i<256; i++){
1876 buf[i]= show_bits(&s->gb, 16)&0xFF;
1877 if(buf[i]==0) break;
1878 skip_bits(&s->gb, 8);
1879 }
1880 buf[255]=0;
1881 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
1882 if(e==2){
1883 s->divx_version= ver;
1884 s->divx_build= build;
1885 if(s->picture_number==0){
1886 printf("This file was encoded with DivX%d Build%d\n", ver, build);
1887 if(ver==500 && build==413){ //most likely all version are indeed totally buggy but i dunno for sure ...
1888 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
1889 }else{
1890 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n"
1891 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n");
1892 }
1893 }
1894 }
1895 //printf("User Data: %s\n", buf);
1790 goto redo; 1896 goto redo;
1791 } else if (startcode != 0x1b6) { //VOP 1897 } else if (startcode != 0x1b6) { //VOP
1792 goto redo; 1898 goto redo;
1793 } 1899 }
1794 1900
1796 if(s->pict_type == B_TYPE) 1902 if(s->pict_type == B_TYPE)
1797 { 1903 {
1798 printf("B-VOP\n"); 1904 printf("B-VOP\n");
1799 return -1; 1905 return -1;
1800 } 1906 }
1801 if(s->pict_type == S_TYPE) 1907
1802 {
1803 printf("S-VOP\n");
1804 // return -1;
1805 }
1806
1807 /* XXX: parse time base */ 1908 /* XXX: parse time base */
1808 time_incr = 0; 1909 time_incr = 0;
1809 while (get_bits1(&s->gb) != 0) 1910 while (get_bits1(&s->gb) != 0)
1810 time_incr++; 1911 time_incr++;
1811 1912
1876 skip_bits1(&s->gb); // vop shape coding type 1977 skip_bits1(&s->gb); // vop shape coding type
1877 } 1978 }
1878 } 1979 }
1879 } 1980 }
1880 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7); 1981 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
1982 s->picture_number++; // better than pic number==0 allways ;)
1881 return 0; 1983 return 0;
1882 } 1984 }
1883 1985
1884 /* don't understand why they choose a different header ! */ 1986 /* don't understand why they choose a different header ! */
1885 int intel_h263_decode_picture_header(MpegEncContext *s) 1987 int intel_h263_decode_picture_header(MpegEncContext *s)