diff options
author | metamuffin <metamuffin@disroot.org> | 2023-08-05 11:35:29 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-08-05 11:35:29 +0200 |
commit | 4a0f08126d80dc589e3c97bf0a07571b8b828a74 (patch) | |
tree | 3cf1b17e1e831ffa1da7b3f4cf9e6f3ca4a5080c /remuxer/src/import/mod.rs | |
parent | 60ed27c6578ac3645f0b56b86d2086b57a468126 (diff) | |
download | jellything-4a0f08126d80dc589e3c97bf0a07571b8b828a74.tar jellything-4a0f08126d80dc589e3c97bf0a07571b8b828a74.tar.bz2 jellything-4a0f08126d80dc589e3c97bf0a07571b8b828a74.tar.zst |
speed up metadata import
Diffstat (limited to 'remuxer/src/import/mod.rs')
-rw-r--r-- | remuxer/src/import/mod.rs | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/remuxer/src/import/mod.rs b/remuxer/src/import/mod.rs index 0a9aebf..309357b 100644 --- a/remuxer/src/import/mod.rs +++ b/remuxer/src/import/mod.rs @@ -13,7 +13,7 @@ use jellymatroska::{ unflatten::{IterWithPos, Unflat, Unflatten}, }; use log::{debug, error, info, warn}; -use std::path::PathBuf; +use std::{path::PathBuf, time::Instant}; #[derive(Default)] pub struct MatroskaMetadata { @@ -28,7 +28,6 @@ pub struct MatroskaMetadata { } pub fn import_metadata(input: &mut EbmlReader) -> Result<MatroskaMetadata> { - let mut m = None; while let Some(item) = input.next() { let item = match item { Ok(item) => item, @@ -55,26 +54,31 @@ pub fn import_metadata(input: &mut EbmlReader) -> Result<MatroskaMetadata> { } } MatroskaTag::Segment(_) => { - info!("segment start"); + info!("extracting metadata..."); let mut children = Unflatten::new_with_end(input, item); - m = Some(import_read_segment(&mut children)?); - info!("segment end"); + let t = Instant::now(); + let r = import_read_segment(&mut children)?; + info!("done in {:?}", t.elapsed()); + return Ok(r); } _ => debug!("(r) tag ignored: {item:?}"), } } - - Ok(m.ok_or(anyhow!("no segment"))?) + Err(anyhow!("no segment found")) } fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { let (mut timestamp_scale, mut duration) = (None, None); let mut m = MatroskaMetadata::default(); + let (mut info_found, mut tags_found, mut attachments_found, mut tracks_found) = + (false, false, false, false); + while let Some(Ok(Unflat { children, item, .. })) = segment.n() { match item { MatroskaTag::SeekHead(_) => {} MatroskaTag::Info(_) => { + info_found = true; let mut children = children.unwrap(); while let Some(Ok(Unflat { children: _, item, .. @@ -90,6 +94,7 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { } MatroskaTag::Void(_) => {} MatroskaTag::Tags(_) => { + tags_found = true; let mut children = children.unwrap(); while let Some(Ok(Unflat { children, item, .. })) = children.n() { match item { @@ -129,6 +134,7 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { } } MatroskaTag::Attachments(_) => { + attachments_found = true; let mut children = children.unwrap(); while let Some(Ok(Unflat { children, item, .. })) = children.n() { match item { @@ -170,6 +176,7 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { MatroskaTag::Cues(_) => {} MatroskaTag::Chapters(_) => {} MatroskaTag::Tracks(_) => { + tracks_found = true; let mut children = children.unwrap(); while let Some(Ok(Unflat { children, item, .. })) = children.n() { match item { @@ -264,9 +271,16 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> { } } MatroskaTag::Cluster(_) => {} + _ => warn!("(rs) tag ignored: {item:?}"), }; + if info_found && tracks_found && attachments_found && tags_found { + debug!("we found all we need, stopping read early"); + break; + } } + segment.exit_dirty(); + if let Some(duration) = duration { m.duration = (duration * timestamp_scale.unwrap_or(1_000_000) as f64) / 1_000_000_000_f64; } |