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