@@ -13,6 +13,7 @@ using namespace DolbyIO;
1313
1414void UDolbyIOSubsystem::BindMaterial (UMaterialInstanceDynamic* Material, const FString& VideoTrackID)
1515{
16+ FScopeLock Lock{&VideoSinksLock};
1617 for (auto & Sink : VideoSinks)
1718 {
1819 if (Sink.Key != VideoTrackID)
@@ -29,6 +30,7 @@ void UDolbyIOSubsystem::BindMaterial(UMaterialInstanceDynamic* Material, const F
2930
3031void UDolbyIOSubsystem::UnbindMaterial (UMaterialInstanceDynamic* Material, const FString& VideoTrackID)
3132{
33+ FScopeLock Lock{&VideoSinksLock};
3234 if (const std::shared_ptr<DolbyIO::FVideoSink>* Sink = VideoSinks.Find (VideoTrackID))
3335 {
3436 (*Sink)->UnbindMaterial (Material);
@@ -37,6 +39,7 @@ void UDolbyIOSubsystem::UnbindMaterial(UMaterialInstanceDynamic* Material, const
3739
3840UTexture2D* UDolbyIOSubsystem::GetTexture (const FString& VideoTrackID)
3941{
42+ FScopeLock Lock{&VideoSinksLock};
4043 if (const std::shared_ptr<FVideoSink>* Sink = VideoSinks.Find (VideoTrackID))
4144 {
4245 return (*Sink)->GetTexture ();
@@ -47,9 +50,18 @@ UTexture2D* UDolbyIOSubsystem::GetTexture(const FString& VideoTrackID)
4750void UDolbyIOSubsystem::BroadcastVideoTrackAdded (const FDolbyIOVideoTrack& VideoTrack)
4851{
4952 DLB_UE_LOG (" Video track added: TrackID=%s ParticipantID=%s" , *VideoTrack.TrackID , *VideoTrack.ParticipantID );
53+ WarnIfVideoTrackSuspicious (VideoTrack.TrackID );
5054 BroadcastEvent (OnVideoTrackAdded, VideoTrack);
5155}
5256
57+ void UDolbyIOSubsystem::WarnIfVideoTrackSuspicious (const FString& VideoTrackID)
58+ {
59+ if (VideoTrackID == " {-}" )
60+ {
61+ DLB_UE_LOG_BASE (Warning, " Suspicious video track ID added, things may not work as expected" );
62+ }
63+ }
64+
5365void UDolbyIOSubsystem::BroadcastVideoTrackEnabled (const FDolbyIOVideoTrack& VideoTrack)
5466{
5567 DLB_UE_LOG (" Video track enabled: TrackID=%s ParticipantID=%s" , *VideoTrack.TrackID , *VideoTrack.ParticipantID );
@@ -60,31 +72,35 @@ void UDolbyIOSubsystem::ProcessBufferedVideoTracks(const FString& ParticipantID)
6072{
6173 if (TArray<FDolbyIOVideoTrack>* AddedTracks = BufferedAddedVideoTracks.Find (ParticipantID))
6274 {
75+ FScopeLock Lock{&VideoSinksLock};
6376 for (const FDolbyIOVideoTrack& AddedTrack : *AddedTracks)
6477 {
65- VideoSinks[AddedTrack.TrackID ]->OnTextureCreated (
66- [=]
67- {
68- BroadcastVideoTrackAdded (AddedTrack);
69-
70- if (TArray<FDolbyIOVideoTrack>* EnabledTracks = BufferedEnabledVideoTracks.Find (ParticipantID))
78+ if (std::shared_ptr<DolbyIO::FVideoSink>* Sink = VideoSinks.Find (AddedTrack.TrackID ))
79+ {
80+ (*Sink)->OnTextureCreated (
81+ [=]
7182 {
72- TArray<FDolbyIOVideoTrack>& EnabledTracksRef = *EnabledTracks;
73- for (int i = 0 ; i < EnabledTracksRef.Num (); ++i)
83+ BroadcastVideoTrackAdded (AddedTrack);
84+
85+ if (TArray<FDolbyIOVideoTrack>* EnabledTracks = BufferedEnabledVideoTracks.Find (ParticipantID))
7486 {
75- if (EnabledTracksRef[i].TrackID == AddedTrack.TrackID )
87+ TArray<FDolbyIOVideoTrack>& EnabledTracksRef = *EnabledTracks;
88+ for (int i = 0 ; i < EnabledTracksRef.Num (); ++i)
7689 {
77- BroadcastVideoTrackEnabled (EnabledTracksRef[i]);
78- EnabledTracksRef.RemoveAt (i);
79- if (!EnabledTracksRef.Num ())
90+ if (EnabledTracksRef[i].TrackID == AddedTrack.TrackID )
8091 {
81- BufferedEnabledVideoTracks.Remove (ParticipantID);
92+ BroadcastVideoTrackEnabled (EnabledTracksRef[i]);
93+ EnabledTracksRef.RemoveAt (i);
94+ if (!EnabledTracksRef.Num ())
95+ {
96+ BufferedEnabledVideoTracks.Remove (ParticipantID);
97+ }
98+ return ;
8299 }
83- return ;
84100 }
85101 }
86- }
87- });
102+ });
103+ }
88104 }
89105 BufferedAddedVideoTracks.Remove (ParticipantID);
90106 }
@@ -94,13 +110,14 @@ void UDolbyIOSubsystem::Handle(const remote_video_track_added& Event)
94110{
95111 const FDolbyIOVideoTrack VideoTrack = ToFDolbyIOVideoTrack (Event.track );
96112
113+ FScopeLock Lock1{&VideoSinksLock};
97114 VideoSinks.Emplace (VideoTrack.TrackID , std::make_shared<FVideoSink>(VideoTrack.TrackID ));
98115 Sdk->video ()
99116 .remote ()
100117 .set_video_sink (Event.track , VideoSinks[VideoTrack.TrackID ])
101118 .on_error (DLB_ERROR_HANDLER_NO_DELEGATE);
102119
103- FScopeLock Lock {&RemoteParticipantsLock};
120+ FScopeLock Lock2 {&RemoteParticipantsLock};
104121 if (RemoteParticipants.Contains (VideoTrack.ParticipantID ))
105122 {
106123 VideoSinks[VideoTrack.TrackID ]->OnTextureCreated ([this , VideoTrack] { BroadcastVideoTrackAdded (VideoTrack); });
@@ -117,9 +134,19 @@ void UDolbyIOSubsystem::Handle(const remote_video_track_removed& Event)
117134{
118135 const FDolbyIOVideoTrack VideoTrack = ToFDolbyIOVideoTrack (Event.track );
119136 DLB_UE_LOG (" Video track removed: TrackID=%s ParticipantID=%s" , *VideoTrack.TrackID , *VideoTrack.ParticipantID );
137+ WarnIfVideoTrackSuspicious (VideoTrack.TrackID );
138+
139+ FScopeLock Lock{&VideoSinksLock};
140+ if (std::shared_ptr<DolbyIO::FVideoSink>* Sink = VideoSinks.Find (VideoTrack.TrackID ))
141+ {
142+ (*Sink)->UnbindAllMaterials ();
143+ VideoSinks.Remove (VideoTrack.TrackID );
144+ }
145+ else
146+ {
147+ DLB_UE_LOG_BASE (Warning, " Non-existent video track removed" );
148+ }
120149
121- VideoSinks[VideoTrack.TrackID ]->UnbindAllMaterials ();
122- VideoSinks.Remove (VideoTrack.TrackID );
123150 BroadcastEvent (OnVideoTrackRemoved, VideoTrack);
124151}
125152
0 commit comments