From 9331824479e6633f0f733a8d0957c6a473ec1927 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Thu, 19 Sep 2024 15:19:45 +0200 Subject: [PATCH] webrtcsrc: expose MSID property on source pad Part-of: --- docs/plugins/gst_plugins_cache.json | 16 ++++++++++++- net/webrtc/src/webrtcsrc/imp.rs | 2 ++ net/webrtc/src/webrtcsrc/pad.rs | 35 ++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/docs/plugins/gst_plugins_cache.json b/docs/plugins/gst_plugins_cache.json index 4279e58b2..b93309965 100644 --- a/docs/plugins/gst_plugins_cache.json +++ b/docs/plugins/gst_plugins_cache.json @@ -10996,7 +10996,21 @@ "GInitiallyUnowned", "GObject" ], - "kind": "object" + "kind": "object", + "properties": { + "msid": { + "blurb": "Remote MediaStream ID in use for this pad", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + } } }, "package": "gst-plugin-webrtc", diff --git a/net/webrtc/src/webrtcsrc/imp.rs b/net/webrtc/src/webrtcsrc/imp.rs index 3162d9511..223563460 100644 --- a/net/webrtc/src/webrtcsrc/imp.rs +++ b/net/webrtc/src/webrtcsrc/imp.rs @@ -419,6 +419,8 @@ impl Session { self.id ); webrtcbin_pad.store_sticky_event(&builder.build()).ok(); + + srcpad.imp().set_webrtc_pad(webrtcbin_pad.downgrade()); } let ghostpad = gst::GhostPad::builder(gst::PadDirection::Src) diff --git a/net/webrtc/src/webrtcsrc/pad.rs b/net/webrtc/src/webrtcsrc/pad.rs index a8b0769f0..807bac382 100644 --- a/net/webrtc/src/webrtcsrc/pad.rs +++ b/net/webrtc/src/webrtcsrc/pad.rs @@ -1,7 +1,9 @@ // SPDX-License-Identifier: MPL-2.0 use gst::glib; +use gst::prelude::*; use gst::subclass::prelude::*; +use once_cell::sync::Lazy; use std::sync::atomic::AtomicBool; use std::sync::atomic::Ordering; use std::sync::Mutex; @@ -10,6 +12,7 @@ use std::sync::Mutex; pub struct WebRTCSrcPad { needs_raw: AtomicBool, stream_id: Mutex>, + webrtcbin_pad: Mutex>>, } impl WebRTCSrcPad { @@ -29,6 +32,10 @@ impl WebRTCSrcPad { let stream_id = self.stream_id.lock().unwrap(); stream_id.as_ref().unwrap().clone() } + + pub fn set_webrtc_pad(&self, pad: glib::object::WeakRef) { + *self.webrtcbin_pad.lock().unwrap() = Some(pad); + } } #[glib::object_subclass] @@ -38,7 +45,33 @@ impl ObjectSubclass for WebRTCSrcPad { type ParentType = gst::GhostPad; } -impl ObjectImpl for WebRTCSrcPad {} +impl ObjectImpl for WebRTCSrcPad { + fn properties() -> &'static [glib::ParamSpec] { + static PROPS: Lazy> = Lazy::new(|| { + vec![glib::ParamSpecString::builder("msid") + .flags(glib::ParamFlags::READABLE) + .blurb("Remote MediaStream ID in use for this pad") + .build()] + }); + PROPS.as_ref() + } + fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { + match pspec.name() { + "msid" => { + let msid = self + .webrtcbin_pad + .lock() + .unwrap() + .as_ref() + .and_then(|p| p.upgrade()) + .map(|p| p.property::("msid")); + + msid.to_value() + } + name => panic!("no readable property {name:?}"), + } + } +} impl GstObjectImpl for WebRTCSrcPad {} impl PadImpl for WebRTCSrcPad {} impl ProxyPadImpl for WebRTCSrcPad {}