cleanup: webrtc-sys & fix RtcRuntime disposing crashes (#81)
This commit is contained in:
@@ -2,9 +2,8 @@ use super::{ConnectionQuality, ParticipantInner};
|
||||
use crate::prelude::*;
|
||||
use crate::track::TrackError;
|
||||
use livekit_protocol as proto;
|
||||
use livekit_webrtc as rtc;
|
||||
use livekit_webrtc::prelude::*;
|
||||
use parking_lot::RwLockReadGuard;
|
||||
use rtc::prelude::MediaStreamTrack;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::fmt::Debug;
|
||||
use std::sync::Arc;
|
||||
@@ -67,7 +66,7 @@ impl RemoteParticipant {
|
||||
pub(crate) async fn add_subscribed_media_track(
|
||||
&self,
|
||||
sid: TrackSid,
|
||||
media_track: rtc::media_stream::MediaStreamTrack,
|
||||
media_track: MediaStreamTrack,
|
||||
) {
|
||||
let wait_publication = {
|
||||
let participant = self.clone();
|
||||
|
||||
@@ -4,9 +4,8 @@ use crate::prelude::*;
|
||||
use crate::rtc_engine::lk_runtime::LkRuntime;
|
||||
use crate::webrtc::peer_connection_factory::native::PeerConnectionFactoryExt;
|
||||
use livekit_protocol as proto;
|
||||
use livekit_webrtc as rtc;
|
||||
use livekit_webrtc::prelude::*;
|
||||
use parking_lot::Mutex;
|
||||
use rtc::audio_source::native::NativeAudioSource;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::mpsc;
|
||||
@@ -35,7 +34,7 @@ impl Debug for LocalAudioTrack {
|
||||
impl LocalAudioTrack {
|
||||
pub(crate) fn new(
|
||||
name: String,
|
||||
rtc_track: rtc::media_stream::RtcAudioTrack,
|
||||
rtc_track: RtcAudioTrack,
|
||||
capture_options: AudioCaptureOptions,
|
||||
) -> Self {
|
||||
Self {
|
||||
@@ -44,7 +43,7 @@ impl LocalAudioTrack {
|
||||
"unknown".to_string().into(), // sid
|
||||
name,
|
||||
TrackKind::Audio,
|
||||
rtc::media_stream::MediaStreamTrack::Audio(rtc_track),
|
||||
MediaStreamTrack::Audio(rtc_track),
|
||||
),
|
||||
capture_options: Mutex::new(capture_options),
|
||||
}),
|
||||
@@ -102,14 +101,11 @@ impl LocalAudioTrack {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::RtcAudioTrack {
|
||||
if let rtc::media_stream::MediaStreamTrack::Audio(audio) =
|
||||
self.inner.track_inner.rtc_track()
|
||||
{
|
||||
audio
|
||||
} else {
|
||||
unreachable!()
|
||||
pub fn rtc_track(&self) -> RtcAudioTrack {
|
||||
if let MediaStreamTrack::Audio(audio) = self.inner.track_inner.rtc_track() {
|
||||
return audio;
|
||||
}
|
||||
unreachable!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -123,15 +119,12 @@ impl LocalAudioTrack {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn transceiver(&self) -> Option<rtc::rtp_transceiver::RtpTransceiver> {
|
||||
pub(crate) fn transceiver(&self) -> Option<RtpTransceiver> {
|
||||
self.inner.track_inner.transceiver()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn update_transceiver(
|
||||
&self,
|
||||
transceiver: Option<rtc::rtp_transceiver::RtpTransceiver>,
|
||||
) {
|
||||
pub(crate) fn update_transceiver(&self, transceiver: Option<RtpTransceiver>) {
|
||||
self.inner.track_inner.update_transceiver(transceiver)
|
||||
}
|
||||
|
||||
@@ -145,11 +138,11 @@ impl LocalAudioTrack {
|
||||
pub fn create_audio_track(
|
||||
name: &str,
|
||||
options: AudioCaptureOptions,
|
||||
source: NativeAudioSource,
|
||||
source: livekit_webrtc::audio_source::native::NativeAudioSource,
|
||||
) -> LocalAudioTrack {
|
||||
let rtc_track = LkRuntime::instance()
|
||||
.pc_factory()
|
||||
.create_audio_track(&rtc::native::create_random_uuid(), source);
|
||||
.create_audio_track(&livekit_webrtc::native::create_random_uuid(), source);
|
||||
|
||||
Self::new(name.to_string(), rtc_track, options)
|
||||
}
|
||||
|
||||
@@ -2,10 +2,9 @@ use super::TrackInner;
|
||||
use crate::rtc_engine::lk_runtime::LkRuntime;
|
||||
use crate::{options::VideoCaptureOptions, prelude::*};
|
||||
use livekit_protocol as proto;
|
||||
use livekit_webrtc as rtc;
|
||||
use livekit_webrtc::peer_connection_factory::native::PeerConnectionFactoryExt;
|
||||
use livekit_webrtc::prelude::*;
|
||||
use parking_lot::Mutex;
|
||||
use rtc::video_source::native::NativeVideoSource;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::mpsc;
|
||||
@@ -34,7 +33,7 @@ impl Debug for LocalVideoTrack {
|
||||
impl LocalVideoTrack {
|
||||
pub fn new(
|
||||
name: String,
|
||||
rtc_track: rtc::media_stream::RtcVideoTrack,
|
||||
rtc_track: RtcVideoTrack,
|
||||
capture_options: VideoCaptureOptions,
|
||||
) -> Self {
|
||||
Self {
|
||||
@@ -43,7 +42,7 @@ impl LocalVideoTrack {
|
||||
"unknown".to_string().into(), // sid
|
||||
name,
|
||||
TrackKind::Video,
|
||||
rtc::media_stream::MediaStreamTrack::Video(rtc_track),
|
||||
MediaStreamTrack::Video(rtc_track),
|
||||
),
|
||||
capture_options: Mutex::new(capture_options),
|
||||
}),
|
||||
@@ -101,14 +100,11 @@ impl LocalVideoTrack {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::RtcVideoTrack {
|
||||
if let rtc::media_stream::MediaStreamTrack::Video(video) =
|
||||
self.inner.track_inner.rtc_track()
|
||||
{
|
||||
video
|
||||
} else {
|
||||
unreachable!()
|
||||
pub fn rtc_track(&self) -> RtcVideoTrack {
|
||||
if let MediaStreamTrack::Video(video) = self.inner.track_inner.rtc_track() {
|
||||
return video;
|
||||
}
|
||||
unreachable!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -122,15 +118,12 @@ impl LocalVideoTrack {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn transceiver(&self) -> Option<rtc::rtp_transceiver::RtpTransceiver> {
|
||||
pub(crate) fn transceiver(&self) -> Option<RtpTransceiver> {
|
||||
self.inner.track_inner.transceiver()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn update_transceiver(
|
||||
&self,
|
||||
transceiver: Option<rtc::rtp_transceiver::RtpTransceiver>,
|
||||
) {
|
||||
pub(crate) fn update_transceiver(&self, transceiver: Option<RtpTransceiver>) {
|
||||
self.inner.track_inner.update_transceiver(transceiver)
|
||||
}
|
||||
|
||||
@@ -144,11 +137,11 @@ impl LocalVideoTrack {
|
||||
pub fn create_video_track(
|
||||
name: &str,
|
||||
options: VideoCaptureOptions,
|
||||
source: NativeVideoSource,
|
||||
source: livekit_webrtc::video_source::native::NativeVideoSource,
|
||||
) -> LocalVideoTrack {
|
||||
let rtc_track = LkRuntime::instance()
|
||||
.pc_factory()
|
||||
.create_video_track(&rtc::native::create_random_uuid(), source);
|
||||
.create_video_track(&livekit_webrtc::native::create_random_uuid(), source);
|
||||
|
||||
Self::new(name.to_string(), rtc_track, options)
|
||||
}
|
||||
|
||||
@@ -2,9 +2,8 @@ use crate::prelude::*;
|
||||
use livekit_protocol as proto;
|
||||
use livekit_protocol::enum_dispatch;
|
||||
use livekit_protocol::observer::Dispatcher;
|
||||
use livekit_webrtc as rtc;
|
||||
use livekit_webrtc::prelude::*;
|
||||
use parking_lot::Mutex;
|
||||
use rtc::MediaType;
|
||||
use std::sync::atomic::{AtomicBool, AtomicU8, Ordering};
|
||||
use thiserror::Error;
|
||||
use tokio::sync::mpsc;
|
||||
@@ -103,8 +102,8 @@ macro_rules! track_dispatch {
|
||||
pub fn register_observer(self: &Self) -> mpsc::UnboundedReceiver<TrackEvent>;
|
||||
pub fn is_remote(self: &Self) -> bool;
|
||||
|
||||
pub(crate) fn transceiver(self: &Self) -> Option<rtc::rtp_transceiver::RtpTransceiver>;
|
||||
pub(crate) fn update_transceiver(self: &Self, transceiver: Option<rtc::rtp_transceiver::RtpTransceiver>) -> ();
|
||||
pub(crate) fn transceiver(self: &Self) -> Option<RtpTransceiver>;
|
||||
pub(crate) fn update_transceiver(self: &Self, transceiver: Option<RtpTransceiver>) -> ();
|
||||
pub(crate) fn update_info(self: &Self, info: proto::TrackInfo) -> ();
|
||||
);
|
||||
};
|
||||
@@ -114,7 +113,7 @@ impl Track {
|
||||
track_dispatch!([LocalAudio, LocalVideo, RemoteAudio, RemoteVideo]);
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::MediaStreamTrack {
|
||||
pub fn rtc_track(&self) -> MediaStreamTrack {
|
||||
match self {
|
||||
Self::LocalAudio(track) => track.rtc_track().into(),
|
||||
Self::LocalVideo(track) => track.rtc_track().into(),
|
||||
@@ -128,7 +127,7 @@ impl LocalTrack {
|
||||
track_dispatch!([Audio, Video]);
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::MediaStreamTrack {
|
||||
pub fn rtc_track(&self) -> MediaStreamTrack {
|
||||
match self {
|
||||
Self::Audio(track) => track.rtc_track().into(),
|
||||
Self::Video(track) => track.rtc_track().into(),
|
||||
@@ -140,7 +139,7 @@ impl RemoteTrack {
|
||||
track_dispatch!([Audio, Video]);
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::MediaStreamTrack {
|
||||
pub fn rtc_track(&self) -> MediaStreamTrack {
|
||||
match self {
|
||||
Self::Audio(track) => track.rtc_track().into(),
|
||||
Self::Video(track) => track.rtc_track().into(),
|
||||
@@ -152,7 +151,7 @@ impl VideoTrack {
|
||||
track_dispatch!([Local, Remote]);
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::RtcVideoTrack {
|
||||
pub fn rtc_track(&self) -> RtcVideoTrack {
|
||||
match self {
|
||||
Self::Local(track) => track.rtc_track(),
|
||||
Self::Remote(track) => track.rtc_track(),
|
||||
@@ -164,7 +163,7 @@ impl AudioTrack {
|
||||
track_dispatch!([Local, Remote]);
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::RtcAudioTrack {
|
||||
pub fn rtc_track(&self) -> RtcAudioTrack {
|
||||
match self {
|
||||
Self::Local(track) => track.rtc_track().into(),
|
||||
Self::Remote(track) => track.rtc_track().into(),
|
||||
@@ -180,18 +179,13 @@ pub(crate) struct TrackInner {
|
||||
pub source: AtomicU8, // TrackSource
|
||||
pub stream_state: AtomicU8, // StreamState
|
||||
pub muted: AtomicBool,
|
||||
pub rtc_track: rtc::media_stream::MediaStreamTrack,
|
||||
pub transceiver: Mutex<Option<rtc::rtp_transceiver::RtpTransceiver>>,
|
||||
pub rtc_track: MediaStreamTrack,
|
||||
pub transceiver: Mutex<Option<RtpTransceiver>>,
|
||||
pub dispatcher: Dispatcher<TrackEvent>,
|
||||
}
|
||||
|
||||
impl TrackInner {
|
||||
pub fn new(
|
||||
sid: TrackSid,
|
||||
name: String,
|
||||
kind: TrackKind,
|
||||
rtc_track: rtc::media_stream::MediaStreamTrack,
|
||||
) -> Self {
|
||||
pub fn new(sid: TrackSid, name: String, kind: TrackKind, rtc_track: MediaStreamTrack) -> Self {
|
||||
Self {
|
||||
sid: Mutex::new(sid),
|
||||
name: Mutex::new(name),
|
||||
@@ -261,7 +255,7 @@ impl TrackInner {
|
||||
self.dispatcher.dispatch(&event);
|
||||
}
|
||||
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::MediaStreamTrack {
|
||||
pub fn rtc_track(&self) -> MediaStreamTrack {
|
||||
self.rtc_track.clone()
|
||||
}
|
||||
|
||||
@@ -269,11 +263,11 @@ impl TrackInner {
|
||||
self.dispatcher.register()
|
||||
}
|
||||
|
||||
pub fn transceiver(&self) -> Option<rtc::rtp_transceiver::RtpTransceiver> {
|
||||
pub fn transceiver(&self) -> Option<RtpTransceiver> {
|
||||
self.transceiver.lock().clone()
|
||||
}
|
||||
|
||||
pub fn update_transceiver(&self, transceiver: Option<rtc::rtp_transceiver::RtpTransceiver>) {
|
||||
pub fn update_transceiver(&self, transceiver: Option<RtpTransceiver>) {
|
||||
*self.transceiver.lock() = transceiver;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use super::TrackInner;
|
||||
use crate::prelude::*;
|
||||
use livekit_protocol as proto;
|
||||
use livekit_webrtc as rtc;
|
||||
use livekit_webrtc::prelude::*;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::mpsc;
|
||||
@@ -22,17 +22,13 @@ impl Debug for RemoteAudioTrack {
|
||||
}
|
||||
|
||||
impl RemoteAudioTrack {
|
||||
pub(crate) fn new(
|
||||
sid: TrackSid,
|
||||
name: String,
|
||||
rtc_track: rtc::media_stream::RtcAudioTrack,
|
||||
) -> Self {
|
||||
pub(crate) fn new(sid: TrackSid, name: String, rtc_track: RtcAudioTrack) -> Self {
|
||||
Self {
|
||||
inner: Arc::new(TrackInner::new(
|
||||
sid,
|
||||
name,
|
||||
TrackKind::Audio,
|
||||
rtc::media_stream::MediaStreamTrack::Audio(rtc_track),
|
||||
MediaStreamTrack::Audio(rtc_track),
|
||||
)),
|
||||
}
|
||||
}
|
||||
@@ -83,12 +79,11 @@ impl RemoteAudioTrack {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::RtcAudioTrack {
|
||||
if let rtc::media_stream::MediaStreamTrack::Audio(audio) = self.inner.rtc_track() {
|
||||
audio
|
||||
} else {
|
||||
unreachable!()
|
||||
pub fn rtc_track(&self) -> RtcAudioTrack {
|
||||
if let MediaStreamTrack::Audio(audio) = self.inner.rtc_track() {
|
||||
return audio;
|
||||
}
|
||||
unreachable!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -103,16 +98,13 @@ impl RemoteAudioTrack {
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[inline]
|
||||
pub(crate) fn transceiver(&self) -> Option<rtc::rtp_transceiver::RtpTransceiver> {
|
||||
pub(crate) fn transceiver(&self) -> Option<RtpTransceiver> {
|
||||
self.inner.transceiver()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(dead_code)]
|
||||
pub(crate) fn update_transceiver(
|
||||
&self,
|
||||
transceiver: Option<rtc::rtp_transceiver::RtpTransceiver>,
|
||||
) {
|
||||
pub(crate) fn update_transceiver(&self, transceiver: Option<RtpTransceiver>) {
|
||||
self.inner.update_transceiver(transceiver)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use super::TrackInner;
|
||||
use crate::prelude::*;
|
||||
use livekit_protocol as proto;
|
||||
use livekit_webrtc as rtc;
|
||||
use livekit_webrtc::prelude::*;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::mpsc;
|
||||
@@ -22,17 +22,13 @@ impl Debug for RemoteVideoTrack {
|
||||
}
|
||||
|
||||
impl RemoteVideoTrack {
|
||||
pub(crate) fn new(
|
||||
sid: TrackSid,
|
||||
name: String,
|
||||
rtc_track: rtc::media_stream::RtcVideoTrack,
|
||||
) -> Self {
|
||||
pub(crate) fn new(sid: TrackSid, name: String, rtc_track: RtcVideoTrack) -> Self {
|
||||
Self {
|
||||
inner: Arc::new(TrackInner::new(
|
||||
sid,
|
||||
name,
|
||||
TrackKind::Video,
|
||||
rtc::media_stream::MediaStreamTrack::Video(rtc_track),
|
||||
MediaStreamTrack::Video(rtc_track),
|
||||
)),
|
||||
}
|
||||
}
|
||||
@@ -83,12 +79,11 @@ impl RemoteVideoTrack {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn rtc_track(&self) -> rtc::media_stream::RtcVideoTrack {
|
||||
if let rtc::media_stream::MediaStreamTrack::Video(video) = self.inner.rtc_track() {
|
||||
video
|
||||
} else {
|
||||
unreachable!()
|
||||
pub fn rtc_track(&self) -> RtcVideoTrack {
|
||||
if let MediaStreamTrack::Video(video) = self.inner.rtc_track() {
|
||||
return video;
|
||||
}
|
||||
unreachable!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -103,16 +98,13 @@ impl RemoteVideoTrack {
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[inline]
|
||||
pub(crate) fn transceiver(&self) -> Option<rtc::rtp_transceiver::RtpTransceiver> {
|
||||
pub(crate) fn transceiver(&self) -> Option<RtpTransceiver> {
|
||||
self.inner.transceiver()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[inline]
|
||||
pub(crate) fn update_transceiver(
|
||||
&self,
|
||||
transceiver: Option<rtc::rtp_transceiver::RtpTransceiver>,
|
||||
) {
|
||||
pub(crate) fn update_transceiver(&self, transceiver: Option<RtpTransceiver>) {
|
||||
self.inner.update_transceiver(transceiver)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user