-use io::bitreader::*;
-use io::codebook::*;
-use formats;
+use crate::io::bitreader::*;
+use crate::io::codebook::*;
+use crate::formats;
use super::super::*;
use super::*;
use super::code::H263BlockDSP;
let rl_cb = if sstate.is_iframe { &self.tables.aic_rl_cb } else { &self.tables.rl_cb };
let q_add = if quant == 0 || sstate.is_iframe { 0i16 } else { ((quant - 1) | 1) as i16 };
- let q = (quant * 2) as i16;
+ let q = if plane_no == 0 { (quant * 2) as i16 } else { H263_CHROMA_QUANT[quant as usize] as i16 };
while idx < 64 {
let code = br.read_cb(rl_cb)?;
let run;
Ok(MV::new(xval, yval))
}
+fn read_dquant(br: &mut BitReader, q: u8) -> DecoderResult<u8> {
+ if br.read_bool()? {
+ Ok(H263_MODIFIED_QUANT[br.read(1)? as usize][q as usize])
+ } else {
+ Ok(br.read(5)? as u8)
+ }
+}
+
impl<'a> BlockDecoder for RealVideo20BR<'a> {
#[allow(unused_variables)]
Ok(ret)
}
- fn decode_block_header(&mut self, info: &PicInfo, slice: &SliceInfo, _sstate: &SliceState) -> DecoderResult<BlockInfo> {
+ fn decode_block_header(&mut self, info: &PicInfo, _slice: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo> {
let br = &mut self.br;
- let mut q = slice.get_quant();
+ let mut q = sstate.quant;
match info.get_mode() {
Type::I => {
let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?;
let cbp = (cbpy << 2) | (cbpc & 3);
let dquant = (cbpc & 4) != 0;
if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ q = read_dquant(br, q)?;
}
let mut binfo = BlockInfo::new(Type::I, cbp, q);
binfo.set_acpred(acpred);
let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
let cbp = (cbpy << 2) | (cbpc & 3);
if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ q = read_dquant(br, q)?;
}
let binfo = BlockInfo::new(Type::I, cbp, q);
return Ok(binfo);
// }
let cbp = (cbpy << 2) | (cbpc & 3);
if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ q = read_dquant(br, q)?;
}
let mut binfo = BlockInfo::new(Type::P, cbp, q);
if !is_4x4 {
if !is_intra { cbpy ^= 0xF; }
(cbpy << 2) | (cbpc & 3)
} else { 0 };
-
+
if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
+ q = read_dquant(br, q)?;
}
if is_intra {
let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
let mut coderead = H263ShortCodeReader::new(H263_MV);
let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
-
+
let tables = Tables {
intra_mcbpc_cb: intra_mcbpc_cb,
inter_mcbpc_cb: inter_mcbpc_cb,
#[cfg(test)]
mod test {
- use test::dec_video::test_file_decoding;
+ use crate::test::dec_video::test_file_decoding;
#[test]
fn test_rv20() {
test_file_decoding("realmedia", "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm", /*None*/Some(3000), true, false, None/*Some("rv20")*/);