aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/demuxers
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-09-25 04:00:51 +0200
committermetamuffin <metamuffin@disroot.org>2025-09-25 04:00:51 +0200
commitf8d4c438d10450ead56c0082b037e466ef5f9f24 (patch)
tree703612747f06b91f063dcd9e8a778675e6aa1303 /remuxer/src/demuxers
parent0fe48987c336b9b50cba09355aa3c1cf11740edc (diff)
downloadjellything-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.rs13
-rw-r--r--remuxer/src/demuxers/matroska.rs15
-rw-r--r--remuxer/src/demuxers/mod.rs14
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)))
+}