pub(crate) mod robidoux;
pub mod presets;
pub mod glassa;
pub use crate::foundation::consts::{
BASE_QUANT_MATRIX_STD as BASE_QUANT_STD, BASE_QUANT_MATRIX_XYB as BASE_QUANT_XYB,
BASE_QUANT_MATRIX_YCBCR as BASE_QUANT_YCBCR,
};
pub use crate::foundation::consts::{GLOBAL_SCALE_420, GLOBAL_SCALE_XYB, GLOBAL_SCALE_YCBCR};
pub use crate::quant::{
ZERO_BIAS_MUL_XYB, ZERO_BIAS_MUL_XYB_HQ, ZERO_BIAS_MUL_XYB_LQ, ZERO_BIAS_MUL_YCBCR_HQ,
ZERO_BIAS_MUL_YCBCR_LQ, ZERO_BIAS_OFFSET_XYB, ZERO_BIAS_OFFSET_XYB_AC,
ZERO_BIAS_OFFSET_YCBCR_AC, ZERO_BIAS_OFFSET_YCBCR_DC,
};
#[inline]
#[must_use]
pub fn luma_from_192(matrix: &[f32; 192]) -> [f32; 64] {
let mut result = [0.0f32; 64];
result.copy_from_slice(&matrix[0..64]);
result
}
#[inline]
#[must_use]
pub fn cb_from_192(matrix: &[f32; 192]) -> [f32; 64] {
let mut result = [0.0f32; 64];
result.copy_from_slice(&matrix[64..128]);
result
}
#[inline]
#[must_use]
pub fn cr_from_192(matrix: &[f32; 192]) -> [f32; 64] {
let mut result = [0.0f32; 64];
result.copy_from_slice(&matrix[128..192]);
result
}
#[inline]
#[must_use]
pub fn pack_192(luma: &[f32; 64], cb: &[f32; 64], cr: &[f32; 64]) -> [f32; 192] {
let mut result = [0.0f32; 192];
result[0..64].copy_from_slice(luma);
result[64..128].copy_from_slice(cb);
result[128..192].copy_from_slice(cr);
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_components() {
let luma = luma_from_192(&BASE_QUANT_YCBCR);
let cb = cb_from_192(&BASE_QUANT_YCBCR);
let cr = cr_from_192(&BASE_QUANT_YCBCR);
assert_eq!(&luma[..], &BASE_QUANT_YCBCR[0..64]);
assert_eq!(&cb[..], &BASE_QUANT_YCBCR[64..128]);
assert_eq!(&cr[..], &BASE_QUANT_YCBCR[128..192]);
}
#[test]
fn test_pack_roundtrip() {
let luma = luma_from_192(&BASE_QUANT_YCBCR);
let cb = cb_from_192(&BASE_QUANT_YCBCR);
let cr = cr_from_192(&BASE_QUANT_YCBCR);
let packed = pack_192(&luma, &cb, &cr);
assert_eq!(packed, BASE_QUANT_YCBCR);
}
#[test]
fn test_zero_bias_table_sizes() {
assert_eq!(ZERO_BIAS_MUL_YCBCR_LQ.len(), 192);
assert_eq!(ZERO_BIAS_MUL_YCBCR_HQ.len(), 192);
assert_eq!(ZERO_BIAS_OFFSET_YCBCR_DC.len(), 3);
assert_eq!(ZERO_BIAS_OFFSET_YCBCR_AC.len(), 3);
}
}