+use std::cmp::Ordering;
use nihav_core::frame::*;
use nihav_codec_support::codecs::blockdsp::edge_emu;
pub trait IntraPred {
const SIZE: usize;
+ #[allow(clippy::needless_late_init)]
fn ipred_dc(dst: &mut [u8], mut off: usize, stride: usize, ipred: &IPredContext) {
let dc;
if !ipred.has_left && !ipred.has_top {
off += stride;
}
}
+ fn ipred_const(dst: &mut [u8], off: usize, stride: usize, dc: u8) {
+ for row in dst[off..].chunks_mut(stride).take(Self::SIZE) {
+ for el in row[..Self::SIZE].iter_mut() {
+ *el = dc;
+ }
+ }
+ }
}
pub struct IPred16x16 {}
pub struct IPred4x4 {}
impl IPred4x4 {
pub fn ipred_dc(dst: &mut [u8], mut off: usize, stride: usize, ipred: &IPredContext) {
- let dc;
let mut dcsum = 0;
for el in ipred.left.iter().take(4) {
dcsum += u16::from(*el);
for el in ipred.top.iter().take(4) {
dcsum += u16::from(*el);
}
- dc = ((dcsum + (1 << 2)) >> 3) as u8;
+ let dc = ((dcsum + (1 << 2)) >> 3) as u8;
for _ in 0..4 {
let out = &mut dst[off..][..4];
for el in out.iter_mut() {
off += stride;
}
}
- pub fn ipred_he(dst: &mut [u8], mut off: usize, stride: usize, ipred: &IPredContext) {
+ pub fn ipred_he(dst: &mut [u8], off: usize, stride: usize, ipred: &IPredContext) {
let (p0, p1, p2, _) = load_pred4!(left; ipred);
let p3 = ((u16::from(ipred.left[2]) + u16::from(ipred.left[3]) * 3 + 2) >> 2) as u8;
let hor_pred = [p0, p1, p2, p3];
- for m in 0..4 {
- for n in 0..4 {
- dst[off + n] = hor_pred[m];
+ for (dline, &pred) in dst[off..].chunks_mut(stride).zip(hor_pred.iter()) {
+ for el in dline[..4].iter_mut() {
+ *el = pred;
}
- off += stride;
}
}
pub fn ipred_ld(dst: &mut [u8], mut off: usize, stride: usize, ipred: &IPredContext) {
let dst = &mut dst[doff..];
let src = &src[EDGE_PRE + EDGE_PRE * sstride..];
for (out, src) in dst.chunks_mut(dstride).take(size).zip(src.chunks(sstride)) {
- (&mut out[0..size]).copy_from_slice(&src[0..size]);
+ out[..size].copy_from_slice(&src[..size]);
}
} else if my == 0 {
let src = &src[EDGE_PRE * sstride..];
let src = &reffrm.get_data();
let src = &src[srcoff..];
for (out, src) in dst.chunks_mut(dstride).take(size).zip(src.chunks(sstride)) {
- (&mut out[0..size]).copy_from_slice(&src[0..size]);
+ out[..size].copy_from_slice(&src[..size]);
}
return;
}
let ha = if plane == 0 { (h + 15) & !15 } else { (h + 7) & !7 } as isize;
let mut start_x = (xpos as isize) + ((mvx >> 3) as isize) - (EDGE_PRE as isize);
let mut end_x = (xpos as isize) + ((mvx >> 3) as isize) + ((size + EDGE_POST) as isize);
- if xstep < 0 {
- start_x -= (size + EDGE_POST) as isize;
- } else if xstep > 0 {
- end_x += (size as isize) * xstep;
+ match xstep.cmp(&0) {
+ Ordering::Less => start_x -= (size + EDGE_POST) as isize,
+ Ordering::Greater => end_x += (size as isize) * xstep,
+ Ordering::Equal => {},
}
let mut start_y = (ypos as isize) + ((mvy >> 3) as isize) - (EDGE_PRE as isize) * ymul;
let mut end_y = (ypos as isize) + ((mvy >> 3) as isize) + ((size + EDGE_POST) as isize) * ymul;
(&data[off + (start_x as usize) + (start_y as usize) * stride..],
((stride as isize) + xstep) as usize)
} else {
- let add = (size + EDGE_PRE + EDGE_POST) * (xstep.abs() as usize);
+ let add = (size + EDGE_PRE + EDGE_POST) * xstep.unsigned_abs();
let bw = size + EDGE_PRE + EDGE_POST + add;
let bh = (end_y - start_y) as usize;
let bo = if xstep >= 0 { 0 } else { add };