From aa86c804bd0d6c419de9dbaa4cd1f3ac34a5770d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 23 Feb 2020 10:00:05 +0200 Subject: [PATCH] rtsp_server/media: Implement take_pipeline() manually Because of floating reference problems in the API that have to be worked around. --- Gir_GstRtspServer.toml | 4 +++ gstreamer-rtsp-server/src/auto/rtsp_media.rs | 11 -------- gstreamer-rtsp-server/src/lib.rs | 5 ++++ gstreamer-rtsp-server/src/rtsp_media.rs | 27 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 gstreamer-rtsp-server/src/rtsp_media.rs diff --git a/Gir_GstRtspServer.toml b/Gir_GstRtspServer.toml index 0b9b4765d..1aac770d1 100644 --- a/Gir_GstRtspServer.toml +++ b/Gir_GstRtspServer.toml @@ -261,6 +261,10 @@ status = "generate" [object.function.return] bool_return_is_error = "Failed to unsuspend media" + [[object.function]] + name = "take_pipeline" + ignore = true + [[object]] name = "GstRtspServer.RTSPMediaFactory" status = "generate" diff --git a/gstreamer-rtsp-server/src/auto/rtsp_media.rs b/gstreamer-rtsp-server/src/auto/rtsp_media.rs index c7cd118ca..dcf361283 100644 --- a/gstreamer-rtsp-server/src/auto/rtsp_media.rs +++ b/gstreamer-rtsp-server/src/auto/rtsp_media.rs @@ -183,8 +183,6 @@ pub trait RTSPMediaExt: 'static { fn suspend(&self) -> Result<(), glib::error::BoolError>; - fn take_pipeline>(&self, pipeline: &P); - fn unprepare(&self) -> Result<(), glib::error::BoolError>; fn unsuspend(&self) -> Result<(), glib::error::BoolError>; @@ -764,15 +762,6 @@ impl> RTSPMediaExt for O { } } - fn take_pipeline>(&self, pipeline: &P) { - unsafe { - gst_rtsp_server_sys::gst_rtsp_media_take_pipeline( - self.as_ref().to_glib_none().0, - pipeline.as_ref().to_glib_full(), - ); - } - } - fn unprepare(&self) -> Result<(), glib::error::BoolError> { unsafe { glib_result_from_gboolean!( diff --git a/gstreamer-rtsp-server/src/lib.rs b/gstreamer-rtsp-server/src/lib.rs index 1e94b45ae..08b10336e 100644 --- a/gstreamer-rtsp-server/src/lib.rs +++ b/gstreamer-rtsp-server/src/lib.rs @@ -52,6 +52,7 @@ mod rtsp_address_pool; mod rtsp_auth; mod rtsp_client; mod rtsp_context; +mod rtsp_media; mod rtsp_media_factory; mod rtsp_server; mod rtsp_session_pool; @@ -60,9 +61,12 @@ mod rtsp_stream_transport; mod rtsp_thread; mod rtsp_token; +pub mod subclass; + pub use rtsp_address_pool::RTSPAddressPoolExtManual; pub use rtsp_auth::RTSPAuthExtManual; pub use rtsp_client::RTSPClientExtManual; +pub use rtsp_media::RTSPMediaExtManual; pub use rtsp_media_factory::RTSPMediaFactoryExtManual; pub use rtsp_server::RTSPServerExtManual; pub use rtsp_session_pool::RTSPSessionPoolExtManual; @@ -142,6 +146,7 @@ pub mod prelude { pub use rtsp_address_pool::RTSPAddressPoolExtManual; pub use rtsp_auth::RTSPAuthExtManual; pub use rtsp_client::RTSPClientExtManual; + pub use rtsp_media::RTSPMediaExtManual; pub use rtsp_media_factory::RTSPMediaFactoryExtManual; pub use rtsp_server::RTSPServerExtManual; pub use rtsp_session_pool::RTSPSessionPoolExtManual; diff --git a/gstreamer-rtsp-server/src/rtsp_media.rs b/gstreamer-rtsp-server/src/rtsp_media.rs new file mode 100644 index 000000000..40c15d0e6 --- /dev/null +++ b/gstreamer-rtsp-server/src/rtsp_media.rs @@ -0,0 +1,27 @@ +use glib::object::IsA; +use glib::translate::*; +use gst; +use gst_rtsp_server_sys; + +use RTSPMedia; + +pub trait RTSPMediaExtManual: 'static { + fn take_pipeline>(&self, pipeline: &P); +} + +impl> RTSPMediaExtManual for O { + fn take_pipeline>(&self, pipeline: &P) { + unsafe { + let pipeline = pipeline.as_ref().to_glib_full(); + // See https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/merge_requests/109 + gobject_sys::g_object_force_floating(pipeline as *mut _); + gst_rtsp_server_sys::gst_rtsp_media_take_pipeline( + self.as_ref().to_glib_none().0, + pipeline, + ); + if gobject_sys::g_object_is_floating(pipeline as *mut _) != glib_sys::GFALSE { + gobject_sys::g_object_ref_sink(pipeline as *mut _); + } + } + } +}