add Acorn Moving Blocks HQ decoder
[nihav.git] / nihav-duck / src / codecs / vp6enc / rdo.rs
CommitLineData
3952bfd9
KS
1use nihav_codec_support::codecs::{MV, ZERO_MV};
2use super::mb::{Coeffs, InterMB};
3//use super::super::vpcommon::VPMBType;
4
5// todo replace with an approximation formula
6const AVG_NITS_PER_MB_INTRA: [u32; 64] = [
7 143, 146, 148, 150, 154, 163, 169, 177,
8 185, 193, 206, 218, 232, 238, 242, 246,
9 250, 260, 265, 270, 275, 283, 290, 297,
10 304, 319, 327, 343, 358, 368, 381, 393,
11 405, 417, 432, 445, 460, 476, 501, 520,
12 543, 564, 591, 617, 645, 678, 711, 746,
13 786, 833, 892, 966, 1031, 1102, 1187, 1281,
14 1395, 1539, 1711, 1938, 2247, 2655, 3314, 4625
15];
16const AVG_NITS_PER_MB_INTER: [u32; 64] = [
17 112, 112, 112, 112, 110, 111, 111, 112,
18 112, 113, 112, 118, 121, 117, 118, 118,
19 119, 118, 118, 119, 120, 122, 123, 124,
20 126, 126, 128, 132, 138, 141, 139, 141,
21 148, 151, 152, 155, 158, 162, 172, 177,
22 183, 189, 195, 203, 210, 220, 231, 243,
23 256, 272, 289, 313, 337, 363, 396, 435,
24 481, 539, 613, 710, 864, 1079, 1430, 2225
25];
26const AVG_NITS_PER_MB_INTRA_HUFF: [u32; 64] = [
27 176, 179, 181, 184, 188, 198, 205, 213,
28 223, 233, 247, 260, 276, 283, 288, 292,
29 297, 307, 313, 318, 324, 334, 341, 349,
30 357, 374, 383, 401, 417, 429, 441, 455,
31 469, 482, 499, 513, 530, 547, 572, 594,
32 621, 644, 673, 703, 734, 771, 807, 847,
33 893, 948, 1016, 1097, 1168, 1244, 1335, 1436,
34 1555, 1708, 1890, 2130, 2461, 2897, 3604, 5014
35];
36const AVG_NITS_PER_MB_INTER_HUFF: [u32; 64] = [
37 126, 126, 126, 126, 125, 125, 126, 127,
38 127, 129, 127, 134, 137, 134, 134, 135,
39 136, 135, 136, 137, 138, 141, 142, 143,
40 145, 146, 147, 152, 160, 163, 161, 164,
41 171, 174, 176, 180, 183, 188, 199, 206,
42 212, 219, 227, 236, 244, 255, 268, 281,
43 296, 315, 334, 362, 389, 419, 456, 500,
44 550, 613, 695, 799, 971, 1205, 1581, 2437
45];
46
47// todo replace with an approximation formula
48const HDR_SIZES: [(u32, u32); 64] = [
49 (5867, 797), (5971, 802), (5975, 798), (5986, 814),
50 (6152, 802), (6269, 821), (6457, 827), (6620, 855),
51 (6865, 865), (6852, 878), (7103, 885), (7295, 924),
52 (7658, 952), (7710, 950), (7851, 959), (8119, 963),
53 (8119, 962), (8292, 914), (8238, 920), (8260, 949),
54 (8174, 943), (8515, 952), (8625, 976), (8784, 979),
55 (8687, 987), (8853, 1007), (8934, 998), (9270, 1013),
56 (9524, 1082), (9595, 1117), (9889, 1060), (10187, 1070),
57 (10241, 1143), (10527, 1164), (10691, 1151), (10694, 1188),
58 (10959, 1132), (11092, 1168), (11197, 1237), (11443, 1267),
59 (11573, 1295), (11856, 1309), (12165, 1340), (12299, 1364),
60 (12767, 1344), (13108, 1373), (13262, 1407), (13497, 1420),
61 (14019, 1458), (14442, 1525), (14935, 1574), (15155, 1626),
62 (15682, 1691), (15936, 1754), (16394, 1859), (16953, 1944),
63 (17407, 2078), (18143, 2195), (18850, 2339), (19677, 2525),
64 (20546, 2786), (21228, 3093), (22549, 3469), (24164, 4144)
65];
66
67pub fn estimate_frame_size(intra: bool, huffman: bool, q: usize, mb_w: usize, mb_h: usize) -> usize {
68 let hdr_nits = if intra { HDR_SIZES[q].0 } else { HDR_SIZES[q].1 } as usize;
69 let avg_mb_nits = match (huffman, intra) {
70 (false, true) => AVG_NITS_PER_MB_INTRA[q],
71 (false, false) => AVG_NITS_PER_MB_INTER[q],
72 (true, true) => AVG_NITS_PER_MB_INTRA_HUFF[q],
73 (true, false) => AVG_NITS_PER_MB_INTER_HUFF[q],
74 } as usize;
75 (hdr_nits + avg_mb_nits * mb_w * mb_h + 7) >> 3
76}
77
78pub fn estimate_mv_nits(mv: MV) -> u32 {
79 (mv.x.abs() + mv.y.abs()).min(32) as u32
80}
81
82// todo make an approximation
83const NITS_PER_BLOCK: [[u32; 65]; 16] = [
84 [
85 0, 42, 103, 150, 197, 245, 290, 332, 362, 399, 438, 485, 516, 555, 568, 615, 645, 704, 752, 775, 829, 807, 850, 847, 847, 424, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938
86 ], [
87 0, 44, 103, 151, 198, 245, 292, 340, 373, 405, 452, 498, 527, 570, 604, 638, 658, 697, 727, 764, 807, 842, 887, 986, 893, 985, 1048, 1018, 1018, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013
88 ], [
89 0, 47, 105, 154, 200, 246, 295, 342, 380, 419, 458, 498, 547, 585, 626, 664, 693, 734, 772, 809, 842, 853, 864, 920, 955, 981, 1031, 1045, 1096, 1152, 1184, 1188, 1206, 1338, 1270, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175
90 ], [
91 0, 49, 105, 155, 203, 248, 294, 342, 383, 416, 464, 510, 544, 595, 620, 668, 714, 747, 773, 824, 865, 889, 919, 934, 969, 1029, 1010, 1063, 1088, 1158, 1175, 1204, 1207, 1303, 1283, 1358, 1512, 1405, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337
92 ], [
93 0, 50, 106, 156, 203, 252, 297, 345, 387, 423, 463, 509, 552, 594, 627, 668, 722, 758, 788, 824, 870, 898, 936, 963, 983, 1019, 1023, 1100, 1101, 1140, 1199, 1206, 1240, 1278, 1301, 1368, 1405, 1365, 1445, 1436, 1483, 1562, 1562, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620
94 ], [
95 1, 51, 107, 156, 204, 252, 298, 347, 391, 424, 465, 509, 553, 591, 634, 685, 709, 747, 805, 826, 881, 914, 937, 997, 1023, 1024, 1056, 1091, 1108, 1145, 1214, 1207, 1246, 1260, 1332, 1400, 1391, 1426, 1486, 1552, 1482, 1573, 1626, 1610, 1610, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692
96 ], [
97 1, 53, 109, 158, 205, 253, 301, 352, 397, 425, 470, 505, 557, 595, 642, 682, 720, 755, 805, 849, 878, 930, 964, 995, 1034, 1072, 1093, 1142, 1180, 1194, 1219, 1243, 1286, 1318, 1325, 1379, 1403, 1471, 1477, 1473, 1554, 1585, 1593, 1646, 1677, 1692, 1763, 1825, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817
98 ], [
99 1, 54, 111, 159, 206, 255, 305, 355, 406, 428, 472, 516, 555, 593, 636, 688, 730, 765, 807, 842, 892, 933, 987, 1001, 1050, 1097, 1111, 1167, 1175, 1223, 1255, 1294, 1297, 1342, 1361, 1404, 1408, 1471, 1495, 1560, 1553, 1611, 1635, 1692, 1783, 1695, 1765, 1764, 1906, 1906, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018
100 ], [
101 1, 55, 113, 160, 209, 255, 306, 357, 408, 435, 477, 521, 557, 598, 641, 685, 730, 773, 814, 844, 889, 940, 982, 1008, 1065, 1102, 1124, 1188, 1228, 1251, 1287, 1297, 1350, 1399, 1380, 1436, 1484, 1514, 1537, 1590, 1599, 1642, 1634, 1726, 1762, 1755, 1799, 1862, 1919, 2086, 1712, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984
102 ], [
103 1, 56, 116, 164, 211, 259, 307, 359, 414, 437, 481, 525, 564, 608, 645, 685, 734, 769, 808, 858, 906, 943, 987, 1000, 1058, 1101, 1145, 1183, 1211, 1274, 1274, 1357, 1384, 1412, 1469, 1454, 1505, 1543, 1563, 1617, 1639, 1667, 1681, 1762, 1770, 1797, 1869, 1853, 1909, 1978, 2077, 2034, 1967, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139
104 ], [
105 1, 59, 118, 166, 213, 261, 309, 360, 416, 437, 483, 524, 570, 611, 651, 686, 732, 768, 806, 844, 895, 938, 983, 1025, 1071, 1103, 1149, 1193, 1226, 1258, 1312, 1340, 1405, 1425, 1479, 1547, 1555, 1588, 1612, 1641, 1662, 1723, 1739, 1797, 1841, 1854, 1888, 1879, 1947, 2025, 2065, 2104, 2158, 2077, 2380, 2177, 2336, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078
106 ], [
107 1, 61, 120, 170, 219, 265, 314, 366, 425, 439, 483, 528, 573, 615, 656, 693, 737, 772, 807, 852, 897, 929, 976, 1008, 1053, 1111, 1140, 1192, 1219, 1279, 1314, 1356, 1387, 1449, 1484, 1513, 1552, 1592, 1673, 1704, 1773, 1784, 1809, 1843, 1903, 1902, 1962, 2002, 2014, 2054, 2109, 2161, 2148, 2198, 2235, 2353, 2360, 2511, 2282, 2282, 2282, 2282, 2282, 2282, 2282
108 ], [
109 2, 65, 123, 173, 225, 273, 322, 373, 438, 448, 488, 533, 580, 616, 661, 703, 739, 779, 819, 855, 897, 943, 983, 1013, 1040, 1086, 1132, 1167, 1217, 1258, 1299, 1345, 1391, 1452, 1474, 1526, 1574, 1602, 1646, 1721, 1764, 1803, 1825, 1921, 1919, 2030, 2049, 2067, 2134, 2152, 2209, 2225, 2274, 2299, 2375, 2379, 2374, 2462, 2536, 2584, 2822, 2822, 2822, 2822, 2822
110 ], [
111 2, 74, 126, 177, 230, 284, 332, 386, 454, 462, 507, 542, 592, 630, 673, 717, 753, 799, 841, 874, 913, 955, 996, 1031, 1073, 1103, 1138, 1172, 1219, 1249, 1300, 1325, 1383, 1428, 1446, 1504, 1550, 1585, 1636, 1702, 1728, 1784, 1841, 1905, 1934, 1978, 2055, 2130, 2165, 2231, 2291, 2417, 2405, 2494, 2491, 2525, 2587, 2626, 2658, 2658, 2708, 2713, 2667, 2867, 2867
112 ], [
113 4, 88, 137, 193, 244, 302, 353, 416, 495, 490, 534, 579, 615, 663, 716, 757, 792, 833, 884, 918, 962, 1006, 1058, 1087, 1125, 1169, 1203, 1258, 1286, 1326, 1365, 1405, 1437, 1477, 1520, 1554, 1597, 1642, 1664, 1709, 1759, 1800, 1842, 1894, 1941, 2002, 2062, 2124, 2138, 2225, 2310, 2377, 2448, 2584, 2628, 2731, 2824, 2846, 2960, 3016, 3147, 3099, 3197, 3107, 3107
114 ], [
115 18, 145, 182, 239, 297, 360, 415, 485, 584, 579, 638, 684, 737, 782, 834, 878, 924, 967, 1016, 1062, 1111, 1145, 1206, 1258, 1302, 1357, 1388, 1460, 1493, 1538, 1577, 1619, 1684, 1732, 1770, 1823, 1879, 1909, 1959, 2022, 2053, 2113, 2176, 2207, 2272, 2316, 2367, 2428, 2479, 2548, 2622, 2671, 2748, 2813, 2894, 2984, 3064, 3153, 3258, 3392, 3507, 3669, 3870, 4082, 4255
116 ]
117];
118
119pub fn estimate_intra_mb_nits(mb: &Coeffs, q: usize) -> u32 {
120 let mut count = 0;
121 for blk in mb.iter() {
122 let mut nz = 0;
123 for &el in blk.iter() {
124 if el != 0 {
125 nz += 1;
126 }
127 }
128 count += NITS_PER_BLOCK[q >> 2][nz];
129 }
130 count
131}
132
133pub fn estimate_inter_mb_nits(mb: &InterMB, q: usize, fourmv: bool) -> u32 {
134 let mut count = 0;
135 for blk in mb.residue.coeffs.iter() {
136 let mut nz = 0;
137 for &el in blk.iter() {
138 if el != 0 {
139 nz += 1;
140 }
141 }
142 count += NITS_PER_BLOCK[q >> 2][nz];
143 }
144 if !fourmv {
145 if mb.mv[3] != ZERO_MV {
146 count += estimate_mv_nits(mb.mv[3]);
147 }
148 } else {
149 count += 4 * 2 * u32::from(super::models::PROB_BITS[128]);
150 for &mv in mb.mv.iter() {
151 if mv != ZERO_MV {
152 count += estimate_mv_nits(mv);
153 }
154 }
155 }
156 count
157}
158
159/*pub fn estimate_mb_hdr_size(mb_type: VPMBType) -> u32 {
160 match mb_type {
161 VPMBType::Intra => 60,
162 VPMBType::InterFourMV => 34,
163 VPMBType::InterNoMV => 3,
164 VPMBType::InterMV | VPMBType::InterNearest | VPMBType::InterNear => 20,
165 _ => 50,
166 }
167}*/