webrtcsink: use spawn_blocking instead of call_async
In webrtcsink
, we terminate a session by setting the session's pipeline to
Null
like this:
pipeline.call_async(|pipeline| {
[...]
pipeline.set_state(gst::State::Null);
[...]
// the following cvar is awaited in unprepare()
cvar.notify_one();
});
However, pipeline.call_async
keeps a ref on the pipeline until it's done,
which means the cvar
is notified before pipeline
is actually 'disposed',
which happens in a different thread than unprepare
's. gst_rtp_bin_dispose
releases some resources when the pipeline is unrefed. In some cases, those
resources are actually released after the main thread has returned, leading
to various issues.
This commit uses tokio runtime's spawn_blocking
instead, which allows owning
and disposing of the pipeline before the cvar
is notified.