use nihav_core::formats;
use nihav_core::frame::*;
use nihav_core::codecs::*;
-use nihav_core::codecs::h263::*;
-use nihav_core::codecs::h263::code::H263BlockDSP;
-use nihav_core::codecs::h263::decoder::*;
-use nihav_core::codecs::h263::data::*;
+use nihav_codec_support::codecs::{MV, ZIGZAG};
+use nihav_codec_support::codecs::h263::*;
+use nihav_codec_support::codecs::h263::code::H263BlockDSP;
+use nihav_codec_support::codecs::h263::decoder::*;
+use nihav_codec_support::codecs::h263::data::*;
#[allow(dead_code)]
struct Tables {
let mut slice_offs = Vec::with_capacity(nslices);
{
let offs = &src[1..][..nslices * 8];
- let mut br = BitReader::new(offs, offs.len(), BitReaderMode::BE);
+ let mut br = BitReader::new(offs, BitReaderMode::BE);
for _ in 0..nslices {
br.skip(32).unwrap();
let off = br.read(32).unwrap();
}
let soff = nslices * 8 + 1;
RealVideo10BR {
- br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE),
+ br: BitReader::new(&src[soff..], BitReaderMode::BE),
tables,
num_slices: nslices,
slice_no: 0,
if !coded { return Ok(()); }
let rl_cb = &self.tables.rl_cb; // could be aic too
+ let quant = if plane_no == 0 { quant } else { H263_CHROMA_QUANT[quant as usize] };
let q_add = if quant == 0 { 0i16 } else { ((quant - 1) | 1) as i16 };
let q = (quant * 2) as i16;
while idx < 64 {
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 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, src.len(), BitReaderMode::BE);
+let mut br = BitReader::new(src, BitReaderMode::BE);
println!("edata:");
println!("{:08X}", br.read(32).unwrap());
println!("{:08X}", br.read(32).unwrap());
mod test {
use nihav_core::codecs::RegisteredDecoders;
use nihav_core::demuxers::RegisteredDemuxers;
- use nihav_core::test::dec_video::*;
- use crate::codecs::realmedia_register_all_codecs;
- use crate::demuxers::realmedia_register_all_demuxers;
+ use nihav_codec_support::test::dec_video::*;
+ use crate::realmedia_register_all_codecs;
+ use crate::realmedia_register_all_demuxers;
#[test]
fn test_rv10() {
let mut dmx_reg = RegisteredDemuxers::new();