From 53b02a82ae6d6beaaa2b8c374e5976839654f4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 12 Oct 2022 21:57:34 +0300 Subject: [PATCH] ndi: Re-organize code a bit and don't make internal modules public --- net/ndi/src/lib.rs | 24 +++++----- net/ndi/src/ndisrc/imp.rs | 13 +++--- net/ndi/src/ndisrc/mod.rs | 1 + net/ndi/src/{ => ndisrc}/receiver.rs | 66 ++++++++++++++++------------ 4 files changed, 56 insertions(+), 48 deletions(-) rename net/ndi/src/{ => ndisrc}/receiver.rs (97%) diff --git a/net/ndi/src/lib.rs b/net/ndi/src/lib.rs index cf4ce9bb..ba82e9b3 100644 --- a/net/ndi/src/lib.rs +++ b/net/ndi/src/lib.rs @@ -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 for NDIlib_recv_color_format_e { +impl From 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, diff --git a/net/ndi/src/ndisrc/imp.rs b/net/ndi/src/ndisrc/imp.rs index 5bd90dfc..d971e89a 100644 --- a/net/ndi/src/ndisrc/imp.rs +++ b/net/ndi/src/ndisrc/imp.rs @@ -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 = Lazy::new(|| { @@ -61,9 +58,9 @@ impl Default for Settings { } struct State { - video_info: Option, + video_info: Option, video_caps: Option, - audio_info: Option, + audio_info: Option, audio_caps: Option, current_latency: Option, receiver: Option, diff --git a/net/ndi/src/ndisrc/mod.rs b/net/ndi/src/ndisrc/mod.rs index d8c05f5d..0b5f9bee 100644 --- a/net/ndi/src/ndisrc/mod.rs +++ b/net/ndi/src/ndisrc/mod.rs @@ -3,6 +3,7 @@ use glib::prelude::*; mod imp; +mod receiver; glib::wrapper! { pub struct NdiSrc(ObjectSubclass) @extends gst_base::BaseSrc, gst::Element, gst::Object; diff --git a/net/ndi/src/receiver.rs b/net/ndi/src/ndisrc/receiver.rs similarity index 97% rename from net/ndi/src/receiver.rs rename to net/ndi/src/ndisrc/receiver.rs index 6c1298ba..f5430ac5 100644 --- a/net/ndi/src/receiver.rs +++ b/net/ndi/src/ndisrc/receiver.rs @@ -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 = Lazy::new(|| { gst::DebugCategory::new( @@ -29,14 +35,15 @@ pub struct Receiver(Arc); #[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 { 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 { 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 { 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 { 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,