/* 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 */ 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) } }