X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-realmedia%2Fsrc%2Fcodecs%2Frv60.rs;h=521025dae75b2bbbe9a93044d1d614c0cd8d7cf4;hb=d32c444b36000abaaf5c65866a2dbdfec1c1ac26;hp=a4cf919cb8337841acb5f58ace5a06ccb131e060;hpb=e07387c7f125550a41faf36a509b252cf71d7f9a;p=nihav.git diff --git a/nihav-realmedia/src/codecs/rv60.rs b/nihav-realmedia/src/codecs/rv60.rs index a4cf919..521025d 100644 --- a/nihav-realmedia/src/codecs/rv60.rs +++ b/nihav-realmedia/src/codecs/rv60.rs @@ -636,6 +636,12 @@ struct RealVideo60Decoder { xpos: usize, ypos: usize, + + ts_scale: u64, + ref0_pts: u64, + ref1_pts: u64, + ref0_ts: u64, + ref1_ts: u64, } impl RealVideo60Decoder { @@ -667,6 +673,12 @@ impl RealVideo60Decoder { blk_pos: 0, xpos: 0, ypos: 0, + + ts_scale: 1, + ref0_pts: 0, + ref1_pts: 0, + ref0_ts: 0, + ref1_ts: 0, } } fn decode_cu_line(&mut self, buf: &mut NASimpleVideoFrame, hdr: &FrameHeader, src: &[u8], cu_y: usize) -> DecoderResult<()> { @@ -1431,6 +1443,22 @@ println!("???"); let hdr = FrameHeader::read(&mut br)?; let mut slices: Vec = Vec::new(); hdr.parse_slice_sizes(&mut br, &mut slices)?; + match hdr.ftype { + FrameType::P => { + if self.ipbs.get_lastref().is_none() { + return Err(DecoderError::MissingReference); + } + }, + FrameType::B => { + if self.ipbs.get_lastref().is_none() { + return Err(DecoderError::MissingReference); + } + if self.ipbs.get_nextref().is_none() { + return Err(DecoderError::MissingReference); + } + }, + _ => {}, + }; let tmp_vinfo = NAVideoInfo::new(hdr.width, hdr.height, false, YUV420_FORMAT); let ret = supp.pool_u8.get_free(); @@ -1469,12 +1497,27 @@ println!("???"); self.ipbs.add_frame(buf.clone()); } + if hdr.ftype != FrameType::B { + self.ref0_pts = self.ref1_pts; + self.ref1_pts = pkt.get_pts().unwrap_or(0); + self.ref0_ts = self.ref1_ts; + self.ref1_ts = hdr.ts as u64; + if (self.ref1_pts > self.ref0_pts) && (self.ref1_ts > self.ref0_ts) { + self.ts_scale = (self.ref1_pts - self.ref0_pts) / (self.ref1_ts - self.ref0_ts); + } + } let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf)); frm.set_keyframe(hdr.ftype == FrameType::I); - frm.set_pts(Some(hdr.ts as u64)); + if hdr.ftype == FrameType::B { + let pts = self.ref0_pts + ((hdr.ts as u64) - self.ref0_ts) * self.ts_scale; + frm.set_pts(Some(pts)); + } frm.set_frame_type(hdr.ftype); Ok(frm.into_ref()) } + fn flush(&mut self) { + self.ipbs.clear(); + } } pub fn get_decoder() -> Box {