aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/remux.rs
diff options
context:
space:
mode:
Diffstat (limited to 'remuxer/src/remux.rs')
-rw-r--r--remuxer/src/remux.rs76
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))
-}