From 362898cd54e7a9245e7be3867c481437fb01037b Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Tue, 14 Jan 2025 14:59:37 +0530 Subject: [PATCH] hlsmultivariantsink: Enable MPEG-TS codec string support only for Linux For the MPEG-TS case, we depend on cros-codecs for parsing SPS to get the relevant information for building codec strings. Do not compile it for non-linux platforms. Users needing MPEG-TS on non-linux platform need to set codec string manually as a workaround. Part-of: --- net/hlsmultivariantsink/Cargo.toml | 1 + net/hlsmultivariantsink/src/imp.rs | 60 +++++++++++-------- .../tests/hlsmultivariantsink.rs | 2 + 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/net/hlsmultivariantsink/Cargo.toml b/net/hlsmultivariantsink/Cargo.toml index 1b971160b..b6f200c97 100644 --- a/net/hlsmultivariantsink/Cargo.toml +++ b/net/hlsmultivariantsink/Cargo.toml @@ -16,6 +16,7 @@ m3u8-rs = "5.0" chrono = "0.4" sprintf = "0.2" gst-pbutils = { workspace = true, features = ["v1_22"] } +[target.'cfg(target_os = "linux")'.dependencies] cros-codecs = { version = "0.0.4", default-features = false } [dev-dependencies] diff --git a/net/hlsmultivariantsink/src/imp.rs b/net/hlsmultivariantsink/src/imp.rs index 9f2b0bbab..1437eb626 100644 --- a/net/hlsmultivariantsink/src/imp.rs +++ b/net/hlsmultivariantsink/src/imp.rs @@ -44,10 +44,6 @@ use std::path; use std::str::FromStr; use std::sync::{LazyLock, Mutex}; -use cros_codecs::codec::h264::parser as H264Parser; -use cros_codecs::codec::h265::parser as H265Parser; -use std::io::Cursor; - const DEFAULT_AUTO_SELECT: bool = false; const DEFAULT_FORCED: bool = false; const DEFAULT_I_FRAMES_ONLY_PLAYLIST: bool = false; @@ -1312,7 +1308,11 @@ impl HlsMultivariantSink { drop(state); } + #[cfg(target_os = "linux")] fn parse_h264_sps(&self, buffer: &[u8], group_id: String) { + use cros_codecs::codec::h264::parser as H264Parser; + use std::io::Cursor; + let mut caps_codec_str: Option = None; let mut cursor = Cursor::new(buffer); let mut parser = H264Parser::Parser::default(); @@ -1362,7 +1362,11 @@ impl HlsMultivariantSink { } } + #[cfg(target_os = "linux")] fn parse_h265_sps(&self, buffer: &[u8], group_id: String) { + use cros_codecs::codec::h265::parser as H265Parser; + use std::io::Cursor; + let mut caps_codec_str: Option = None; let mut cursor = Cursor::new(buffer); let mut parser = H265Parser::Parser::default(); @@ -1455,6 +1459,7 @@ impl HlsMultivariantSink { } } + #[cfg(target_os = "linux")] fn parse_sps( &self, caps: &gst::Caps, @@ -1499,34 +1504,41 @@ impl HlsMultivariantSink { hlspad: &super::HlsMultivariantSinkPad, buffer: gst::Buffer, ) -> Result { - let settings = self.settings.lock().unwrap(); - let is_mpegts = settings.muxer_type == HlsMultivariantSinkMuxerType::MpegTs; - drop(settings); - /* * MPEG-TS does byte-stream for H264/H265 which does not have * codec_data as the relevant information is carried in-band * with SPS. codec-utils helpers cannot give us codec string * without the codec_data. For MPEG-TS, parse SPS and figure * out the relevant information to generate codec string. + * + * parse_sps function relies on cros_codecs which supports + * only linux. On other platforms for MPEG-TS, users need to + * specify codec string manually. */ - if is_mpegts && buffer.flags().contains(gst::BufferFlags::HEADER) { - let pad_settings = hlspad.imp().settings.lock().unwrap().to_owned(); - let group_id = match pad_settings { - HlsMultivariantSinkPadSettings::PadAlternative(ref a) => a.group_id.clone(), - HlsMultivariantSinkPadSettings::PadVariant(ref v) => { - if let Some(group_id) = &v.video { - group_id.clone() - } else if let Some(group_id) = &v.audio { - group_id.clone() - } else { - v.uri.clone() - } - } - }; + #[cfg(target_os = "linux")] + { + let settings = self.settings.lock().unwrap(); + let is_mpegts = settings.muxer_type == HlsMultivariantSinkMuxerType::MpegTs; + drop(settings); - if let Some(caps) = hlspad.current_caps() { - self.parse_sps(&caps, &buffer, group_id)?; + if is_mpegts && buffer.flags().contains(gst::BufferFlags::HEADER) { + let pad_settings = hlspad.imp().settings.lock().unwrap().to_owned(); + let group_id = match pad_settings { + HlsMultivariantSinkPadSettings::PadAlternative(ref a) => a.group_id.clone(), + HlsMultivariantSinkPadSettings::PadVariant(ref v) => { + if let Some(group_id) = &v.video { + group_id.clone() + } else if let Some(group_id) = &v.audio { + group_id.clone() + } else { + v.uri.clone() + } + } + }; + + if let Some(caps) = hlspad.current_caps() { + self.parse_sps(&caps, &buffer, group_id)?; + } } } diff --git a/net/hlsmultivariantsink/tests/hlsmultivariantsink.rs b/net/hlsmultivariantsink/tests/hlsmultivariantsink.rs index 2be776c71..48396f239 100644 --- a/net/hlsmultivariantsink/tests/hlsmultivariantsink.rs +++ b/net/hlsmultivariantsink/tests/hlsmultivariantsink.rs @@ -810,6 +810,7 @@ low/video.m3u8 Ok(()) } +#[cfg(target_os = "linux")] #[test] fn hlsmultivariantsink_multiple_audio_rendition_multiple_video_variant_with_mpegts( ) -> Result<(), ()> { @@ -985,6 +986,7 @@ low/video.m3u8 Ok(()) } +#[cfg(target_os = "linux")] #[test] fn hlsmultivariantsink_multiple_video_variant_with_mpegts_audio_video_muxed() -> Result<(), ()> { init();