What you should be aware of: I don't know what I'm doing. Going into this I was very unfamiliar with the
webrtcbin internals. I understand them much better now, but I'm still not confident in what I've produced. I'm also generally not diligent enough to write C these days (curse you, memory management); I've probably introduced small memory leaks by forgetting to free returned copies of values, or else unref that which must be unreffed.
Regardless, I want to at least kick this off. I reached out on the mailing list looking for help with this, but kept at it as well, and this is the result.
As far as I am aware, this only supports manually initiated ICE restarts when acting as the initiator.
First, we utilize the create-offer signal's options structure to pass in a restart flag. That restart flag is propagated into appropriate locations to tweak the behavior of
- generate new ice-pwd and ice-ufrag values
- ensure the creation of a new sdp media section with the correct ufrag and pwd
Next, we update
GstWebRTCICE such that when it sets the new credentials, it compares them to the prior credentials, and if they are changed will invoke the new
gst_webrtc_ice_stream_restart on the appropriate stream.
gst_webrtc_ice_stream_restart does a few things:
- Resets the stream's gathering state (come to think of it, this may not be necessary)
nice_agent_restart_streamwith the appropriate
- Retrieve the full list of local candidates for
- Re-signals said candidates through a dirty hack
The dirty hack is commented in the changes. I am deeply ashamed to have thought of it, and I await your collective judgement.