level = code.get_level();
last = code.is_last();
if br.read_bool()? { level = -level; }
- level = (level * q) + q_add;
+ if level >= 0 {
+ level = (level * q) + q_add;
+ } else {
+ level = (level * q) - q_add;
+ }
} else {
last = br.read_bool()?;
run = br.read(6)? as u8;
let top = br.read_s(6)? as i16;
level = (top << 5) | low;
}
- level = (level * q) + q_add;
+ if level >= 0 {
+ level = (level * q) + q_add;
+ } else {
+ level = (level * q) - q_add;
+ }
if level < -2048 { level = -2048; }
if level > 2047 { level = 2047; }
}
if dquant {
let idx = br.read(2)? as usize;
q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ validate!(q < 32);
}
Ok(BlockInfo::new(Type::I, cbp, q))
},
if dquant {
let idx = br.read(2)? as usize;
q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ validate!(q < 32);
}
let binfo = BlockInfo::new(Type::I, cbp, q);
return Ok(binfo);
if dquant {
let idx = br.read(2)? as usize;
q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ validate!(q < 32);
}
let mut binfo = BlockInfo::new(Type::P, cbp, q);
if !is_4x4 {
RealVideo10Decoder{
info: NACodecInfoRef::default(),
- dec: H263BaseDecoder::new_with_opts(false, false, false),
+ dec: H263BaseDecoder::new_with_opts(0),
tables,
w: 0,
h: 0,
let ver = ((src[4] as u32) << 12) | ((src[5] as u32) << 4) | ((src[6] as u32) >> 4);
let maj_ver = ver >> 16;
let mic_ver = ver & 0xFF;
-println!("ver {:06X} -> {}", ver, mic_ver);
validate!(maj_ver == 1);
- self.new_ver = mic_ver > 1;
+ self.new_ver = mic_ver > 0;
+ if mic_ver == 2 {
+ self.dec = H263BaseDecoder::new_with_opts(H263DEC_OPT_HAS_OBMC);
+ }
if (src[3] & 1) != 0 {
self.mvmode = MVMode::UMV;
}
-{
-let mut br = BitReader::new(src, BitReaderMode::BE);
-println!("edata:");
-println!("{:08X}", br.read(32).unwrap());
-println!("{:08X}", br.read(32).unwrap());
-}
Ok(())
} else {
-println!("???");
Err(DecoderError::InvalidData)
}
}
fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
let src = pkt.get_buffer();
-//println!(" decode frame size {}, {} slices", src.len(), src[0]+1);
let mut ibr = RealVideo10BR::new(&src, &self.tables, self.w, self.h, self.new_ver, self.mvmode);
let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?;