diff --git a/gstreamer-allocators/src/lib.rs b/gstreamer-allocators/src/lib.rs index c729e498f..691a85265 100644 --- a/gstreamer-allocators/src/lib.rs +++ b/gstreamer-allocators/src/lib.rs @@ -12,12 +12,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-app/src/lib.rs b/gstreamer-app/src/lib.rs index 1d8bfc167..a2e987b88 100644 --- a/gstreamer-app/src/lib.rs +++ b/gstreamer-app/src/lib.rs @@ -10,6 +10,14 @@ pub use glib; pub use gst; pub use gst_base; +macro_rules! assert_initialized_main_thread { + () => { + if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { + gst::assert_initialized(); + } + }; +} + macro_rules! skip_assert_initialized { () => {}; } diff --git a/gstreamer-audio/src/lib.rs b/gstreamer-audio/src/lib.rs index ec47b4222..6fc91f3ec 100644 --- a/gstreamer-audio/src/lib.rs +++ b/gstreamer-audio/src/lib.rs @@ -13,12 +13,7 @@ pub use gst_base; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-base/src/lib.rs b/gstreamer-base/src/lib.rs index e2a168b6e..fb7e7eb60 100644 --- a/gstreamer-base/src/lib.rs +++ b/gstreamer-base/src/lib.rs @@ -12,12 +12,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-check/src/lib.rs b/gstreamer-check/src/lib.rs index a4d3ac4aa..8367ae794 100644 --- a/gstreamer-check/src/lib.rs +++ b/gstreamer-check/src/lib.rs @@ -12,12 +12,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-controller/src/lib.rs b/gstreamer-controller/src/lib.rs index 56a2a6b03..02fbbcb15 100644 --- a/gstreamer-controller/src/lib.rs +++ b/gstreamer-controller/src/lib.rs @@ -12,12 +12,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-editing-services/src/lib.rs b/gstreamer-editing-services/src/lib.rs index 4f17414f0..3b666ff18 100644 --- a/gstreamer-editing-services/src/lib.rs +++ b/gstreamer-editing-services/src/lib.rs @@ -39,12 +39,7 @@ pub unsafe fn deinit() { macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } crate::GES_INIT.call_once(|| { unsafe { ffi::ges_init() }; diff --git a/gstreamer-gl/egl/src/lib.rs b/gstreamer-gl/egl/src/lib.rs index 972f854de..e706b18db 100644 --- a/gstreamer-gl/egl/src/lib.rs +++ b/gstreamer-gl/egl/src/lib.rs @@ -15,8 +15,8 @@ pub use gst_gl; macro_rules! assert_initialized_main_thread { () => { - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); + if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { + gst::assert_initialized(); } }; } diff --git a/gstreamer-gl/src/lib.rs b/gstreamer-gl/src/lib.rs index 3f69dd2c4..4bd6f12f0 100644 --- a/gstreamer-gl/src/lib.rs +++ b/gstreamer-gl/src/lib.rs @@ -14,12 +14,7 @@ pub use gst_video; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-gl/wayland/src/lib.rs b/gstreamer-gl/wayland/src/lib.rs index 36fd18aa0..9ff471514 100644 --- a/gstreamer-gl/wayland/src/lib.rs +++ b/gstreamer-gl/wayland/src/lib.rs @@ -15,8 +15,8 @@ pub use gst_gl; macro_rules! assert_initialized_main_thread { () => { - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); + if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { + gst::assert_initialized(); } }; } diff --git a/gstreamer-gl/x11/src/lib.rs b/gstreamer-gl/x11/src/lib.rs index 992de1cb2..d9b7ec59f 100644 --- a/gstreamer-gl/x11/src/lib.rs +++ b/gstreamer-gl/x11/src/lib.rs @@ -15,8 +15,8 @@ pub use gst_gl; macro_rules! assert_initialized_main_thread { () => { - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); + if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { + gst::assert_initialized(); } }; } diff --git a/gstreamer-mpegts/src/lib.rs b/gstreamer-mpegts/src/lib.rs index 965db2b0e..aebbffd8f 100644 --- a/gstreamer-mpegts/src/lib.rs +++ b/gstreamer-mpegts/src/lib.rs @@ -13,12 +13,7 @@ static MPEGTS_INIT: Once = Once::new(); macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } crate::MPEGTS_INIT.call_once(|| unsafe { ffi::gst_mpegts_initialize() }); }; diff --git a/gstreamer-net/src/lib.rs b/gstreamer-net/src/lib.rs index a37528947..783c3cdee 100644 --- a/gstreamer-net/src/lib.rs +++ b/gstreamer-net/src/lib.rs @@ -12,12 +12,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-pbutils/src/lib.rs b/gstreamer-pbutils/src/lib.rs index ffc2709d9..b23e62f7b 100644 --- a/gstreamer-pbutils/src/lib.rs +++ b/gstreamer-pbutils/src/lib.rs @@ -16,12 +16,7 @@ static PBUTILS_INIT: Once = Once::new(); macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } crate::PBUTILS_INIT.call_once(|| { unsafe { ffi::gst_pb_utils_init() }; diff --git a/gstreamer-play/src/lib.rs b/gstreamer-play/src/lib.rs index 4e79dda46..46578a339 100644 --- a/gstreamer-play/src/lib.rs +++ b/gstreamer-play/src/lib.rs @@ -16,12 +16,7 @@ macro_rules! skip_assert_initialized { macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-player/src/lib.rs b/gstreamer-player/src/lib.rs index e211737df..6babd7362 100644 --- a/gstreamer-player/src/lib.rs +++ b/gstreamer-player/src/lib.rs @@ -16,12 +16,7 @@ macro_rules! skip_assert_initialized { macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-rtp/src/lib.rs b/gstreamer-rtp/src/lib.rs index d5278d2ac..be3272a27 100644 --- a/gstreamer-rtp/src/lib.rs +++ b/gstreamer-rtp/src/lib.rs @@ -13,12 +13,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-rtsp-server/src/lib.rs b/gstreamer-rtsp-server/src/lib.rs index 3e62ba9bd..32ad4b01b 100644 --- a/gstreamer-rtsp-server/src/lib.rs +++ b/gstreamer-rtsp-server/src/lib.rs @@ -16,12 +16,7 @@ pub use gst_sdp; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-rtsp/src/lib.rs b/gstreamer-rtsp/src/lib.rs index 7c9d3e2b8..c9e463631 100644 --- a/gstreamer-rtsp/src/lib.rs +++ b/gstreamer-rtsp/src/lib.rs @@ -13,12 +13,7 @@ pub use gst_sdp; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-sdp/src/lib.rs b/gstreamer-sdp/src/lib.rs index 3d10203fd..0d3256984 100644 --- a/gstreamer-sdp/src/lib.rs +++ b/gstreamer-sdp/src/lib.rs @@ -12,12 +12,7 @@ pub use gst; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-validate/src/lib.rs b/gstreamer-validate/src/lib.rs index 5668b0d92..1be216e45 100644 --- a/gstreamer-validate/src/lib.rs +++ b/gstreamer-validate/src/lib.rs @@ -8,25 +8,25 @@ #[doc(hidden)] pub static INITIALIZED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false); +#[cold] +#[inline(never)] +#[track_caller] +pub fn assert_initialized() { + if unsafe { ffi::gst_validate_is_initialized() } != glib::ffi::GTRUE { + panic!("GStreamer Validate has not been initialized. Call `gst_validate::init` first."); + } else { + crate::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); + } +} + macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } if !crate::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - if unsafe { ffi::gst_validate_is_initialized() } != glib::ffi::GTRUE { - panic!( - "GStreamer Validate has not been initialized. Call `gst_validate::init` first." - ); - } else { - crate::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + $crate::assert_initialized(); } }; } diff --git a/gstreamer-video/src/lib.rs b/gstreamer-video/src/lib.rs index cca87157e..21d96765c 100644 --- a/gstreamer-video/src/lib.rs +++ b/gstreamer-video/src/lib.rs @@ -13,12 +13,7 @@ pub use gst_base; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer-webrtc/src/lib.rs b/gstreamer-webrtc/src/lib.rs index 90b7b50f0..bb4bd4116 100644 --- a/gstreamer-webrtc/src/lib.rs +++ b/gstreamer-webrtc/src/lib.rs @@ -13,12 +13,7 @@ pub use gst_sdp; macro_rules! assert_initialized_main_thread { () => { if !gst::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - gst::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + gst::assert_initialized(); } }; } diff --git a/gstreamer/src/lib.rs b/gstreamer/src/lib.rs index 29929e4c9..ccf348041 100644 --- a/gstreamer/src/lib.rs +++ b/gstreamer/src/lib.rs @@ -15,15 +15,22 @@ pub use paste; #[doc(hidden)] pub static INITIALIZED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false); +#[cold] +#[inline(never)] +#[track_caller] +pub fn assert_initialized() { + #[allow(unused_unsafe)] + if unsafe { ffi::gst_is_initialized() } != glib::ffi::GTRUE { + panic!("GStreamer has not been initialized. Call `gst::init` first."); + } else { + crate::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); + } +} + macro_rules! assert_initialized_main_thread { () => { if !crate::INITIALIZED.load(std::sync::atomic::Ordering::SeqCst) { - #[allow(unused_unsafe)] - if unsafe { ffi::gst_is_initialized() } != glib::ffi::GTRUE { - panic!("GStreamer has not been initialized. Call `gst::init` first."); - } else { - crate::INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - } + $crate::assert_initialized(); } }; }