aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/muxers/matroska.rs
diff options
context:
space:
mode:
Diffstat (limited to 'remuxer/src/muxers/matroska.rs')
-rw-r--r--remuxer/src/muxers/matroska.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/remuxer/src/muxers/matroska.rs b/remuxer/src/muxers/matroska.rs
new file mode 100644
index 0000000..47210c9
--- /dev/null
+++ b/remuxer/src/muxers/matroska.rs
@@ -0,0 +1,63 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2025 metamuffin <metamuffin.org>
+*/
+
+use crate::muxers::FragmentMuxer;
+use anyhow::Result;
+use std::io::Write;
+use winter_ebml::{EbmlHeader, EbmlToVec};
+use winter_matroska::{Cluster, Info, MatroskaFile, Segment, Tracks};
+
+fn write_fragment_shared(
+ out: &mut dyn Write,
+ info: Info,
+ tracks: Tracks,
+ cluster: Cluster,
+ webm: bool,
+) -> Result<()> {
+ let file = MatroskaFile {
+ ebml_header: EbmlHeader {
+ ebml_version: 1,
+ ebml_read_version: 1,
+ ebml_max_id_length: 4,
+ ebml_max_size_length: 8,
+ doc_type: if webm { "webm" } else { "matroska" }.to_string(),
+ doc_type_version: 4,
+ doc_type_read_version: 2,
+ ..Default::default()
+ },
+ segment: Segment {
+ info,
+ tracks: Some(tracks),
+ clusters: vec![cluster],
+ ..Default::default()
+ },
+ };
+ out.write_all(&file.to_vec())?;
+ Ok(())
+}
+
+pub struct MatroskaFragmentMuxer;
+impl FragmentMuxer for MatroskaFragmentMuxer {
+ fn write_fragment(
+ out: &mut dyn Write,
+ info: Info,
+ tracks: Tracks,
+ cluster: Cluster,
+ ) -> Result<()> {
+ write_fragment_shared(out, info, tracks, cluster, false)
+ }
+}
+pub struct WebmFragmentMuxer;
+impl FragmentMuxer for WebmFragmentMuxer {
+ fn write_fragment(
+ out: &mut dyn Write,
+ info: Info,
+ tracks: Tracks,
+ cluster: Cluster,
+ ) -> Result<()> {
+ write_fragment_shared(out, info, tracks, cluster, true)
+ }
+}