diff options
Diffstat (limited to 'remuxer/src/remux.rs')
-rw-r--r-- | remuxer/src/remux.rs | 76 |
1 files changed, 10 insertions, 66 deletions
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 <metamuffin.org> */ -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<Vec<u8>>, -) -> 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)) -} |