mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-12-23 10:30:40 +00:00
ndi: Re-organize code a bit and don't make internal modules public
This commit is contained in:
parent
0a2e6e47c9
commit
53b02a82ae
4 changed files with 56 additions and 48 deletions
|
@ -1,24 +1,22 @@
|
|||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
#[allow(dead_code)]
|
||||
mod ndi;
|
||||
#[allow(dead_code)]
|
||||
mod ndisys;
|
||||
|
||||
mod device_provider;
|
||||
pub mod ndi;
|
||||
|
||||
#[cfg(feature = "sink")]
|
||||
mod ndisink;
|
||||
#[cfg(feature = "sink")]
|
||||
mod ndisinkcombiner;
|
||||
#[cfg(feature = "sink")]
|
||||
pub mod ndisinkmeta;
|
||||
mod ndisinkmeta;
|
||||
|
||||
mod ndisrc;
|
||||
mod ndisrcdemux;
|
||||
pub mod ndisrcmeta;
|
||||
pub mod ndisys;
|
||||
pub mod receiver;
|
||||
|
||||
use crate::ndi::*;
|
||||
use crate::ndisys::*;
|
||||
use crate::receiver::*;
|
||||
|
||||
use std::time;
|
||||
mod ndisrcmeta;
|
||||
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
|
@ -82,8 +80,10 @@ pub enum RecvColorFormat {
|
|||
CompressedV5WithAudio = 13,
|
||||
}
|
||||
|
||||
impl From<RecvColorFormat> for NDIlib_recv_color_format_e {
|
||||
impl From<RecvColorFormat> for crate::ndisys::NDIlib_recv_color_format_e {
|
||||
fn from(v: RecvColorFormat) -> Self {
|
||||
use crate::ndisys::*;
|
||||
|
||||
match v {
|
||||
RecvColorFormat::BgrxBgra => NDIlib_recv_color_format_BGRX_BGRA,
|
||||
RecvColorFormat::UyvyBgra => NDIlib_recv_color_format_UYVY_BGRA,
|
||||
|
|
|
@ -13,14 +13,11 @@ use std::u32;
|
|||
use once_cell::sync::Lazy;
|
||||
|
||||
use crate::ndisys;
|
||||
|
||||
use crate::ndisrcmeta;
|
||||
use crate::Buffer;
|
||||
use crate::Receiver;
|
||||
use crate::ReceiverControlHandle;
|
||||
use crate::ReceiverItem;
|
||||
use crate::RecvColorFormat;
|
||||
use crate::TimestampMode;
|
||||
|
||||
use super::receiver::{self, Buffer, Receiver, ReceiverControlHandle, ReceiverItem};
|
||||
use crate::ndisrcmeta;
|
||||
use crate::DEFAULT_RECEIVER_NDI_NAME;
|
||||
|
||||
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
||||
|
@ -61,9 +58,9 @@ impl Default for Settings {
|
|||
}
|
||||
|
||||
struct State {
|
||||
video_info: Option<crate::VideoInfo>,
|
||||
video_info: Option<receiver::VideoInfo>,
|
||||
video_caps: Option<gst::Caps>,
|
||||
audio_info: Option<crate::AudioInfo>,
|
||||
audio_info: Option<receiver::AudioInfo>,
|
||||
audio_caps: Option<gst::Caps>,
|
||||
current_latency: Option<gst::ClockTime>,
|
||||
receiver: Option<Receiver>,
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
use glib::prelude::*;
|
||||
|
||||
mod imp;
|
||||
mod receiver;
|
||||
|
||||
glib::wrapper! {
|
||||
pub struct NdiSrc(ObjectSubclass<imp::NdiSrc>) @extends gst_base::BaseSrc, gst::Element, gst::Object;
|
||||
|
|
|
@ -11,10 +11,16 @@ use std::cmp;
|
|||
use std::collections::VecDeque;
|
||||
use std::sync::{Arc, Condvar, Mutex, Weak};
|
||||
use std::thread;
|
||||
use std::time;
|
||||
|
||||
use atomic_refcell::AtomicRefCell;
|
||||
|
||||
use super::*;
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
use crate::ndi::*;
|
||||
use crate::ndisys;
|
||||
use crate::ndisys::*;
|
||||
use crate::TimestampMode;
|
||||
|
||||
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
||||
gst::DebugCategory::new(
|
||||
|
@ -29,14 +35,15 @@ pub struct Receiver(Arc<ReceiverInner>);
|
|||
#[derive(Debug, PartialEq, Eq)]
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
pub enum AudioInfo {
|
||||
AudioInfo(gst_audio::AudioInfo),
|
||||
Audio(gst_audio::AudioInfo),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
OpusInfo {
|
||||
#[allow(dead_code)]
|
||||
Opus {
|
||||
sample_rate: i32,
|
||||
no_channels: i32,
|
||||
},
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
AacInfo {
|
||||
Aac {
|
||||
sample_rate: i32,
|
||||
no_channels: i32,
|
||||
codec_data: [u8; 2],
|
||||
|
@ -46,9 +53,9 @@ pub enum AudioInfo {
|
|||
impl AudioInfo {
|
||||
pub fn to_caps(&self) -> Result<gst::Caps, glib::BoolError> {
|
||||
match self {
|
||||
AudioInfo::AudioInfo(ref info) => info.to_caps(),
|
||||
AudioInfo::Audio(ref info) => info.to_caps(),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
AudioInfo::OpusInfo {
|
||||
AudioInfo::Opus {
|
||||
sample_rate,
|
||||
no_channels,
|
||||
} => Ok(gst::Caps::builder("audio/x-opus")
|
||||
|
@ -57,7 +64,7 @@ impl AudioInfo {
|
|||
.field("channel-mapping-family", 0i32)
|
||||
.build()),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
AudioInfo::AacInfo {
|
||||
AudioInfo::Aac {
|
||||
sample_rate,
|
||||
no_channels,
|
||||
codec_data,
|
||||
|
@ -74,7 +81,7 @@ impl AudioInfo {
|
|||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum VideoInfo {
|
||||
VideoInfo(gst_video::VideoInfo),
|
||||
Video(gst_video::VideoInfo),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
SpeedHQInfo {
|
||||
variant: String,
|
||||
|
@ -87,7 +94,7 @@ pub enum VideoInfo {
|
|||
interlace_mode: gst_video::VideoInterlaceMode,
|
||||
},
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
H264Info {
|
||||
H264 {
|
||||
xres: i32,
|
||||
yres: i32,
|
||||
fps_n: i32,
|
||||
|
@ -97,7 +104,7 @@ pub enum VideoInfo {
|
|||
interlace_mode: gst_video::VideoInterlaceMode,
|
||||
},
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
H265Info {
|
||||
H265 {
|
||||
xres: i32,
|
||||
yres: i32,
|
||||
fps_n: i32,
|
||||
|
@ -111,7 +118,7 @@ pub enum VideoInfo {
|
|||
impl VideoInfo {
|
||||
pub fn to_caps(&self) -> Result<gst::Caps, glib::BoolError> {
|
||||
match self {
|
||||
VideoInfo::VideoInfo(ref info) => info.to_caps(),
|
||||
VideoInfo::Video(ref info) => info.to_caps(),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
VideoInfo::SpeedHQInfo {
|
||||
ref variant,
|
||||
|
@ -131,7 +138,7 @@ impl VideoInfo {
|
|||
.field("variant", variant)
|
||||
.build()),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
VideoInfo::H264Info {
|
||||
VideoInfo::H264 {
|
||||
xres,
|
||||
yres,
|
||||
fps_n,
|
||||
|
@ -150,7 +157,7 @@ impl VideoInfo {
|
|||
.field("alignment", "au")
|
||||
.build()),
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
VideoInfo::H265Info {
|
||||
VideoInfo::H265 {
|
||||
xres,
|
||||
yres,
|
||||
fps_n,
|
||||
|
@ -639,17 +646,20 @@ impl Receiver {
|
|||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_flushing(&self, flushing: bool) {
|
||||
let mut queue = (self.0.queue.0).0.lock().unwrap();
|
||||
queue.flushing = flushing;
|
||||
(self.0.queue.0).1.notify_all();
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_playing(&self, playing: bool) {
|
||||
let mut queue = (self.0.queue.0).0.lock().unwrap();
|
||||
queue.playing = playing;
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn shutdown(&self) {
|
||||
let mut queue = (self.0.queue.0).0.lock().unwrap();
|
||||
queue.shutdown = true;
|
||||
|
@ -1111,7 +1121,7 @@ impl Receiver {
|
|||
builder = builder.field_order(gst_video::VideoFieldOrder::TopFieldFirst);
|
||||
}
|
||||
|
||||
return Ok(VideoInfo::VideoInfo(builder.build().map_err(|_| {
|
||||
return Ok(VideoInfo::Video(builder.build().map_err(|_| {
|
||||
gst::element_error!(
|
||||
element,
|
||||
gst::StreamError::Format,
|
||||
|
@ -1139,7 +1149,7 @@ impl Receiver {
|
|||
builder = builder.field_order(gst_video::VideoFieldOrder::TopFieldFirst);
|
||||
}
|
||||
|
||||
return Ok(VideoInfo::VideoInfo(builder.build().map_err(|_| {
|
||||
return Ok(VideoInfo::Video(builder.build().map_err(|_| {
|
||||
gst::element_error!(
|
||||
element,
|
||||
gst::StreamError::Format,
|
||||
|
@ -1222,7 +1232,7 @@ impl Receiver {
|
|||
return Err(gst::FlowError::Error);
|
||||
}
|
||||
|
||||
return Ok(VideoInfo::H264Info {
|
||||
return Ok(VideoInfo::H264 {
|
||||
xres: video_frame.xres(),
|
||||
yres: video_frame.yres(),
|
||||
fps_n: video_frame.frame_rate().0,
|
||||
|
@ -1260,7 +1270,7 @@ impl Receiver {
|
|||
return Err(gst::FlowError::Error);
|
||||
}
|
||||
|
||||
return Ok(VideoInfo::H265Info {
|
||||
return Ok(VideoInfo::H265 {
|
||||
xres: video_frame.xres(),
|
||||
yres: video_frame.yres(),
|
||||
fps_n: video_frame.frame_rate().0,
|
||||
|
@ -1295,14 +1305,14 @@ impl Receiver {
|
|||
|
||||
gst::ReferenceTimestampMeta::add(
|
||||
buffer,
|
||||
&*TIMECODE_CAPS,
|
||||
&*crate::TIMECODE_CAPS,
|
||||
gst::ClockTime::from_nseconds(video_frame.timecode() as u64 * 100),
|
||||
gst::ClockTime::NONE,
|
||||
);
|
||||
if video_frame.timestamp() != ndisys::NDIlib_recv_timestamp_undefined {
|
||||
gst::ReferenceTimestampMeta::add(
|
||||
buffer,
|
||||
&*TIMESTAMP_CAPS,
|
||||
&*crate::TIMESTAMP_CAPS,
|
||||
gst::ClockTime::from_nseconds(video_frame.timestamp() as u64 * 100),
|
||||
gst::ClockTime::NONE,
|
||||
);
|
||||
|
@ -1355,7 +1365,7 @@ impl Receiver {
|
|||
video_frame: &VideoFrame,
|
||||
) -> Result<gst::Buffer, gst::FlowError> {
|
||||
match info {
|
||||
VideoInfo::VideoInfo(ref info) => {
|
||||
VideoInfo::Video(ref info) => {
|
||||
let src = video_frame.data().ok_or(gst::FlowError::Error)?;
|
||||
|
||||
let buffer = gst::Buffer::with_size(info.size()).unwrap();
|
||||
|
@ -1495,7 +1505,7 @@ impl Receiver {
|
|||
Ok(gst::Buffer::from_mut_slice(Vec::from(data)))
|
||||
}
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
VideoInfo::H264Info { .. } | VideoInfo::H265Info { .. } => {
|
||||
VideoInfo::H264 { .. } | VideoInfo::H265 { .. } => {
|
||||
let compressed_packet = video_frame.compressed_packet().ok_or_else(|| {
|
||||
error!(
|
||||
CAT,
|
||||
|
@ -1599,7 +1609,7 @@ impl Receiver {
|
|||
gst::FlowError::NotNegotiated
|
||||
})?;
|
||||
|
||||
return Ok(AudioInfo::AudioInfo(info));
|
||||
return Ok(AudioInfo::Audio(info));
|
||||
}
|
||||
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
|
@ -1622,7 +1632,7 @@ impl Receiver {
|
|||
return Err(gst::FlowError::Error);
|
||||
}
|
||||
|
||||
return Ok(AudioInfo::AacInfo {
|
||||
return Ok(AudioInfo::Aac {
|
||||
sample_rate: audio_frame.sample_rate(),
|
||||
no_channels: audio_frame.no_channels(),
|
||||
codec_data: compressed_packet
|
||||
|
@ -1653,7 +1663,7 @@ impl Receiver {
|
|||
audio_frame: &AudioFrame,
|
||||
) -> Result<gst::Buffer, gst::FlowError> {
|
||||
match info {
|
||||
AudioInfo::AudioInfo(ref info) => {
|
||||
AudioInfo::Audio(ref info) => {
|
||||
let src = audio_frame.data().ok_or(gst::FlowError::Error)?;
|
||||
let buff_size = (audio_frame.no_samples() as u32 * info.bpf()) as usize;
|
||||
|
||||
|
@ -1666,14 +1676,14 @@ impl Receiver {
|
|||
|
||||
gst::ReferenceTimestampMeta::add(
|
||||
buffer,
|
||||
&*TIMECODE_CAPS,
|
||||
&*crate::TIMECODE_CAPS,
|
||||
gst::ClockTime::from_nseconds(audio_frame.timecode() as u64 * 100),
|
||||
gst::ClockTime::NONE,
|
||||
);
|
||||
if audio_frame.timestamp() != ndisys::NDIlib_recv_timestamp_undefined {
|
||||
gst::ReferenceTimestampMeta::add(
|
||||
buffer,
|
||||
&*TIMESTAMP_CAPS,
|
||||
&*crate::TIMESTAMP_CAPS,
|
||||
gst::ClockTime::from_nseconds(audio_frame.timestamp() as u64 * 100),
|
||||
gst::ClockTime::NONE,
|
||||
);
|
||||
|
@ -1709,7 +1719,7 @@ impl Receiver {
|
|||
Ok(buffer)
|
||||
}
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
AudioInfo::OpusInfo { .. } => {
|
||||
AudioInfo::Opus { .. } => {
|
||||
let data = audio_frame.data().ok_or_else(|| {
|
||||
error!(CAT, obj: element, "Audio packet has no data");
|
||||
gst::element_error!(
|
||||
|
@ -1724,7 +1734,7 @@ impl Receiver {
|
|||
Ok(gst::Buffer::from_mut_slice(Vec::from(data)))
|
||||
}
|
||||
#[cfg(feature = "advanced-sdk")]
|
||||
AudioInfo::AacInfo { .. } => {
|
||||
AudioInfo::Aac { .. } => {
|
||||
let compressed_packet = audio_frame.compressed_packet().ok_or_else(|| {
|
||||
error!(
|
||||
CAT,
|
Loading…
Reference in a new issue