Skip to main content

pito_codecs/vp9/enc/rc/
q.rs

1use crate::vp9::spec_tables::AC_QLOOKUP;
2
3pub fn qstep(q_index: u8) -> f64 {
4    AC_QLOOKUP[q_index as usize] as f64
5}
6
7pub fn q_index_for(step: f64) -> u8 {
8    let ac = &AC_QLOOKUP[..256];
9    let i = ac.partition_point(|&s| (s as f64) < step);
10    if i == 0 {
11        return 0;
12    }
13    if i >= 256 {
14        return 255;
15    }
16    let lo = ac[i - 1] as f64;
17    let hi = ac[i] as f64;
18    if step * step < lo * hi {
19        (i - 1) as u8
20    } else {
21        i as u8
22    }
23}
24
25pub fn lambda(q_index: u8) -> u32 {
26    let s = AC_QLOOKUP[q_index as usize] as u64;
27    ((s * s * 137) >> 16).max(1) as u32
28}
29
30pub fn crf_to_q(crf: u8) -> u8 {
31    if crf >= 63 { 255 } else { crf * 4 }
32}