From b15fb338de55df177948a7fdf9704efa4374816b Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 30 Sep 2023 18:15:16 +0200 Subject: refactor common crate --- remuxer/src/lib.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++-- remuxer/src/remux.rs | 76 ++++++------------------------------------- remuxer/src/seek_index.rs | 2 +- 3 files changed, 91 insertions(+), 69 deletions(-) (limited to 'remuxer/src') diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs index 9a5e6c6..e1f8c80 100644 --- a/remuxer/src/lib.rs +++ b/remuxer/src/lib.rs @@ -5,9 +5,87 @@ */ pub mod import; pub mod remux; +pub mod seek_index; pub mod segment_extractor; -pub mod trim_writer; pub mod snippet; -pub mod seek_index; +pub mod trim_writer; pub use remux::remux_stream_into; +pub use snippet::write_snippet_into; + +use jellycommon::{SourceTrack, SourceTrackKind}; +use jellymatroska::{Master, MatroskaTag}; + +pub fn ebml_header(webm: bool) -> MatroskaTag { + MatroskaTag::Ebml(Master::Collected(vec![ + MatroskaTag::EbmlVersion(1), + MatroskaTag::EbmlReadVersion(1), + MatroskaTag::EbmlMaxIdLength(4), + MatroskaTag::EbmlMaxSizeLength(8), + MatroskaTag::DocType(if webm { + "webm".to_string() + } else { + "matroska".to_string() + }), + MatroskaTag::DocTypeVersion(4), + MatroskaTag::DocTypeReadVersion(2), + ])) +} +pub fn ebml_segment_info(title: String, duration: f64) -> MatroskaTag { + MatroskaTag::Info(Master::Collected(vec![ + MatroskaTag::TimestampScale(1_000_000), + MatroskaTag::Duration(duration * 1000.0), + MatroskaTag::Title(title), + MatroskaTag::MuxingApp("jellyremux".to_string()), + MatroskaTag::WritingApp("jellything".to_string()), + ])) +} + +pub fn ebml_track_entry( + number: u64, + track: &SourceTrack, + codec_private: Option>, +) -> MatroskaTag { + let mut els = vec![ + MatroskaTag::TrackNumber(number), + MatroskaTag::TrackUID(number), + MatroskaTag::FlagLacing(0), + MatroskaTag::Language(track.language.clone()), + MatroskaTag::CodecID(track.codec.clone()), + ]; + if let Some(d) = &track.default_duration { + els.push(MatroskaTag::DefaultDuration(*d)); + } + match track.kind { + SourceTrackKind::Video { + width, + height, + fps: _, + } => { + els.push(MatroskaTag::TrackType(1)); + els.push(MatroskaTag::Video(Master::Collected(vec![ + MatroskaTag::PixelWidth(width), + MatroskaTag::PixelHeight(height), + ]))) + } + SourceTrackKind::Audio { + channels, + sample_rate, + bit_depth, + } => { + els.push(MatroskaTag::TrackType(2)); + els.push(MatroskaTag::Audio(Master::Collected(vec![ + MatroskaTag::SamplingFrequency(sample_rate), + MatroskaTag::Channels(channels.try_into().unwrap()), + ]))); + els.push(MatroskaTag::BitDepth(bit_depth.try_into().unwrap())); + } + SourceTrackKind::Subtitles => { + els.push(MatroskaTag::TrackType(19)); + } + } + if let Some(d) = &codec_private { + els.push(MatroskaTag::CodecPrivate(d.clone())); + } + MatroskaTag::TrackEntry(Master::Collected(els)) +} diff --git a/remuxer/src/remux.rs b/remuxer/src/remux.rs index 8807a38..d7a30e5 100644 --- a/remuxer/src/remux.rs +++ b/remuxer/src/remux.rs @@ -3,9 +3,14 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin */ -use crate::{segment_extractor::SegmentExtractIter, trim_writer::TrimWriter}; +use crate::{ + ebml_header, ebml_track_entry, segment_extractor::SegmentExtractIter, trim_writer::TrimWriter, +}; use anyhow::{anyhow, Context}; -use jellycommon::{BlockIndex, LocalTrack, NodePublic, SeekIndex, SourceTrack, SourceTrackKind}; +use jellycommon::{ + seek_index::{BlockIndex, SeekIndex}, + LocalTrack, NodePublic, SourceTrack, +}; use jellymatroska::{ block::Block, read::EbmlReader, @@ -87,19 +92,7 @@ pub fn remux_stream_into( info!("(perf) prepare inputs: {:?}", Instant::now() - timing_cp); let timing_cp = Instant::now(); - output.write_tag(&MatroskaTag::Ebml(Master::Collected(vec![ - MatroskaTag::EbmlVersion(1), - MatroskaTag::EbmlReadVersion(1), - MatroskaTag::EbmlMaxIdLength(4), - MatroskaTag::EbmlMaxSizeLength(8), - MatroskaTag::DocType(if webm { - "webm".to_string() - } else { - "matroska".to_string() - }), - MatroskaTag::DocTypeVersion(4), - MatroskaTag::DocTypeReadVersion(2), - ])))?; + output.write_tag(&ebml_header(webm))?; output.write_tag(&MatroskaTag::Segment(Master::Start))?; let segment_offset = output.position(); @@ -115,7 +108,7 @@ pub fn remux_stream_into( let tracks_header = inputs .iter_mut() - .map(|rc| track_to_ebml(rc.mapped, &rc.info, rc.codec_private.take())) + .map(|rc| ebml_track_entry(rc.mapped, &rc.info, rc.codec_private.take())) .collect(); output.write_tag(&MatroskaTag::Tracks(Master::Collected(tracks_header)))?; @@ -210,7 +203,7 @@ pub fn remux_stream_into( 1 // ctrack id + 1 // ctrack size + 1 // ctrack content int - // TODO break if inputs.len() >= 127 + // TODO this breaks if inputs.len() >= 127 + 1 // ccp id + 1 // ccp len + 8 // ccp content offset @@ -330,52 +323,3 @@ pub fn remux_stream_into( output.write_tag(&MatroskaTag::Segment(Master::End))?; Ok(()) } - -pub fn track_to_ebml( - number: u64, - track: &SourceTrack, - codec_private: Option>, -) -> MatroskaTag { - let mut els = vec![ - MatroskaTag::TrackNumber(number), - MatroskaTag::TrackUID(number), - MatroskaTag::FlagLacing(0), - MatroskaTag::Language(track.language.clone()), - MatroskaTag::CodecID(track.codec.clone()), - ]; - if let Some(d) = &track.default_duration { - els.push(MatroskaTag::DefaultDuration(*d)); - } - match track.kind { - SourceTrackKind::Video { - width, - height, - fps: _, - } => { - els.push(MatroskaTag::TrackType(1)); - els.push(MatroskaTag::Video(Master::Collected(vec![ - MatroskaTag::PixelWidth(width), - MatroskaTag::PixelHeight(height), - ]))) - } - SourceTrackKind::Audio { - channels, - sample_rate, - bit_depth, - } => { - els.push(MatroskaTag::TrackType(2)); - els.push(MatroskaTag::Audio(Master::Collected(vec![ - MatroskaTag::SamplingFrequency(sample_rate), - MatroskaTag::Channels(channels.try_into().unwrap()), - ]))); - els.push(MatroskaTag::BitDepth(bit_depth.try_into().unwrap())); - } - SourceTrackKind::Subtitles => { - els.push(MatroskaTag::TrackType(19)); - } - } - if let Some(d) = &codec_private { - els.push(MatroskaTag::CodecPrivate(d.clone())); - } - MatroskaTag::TrackEntry(Master::Collected(els)) -} diff --git a/remuxer/src/seek_index.rs b/remuxer/src/seek_index.rs index 7dbb9f7..f269a23 100644 --- a/remuxer/src/seek_index.rs +++ b/remuxer/src/seek_index.rs @@ -4,7 +4,7 @@ Copyright (C) 2023 metamuffin */ use anyhow::Result; -use jellycommon::{BlockIndex, SeekIndex}; +use jellycommon::seek_index::{BlockIndex, SeekIndex}; use jellymatroska::{ block::Block, read::EbmlReader, -- cgit v1.2.3-70-g09d2