calculate PTS for raw stream if needed and possible
authorKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 18 Nov 2021 13:11:27 +0000 (14:11 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 18 Nov 2021 13:11:27 +0000 (14:11 +0100)
src/demux.rs

index 73ed14fa503ffa36ba09d6ccaf1f595d58dedc47..28f564d88134f1e3986854dba1efd56d236b5f28 100644 (file)
@@ -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),
                             };