diff options
Diffstat (limited to 'remuxer')
-rw-r--r-- | remuxer/Cargo.toml | 1 | ||||
-rw-r--r-- | remuxer/src/remux.rs | 17 | ||||
-rw-r--r-- | remuxer/src/seek_index.rs | 27 | ||||
-rw-r--r-- | remuxer/src/snippet.rs | 11 |
4 files changed, 25 insertions, 31 deletions
diff --git a/remuxer/Cargo.toml b/remuxer/Cargo.toml index ac74c9d..4fae27e 100644 --- a/remuxer/Cargo.toml +++ b/remuxer/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] jellycommon = { path = "../common" } jellymatroska = { path = "../matroska" } +jellybase = { path = "../base" } tokio = { version = "1.32.0", features = ["io-util"] } anyhow = "1.0.75" 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}"); |