len * 2,
cand_b,
r#ref,
gmv,
have_newmv_match,
have_refmv_match,
);
y += len;
if y >= h4 {
return 1;
}
cand_b = *r.index(b[y as usize] + bx4 as usize);
cand_bh4 = cand_b.bs.dimensions()[1] as i32;
assert!(cand_bh4 < bh4);
len = cmp::max(step, cand_bh4);
}
}
#[inline]
fn mv_projection(mv: Mv, num: i32, den: i32) -> Mv {
static div_mult: [u16; 32] = [
0, 16384, 8192, 5461, 4096, 3276, 2730, 2340, 2048, 1820, 1638, 1489, 1365, 1260, 1170,
1092, 1024, 963, 910, 862, 819, 780, 744, 712, 682, 655, 630, 606, 585, 564, 546, 528,
];
assert!(den > 0 && den < 32);
assert!(num > -32 && num < 32);
let frac = num * div_mult[den as usize] as i32;
let y = mv.y as i32 * frac;
let x = mv.x as i32 * frac;
let max = (1 << 14) - 1;
return Mv {
y: iclip(y + 8192 + (y >> 31) >> 14, -max, max) as i16,
x: iclip(x + 8192 + (x >> 31) >> 14, -max, max) as i16,
};
}
fn add_temporal_candidate(
rf: &RefMvsFrame,
mvstack: &mut [RefMvsCandidate],
cnt: &mut usize,
rb: RefMvsTemporalBlock,
r#ref: RefMvsRefPair,
globalmv: Option<(&mut i32, &[Mv; 2])>,
frame_hdr: &Rav1dFrameHeader,
) {
if rb.mv.is_invalid() {
return;
}
let mut mv = mv_projection(
rb.mv,
rf.pocdiff[r#ref.r#ref[0] as usize - 1] as i32,
rb.r#ref as i32,
);
fix_mv_precision(frame_hdr, &mut mv);
let last = *cnt;
if r#ref.r#ref[1] == -1 {
if let Some((globalmv_ctx, gmv)) = globalmv {
*globalmv_ctx = ((mv.x - gmv[0].x).abs() | (mv.y - gmv[0].y).abs() >= 16) as i32;
}
for cand in &mut mvstack[..last] {
if cand.mv.mv[0] == mv {
cand.weight += 2;
return;
}
}
if last < 8 {
let cand = &mut mvstack[last];
cand.mv.mv[0] = mv;
cand.weight = 2;
*cnt = last + 1;
}
} else {
let mut mvp = RefMvsMvPair {
mv: [
mv,
mv_projection(
rb.mv,
rf.pocdiff[r#ref.r#ref[1] as usize - 1] as i32,
rb.r#ref as i32,
),
],
};
fix_mv_precision(frame_hdr, &mut mvp.mv[1]);
for cand in &mut mvstack[..last] {
if cand.mv == mvp {
cand.weight += 2;
return;
}
}
if last < 8 {
let cand = &mut mvstack[last];
cand.mv = mvp;
cand.weight = 2;
*cnt = last + 1;
}
};
}
fn add_compound_extended_candidate(
same: &mut [RefMvsCandidate],
same_count: &mut [usize; 4],
cand_b: RefMvsBlock,
sign0: u8,
sign1: u8,
r#ref: RefMvsRefPair,
sign_bias: &[u8; 7],
) {
let (same, diff) = same.split_at_mut(2);
let (same_count, diff_count) = same_count.split_at_mut(2);
for n in 0..2 {
let cand_ref = cand_b.r#ref.r#ref[n];