aboutsummaryrefslogtreecommitdiff
path: root/remuxer
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-29 14:45:25 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-29 14:45:25 +0100
commitde8d69d2886ae50e28da210fc690c99457a804bb (patch)
treeb9d4fca9acd7d5fb844f4c76c8c338770d943df7 /remuxer
parent0d9dc5672b0ba0c6c9988b0422837ceb00a5d7b8 (diff)
downloadjellything-de8d69d2886ae50e28da210fc690c99457a804bb.tar
jellything-de8d69d2886ae50e28da210fc690c99457a804bb.tar.bz2
jellything-de8d69d2886ae50e28da210fc690c99457a804bb.tar.zst
more seeking code + expire cookies
Diffstat (limited to 'remuxer')
-rw-r--r--remuxer/src/import/mod.rs3
-rw-r--r--remuxer/src/lib.rs26
-rw-r--r--remuxer/src/segment_extractor.rs24
-rw-r--r--remuxer/src/trim_writer.rs18
4 files changed, 36 insertions, 35 deletions
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<Block>,
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<W> {
inner: W,
@@ -36,12 +36,16 @@ impl<W: Write> Write for TrimWriter<W> {
));
}
- 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<()> {