aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src
diff options
context:
space:
mode:
Diffstat (limited to 'remuxer/src')
-rw-r--r--remuxer/src/remux.rs17
-rw-r--r--remuxer/src/seek_index.rs27
-rw-r--r--remuxer/src/snippet.rs11
3 files changed, 24 insertions, 31 deletions
diff --git a/remuxer/src/remux.rs b/remuxer/src/remux.rs
index d7a30e5..31e4a3a 100644
--- a/remuxer/src/remux.rs
+++ b/remuxer/src/remux.rs
@@ -4,7 +4,8 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
use crate::{
- ebml_header, ebml_track_entry, segment_extractor::SegmentExtractIter, trim_writer::TrimWriter,
+ ebml_header, ebml_track_entry, seek_index::get_seek_index,
+ segment_extractor::SegmentExtractIter, trim_writer::TrimWriter,
};
use anyhow::{anyhow, Context};
use jellycommon::{
@@ -23,6 +24,7 @@ use std::{
io::{Seek, SeekFrom, Write},
ops::Range,
path::PathBuf,
+ sync::Arc,
time::Instant,
};
@@ -43,7 +45,7 @@ pub fn remux_stream_into(
info: SourceTrack,
reader: EbmlReader,
mapped: u64,
- index: SeekIndex,
+ index: Arc<SeekIndex>,
source_track_index: usize,
codec_private: Option<Vec<u8>>,
layouting_progress_index: usize,
@@ -69,12 +71,11 @@ pub fn remux_stream_into(
info!("\t- {sel} {source_path:?} ({} => {mapped})", private.track);
info!("\t {}", info);
let file = File::open(&source_path).context("opening source file")?;
- let mut index = File::open(source_path.with_extension(format!("si.{}", private.track)))
- .context("opening seek index file")?;
- let index = bincode::decode_from_std_read::<SeekIndex, _, _>(
- &mut index,
- bincode::config::standard(),
- )?;
+ let index = get_seek_index(&source_path)?;
+ let index = index
+ .get(&(private.track as u64))
+ .ok_or(anyhow!("track missing"))?
+ .to_owned();
debug!("\t seek index: {} blocks loaded", index.blocks.len());
let reader = EbmlReader::new(file);
Ok(ReaderC {
diff --git a/remuxer/src/seek_index.rs b/remuxer/src/seek_index.rs
index f269a23..93a425c 100644
--- a/remuxer/src/seek_index.rs
+++ b/remuxer/src/seek_index.rs
@@ -4,6 +4,7 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
use anyhow::Result;
+use jellybase::cache::cache_memory;
use jellycommon::seek_index::{BlockIndex, SeekIndex};
use jellymatroska::{
block::Block,
@@ -12,27 +13,17 @@ use jellymatroska::{
MatroskaTag,
};
use log::{debug, info, trace, warn};
-use std::{collections::BTreeMap, fs::File, path::Path};
+use std::{collections::BTreeMap, fs::File, path::Path, sync::Arc};
-pub fn write_all(path: &Path) -> Result<()> {
- if path.with_extension(&format!("si.1")).exists() {
- info!("seek index already present");
- return Ok(());
- }
- let seek_index = {
+pub fn get_seek_index(path: &Path) -> anyhow::Result<Arc<BTreeMap<u64, Arc<SeekIndex>>>> {
+ cache_memory(&["seekindex", path.to_str().unwrap()], move || {
+ info!("generating seek index for {path:?}");
let input = File::open(&path).unwrap();
let mut input = EbmlReader::new(input);
- import_seek_index(&mut input)?
- };
- for (tn, index) in seek_index {
- info!("writing index {tn} with {} blocks", index.blocks.len());
- bincode::encode_into_std_write(
- index,
- &mut File::create(path.with_extension(&format!("si.{tn}")))?,
- bincode::config::standard(),
- )?;
- }
- Ok(())
+ let index = import_seek_index(&mut input)?;
+ info!("done");
+ Ok(index.into_iter().map(|(k, v)| (k, Arc::new(v))).collect())
+ })
}
pub fn import_seek_index(input: &mut EbmlReader) -> Result<BTreeMap<u64, SeekIndex>> {
diff --git a/remuxer/src/snippet.rs b/remuxer/src/snippet.rs
index bc7f190..cc5ec9d 100644
--- a/remuxer/src/snippet.rs
+++ b/remuxer/src/snippet.rs
@@ -5,7 +5,8 @@
*/
use crate::{
- ebml_header, ebml_segment_info, ebml_track_entry, segment_extractor::SegmentExtractIter,
+ ebml_header, ebml_segment_info, ebml_track_entry, seek_index::get_seek_index,
+ segment_extractor::SegmentExtractIter,
};
use anyhow::{anyhow, Context, Result};
use jellycommon::{seek_index::SeekIndex, LocalTrack, NodePublic};
@@ -24,10 +25,10 @@ pub fn snippet_index(
let media_info = item.media.as_ref().unwrap();
let private = &track_sources[track];
let source_path = path_base.join(&private.path);
- let mut index = File::open(source_path.with_extension(format!("si.{}", private.track)))
- .context("opening seek index file")?;
- let index =
- bincode::decode_from_std_read::<SeekIndex, _, _>(&mut index, bincode::config::standard())?;
+ let index = get_seek_index(&source_path)?;
+ let index = index
+ .get(&(private.track as u64))
+ .ok_or(anyhow!("track missing"))?;
let average_kf_interval = media_info.duration / index.keyframes.len() as f64;
let kf_per_snip = (SNIPPET_LENGTH / average_kf_interval).ceil() as usize;
debug!("average keyframe interval: {average_kf_interval}");