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)]
minor_ver: u8,
rpr: RPRInfo,
bdsp: H263BlockDSP,
+ base_ts: u64,
+ last_ts: u16,
+ next_ts: u16,
}
struct RealVideo20BR<'a> {
mb_pos_bits: u8,
minor_ver: u8,
rpr: RPRInfo,
+ pts: u16,
}
struct RV20SliceInfo {
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();
}
}
RealVideo20BR {
- br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE),
+ br: BitReader::new(&src[soff..], BitReaderMode::BE),
tables,
num_slices: nslices,
slice_no: 0,
mb_pos_bits: mbpb,
minor_ver,
rpr,
+ pts: 0,
}
}
} else {
br.read(13)? << 3
};
+ self.pts = seq as u16;
let w;
let h;
if self.rpr.present {
minor_ver: 0,
rpr: RPRInfo { present: false, bits: 0, widths: [0; 8], heights: [0; 8] },
bdsp: H263BlockDSP::new(),
+ base_ts: 0,
+ last_ts: 0,
+ next_ts: 0,
}
}
}
let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?;
let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
+ let ftype = self.dec.get_frame_type();
+ let pts = ibr.pts;
+ if ftype != FrameType::B {
+ self.last_ts = self.next_ts;
+ self.next_ts = pts;
+ if self.last_ts > self.next_ts {
+ self.base_ts += 1 << 16;
+ }
+ }
+ let ts_diff = self.next_ts.wrapping_sub(pts);
+ let ts = self.base_ts + (self.next_ts as u64) - (ts_diff as u64);
frm.set_keyframe(self.dec.is_intra());
- frm.set_frame_type(self.dec.get_frame_type());
+ frm.set_frame_type(ftype);
+ frm.set_pts(Some(ts >> 3));
Ok(frm.into_ref())
}
fn flush(&mut self) {
MBB{ blocks: 65536, bits: 14 },
];
-pub fn get_decoder() -> Box<dyn NADecoder> {
+pub fn get_decoder() -> Box<dyn NADecoder + Send> {
Box::new(RealVideo20Decoder::new())
}
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_rv20() {
let mut dmx_reg = RegisteredDemuxers::new();