diff options
author | metamuffin <metamuffin@disroot.org> | 2023-09-30 20:07:52 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-09-30 20:07:52 +0200 |
commit | 215503287d2e835f5ae9bd9cbd4262188025b44c (patch) | |
tree | ff96753bbd53a5886fa9859652f3231a6fff0b29 /remuxer/src | |
parent | b15fb338de55df177948a7fdf9704efa4374816b (diff) | |
download | jellything-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')
-rw-r--r-- | remuxer/src/snippet.rs | 49 |
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()?; |