X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fdemux.rs;h=859faf5acad11c99716f1826c2e845103c91bc35;hb=4dd9047c4ba7e1ee7f1e163e0c551d318497d6db;hp=73ed14fa503ffa36ba09d6ccaf1f595d58dedc47;hpb=5ec8115fa8878cba1649346e52e65f5414f64b75;p=nihav-encoder.git diff --git a/src/demux.rs b/src/demux.rs index 73ed14f..859faf5 100644 --- a/src/demux.rs +++ b/src/demux.rs @@ -41,13 +41,14 @@ pub struct RawStreamCtx<'a> { sm: StreamManager, packetiser: Box, br: &'a mut ByteReader<'a>, + pts: u64, } impl<'a> RawStreamCtx<'a> { fn new(stream: NAStreamRef, packetiser: Box, 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 } } } @@ -150,6 +151,9 @@ impl<'a> DemuxerObject<'a> { 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, } } @@ -230,7 +234,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 +251,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), };