pub fn upsample_h2(input: &[u8], output: &mut [u8], width: usize) {
if width == 0 {
return;
}
output[0] = input[0];
if width == 1 {
output[1] = input[0];
return;
}
for i in 0..width - 1 {
let a = input[i] as u16;
let b = input[i + 1] as u16;
output[2 * i + 1] = ((a * 3 + b + 2) >> 2) as u8;
output[2 * i + 2] = ((a + b * 3 + 2) >> 2) as u8;
}
output[2 * width - 1] = input[width - 1];
}
#[allow(dead_code)]
pub fn upsample_v2(above: &[u8], below: &[u8], out_upper: &[u8], out_lower: &[u8], _width: usize) {
let _ = (above, below, out_upper, out_lower);
}
#[allow(dead_code)]
pub fn upsample_hv2(
above: &[u8],
below: &[u8],
out_upper: &mut [u8],
out_lower: &mut [u8],
chroma_width: usize,
) {
if chroma_width == 0 {
return;
}
for i in 0..chroma_width {
let a = above[i] as u16;
let b = below[i] as u16;
let a_next = if i + 1 < chroma_width {
above[i + 1] as u16
} else {
a
};
let b_next = if i + 1 < chroma_width {
below[i + 1] as u16
} else {
b
};
let v_upper = a * 3 + b;
let v_lower = a + b * 3;
let v_upper_next = a_next * 3 + b_next;
let v_lower_next = a_next + b_next * 3;
if i == 0 {
out_upper[0] = ((v_upper + 2) >> 2) as u8;
out_lower[0] = ((v_lower + 2) >> 2) as u8;
}
if i + 1 < chroma_width {
out_upper[2 * i + 1] = ((v_upper * 3 + v_upper_next + 8) >> 4) as u8;
out_upper[2 * i + 2] = ((v_upper + v_upper_next * 3 + 8) >> 4) as u8;
out_lower[2 * i + 1] = ((v_lower * 3 + v_lower_next + 8) >> 4) as u8;
out_lower[2 * i + 2] = ((v_lower + v_lower_next * 3 + 8) >> 4) as u8;
} else {
if chroma_width > 1 {
out_upper[2 * i + 1] = ((v_upper + 2) >> 2) as u8;
out_lower[2 * i + 1] = ((v_lower + 2) >> 2) as u8;
} else {
out_upper[1] = ((v_upper + 2) >> 2) as u8;
out_lower[1] = ((v_lower + 2) >> 2) as u8;
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn upsample_h2_single() {
let input = [100u8];
let mut output = [0u8; 2];
upsample_h2(&input, &mut output, 1);
assert_eq!(output, [100, 100]);
}
#[test]
fn upsample_h2_two() {
let input = [0u8, 100];
let mut output = [0u8; 4];
upsample_h2(&input, &mut output, 2);
assert_eq!(output[0], 0);
assert_eq!(output[1], 25);
assert_eq!(output[2], 75);
assert_eq!(output[3], 100);
}
#[test]
fn upsample_h2_uniform() {
let input = [128u8; 4];
let mut output = [0u8; 8];
upsample_h2(&input, &mut output, 4);
for &v in &output {
assert_eq!(v, 128);
}
}
}