diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-25 04:00:51 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-25 04:00:51 +0200 |
commit | f8d4c438d10450ead56c0082b037e466ef5f9f24 (patch) | |
tree | 703612747f06b91f063dcd9e8a778675e6aa1303 /remuxer/src/demuxers | |
parent | 0fe48987c336b9b50cba09355aa3c1cf11740edc (diff) | |
download | jellything-f8d4c438d10450ead56c0082b037e466ef5f9f24.tar jellything-f8d4c438d10450ead56c0082b037e466ef5f9f24.tar.bz2 jellything-f8d4c438d10450ead56c0082b037e466ef5f9f24.tar.zst |
start media processing refactor
Diffstat (limited to 'remuxer/src/demuxers')
-rw-r--r-- | remuxer/src/demuxers/flac.rs | 13 | ||||
-rw-r--r-- | remuxer/src/demuxers/matroska.rs | 15 | ||||
-rw-r--r-- | remuxer/src/demuxers/mod.rs | 14 |
3 files changed, 33 insertions, 9 deletions
diff --git a/remuxer/src/demuxers/flac.rs b/remuxer/src/demuxers/flac.rs index 04d15e0..b397a8c 100644 --- a/remuxer/src/demuxers/flac.rs +++ b/remuxer/src/demuxers/flac.rs @@ -7,7 +7,7 @@ use crate::demuxers::{Demuxer, DemuxerNew, ReadSeek}; use anyhow::{Result, anyhow, bail}; use std::io::{BufReader, Read, Seek, SeekFrom}; -use winter_matroska::{Audio, Cluster, TrackEntry, TrackType, Tracks}; +use winter_matroska::{Audio, Cluster, Info, TrackEntry, TrackType, Tracks}; pub struct FlacDemuxer { reader: BufReader<Box<dyn ReadSeek>>, @@ -28,6 +28,7 @@ struct MetadataBlock { r#type: u8, data: Vec<u8>, } +#[allow(unused)] impl MetadataBlock { const TY_STREAMINFO: u8 = 0; const TY_PADDING: u8 = 1; @@ -38,6 +39,7 @@ impl MetadataBlock { const TY_PICTURE: u8 = 6; } +#[allow(unused)] struct StreamInfo { min_block_size: u16, max_block_size: u16, @@ -109,6 +111,13 @@ impl FlacDemuxer { } } impl Demuxer for FlacDemuxer { + fn info(&mut self) -> Result<Info> { + Ok(Info { + duration: Some(120000.), // TODO + timestamp_scale: 1_000_000, + ..Default::default() + }) + } fn tracks(&mut self) -> Result<Option<Tracks>> { let si = self.stream_info()?; let mut buf = Vec::new(); @@ -243,8 +252,6 @@ impl Demuxer for FlacDemuxer { let mut crc_buf = [0u8; 1]; self.reader.read_exact(&mut crc_buf)?; - - Ok(None) } } diff --git a/remuxer/src/demuxers/matroska.rs b/remuxer/src/demuxers/matroska.rs index 6301f15..b70054d 100644 --- a/remuxer/src/demuxers/matroska.rs +++ b/remuxer/src/demuxers/matroska.rs @@ -7,7 +7,7 @@ use crate::demuxers::{Demuxer, DemuxerNew, ReadSeek}; use anyhow::{Context, Result, anyhow, bail}; use log::debug; -use std::io::{BufReader, Read, Seek, SeekFrom}; +use std::io::{BufReader, ErrorKind, Read, Seek, SeekFrom}; use winter_ebml::{Ebml, EbmlHeader, VintReadExt, read_vint_slice}; use winter_matroska::{ Attachments, Chapters, Cluster, Cues, Info, MatroskaFile, SeekHead, Segment, Tags, Tracks, @@ -47,6 +47,7 @@ impl MatroskaDemuxer { if !matches!(header.doc_type.as_str(), "matroska" | "webm") { bail!("file is {:?} but not matroska/webm", header.doc_type) } + eprintln!("{header:?}"); if header.ebml_max_id_length != 4 { bail!( "file has invalid EBMLMaxIDLength of {}", @@ -156,8 +157,10 @@ impl MatroskaDemuxer { } } impl Demuxer for MatroskaDemuxer { - fn info(&mut self) -> Result<Option<Info>> { - self.read_segment_tag("Info", Segment::TAG_INFO) + fn info(&mut self) -> Result<Info> { + Ok(self + .read_segment_tag("Info", Segment::TAG_INFO)? + .ok_or(anyhow!("info missing"))?) } fn tracks(&mut self) -> Result<Option<Tracks>> { self.read_segment_tag("Tracks", Segment::TAG_TRACKS) @@ -187,7 +190,11 @@ impl Demuxer for MatroskaDemuxer { loop { let position = self.reader.stream_position()?; // TODO handle eof - let tag = self.reader.read_vint()?; + let tag = match self.reader.read_vint() { + Ok(val) => val, + Err(e) if e.kind() == ErrorKind::UnexpectedEof => return Ok(None), + Err(e) => return Err(e.into()), + }; let size = self.reader.read_vint()?; if tag != Segment::TAG_CLUSTERS { self.reader.seek_relative(size as i64)?; diff --git a/remuxer/src/demuxers/mod.rs b/remuxer/src/demuxers/mod.rs index 8940ca5..f001250 100644 --- a/remuxer/src/demuxers/mod.rs +++ b/remuxer/src/demuxers/mod.rs @@ -10,9 +10,10 @@ pub mod matroska; use crate::{ ContainerFormat, demuxers::{flac::FlacDemuxer, matroska::MatroskaDemuxer}, + magic::detect_container_format, }; use anyhow::Result; -use std::io::{Read, Seek}; +use std::io::{Read, Seek, SeekFrom}; use winter_matroska::{Attachments, Chapters, Cluster, Cues, Info, Tags, Tracks}; pub trait ReadSeek: Read + Seek {} @@ -24,7 +25,7 @@ pub trait DemuxerNew: Demuxer + Sized { #[rustfmt::skip] pub trait Demuxer { - fn info(&mut self) -> Result<Option<Info>> { Ok(None) } + fn info(&mut self) -> Result<Info>; fn tracks(&mut self) -> Result<Option<Tracks>> { Ok(None) } fn chapters(&mut self) -> Result<Option<Chapters>> { Ok(None) } fn attachments(&mut self) -> Result<Option<Attachments>> { Ok(None) } @@ -41,3 +42,12 @@ pub fn create_demuxer(container: ContainerFormat, reader: Box<dyn ReadSeek>) -> ContainerFormat::Flac => Box::new(FlacDemuxer::new(reader)), } } +pub fn create_demuxer_autodetect( + mut reader: Box<dyn ReadSeek>, +) -> Result<Option<Box<dyn Demuxer>>> { + let Some(container) = detect_container_format(&mut reader)? else { + return Ok(None); + }; + reader.seek(SeekFrom::Start(0))?; + Ok(Some(create_demuxer(container, reader))) +} |