comparison msmpeg4.c @ 531:f5d7fcc81787 libavcodec

get_vlc() optimizations
author michaelni
date Wed, 10 Jul 2002 20:05:42 +0000
parents 55b4e2248a45
children d55978a3c369
comparison
equal deleted inserted replaced
530:509146e1ff1d 531:f5d7fcc81787
29 * TODO: 29 * TODO:
30 * - (encoding) select best mv table (two choices) 30 * - (encoding) select best mv table (two choices)
31 * - (encoding) select best vlc/dc table 31 * - (encoding) select best vlc/dc table
32 */ 32 */
33 //#define DEBUG 33 //#define DEBUG
34
35 #define DC_VLC_BITS 9
36 #define CBPY_VLC_BITS 6
37 #define INTER_INTRA_VLC_BITS 3
38 #define V1_INTRA_CBPC_VLC_BITS 6
39 #define V1_INTER_CBPC_VLC_BITS 6
40 #define V2_INTRA_CBPC_VLC_BITS 3
41 #define V2_MB_TYPE_VLC_BITS 7
42 #define MV_VLC_BITS 9
43 #define V2_MV_VLC_BITS 9
44 #define TEX_VLC_BITS 9
45 #define MB_NON_INTRA_VLC_BITS 9
46 #define MB_INTRA_VLC_BITS 9
34 47
35 static UINT32 v2_dc_lum_table[512][2]; 48 static UINT32 v2_dc_lum_table[512][2];
36 static UINT32 v2_dc_chroma_table[512][2]; 49 static UINT32 v2_dc_chroma_table[512][2];
37 50
38 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); 51 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
1086 init_rl(&rl_table[i]); 1099 init_rl(&rl_table[i]);
1087 init_vlc_rl(&rl_table[i]); 1100 init_vlc_rl(&rl_table[i]);
1088 } 1101 }
1089 for(i=0;i<2;i++) { 1102 for(i=0;i<2;i++) {
1090 mv = &mv_tables[i]; 1103 mv = &mv_tables[i];
1091 init_vlc(&mv->vlc, 9, mv->n + 1, 1104 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
1092 mv->table_mv_bits, 1, 1, 1105 mv->table_mv_bits, 1, 1,
1093 mv->table_mv_code, 2, 2); 1106 mv->table_mv_code, 2, 2);
1094 } 1107 }
1095 1108
1096 init_vlc(&dc_lum_vlc[0], 9, 120, 1109 init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120,
1097 &table0_dc_lum[0][1], 8, 4, 1110 &table0_dc_lum[0][1], 8, 4,
1098 &table0_dc_lum[0][0], 8, 4); 1111 &table0_dc_lum[0][0], 8, 4);
1099 init_vlc(&dc_chroma_vlc[0], 9, 120, 1112 init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120,
1100 &table0_dc_chroma[0][1], 8, 4, 1113 &table0_dc_chroma[0][1], 8, 4,
1101 &table0_dc_chroma[0][0], 8, 4); 1114 &table0_dc_chroma[0][0], 8, 4);
1102 init_vlc(&dc_lum_vlc[1], 9, 120, 1115 init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120,
1103 &table1_dc_lum[0][1], 8, 4, 1116 &table1_dc_lum[0][1], 8, 4,
1104 &table1_dc_lum[0][0], 8, 4); 1117 &table1_dc_lum[0][0], 8, 4);
1105 init_vlc(&dc_chroma_vlc[1], 9, 120, 1118 init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120,
1106 &table1_dc_chroma[0][1], 8, 4, 1119 &table1_dc_chroma[0][1], 8, 4,
1107 &table1_dc_chroma[0][0], 8, 4); 1120 &table1_dc_chroma[0][0], 8, 4);
1108 1121
1109 init_vlc(&v2_dc_lum_vlc, 9, 512, 1122 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
1110 &v2_dc_lum_table[0][1], 8, 4, 1123 &v2_dc_lum_table[0][1], 8, 4,
1111 &v2_dc_lum_table[0][0], 8, 4); 1124 &v2_dc_lum_table[0][0], 8, 4);
1112 init_vlc(&v2_dc_chroma_vlc, 9, 512, 1125 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
1113 &v2_dc_chroma_table[0][1], 8, 4, 1126 &v2_dc_chroma_table[0][1], 8, 4,
1114 &v2_dc_chroma_table[0][0], 8, 4); 1127 &v2_dc_chroma_table[0][0], 8, 4);
1115 1128
1116 init_vlc(&cbpy_vlc, 6, 16, 1129 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
1117 &cbpy_tab[0][1], 2, 1, 1130 &cbpy_tab[0][1], 2, 1,
1118 &cbpy_tab[0][0], 2, 1); 1131 &cbpy_tab[0][0], 2, 1);
1119 init_vlc(&v2_intra_cbpc_vlc, 3, 4, 1132 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
1120 &v2_intra_cbpc[0][1], 2, 1, 1133 &v2_intra_cbpc[0][1], 2, 1,
1121 &v2_intra_cbpc[0][0], 2, 1); 1134 &v2_intra_cbpc[0][0], 2, 1);
1122 init_vlc(&v2_mb_type_vlc, 5, 8, 1135 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
1123 &v2_mb_type[0][1], 2, 1, 1136 &v2_mb_type[0][1], 2, 1,
1124 &v2_mb_type[0][0], 2, 1); 1137 &v2_mb_type[0][0], 2, 1);
1125 init_vlc(&v2_mv_vlc, 9, 33, 1138 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
1126 &mvtab[0][1], 2, 1, 1139 &mvtab[0][1], 2, 1,
1127 &mvtab[0][0], 2, 1); 1140 &mvtab[0][0], 2, 1);
1128 1141
1129 init_vlc(&mb_non_intra_vlc, 9, 128, 1142 init_vlc(&mb_non_intra_vlc, MB_NON_INTRA_VLC_BITS, 128,
1130 &table_mb_non_intra[0][1], 8, 4, 1143 &table_mb_non_intra[0][1], 8, 4,
1131 &table_mb_non_intra[0][0], 8, 4); 1144 &table_mb_non_intra[0][0], 8, 4);
1132 init_vlc(&mb_intra_vlc, 9, 64, 1145 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
1133 &table_mb_intra[0][1], 4, 2, 1146 &table_mb_intra[0][1], 4, 2,
1134 &table_mb_intra[0][0], 4, 2); 1147 &table_mb_intra[0][0], 4, 2);
1135 1148
1136 init_vlc(&v1_intra_cbpc_vlc, 6, 8, 1149 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
1137 intra_MCBPC_bits, 1, 1, 1150 intra_MCBPC_bits, 1, 1,
1138 intra_MCBPC_code, 1, 1); 1151 intra_MCBPC_code, 1, 1);
1139 init_vlc(&v1_inter_cbpc_vlc, 6, 25, 1152 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
1140 inter_MCBPC_bits, 1, 1, 1153 inter_MCBPC_bits, 1, 1,
1141 inter_MCBPC_code, 1, 1); 1154 inter_MCBPC_code, 1, 1);
1142 1155
1143 init_vlc(&inter_intra_vlc, 3, 4, 1156 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
1144 &table_inter_intra[0][1], 2, 1, 1157 &table_inter_intra[0][1], 2, 1,
1145 &table_inter_intra[0][0], 2, 1); 1158 &table_inter_intra[0][0], 2, 1);
1146 } 1159 }
1147 return 0; 1160 return 0;
1148 } 1161 }
1391 /* this is identical to h263 except that its range is multiplied by 2 */ 1404 /* this is identical to h263 except that its range is multiplied by 2 */
1392 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) 1405 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1393 { 1406 {
1394 int code, val, sign, shift; 1407 int code, val, sign, shift;
1395 1408
1396 code = get_vlc(&s->gb, &v2_mv_vlc); 1409 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
1397 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred); 1410 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
1398 if (code < 0) 1411 if (code < 0)
1399 return 0xffff; 1412 return 0xffff;
1400 1413
1401 if (code == 0) 1414 if (code == 0)
1438 return 0; 1451 return 0;
1439 } 1452 }
1440 } 1453 }
1441 1454
1442 if(s->msmpeg4_version==2) 1455 if(s->msmpeg4_version==2)
1443 code = get_vlc(&s->gb, &v2_mb_type_vlc); 1456 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
1444 else 1457 else
1445 code = get_vlc(&s->gb, &v1_inter_cbpc_vlc); 1458 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
1446 if(code<0 || code>7){ 1459 if(code<0 || code>7){
1447 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y); 1460 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1448 return -1; 1461 return -1;
1449 } 1462 }
1450 1463
1452 1465
1453 cbp = code & 0x3; 1466 cbp = code & 0x3;
1454 } else { 1467 } else {
1455 s->mb_intra = 1; 1468 s->mb_intra = 1;
1456 if(s->msmpeg4_version==2) 1469 if(s->msmpeg4_version==2)
1457 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc); 1470 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
1458 else 1471 else
1459 cbp= get_vlc(&s->gb, &v1_intra_cbpc_vlc); 1472 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
1460 if(cbp<0 || cbp>3){ 1473 if(cbp<0 || cbp>3){
1461 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); 1474 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1462 return -1; 1475 return -1;
1463 } 1476 }
1464 } 1477 }
1465 1478
1466 if (!s->mb_intra) { 1479 if (!s->mb_intra) {
1467 int mx, my, cbpy; 1480 int mx, my, cbpy;
1468 1481
1469 cbpy= get_vlc(&s->gb, &cbpy_vlc); 1482 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
1470 if(cbpy<0){ 1483 if(cbpy<0){
1471 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); 1484 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1472 return -1; 1485 return -1;
1473 } 1486 }
1474 1487
1484 s->mv[0][0][0] = mx; 1497 s->mv[0][0][0] = mx;
1485 s->mv[0][0][1] = my; 1498 s->mv[0][0][1] = my;
1486 } else { 1499 } else {
1487 if(s->msmpeg4_version==2){ 1500 if(s->msmpeg4_version==2){
1488 s->ac_pred = get_bits1(&s->gb); 1501 s->ac_pred = get_bits1(&s->gb);
1489 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors 1502 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
1490 } else{ 1503 } else{
1491 s->ac_pred = 0; 1504 s->ac_pred = 0;
1492 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors 1505 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
1493 if(s->pict_type==P_TYPE) cbp^=0x3C; 1506 if(s->pict_type==P_TYPE) cbp^=0x3C;
1494 } 1507 }
1495 } 1508 }
1496 1509
1497 for (i = 0; i < 6; i++) { 1510 for (i = 0; i < 6; i++) {
1539 #endif 1552 #endif
1540 return 0; 1553 return 0;
1541 } 1554 }
1542 } 1555 }
1543 1556
1544 code = get_vlc(&s->gb, &mb_non_intra_vlc); 1557 code = get_vlc2(&s->gb, mb_non_intra_vlc.table, MB_NON_INTRA_VLC_BITS, 3);
1545 if (code < 0) 1558 if (code < 0)
1546 return -1; 1559 return -1;
1547 //s->mb_intra = (code & 0x40) ? 0 : 1; 1560 //s->mb_intra = (code & 0x40) ? 0 : 1;
1548 s->mb_intra = (~code & 0x40) >> 6; 1561 s->mb_intra = (~code & 0x40) >> 6;
1549 1562
1550 cbp = code & 0x3f; 1563 cbp = code & 0x3f;
1551 } else { 1564 } else {
1552 set_stat(ST_INTRA_MB); 1565 set_stat(ST_INTRA_MB);
1553 s->mb_intra = 1; 1566 s->mb_intra = 1;
1554 code = get_vlc(&s->gb, &mb_intra_vlc); 1567 code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2);
1555 if (code < 0) 1568 if (code < 0)
1556 return -1; 1569 return -1;
1557 /* predict coded block pattern */ 1570 /* predict coded block pattern */
1558 cbp = 0; 1571 cbp = 0;
1559 for(i=0;i<6;i++) { 1572 for(i=0;i<6;i++) {
1591 s->ac_pred = get_bits1(&s->gb); 1604 s->ac_pred = get_bits1(&s->gb);
1592 #ifdef PRINT_MB 1605 #ifdef PRINT_MB
1593 printf("%c", s->ac_pred ? 'A' : 'I'); 1606 printf("%c", s->ac_pred ? 'A' : 'I');
1594 #endif 1607 #endif
1595 if(s->inter_intra_pred){ 1608 if(s->inter_intra_pred){
1596 s->h263_aic_dir= get_vlc(&s->gb, &inter_intra_vlc); 1609 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
1597 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); 1610 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1598 } 1611 }
1599 if(s->per_mb_rl_table && cbp){ 1612 if(s->per_mb_rl_table && cbp){
1600 s->rl_table_index = decode012(&s->gb); 1613 s->rl_table_index = decode012(&s->gb);
1601 s->rl_chroma_table_index = s->rl_table_index; 1614 s->rl_chroma_table_index = s->rl_table_index;
1689 scan_table = s->inter_scantable; 1702 scan_table = s->inter_scantable;
1690 set_stat(ST_INTER_AC); 1703 set_stat(ST_INTER_AC);
1691 } 1704 }
1692 1705
1693 for(;;) { 1706 for(;;) {
1694 code = get_vlc(&s->gb, &rl->vlc); 1707 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
1695 if (code < 0){ 1708 if (code < 0){
1696 fprintf(stderr, "illegal AC-VLC code at %d %d\n", s->mb_x, s->mb_y); 1709 fprintf(stderr, "illegal AC-VLC code at %d %d\n", s->mb_x, s->mb_y);
1697 return -1; 1710 return -1;
1698 } 1711 }
1699 if (code == rl->n) { 1712 if (code == rl->n) {
1762 return DECODING_AC_LOST; 1775 return DECODING_AC_LOST;
1763 } 1776 }
1764 #endif 1777 #endif
1765 } else { 1778 } else {
1766 /* second escape */ 1779 /* second escape */
1767 code = get_vlc(&s->gb, &rl->vlc); 1780 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
1768 if (code < 0 || code >= rl->n){ 1781 if (code < 0 || code >= rl->n){
1769 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y); 1782 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y);
1770 return -1; 1783 return -1;
1771 } 1784 }
1772 run = rl->table_run[code]; 1785 run = rl->table_run[code];
1777 if (get_bits1(&s->gb)) 1790 if (get_bits1(&s->gb))
1778 level = -level; 1791 level = -level;
1779 } 1792 }
1780 } else { 1793 } else {
1781 /* first escape */ 1794 /* first escape */
1782 code = get_vlc(&s->gb, &rl->vlc); 1795 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
1783 if (code < 0 || code >= rl->n){ 1796 if (code < 0 || code >= rl->n){
1784 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y); 1797 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y);
1785 return -1; 1798 return -1;
1786 } 1799 }
1787 run = rl->table_run[code]; 1800 run = rl->table_run[code];
1828 { 1841 {
1829 int level, pred; 1842 int level, pred;
1830 1843
1831 if(s->msmpeg4_version<=2){ 1844 if(s->msmpeg4_version<=2){
1832 if (n < 4) { 1845 if (n < 4) {
1833 level = get_vlc(&s->gb, &v2_dc_lum_vlc); 1846 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
1834 } else { 1847 } else {
1835 level = get_vlc(&s->gb, &v2_dc_chroma_vlc); 1848 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
1836 } 1849 }
1837 if (level < 0) 1850 if (level < 0)
1838 return -1; 1851 return -1;
1839 level-=256; 1852 level-=256;
1840 }else{ //FIXME optimize use unified tables & index 1853 }else{ //FIXME optimize use unified tables & index
1841 if (n < 4) { 1854 if (n < 4) {
1842 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]); 1855 level = get_vlc2(&s->gb, dc_lum_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
1843 } else { 1856 } else {
1844 level = get_vlc(&s->gb, &dc_chroma_vlc[s->dc_table_index]); 1857 level = get_vlc2(&s->gb, dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
1845 } 1858 }
1846 if (level < 0){ 1859 if (level < 0){
1847 fprintf(stderr, "illegal dc vlc\n"); 1860 fprintf(stderr, "illegal dc vlc\n");
1848 return -1; 1861 return -1;
1849 } 1862 }
1887 MVTable *mv; 1900 MVTable *mv;
1888 int code, mx, my; 1901 int code, mx, my;
1889 1902
1890 mv = &mv_tables[s->mv_table_index]; 1903 mv = &mv_tables[s->mv_table_index];
1891 1904
1892 code = get_vlc(&s->gb, &mv->vlc); 1905 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
1893 if (code < 0){ 1906 if (code < 0){
1894 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y); 1907 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
1895 return -1; 1908 return -1;
1896 } 1909 }
1897 if (code == mv->n) { 1910 if (code == mv->n) {