diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-09 15:16:34 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-09 15:16:34 +0200 |
| commit | ea06e23a7fd3160f41da9aadec2229dc4dc47e37 (patch) | |
| tree | b485f8baeab5b6bf90321fdf60140f4ac362ade9 /remuxer/src/bin | |
| parent | d9aa1005b589ae5eae93f00b25852166226bb9fd (diff) | |
| download | jellything-ea06e23a7fd3160f41da9aadec2229dc4dc47e37.tar jellything-ea06e23a7fd3160f41da9aadec2229dc4dc47e37.tar.bz2 jellything-ea06e23a7fd3160f41da9aadec2229dc4dc47e37.tar.zst | |
Fix bug seeking to clusters without seekhead
Diffstat (limited to 'remuxer/src/bin')
| -rw-r--r-- | remuxer/src/bin/analyze_kf_placement.rs | 49 | ||||
| -rw-r--r-- | remuxer/src/bin/average_cluster_duration.rs | 13 |
2 files changed, 56 insertions, 6 deletions
diff --git a/remuxer/src/bin/analyze_kf_placement.rs b/remuxer/src/bin/analyze_kf_placement.rs new file mode 100644 index 0000000..7a5a01d --- /dev/null +++ b/remuxer/src/bin/analyze_kf_placement.rs @@ -0,0 +1,49 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2025 metamuffin <metamuffin.org> +*/ + +use anyhow::{Result, anyhow}; +use jellyremuxer::demuxers::{Demuxer, DemuxerNew, matroska::MatroskaDemuxer}; +use std::{env::args, fs::File}; +use winter_matroska::TrackType; + +fn main() -> Result<()> { + env_logger::init_from_env("LOG"); + let path = args().nth(1).ok_or(anyhow!("first arg is input path"))?; + let file = File::open(path)?; + let mut reader = MatroskaDemuxer::new(Box::new(file)); + + let tracks = reader.tracks()?.unwrap(); + let video_track = tracks + .entries + .iter() + .find(|t| matches!(t.track_type, TrackType::Video)) + .map(|t| t.track_number) + .unwrap(); + + reader.seek_cluster(None)?; + let mut num_kf_first = 0; + let mut num_kf_later = 0; + while let Some((_, cluster)) = reader.read_cluster()? { + let mut first = true; + for block in cluster.simple_blocks { + if block.track != video_track { + continue; + } + if block.flags.keyframe() { + if first { + num_kf_first += 1 + } else { + num_kf_later += 1; + } + } + first = false + } + } + + println!("{num_kf_first:>4} kf first"); + println!("{num_kf_later:>4} kf later"); + Ok(()) +} diff --git a/remuxer/src/bin/average_cluster_duration.rs b/remuxer/src/bin/average_cluster_duration.rs index 69bb79c..41effb4 100644 --- a/remuxer/src/bin/average_cluster_duration.rs +++ b/remuxer/src/bin/average_cluster_duration.rs @@ -6,7 +6,7 @@ use anyhow::{Result, anyhow}; use jellyremuxer::demuxers::{Demuxer, DemuxerNew, matroska::MatroskaDemuxer}; -use std::{env::args, fs::File}; +use std::{collections::BTreeMap, env::args, fs::File}; fn main() -> Result<()> { env_logger::init_from_env("LOG"); @@ -18,21 +18,22 @@ fn main() -> Result<()> { reader.seek_cluster(None)?; let mut num_clusters = 0; + let mut num_blocks = BTreeMap::<u64, usize>::new(); let mut last_ts = 0; let mut total_size = 0; while let Some((_, cluster)) = reader.read_cluster()? { last_ts = cluster.timestamp * info.timestamp_scale; num_clusters += 1; - total_size += cluster - .simple_blocks - .iter() - .map(|b| b.data.len()) - .sum::<usize>() as u64 + for block in &cluster.simple_blocks { + total_size += block.data.len() as u64; + *num_blocks.entry(block.track).or_default() += 1; + } } let average_duration = (last_ts / num_clusters) as f64 / 1_000_000_000.; let average_size = (total_size / num_clusters) as f64 / 1_000_000.; println!("{average_duration:>6.02}s {average_size:>6.02}MB"); + println!("{num_blocks:?}"); Ok(()) } |