| 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 | }*/ |