sm: StreamManager,
packetiser: Box<dyn NAPacketiser + Send>,
br: &'a mut ByteReader<'a>,
+ pts: u64,
}
impl<'a> RawStreamCtx<'a> {
fn new(stream: NAStreamRef, packetiser: Box<dyn NAPacketiser + Send>, br: &'a mut ByteReader<'a>) -> Self {
let mut sm = StreamManager::new();
sm.add_stream_ref(stream.clone());
- Self { stream, sm, packetiser, br }
+ Self { stream, sm, packetiser, br, pts: 0 }
}
}
match *self {
DemuxerObject::Normal(ref dmx) => dmx.get_duration(),
DemuxerObject::Raw(ref dmx, _, _) => dmx.get_duration(),
+ DemuxerObject::RawStream(ref ctx) => {
+ NATimeInfo::ts_to_time(ctx.stream.duration, 1000, ctx.stream.tb_num, ctx.stream.tb_den)
+ },
_ => 0,
}
}
let mut buf = [0; 65536];
loop {
match ctx.packetiser.get_packet(ctx.stream.clone()) {
- Ok(Some(packet)) => return Ok(packet),
+ Ok(Some(mut packet)) => {
+ if packet.get_pts().is_none() && packet.get_duration().is_some() {
+ packet.ts.pts = Some(ctx.pts);
+ }
+ ctx.pts += packet.get_duration().unwrap_or(0);
+ return Ok(packet);
+ },
Ok(None) => {},
Err(DecoderError::ShortData) => {},
_ => return Err(DemuxerError::InvalidData),
},
Err(_) => {
match ctx.packetiser.get_packet(ctx.stream.clone()) {
- Ok(Some(packet)) => return Ok(packet),
+ Ok(Some(mut packet)) => {
+ if packet.get_pts().is_none() && packet.get_duration().is_some() {
+ packet.ts.pts = Some(ctx.pts);
+ }
+ ctx.pts += packet.get_duration().unwrap_or(0);
+ return Ok(packet);
+ },
Ok(None) | Err(DecoderError::ShortData) => return Err(DemuxerError::EOF),
_ => return Err(DemuxerError::InvalidData),
};