// Copyright (C) 2021 Sebastian Dröge // // This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at // . // // SPDX-License-Identifier: MPL-2.0 use gst::glib; use gst::prelude::*; mod boxes; mod imp; glib::wrapper! { pub(crate) struct FMP4Mux(ObjectSubclass) @extends gst::Element, gst::Object; } unsafe impl Send for FMP4Mux {} unsafe impl Sync for FMP4Mux {} glib::wrapper! { pub(crate) struct ISOFMP4Mux(ObjectSubclass) @extends FMP4Mux, gst::Element, gst::Object; } unsafe impl Send for ISOFMP4Mux {} unsafe impl Sync for ISOFMP4Mux {} glib::wrapper! { pub(crate) struct CMAFMux(ObjectSubclass) @extends FMP4Mux, gst::Element, gst::Object; } unsafe impl Send for CMAFMux {} unsafe impl Sync for CMAFMux {} glib::wrapper! { pub(crate) struct DASHMP4Mux(ObjectSubclass) @extends FMP4Mux, gst::Element, gst::Object; } unsafe impl Send for DASHMP4Mux {} unsafe impl Sync for DASHMP4Mux {} pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { gst::Element::register( Some(plugin), "isofmp4mux", gst::Rank::Primary, ISOFMP4Mux::static_type(), )?; gst::Element::register( Some(plugin), "cmafmux", gst::Rank::Primary, CMAFMux::static_type(), )?; gst::Element::register( Some(plugin), "dashmp4mux", gst::Rank::Primary, DASHMP4Mux::static_type(), )?; Ok(()) } #[derive(Debug)] pub(crate) struct Buffer { buffer: gst::Buffer, // Running times pts: gst::ClockTime, dts: Option, } #[derive(Debug)] pub(crate) struct HeaderConfiguration<'a> { variant: Variant, update: bool, caps: &'a gst::Caps, write_mehd: bool, duration: Option, } #[derive(Debug)] pub(crate) struct FragmentHeaderConfiguration<'a> { variant: Variant, sequence_number: u32, caps: &'a gst::Caps, buffers: &'a [Buffer], earliest_pts: gst::ClockTime, start_dts: Option, end_pts: gst::ClockTime, end_dts: Option, dts_offset: Option, } #[allow(clippy::upper_case_acronyms)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub(crate) enum Variant { ISO, CMAF, DASH, } #[derive(Debug)] pub(crate) struct FragmentOffset { time: gst::ClockTime, offset: u64, } #[allow(clippy::upper_case_acronyms)] #[derive(Debug, Clone, Copy, PartialEq, Eq, glib::GEnum)] #[repr(i32)] #[genum(type_name = "GstFMP4MuxHeaderUpdateMode")] pub(crate) enum HeaderUpdateMode { None, Rewrite, Update, }