mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-09-04 02:33:51 +00:00
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1515>
This commit is contained in:
parent
104d9110b7
commit
362898cd54
3 changed files with 39 additions and 24 deletions
|
@ -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]
|
||||
|
|
|
@ -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<String> = 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<String> = 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<gst::FlowSuccess, gst::FlowError> {
|
||||
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)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue