2018-03-06 09:38:27 +00:00
|
|
|
// Copyright (C) 2018 Sebastian Dröge <sebastian@centricular.com>
|
|
|
|
//
|
2021-12-14 18:40:27 +00:00
|
|
|
// Take a look at the license at the top of the repository in the LICENSE file.
|
2022-01-14 09:25:49 +00:00
|
|
|
#![allow(clippy::non_send_fields_in_send_ty)]
|
2018-03-06 09:38:27 +00:00
|
|
|
|
2019-12-02 09:30:07 +00:00
|
|
|
//! A collection of GStreamer plugins which leverage the `threadshare` [`runtime`].
|
|
|
|
//!
|
|
|
|
//! [`runtime`]: runtime/index.html
|
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
pub mod runtime;
|
2018-03-19 14:47:56 +00:00
|
|
|
|
2020-03-06 13:51:05 +00:00
|
|
|
pub mod socket;
|
2020-03-13 11:49:03 +00:00
|
|
|
mod tcpclientsrc;
|
2020-03-15 11:13:26 +00:00
|
|
|
mod udpsink;
|
2020-03-06 13:51:05 +00:00
|
|
|
mod udpsrc;
|
2020-03-08 18:18:41 +00:00
|
|
|
|
|
|
|
mod appsrc;
|
2020-03-13 20:21:11 +00:00
|
|
|
pub mod dataqueue;
|
2020-01-03 17:46:32 +00:00
|
|
|
mod inputselector;
|
2020-03-14 10:34:45 +00:00
|
|
|
mod jitterbuffer;
|
2020-03-14 17:24:14 +00:00
|
|
|
mod proxy;
|
2020-03-13 20:21:11 +00:00
|
|
|
mod queue;
|
2018-03-19 14:47:56 +00:00
|
|
|
|
2019-12-21 09:45:43 +00:00
|
|
|
use glib::translate::*;
|
2021-06-03 18:20:54 +00:00
|
|
|
use gst::glib;
|
2019-11-24 20:12:40 +00:00
|
|
|
|
2018-11-05 11:43:11 +00:00
|
|
|
fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
2020-03-06 13:51:05 +00:00
|
|
|
udpsrc::register(plugin)?;
|
2020-03-15 11:13:26 +00:00
|
|
|
udpsink::register(plugin)?;
|
2020-03-13 11:49:03 +00:00
|
|
|
tcpclientsrc::register(plugin)?;
|
2020-03-13 20:21:11 +00:00
|
|
|
queue::register(plugin)?;
|
2020-03-14 17:24:14 +00:00
|
|
|
proxy::register(plugin)?;
|
2020-03-08 18:18:41 +00:00
|
|
|
appsrc::register(plugin)?;
|
2020-11-14 17:09:42 +00:00
|
|
|
jitterbuffer::register(plugin)?;
|
2020-01-03 17:46:32 +00:00
|
|
|
inputselector::register(plugin)?;
|
2018-11-05 11:43:11 +00:00
|
|
|
|
|
|
|
Ok(())
|
2018-03-06 09:38:27 +00:00
|
|
|
}
|
|
|
|
|
2020-12-20 18:43:45 +00:00
|
|
|
gst::plugin_define!(
|
2019-05-27 20:21:22 +00:00
|
|
|
threadshare,
|
2019-06-03 10:53:58 +00:00
|
|
|
env!("CARGO_PKG_DESCRIPTION"),
|
2018-03-06 09:38:27 +00:00
|
|
|
plugin_init,
|
2019-06-03 10:53:58 +00:00
|
|
|
concat!(env!("CARGO_PKG_VERSION"), "-", env!("COMMIT_ID")),
|
2018-12-06 11:03:04 +00:00
|
|
|
"LGPL",
|
2019-06-03 10:53:58 +00:00
|
|
|
env!("CARGO_PKG_NAME"),
|
|
|
|
env!("CARGO_PKG_NAME"),
|
|
|
|
env!("CARGO_PKG_REPOSITORY"),
|
|
|
|
env!("BUILD_REL_DATE")
|
2018-03-06 09:38:27 +00:00
|
|
|
);
|
2018-04-05 10:36:58 +00:00
|
|
|
|
|
|
|
pub fn set_element_flags<T: glib::IsA<gst::Object> + glib::IsA<gst::Element>>(
|
|
|
|
element: &T,
|
|
|
|
flags: gst::ElementFlags,
|
|
|
|
) {
|
|
|
|
unsafe {
|
2020-11-22 14:24:55 +00:00
|
|
|
let ptr: *mut gst::ffi::GstObject = element.as_ptr() as *mut _;
|
2018-04-05 10:36:58 +00:00
|
|
|
let _guard = MutexGuard::lock(&(*ptr).lock);
|
2021-04-27 15:21:54 +00:00
|
|
|
(*ptr).flags |= flags.into_glib();
|
2018-04-05 10:36:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-08 12:24:07 +00:00
|
|
|
#[must_use = "if unused the Mutex will immediately unlock"]
|
2020-11-22 14:24:55 +00:00
|
|
|
struct MutexGuard<'a>(&'a glib::ffi::GMutex);
|
2018-04-05 10:36:58 +00:00
|
|
|
|
|
|
|
impl<'a> MutexGuard<'a> {
|
2020-11-22 14:24:55 +00:00
|
|
|
pub fn lock(mutex: &'a glib::ffi::GMutex) -> Self {
|
2018-04-05 10:36:58 +00:00
|
|
|
unsafe {
|
2020-11-22 14:24:55 +00:00
|
|
|
glib::ffi::g_mutex_lock(mut_override(mutex));
|
2018-04-05 10:36:58 +00:00
|
|
|
}
|
|
|
|
MutexGuard(mutex)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Drop for MutexGuard<'a> {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
unsafe {
|
2020-11-22 14:24:55 +00:00
|
|
|
glib::ffi::g_mutex_unlock(mut_override(self.0));
|
2018-04-05 10:36:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|