]>
Commit | Line | Data |
---|---|---|
1 | use nihav_codec_support::codecs::{MV, ZERO_MV}; | |
2 | use super::mb::{Coeffs, InterMB}; | |
3 | //use super::super::vpcommon::VPMBType; | |
4 | ||
5 | // todo replace with an approximation formula | |
6 | const 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 | ]; | |
16 | const 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 | ]; | |
26 | const 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 | ]; | |
36 | const 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 | |
48 | const 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 | ||
67 | pub 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 | ||
78 | pub 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 | |
83 | const 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 | ||
119 | pub 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 | ||
133 | pub 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 | }*/ |