aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/import/mod.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-05 11:35:29 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-05 11:35:29 +0200
commit4a0f08126d80dc589e3c97bf0a07571b8b828a74 (patch)
tree3cf1b17e1e831ffa1da7b3f4cf9e6f3ca4a5080c /remuxer/src/import/mod.rs
parent60ed27c6578ac3645f0b56b86d2086b57a468126 (diff)
downloadjellything-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.rs28
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;
}