Skip to content

Commit d8f58f1

Browse files
authored
Merge pull request #37 from GetStream/fix/windows-missing-dll
fix: cloneTrack on windows and linux
2 parents eebf991 + 97955b4 commit d8f58f1

File tree

5 files changed

+70
-1
lines changed

5 files changed

+70
-1
lines changed

common/cpp/include/flutter_media_stream.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class FlutterMediaStream {
4444
void MediaStreamTrackDispose(const std::string& track_id,
4545
std::unique_ptr<MethodResultProxy> result);
4646

47+
void MediaStreamTrackClone(const std::string& track_id,
48+
std::unique_ptr<MethodResultProxy> result);
49+
4750
void CreateLocalMediaStream(std::unique_ptr<MethodResultProxy> result);
4851

4952
void OnDeviceChange();

common/cpp/include/flutter_webrtc_base.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ class FlutterWebRTCBase {
119119
data_channel_observers_;
120120
std::map<std::string, std::shared_ptr<FlutterPeerConnectionObserver>>
121121
peerconnection_observers_;
122+
std::map<std::string, scoped_refptr<RTCVideoSource>> video_sources_;
123+
std::map<std::string, scoped_refptr<RTCAudioSource>> audio_sources_;
122124
mutable std::mutex mutex_;
123125

124126
void lock() { mutex_.lock(); }

common/cpp/src/flutter_media_stream.cc

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ void FlutterMediaStream::GetUserAudio(const EncodableMap& constraints,
181181
params[EncodableValue("audioTracks")] = EncodableValue(audioTracks);
182182
stream->AddTrack(track);
183183

184+
base_->audio_sources_[track->id().std_string()] = source;
184185
base_->local_tracks_[track->id().std_string()] = track;
185186
}
186187
}
@@ -319,6 +320,7 @@ void FlutterMediaStream::GetUserVideo(const EncodableMap& constraints,
319320

320321
stream->AddTrack(track);
321322

323+
base_->video_sources_[track->id().std_string()] = source;
322324
base_->local_tracks_[track->id().std_string()] = track;
323325
base_->video_capturers_[track->id().std_string()] = video_capturer;
324326
}
@@ -483,12 +485,14 @@ void FlutterMediaStream::MediaStreamDispose(
483485
for (auto track : audio_tracks.std_vector()) {
484486
stream->RemoveTrack(track);
485487
base_->local_tracks_.erase(track->id().std_string());
488+
base_->audio_sources_.erase(track->id().std_string());
486489
}
487490

488491
vector<scoped_refptr<RTCVideoTrack>> video_tracks = stream->video_tracks();
489492
for (auto track : video_tracks.std_vector()) {
490493
stream->RemoveTrack(track);
491494
base_->local_tracks_.erase(track->id().std_string());
495+
base_->video_sources_.erase(track->id().std_string());
492496
if (base_->video_capturers_.find(track->id().std_string()) !=
493497
base_->video_capturers_.end()) {
494498
auto video_capture = base_->video_capturers_[track->id().std_string()];
@@ -558,4 +562,55 @@ void FlutterMediaStream::MediaStreamTrackDispose(
558562
base_->RemoveMediaTrackForId(track_id);
559563
result->Success();
560564
}
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+
}
561616
} // namespace stream_webrtc_flutter_plugin

common/cpp/src/flutter_webrtc.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,15 @@ void FlutterWebRTC::HandleMethodCall(
432432
GetValue<EncodableMap>(*method_call.arguments());
433433
const std::string track_id = findString(params, "trackId");
434434
MediaStreamTrackDispose(track_id, std::move(result));
435+
} else if (method_call.method_name().compare("trackClone") == 0) {
436+
if (!method_call.arguments()) {
437+
result->Error("Bad Arguments", "Null constraints arguments received");
438+
return;
439+
}
440+
const EncodableMap params =
441+
GetValue<EncodableMap>(*method_call.arguments());
442+
const std::string track_id = findString(params, "trackId");
443+
MediaStreamTrackClone(track_id, std::move(result));
435444
} else if (method_call.method_name().compare("restartIce") == 0) {
436445
if (!method_call.arguments()) {
437446
result->Error("Bad Arguments", "Null constraints arguments received");

windows/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE
4747
)
4848

4949
# List of absolute paths to libraries that should be bundled with the plugin
50-
set(flutter_webrtc_bundled_libraries
50+
set(stream_webrtc_flutter_bundled_libraries
5151
"${CMAKE_CURRENT_SOURCE_DIR}/../third_party/libwebrtc/lib/win64/libwebrtc.dll"
5252
PARENT_SCOPE
5353
)

0 commit comments

Comments
 (0)