summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/demux.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/demux.rs b/src/demux.rs
index 73ed14f..28f564d 100644
--- a/src/demux.rs
+++ b/src/demux.rs
@@ -41,13 +41,14 @@ pub struct RawStreamCtx<'a> {
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 }
}
}
@@ -230,7 +231,13 @@ impl<'a> DemuxerObject<'a> {
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),
@@ -241,7 +248,13 @@ impl<'a> DemuxerObject<'a> {
},
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),
};