aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/snippet.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-09-30 20:07:52 +0200
committermetamuffin <metamuffin@disroot.org>2023-09-30 20:07:52 +0200
commit215503287d2e835f5ae9bd9cbd4262188025b44c (patch)
treeff96753bbd53a5886fa9859652f3231a6fff0b29 /remuxer/src/snippet.rs
parentb15fb338de55df177948a7fdf9704efa4374816b (diff)
downloadjellything-215503287d2e835f5ae9bd9cbd4262188025b44c.tar
jellything-215503287d2e835f5ae9bd9cbd4262188025b44c.tar.bz2
jellything-215503287d2e835f5ae9bd9cbd4262188025b44c.tar.zst
broken snippet generation and outputting something that looks like hls
Diffstat (limited to 'remuxer/src/snippet.rs')
-rw-r--r--remuxer/src/snippet.rs49
1 files changed, 40 insertions, 9 deletions
diff --git a/remuxer/src/snippet.rs b/remuxer/src/snippet.rs
index 186be19..f23e19e 100644
--- a/remuxer/src/snippet.rs
+++ b/remuxer/src/snippet.rs
@@ -4,18 +4,49 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use crate::ebml_track_entry;
-use crate::segment_extractor::SegmentExtractIter;
-use crate::{ebml_header, ebml_segment_info};
-use anyhow::anyhow;
-use anyhow::Context;
+use crate::{
+ ebml_header, ebml_segment_info, ebml_track_entry, segment_extractor::SegmentExtractIter,
+};
+use anyhow::{anyhow, Context, Result};
use jellycommon::{seek_index::SeekIndex, LocalTrack, NodePublic};
use jellymatroska::{read::EbmlReader, write::EbmlWriter, Master, MatroskaTag};
use log::{debug, info};
-use std::{fs::File, io::Write, path::PathBuf};
+use std::{fs::File, io::Write, ops::Range, path::PathBuf};
const SNIPPET_LENGTH: f64 = 2.;
+pub fn snippet_index(
+ path_base: PathBuf,
+ item: NodePublic,
+ track_sources: &Vec<LocalTrack>,
+ track: usize,
+) -> Result<Vec<Range<f64>>> {
+ 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 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}");
+ debug!(" => keyframes per snippet {kf_per_snip}");
+
+ let n_snips = index.keyframes.len().div_ceil(kf_per_snip);
+ Ok((0..n_snips)
+ .map(|i| {
+ let start = index.blocks[index.keyframes[i * kf_per_snip]].pts as f64 / 1000.;
+ let end = index
+ .keyframes
+ .get((i + 1) * kf_per_snip)
+ .map(|i| index.blocks[*i].pts as f64 / 1000.)
+ .unwrap_or(media_info.duration);
+ start..end
+ })
+ .collect())
+}
+
pub fn write_snippet_into(
writer: impl Write,
path_base: PathBuf,
@@ -50,8 +81,8 @@ pub fn write_snippet_into(
// TODO maybe refactor this to approx. contant time per snippet
let average_kf_interval = media_info.duration / index.keyframes.len() as f64;
let kf_per_snip = (SNIPPET_LENGTH / average_kf_interval).ceil() as usize;
- info!("average keyframe interval: {average_kf_interval}");
- info!(" => keyframes per snippet {kf_per_snip}");
+ debug!("average keyframe interval: {average_kf_interval}");
+ debug!(" => keyframes per snippet {kf_per_snip}");
let start_block_index = *index
.keyframes
@@ -79,7 +110,7 @@ pub fn write_snippet_into(
let mut reader = SegmentExtractIter::new(&mut reader, private.track as u64);
- let mut blocks = Vec::new();
+ let mut blocks = vec![MatroskaTag::Timestamp(start_block.pts)];
for i in start_block_index..end_block_index {
let index_block = &index.blocks[i];
let mut block = reader.next()?;