#![allow(dead_code)]
pub fn lambda_ssd(qp: i32, intra: bool) -> f64 {
let qp_clamped = qp.clamp(0, 51) as f64;
let base = 0.85_f64 * 2f64.powf((qp_clamped - 12.0) / 3.0);
let _ = intra;
base
}
pub fn ssd_4x4(src_plane: &[u8], width: usize, x: usize, y: usize, recon: &[i32; 16]) -> u64 {
let mut s: u64 = 0;
for j in 0..4usize {
for i in 0..4usize {
let src = src_plane[(y + j) * width + x + i] as i32;
let r = recon[j * 4 + i].clamp(0, 255);
let d = src - r;
s += (d * d) as u64;
}
}
s
}
pub fn ssd_16x16(src_plane: &[u8], width: usize, x: usize, y: usize, recon: &[i32; 256]) -> u64 {
let mut s: u64 = 0;
for j in 0..16usize {
for i in 0..16usize {
let src = src_plane[(y + j) * width + x + i] as i32;
let r = recon[j * 16 + i].clamp(0, 255);
let d = src - r;
s += (d * d) as u64;
}
}
s
}
pub fn cost_combined(distortion: u64, rate_bits: u64, lambda: f64) -> u64 {
let scaled = (lambda * 1024.0).round() as u64;
distortion
.saturating_mul(1024)
.saturating_add(rate_bits.saturating_mul(scaled))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lambda_doubles_every_6_qp() {
for qp in 12..=45 {
let l_a = lambda_ssd(qp, false);
let l_b = lambda_ssd(qp + 6, false);
let ratio = l_b / l_a;
assert!(
(ratio - 4.0).abs() < 1e-9,
"λ ratio over 6 QP at qp={qp}: {ratio}",
);
}
}
#[test]
fn lambda_intra_equals_inter_until_inter_path_lands() {
for qp in 0..=51 {
let li = lambda_ssd(qp, true);
let le = lambda_ssd(qp, false);
assert_eq!(li, le);
}
}
#[test]
fn ssd_4x4_zero_when_match() {
let plane = [128u8; 16];
let recon = [128i32; 16];
assert_eq!(ssd_4x4(&plane, 4, 0, 0, &recon), 0);
}
#[test]
fn ssd_4x4_clamps_recon_to_byte_range() {
let plane = [255u8; 16];
let recon = [400i32; 16];
assert_eq!(ssd_4x4(&plane, 4, 0, 0, &recon), 0);
}
#[test]
fn cost_combined_orders_by_j() {
let lambda = lambda_ssd(26, true);
let j1 = cost_combined(1000, 5, lambda);
let j2 = cost_combined(1100, 1, lambda);
assert!(j1 < j2, "J1 {j1} < J2 {j2} for λ={lambda}");
}
}