in image/src/codecs/webp/vp8.rs [1463:1538]
fn read_residual_data(&mut self, mb: &MacroBlock, mbx: usize, p: usize) -> [i32; 384] {
let sindex = mb.segmentid as usize;
let mut blocks = [0i32; 384];
let mut plane = if mb.luma_mode == LumaMode::B { 3 } else { 1 };
if plane == 1 {
let complexity = self.top[mbx].complexity[0] + self.left.complexity[0];
let mut block = [0i32; 16];
let dcq = self.segment[sindex].y2dc;
let acq = self.segment[sindex].y2ac;
let n = self.read_coefficients(&mut block, p, plane, complexity as usize, dcq, acq);
self.left.complexity[0] = if n { 1 } else { 0 };
self.top[mbx].complexity[0] = if n { 1 } else { 0 };
transform::iwht4x4(&mut block);
for k in 0usize..16 {
blocks[16 * k] = block[k];
}
plane = 0;
}
for y in 0usize..4 {
let mut left = self.left.complexity[y + 1];
for x in 0usize..4 {
let i = x + y * 4;
let block = &mut blocks[i * 16..i * 16 + 16];
let complexity = self.top[mbx].complexity[x + 1] + left;
let dcq = self.segment[sindex].ydc;
let acq = self.segment[sindex].yac;
let n = self.read_coefficients(block, p, plane, complexity as usize, dcq, acq);
if block[0] != 0 || n {
transform::idct4x4(block);
}
left = if n { 1 } else { 0 };
self.top[mbx].complexity[x + 1] = if n { 1 } else { 0 };
}
self.left.complexity[y + 1] = left;
}
plane = 2;
for &j in &[5usize, 7usize] {
for y in 0usize..2 {
let mut left = self.left.complexity[y + j];
for x in 0usize..2 {
let i = x + y * 2 + if j == 5 { 16 } else { 20 };
let block = &mut blocks[i * 16..i * 16 + 16];
let complexity = self.top[mbx].complexity[x + j] + left;
let dcq = self.segment[sindex].uvdc;
let acq = self.segment[sindex].uvac;
let n = self.read_coefficients(block, p, plane, complexity as usize, dcq, acq);
if block[0] != 0 || n {
transform::idct4x4(block);
}
left = if n { 1 } else { 0 };
self.top[mbx].complexity[x + j] = if n { 1 } else { 0 };
}
self.left.complexity[y + j] = left;
}
}
blocks
}