}
fn reset(&mut self) {
let size = self.w * self.h;
- self.mv_f.truncate(0);
+ self.mv_f.clear();
self.mv_f.resize(size, ZERO_MV);
- self.mv_b.truncate(0);
+ self.mv_b.clear();
self.mv_b.resize(size, ZERO_MV);
- self.has_f.truncate(0);
+ self.has_f.clear();
self.has_f.resize(size >> 4, false);
- self.has_b.truncate(0);
+ self.has_b.clear();
self.has_b.resize(size >> 4, false);
}
fn fill(&mut self, mb_x: usize, mb_y: usize, fwd: bool, mv: MV) {
SVQ3_RUNLEVEL_ALT[val as usize]
} else {
let run = (val & 0x7) as usize;
- (run, ((val >> 3) as i16) + RUN_ADD_ALT[(run as usize).min(RUN_ADD_ALT.len() - 1)])
+ (run, ((val >> 3) as i16) + RUN_ADD_ALT[run.min(RUN_ADD_ALT.len() - 1)])
};
idx += run;
validate!(idx < end);
SVQ3_RUNLEVEL[val as usize]
} else {
let run = (val & 0xF) as usize;
- (run, ((val >> 4) as i16) + RUN_ADD[(run as usize).min(RUN_ADD.len() - 1)])
+ (run, ((val >> 4) as i16) + RUN_ADD[run.min(RUN_ADD.len() - 1)])
};
idx += run;
validate!(idx < blk.len());
};
let slice_len = length + llen + 1;
validate!(src.len() >= slice_len);
- self.slice_buf.truncate(0);
+ self.slice_buf.clear();
if llen > 1 {
self.slice_buf.extend_from_slice(&src[slice_len - llen + 1..][..llen - 1]);
}
let mbs = self.mb_w * self.mb_h;
let mb_bits = if mbs < 64 { 6 } else { 32 - (mbs - 1).leading_zeros() } as u8;
let _offset = br.read(mb_bits)?;
-println!("slice offset {}", _offset);
+//println!("slice offset {}", _offset);
}
let ts = br.read(8)? as u8;
let quant = br.read(5)? as u8;
if !is_4x4 || (hdr.dquant && hdr.ftype != FrameType::I && cbp != 0) {
let dq = br.read_code_signed(IntCodeType::Gamma)?;
let new_q = i32::from(sstate.q) + dq;
- validate!(new_q >= 0 && new_q < 32);
+ validate!((0..32).contains(&new_q));
sstate.q = new_q as u8;
}
if !is_4x4 {
} else {
MCMode::Pixel
};
- let (bw, bh) = SVQ3_PART_SIZES[mb_type as usize];
+ let (bw, bh) = SVQ3_PART_SIZES[mb_type];
let bw = (bw >> 2) as usize;
let bh = (bh >> 2) as usize;
if hdr.dquant && cbp != 0 {
let dq = br.read_code_signed(IntCodeType::Gamma)?;
let new_q = i32::from(sstate.q) + dq;
- validate!(new_q >= 0 && new_q < 32);
+ validate!((0..32).contains(&new_q));
sstate.q = new_q as u8;
}
for sb in 0..4 {
}
let ret = self.decode_slice(&mut br, &hdr, &mut dframe);
std::mem::swap(&mut sbuf, &mut self.slice_buf);
- if let Err(err) = ret {
- return Err(err);
- }
+ ret?;
slice_prepared = false;
off += slice_len;
}
//let file = "assets/QT/broken_sword_Large.mov";
//test_file_decoding("mov", file, Some(264), true, false, Some("svq3"), &dmx_reg, &dec_reg);
//panic!("end");
+ // sample: https://samples.mplayerhq.hu/V-codecs/SVQ3/broken_sword_Large.mov
test_decoding("mov", "sorenson-video3", "assets/QT/broken_sword_Large.mov", Some(40), &dmx_reg, &dec_reg,
ExpectedTestResult::MD5Frames(vec![
[0x16924d18, 0xccc5a0b4, 0xc2bb9412, 0x93d41f10],