Mercurial > libavcodec.hg
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) |