X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-qt%2Fsrc%2Fcodecs%2Fsvq3.rs;h=1a87ca62200fd76958a8f8ba898789ef0f38a2c2;hb=e6aaad5c5273cd814b5748b7faf3751835a37217;hp=c900d3ca5386379a5cbb3eadaa23b32bd3c4bcc3;hpb=237cc1f9576ed23c7a2f9bb34b43e5d07e93f710;p=nihav.git diff --git a/nihav-qt/src/codecs/svq3.rs b/nihav-qt/src/codecs/svq3.rs index c900d3c..1a87ca6 100644 --- a/nihav-qt/src/codecs/svq3.rs +++ b/nihav-qt/src/codecs/svq3.rs @@ -140,13 +140,13 @@ impl MVInfo { } 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) { @@ -261,7 +261,7 @@ fn decode_alt_slice(br: &mut BitReader, blk: &mut [i16; 16], mut idx: usize, end 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); @@ -289,7 +289,7 @@ fn decode_block(br: &mut BitReader, blk: &mut [i16; 16], start: usize, alt: bool 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()); @@ -434,7 +434,7 @@ fn mc_part(dframe: &mut NASimpleVideoFrame, src: NAVideoBufferRef, ebuf: copy_block(dframe, src.clone(), ebuf, 0, xoff, yoff, mx, my, bw * 4, bh * 4, 0, post, mode, ifuncs); copy_block(dframe, src.clone(), ebuf, 1, xoff / 2, yoff / 2, cmx, cmy, bw * 2, bh * 2, 0, post, mode, ifuncs); - copy_block(dframe, src.clone(), ebuf, 2, xoff / 2, yoff / 2, cmx, cmy, bw * 2, bh * 2, 0, post, mode, ifuncs); + copy_block(dframe, src, ebuf, 2, xoff / 2, yoff / 2, cmx, cmy, bw * 2, bh * 2, 0, post, mode, ifuncs); } impl SVQ3Decoder { @@ -518,7 +518,7 @@ unimplemented!(); }; 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]); } @@ -540,7 +540,7 @@ unimplemented!(); 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; @@ -602,7 +602,7 @@ println!("slice offset {}", _offset); 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 { @@ -674,7 +674,7 @@ println!("slice offset {}", _offset); } 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; @@ -813,7 +813,7 @@ println!("slice offset {}", _offset); if let (Some(bwd_ref), true, true) = (self.ipbs.get_b_bwdref(), has_fwd, has_bwd) { let mut aframe = NASimpleVideoFrame::from_video_buf(&mut self.avg_buf).unwrap(); let amv = MV { x: bmv.x + (self.mb_x as i16) * 16 * 6, y: bmv.y + (self.mb_y as i16) * 16 * 6 }; - mc_part(&mut aframe, bwd_ref.clone(), &mut self.ebuf, 0, 0, 4, 4, amv, bmode, ifuncs); + mc_part(&mut aframe, bwd_ref, &mut self.ebuf, 0, 0, 4, 4, amv, bmode, ifuncs); let dstride = dframe.stride[0]; let dst = &mut dframe.data[dframe.offset[0] + self.mb_x * 16 + self.mb_y * 16 * dstride..]; @@ -857,7 +857,7 @@ println!("slice offset {}", _offset); 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 { @@ -1167,9 +1167,7 @@ impl NADecoder for SVQ3Decoder { } 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; } @@ -1230,6 +1228,7 @@ mod test { //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],