From de8d69d2886ae50e28da210fc690c99457a804bb Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 29 Jan 2023 14:45:25 +0100 Subject: more seeking code + expire cookies --- remuxer/src/import/mod.rs | 3 ++- remuxer/src/lib.rs | 26 +++++++++++--------------- remuxer/src/segment_extractor.rs | 24 ++++++++++++------------ remuxer/src/trim_writer.rs | 18 +++++++++++------- 4 files changed, 36 insertions(+), 35 deletions(-) (limited to 'remuxer/src') diff --git a/remuxer/src/import/mod.rs b/remuxer/src/import/mod.rs index 01b211b..49a9aa5 100644 --- a/remuxer/src/import/mod.rs +++ b/remuxer/src/import/mod.rs @@ -210,12 +210,13 @@ fn import_read_segment( "simple block: track={} tso={}", block.track, block.timestamp_off ); + debug!("{pts} {}", block.timestamp_off); seek_index .entry(block.track) .or_insert(SeekIndex { blocks: vec![] }) .blocks .push(BlockIndex { - pts: pts + block.timestamp_off as u64, + pts: (pts as i64 + block.timestamp_off as i64) as u64, source_off: position, size: block.data.len(), }); diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs index 03d469e..0034cf8 100644 --- a/remuxer/src/lib.rs +++ b/remuxer/src/lib.rs @@ -7,16 +7,12 @@ pub mod import; pub mod segment_extractor; pub mod trim_writer; -use crate::{ - segment_extractor::{AbsoluteBlock, SegmentExtractIter}, - trim_writer::TrimWriter, -}; +use crate::{segment_extractor::SegmentExtractIter, trim_writer::TrimWriter}; use anyhow::{anyhow, Context}; use jellycommon::{BlockIndex, ItemInfo, SeekIndex, SourceTrack, SourceTrackKind}; use jellymatroska::{ block::Block, read::EbmlReader, - unflatten::Unflatten, write::{vint_length, EbmlWriter}, Master, MatroskaTag, }; @@ -188,10 +184,11 @@ impl RemuxerContext { break; } p += 1; // simpleblock tag - p += vint_length(1 + 2 + 1 + best_block.size as u64); // simpleblock size vint - p += 1 + 2 + 1; // block {tracknum, pts_off, flags} - // TODO does not work, if more than 127 tracks are present - p += best_block.size; // block payload + let simpleblock_size = 1 + 2 + 1 // block {tracknum, pts_off, flags} + // TODO does not work, if more than 127 tracks are present + + best_block.size; // block payload + p += vint_length(simpleblock_size as u64); // simpleblock size vint + p += simpleblock_size; cluster.push((best_index, best_block)) } info!("segment layout computed ({} clusters)", clusters.len()); @@ -225,11 +222,12 @@ impl RemuxerContext { let segment_start_position = output.position(); let mut skip = 0; - for cluster in &segment_layout { - if (cluster.position + segment_start_position) > range.start { + for (i, cluster) in segment_layout.iter().enumerate() { + if (cluster.position + segment_start_position) < range.start { + skip += i; + } else { break; } - skip += 1; } if skip != 0 { info!("skipping {skip} clusters"); @@ -237,7 +235,6 @@ impl RemuxerContext { } struct ReaderD<'a> { - _info: SourceTrack, peek: Option, stream: SegmentExtractIter<'a>, mapped: u64, @@ -258,7 +255,6 @@ impl RemuxerContext { mapped: inp.mapped, peek: Some(stream.next()?), stream, - _info: inp.info.clone(), }); } info!( @@ -266,7 +262,7 @@ impl RemuxerContext { (Instant::now() - timing_cp).as_millis() ); - for (cluster_index, cluster) in segment_layout.into_iter().skip(skip).enumerate() { + for (cluster_index, cluster) in segment_layout.into_iter().enumerate().skip(skip) { info!( "writing cluster {cluster_index} (pts_base={}) with {} blocks", cluster.timestamp, diff --git a/remuxer/src/segment_extractor.rs b/remuxer/src/segment_extractor.rs index 095bdfe..c44a511 100644 --- a/remuxer/src/segment_extractor.rs +++ b/remuxer/src/segment_extractor.rs @@ -1,24 +1,22 @@ -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, Result}; use jellymatroska::{block::Block, read::EbmlReader, unflatten::IterWithPos, MatroskaTag}; use log::{debug, trace}; -use std::collections::VecDeque; -pub struct AbsoluteBlock { - pub pts_base: u64, - pub inner: Block, -} +// pub struct AbsoluteBlock { +// pub pts_base: u64, +// pub inner: Block, +// } +// impl AbsoluteBlock { +// pub fn pts(&self) -> u64 { +// self.inner.timestamp_off as u64 + self.pts_base +// } +// } pub struct SegmentExtractIter<'a> { segment: &'a mut EbmlReader, extract: u64, } -impl AbsoluteBlock { - pub fn pts(&self) -> u64 { - self.inner.timestamp_off as u64 + self.pts_base - } -} - impl<'a> SegmentExtractIter<'a> { pub fn new(segment: &'a mut EbmlReader, extract: u64) -> Self { Self { segment, extract } @@ -31,6 +29,7 @@ impl<'a> SegmentExtractIter<'a> { MatroskaTag::Void(_) => (), MatroskaTag::Crc32(_) => (), MatroskaTag::Cluster(_) => (), + MatroskaTag::Timestamp(_) => (), MatroskaTag::SimpleBlock(buf) | MatroskaTag::Block(buf) => { let block = Block::parse(&buf)?; if block.track == self.extract { @@ -38,6 +37,7 @@ impl<'a> SegmentExtractIter<'a> { return Ok(block); } } + MatroskaTag::Cues(_) => bail!("reached cues, this is the end"), _ => debug!("(rs) tag ignored: {item:?}"), } } diff --git a/remuxer/src/trim_writer.rs b/remuxer/src/trim_writer.rs index 65d3589..bed90e7 100644 --- a/remuxer/src/trim_writer.rs +++ b/remuxer/src/trim_writer.rs @@ -4,7 +4,7 @@ use std::{ }; use anyhow::anyhow; -use log::warn; +use log::{trace, warn}; pub struct TrimWriter { inner: W, @@ -36,12 +36,16 @@ impl Write for TrimWriter { )); } - let buf = &buf[start..end]; - if !buf.is_empty() { - self.inner.write_all(buf)?; - self.position += buf.len() - } - Ok(buf.len()) + let tbuf = &buf[start..end]; + Ok(if !tbuf.is_empty() { + trace!("trim={start}..{end} avail={}", buf.len()); + let sz = self.inner.write(tbuf)?; + self.position += sz; + sz + } else { + trace!("skip={}", buf.len()); + buf.len() + }) } fn flush(&mut self) -> std::io::Result<()> { -- cgit v1.2.3-70-g09d2