@@ -181,6 +181,7 @@ void FlutterMediaStream::GetUserAudio(const EncodableMap& constraints,
181
181
params[EncodableValue (" audioTracks" )] = EncodableValue (audioTracks);
182
182
stream->AddTrack (track);
183
183
184
+ base_->audio_sources_ [track->id ().std_string ()] = source;
184
185
base_->local_tracks_ [track->id ().std_string ()] = track;
185
186
}
186
187
}
@@ -319,6 +320,7 @@ void FlutterMediaStream::GetUserVideo(const EncodableMap& constraints,
319
320
320
321
stream->AddTrack (track);
321
322
323
+ base_->video_sources_ [track->id ().std_string ()] = source;
322
324
base_->local_tracks_ [track->id ().std_string ()] = track;
323
325
base_->video_capturers_ [track->id ().std_string ()] = video_capturer;
324
326
}
@@ -483,12 +485,14 @@ void FlutterMediaStream::MediaStreamDispose(
483
485
for (auto track : audio_tracks.std_vector ()) {
484
486
stream->RemoveTrack (track);
485
487
base_->local_tracks_ .erase (track->id ().std_string ());
488
+ base_->audio_sources_ .erase (track->id ().std_string ());
486
489
}
487
490
488
491
vector<scoped_refptr<RTCVideoTrack>> video_tracks = stream->video_tracks ();
489
492
for (auto track : video_tracks.std_vector ()) {
490
493
stream->RemoveTrack (track);
491
494
base_->local_tracks_ .erase (track->id ().std_string ());
495
+ base_->video_sources_ .erase (track->id ().std_string ());
492
496
if (base_->video_capturers_ .find (track->id ().std_string ()) !=
493
497
base_->video_capturers_ .end ()) {
494
498
auto video_capture = base_->video_capturers_ [track->id ().std_string ()];
@@ -558,4 +562,55 @@ void FlutterMediaStream::MediaStreamTrackDispose(
558
562
base_->RemoveMediaTrackForId (track_id);
559
563
result->Success ();
560
564
}
565
+
566
+ void FlutterMediaStream::MediaStreamTrackClone (
567
+ const std::string& track_id,
568
+ std::unique_ptr<MethodResultProxy> result) {
569
+
570
+ std::string new_track_id = base_->GenerateUUID ();
571
+
572
+ EncodableMap track_params;
573
+
574
+ for (auto it : base_->local_streams_ ) {
575
+ auto stream = it.second ;
576
+ auto audio_tracks = stream->audio_tracks ();
577
+ for (auto original_audio_track : audio_tracks.std_vector ()) {
578
+ if (original_audio_track->id ().std_string () == track_id) {
579
+ // clone audio track
580
+ auto audio_source = base_->audio_sources_ [track_id];
581
+ scoped_refptr<RTCAudioTrack> track =
582
+ base_->factory_ ->CreateAudioTrack (audio_source, new_track_id);
583
+ base_->audio_sources_ [track->id ().std_string ()] = audio_source;
584
+
585
+ track_params[EncodableValue (" readyState" )] = " live" ;
586
+ track_params[EncodableValue (" kind" )] =
587
+ EncodableValue (track->kind ().std_string ());
588
+ track_params[EncodableValue (" enabled" )] =
589
+ EncodableValue (track->enabled ());
590
+ }
591
+ }
592
+ auto video_tracks = stream->video_tracks ();
593
+ for (auto original_video_track : video_tracks.std_vector ()) {
594
+ if (original_video_track->id ().std_string () == track_id) {
595
+ // clone video track
596
+ auto video_source = base_->video_sources_ [track_id];
597
+ // TODO copy surface texture
598
+ scoped_refptr<RTCVideoTrack> track =
599
+ base_->factory_ ->CreateVideoTrack (video_source, new_track_id);
600
+ base_->video_sources_ [track->id ().std_string ()] = video_source;
601
+
602
+ track_params[EncodableValue (" readyState" )] = " live" ;
603
+ track_params[EncodableValue (" kind" )] =
604
+ EncodableValue (track->kind ().std_string ());
605
+ track_params[EncodableValue (" enabled" )] =
606
+ EncodableValue (track->enabled ());
607
+ }
608
+ }
609
+ }
610
+ track_params[EncodableValue (" id" )] = EncodableValue (new_track_id);
611
+ track_params[EncodableValue (" label" )] = EncodableValue (new_track_id);
612
+ track_params[EncodableValue (" remote" )] = EncodableValue (false );
613
+
614
+ result->Success (EncodableValue (track_params));
615
+ }
561
616
} // namespace stream_webrtc_flutter_plugin
0 commit comments