mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-02-22 23:56:17 +00:00
webrtcsink: Store navigation events / control request handlers per session
Otherwise only the one from the last established session will be stored and e.g. metas are only sent to that one session. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2078>
This commit is contained in:
parent
50b0ad95e4
commit
63b6fe5edc
1 changed files with 27 additions and 15 deletions
|
@ -325,6 +325,9 @@ struct SessionInner {
|
||||||
codecs: Option<BTreeMap<i32, Codec>>,
|
codecs: Option<BTreeMap<i32, Codec>>,
|
||||||
|
|
||||||
stats_collection_handle: Option<tokio::task::JoinHandle<()>>,
|
stats_collection_handle: Option<tokio::task::JoinHandle<()>>,
|
||||||
|
|
||||||
|
navigation_handler: Option<NavigationEventHandler>,
|
||||||
|
control_events_handler: Option<ControlRequestHandler>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
@ -364,8 +367,6 @@ struct State {
|
||||||
video_serial: u32,
|
video_serial: u32,
|
||||||
streams: HashMap<String, InputStream>,
|
streams: HashMap<String, InputStream>,
|
||||||
discoveries: HashMap<String, Vec<DiscoveryInfo>>,
|
discoveries: HashMap<String, Vec<DiscoveryInfo>>,
|
||||||
navigation_handler: Option<NavigationEventHandler>,
|
|
||||||
control_events_handler: Option<ControlRequestHandler>,
|
|
||||||
signaller_signals: Option<SignallerSignals>,
|
signaller_signals: Option<SignallerSignals>,
|
||||||
finalizing_sessions: Arc<(Mutex<HashSet<String>>, Condvar)>,
|
finalizing_sessions: Arc<(Mutex<HashSet<String>>, Condvar)>,
|
||||||
#[cfg(feature = "web_server")]
|
#[cfg(feature = "web_server")]
|
||||||
|
@ -567,8 +568,6 @@ impl Default for State {
|
||||||
video_serial: 0,
|
video_serial: 0,
|
||||||
streams: HashMap::new(),
|
streams: HashMap::new(),
|
||||||
discoveries: HashMap::new(),
|
discoveries: HashMap::new(),
|
||||||
navigation_handler: None,
|
|
||||||
control_events_handler: None,
|
|
||||||
signaller_signals: Default::default(),
|
signaller_signals: Default::default(),
|
||||||
finalizing_sessions: Arc::new((Mutex::new(HashSet::new()), Condvar::new())),
|
finalizing_sessions: Arc::new((Mutex::new(HashSet::new()), Condvar::new())),
|
||||||
#[cfg(feature = "web_server")]
|
#[cfg(feature = "web_server")]
|
||||||
|
@ -1292,6 +1291,8 @@ impl SessionInner {
|
||||||
stats_sigid: None,
|
stats_sigid: None,
|
||||||
codecs: None,
|
codecs: None,
|
||||||
stats_collection_handle: None,
|
stats_collection_handle: None,
|
||||||
|
navigation_handler: None,
|
||||||
|
control_events_handler: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2764,7 +2765,12 @@ impl BaseWebRTCSink {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(ref handler) = state.control_events_handler {
|
let Some(session) = state.sessions.get(session_id) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let session = session.0.lock().unwrap();
|
||||||
|
|
||||||
|
if let Some(ref handler) = session.control_events_handler {
|
||||||
for meta in utils::serialize_meta(buffer, &settings.forward_metas) {
|
for meta in utils::serialize_meta(buffer, &settings.forward_metas) {
|
||||||
match serde_json::to_string(&utils::InfoMessage {
|
match serde_json::to_string(&utils::InfoMessage {
|
||||||
mid: mid.to_owned(),
|
mid: mid.to_owned(),
|
||||||
|
@ -3372,21 +3378,27 @@ impl BaseWebRTCSink {
|
||||||
|
|
||||||
if enable_data_channel_navigation {
|
if enable_data_channel_navigation {
|
||||||
let mut state = this.state.lock().unwrap();
|
let mut state = this.state.lock().unwrap();
|
||||||
state.navigation_handler = Some(NavigationEventHandler::new(
|
if let Some(session) = state.sessions.get_mut(&session_id) {
|
||||||
|
let mut session = session.0.lock().unwrap();
|
||||||
|
session.navigation_handler = Some(NavigationEventHandler::new(
|
||||||
&element,
|
&element,
|
||||||
&webrtcbin,
|
&webrtcbin,
|
||||||
&session_id,
|
&session_id,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if enable_control_data_channel {
|
if enable_control_data_channel {
|
||||||
let mut state = this.state.lock().unwrap();
|
let mut state = this.state.lock().unwrap();
|
||||||
state.control_events_handler = Some(ControlRequestHandler::new(
|
if let Some(session) = state.sessions.get_mut(&session_id) {
|
||||||
|
let mut session = session.0.lock().unwrap();
|
||||||
|
session.control_events_handler = Some(ControlRequestHandler::new(
|
||||||
&element,
|
&element,
|
||||||
&webrtcbin,
|
&webrtcbin,
|
||||||
&session_id,
|
&session_id,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This is intentionally emitted with the pipeline in the Ready state,
|
// This is intentionally emitted with the pipeline in the Ready state,
|
||||||
// so that application code can create data channels at the correct
|
// so that application code can create data channels at the correct
|
||||||
|
|
Loading…
Reference in a new issue