8000 fix: Try to fix the non-platform thread call error. (#1795) · flutter-webrtc/flutter-webrtc@1c2ff6f · GitHub
[go: up one dir, main page]

Skip to content

Commit 1c2ff6f

Browse files
authored
fix: Try to fix the non-platform thread call error. (#1795)
* fix: Try to fix the non-platform thread call error. * using hidden window for event post. * fix. * fix.
1 parent 9b48495 commit 1c2ff6f

21 files changed

+297
-68
lines changed

common/cpp/include/flutter_common.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212

1313
#include <list>
1414
#include <memory>
15-
#include <string>
15+
#include <mutex>
1616
#include <optional>
17+
#include <queue>
18+
#include <string>
1719

1820
typedef flutter::EncodableValue EncodableValue;
1921
typedef flutter::EncodableMap EncodableMap;
@@ -27,6 +29,8 @@ typedef flutter::EventSink<EncodableValue> EventSink;
2729
typedef flutter::MethodCall<EncodableValue> MethodCall;
2830
typedef flutter::MethodResult<EncodableValue> MethodResult;
2931

32+
class TaskRunner;
33+
3034
// foo.StringValue() becomes std::get<std::string>(foo)
3135
// foo.IsString() becomes std::holds_alternative<std::string>(foo)
3236

@@ -90,7 +94,8 @@ inline double findDouble(const EncodableMap& map, const std::string& key) {
9094
return 0.0;
9195
}
9296

93-
inline std::optional<double> maybeFindDouble(const EncodableMap& map, const std::string& key) {
97+
inline std::optional<double> maybeFindDouble(const EncodableMap& map,
98+
const std::string& key) {
9499
auto it = map.find(EncodableValue(key));
95100
if (it != map.end() && TypeIs<double>(it->second))
96101
return GetValue<double>(it->second);
@@ -171,6 +176,7 @@ class EventChannelProxy {
171176
public:
172177
static std::unique_ptr<EventChannelProxy> Create(
173178
BinaryMessenger* messenger,
179+
TaskRunner* task_runner,
174180 F438
const std::string& channelName);
175181

176182
virtual ~EventChannelProxy() = default;

common/cpp/include/flutter_data_channel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class FlutterRTCDataChannelObserver : public RTCDataChannelObserver {
1010
public:
1111
FlutterRTCDataChannelObserver(scoped_refptr<RTCDataChannel> data_channel,
1212
BinaryMessenger* messenger,
13+
TaskRunner* task_runner,
1314
const std::string& channel_name);
1415
virtual ~FlutterRTCDataChannelObserver();
1516

common/cpp/include/flutter_frame_cryptor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ namespace flutter_webrtc_plugin {
1010

1111
class FlutterFrameCryptorObserver : public libwebrtc::RTCFrameCryptorObserver {
1212
public:
13-
FlutterFrameCryptorObserver(BinaryMessenger* messenger,const std::string& channelName)
14-
: event_channel_(EventChannelProxy::Create(messenger, channelName)) {}
13+
FlutterFrameCryptorObserver(BinaryMessenger* messenger, TaskRunner* task_runner, const std::string& channelName)
14+
: event_channel_(EventChannelProxy::Create(messenger, task_runner, channelName)) {}
1515
void OnFrameCryptionStateChanged(
1616
const string participant_id,
1717
libwebrtc::RTCFrameCryptionState state);

common/cpp/include/flutter_peerconnection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class FlutterPeerConnectionObserver : public RTCPeerConnectionObserver {
1111
FlutterPeerConnectionObserver(FlutterWebRTCBase* base,
1212
scoped_refptr<RTCPeerConnection> peerconnection,
1313
BinaryMessenger* messenger,
14+
TaskRunner* task_runner,
1415
const std::string& channel_name,
1516
std::string& peerConnectionId);
1617

common/cpp/include/flutter_video_renderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class FlutterVideoRenderer
2222

2323
void initialize(TextureRegistrar* registrar,
2424
BinaryMessenger* messenger,
25+
TaskRunner* task_runner,
2526
std::unique_ptr<flutter::TextureVariant> texture,
2627
int64_t texture_id);
2728

common/cpp/include/flutter_webrtc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class FlutterWebRTCPlugin : public flutter::Plugin {
2121
virtual BinaryMessenger* messenger() = 0;
2222

2323
virtual TextureRegistrar* textures() = 0;
24+
25+
virtual TaskRunner* task_runner() = 0;
2426
};
2527

2628
class FlutterWebRTC : public FlutterWebRTCBase,

common/cpp/include/flutter_webrtc_base.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class FlutterWebRTCBase {
4343
enum ParseConstraintType { kMandatory, kOptional };
4444

4545
public:
46-
FlutterWebRTCBase(BinaryMessenger* messenger, TextureRegistrar* textures);
46+
FlutterWebRTCBase(BinaryMessenger* messenger, TextureRegistrar* textures, TaskRunner* task_runner);
4747
~FlutterWebRTCBase();
4848

4949
std::string GenerateUUID();
@@ -122,6 +122,7 @@ class FlutterWebRTCBase {
122122

123123
protected:
124124
BinaryMessenger* messenger_;
125+
TaskRunner *task_runner_;
125126
TextureRegistrar* textures_;
126127
std::unique_ptr<EventChannelProxy> event_channel_;
127128
};

common/cpp/include/task_runner.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2024 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
#ifndef PACKAGES_FLUTTER_WEBRTC_TASK_RUNNER_H_
5+
#define PACKAGES_FLUTTER_WEBRTC_TASK_RUNNER_H_
6+
7+
#include <functional>
8+
9+
using TaskClosure = std::function<void()>;
10+
11+
class TaskRunner {
12+
public:
13+
virtual void EnqueueTask(TaskClosure task) = 0;
14+
virtual ~TaskRunner() = default;
15+
};
16+
17+
#endif // PACKAGES_FLUTTER_WEBRTC_TASK_RUNNER_H_

common/cpp/src/flutter_common.cc

Lines changed: 70 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#include "flutter_common.h"
2+
#include "task_runner.h"
3+
4+
#include <memory>
25

36
class MethodCallProxyImpl : public MethodCallProxy {
47
public:
@@ -66,56 +69,75 @@ std::unique_ptr<MethodResultProxy> MethodResultProxy::Create(
6669
}
6770

6871
class EventChannelProxyImpl : public EventChannelProxy {
69-
public:
70-
EventChannelProxyImpl(BinaryMessenger* messenger,
71-
const std::string& channelName)
72-
: channel_(std::make_unique<EventChannel>(
73-
messenger,
74-
channelName,
75-
&flutter::StandardMethodCodec::GetInstance())) {
76-
auto handler = std::make_unique<
77-
flutter::StreamHandlerFunctions<EncodableValue>>(
78-
[&](const EncodableValue* arguments,
79-
std::unique_ptr<flutter::EventSink<EncodableValue>>&& events)
80-
-> std::unique_ptr<flutter::StreamHandlerError<EncodableValue>> {
81-
sink_ = std::move(events);
82-
for (auto& event : event_queue_) {
83-
sink_->Success(event);
84-
}
85-
event_queue_.clear();
86-
on_listen_called_ = true;
87-
return nullptr;
88-
},
89-
[&](const EncodableValue* arguments)
90-
-> std::unique_ptr<flutter::StreamHandlerError<EncodableValue>> {
91-
on_listen_called_ = false;
92-
return nullptr;
93-
});
94-
95-
channel_->SetStreamHandler(std::move(handler));
96-
}
97-
98-
virtual ~EventChannelProxyImpl() {}
99-
100-
void Success(const EncodableValue& event, bool cache_event = true) override {
101-
if (on_listen_called_) {
72+
public:
73+
EventChannelProxyImpl(BinaryMessenger* messenger,
74+
TaskRunner* task_runner,
75+
const std::string& channelName)
76+
: channel_(std::make_unique<EventChannel>(
77+
messenger,
78+
channelName,
79+
&flutter::StandardMethodCodec::GetInstance())),
80+
task_runner_(task_runner) {
81+
auto handler = std::make_unique<
82+
flutter::StreamHandlerFunctions<EncodableValue>>(
83+
[&](const EncodableValue* arguments,
84+
std::unique_ptr<flutter::EventSink<EncodableValue>>&& events)
85+
-> std::unique_ptr<flutter::StreamHandlerError<EncodableValue>> {
86+
sink_ = std::move(events);
87+
std::weak_ptr<EventSink> weak_sink = sink_;
88+
for (auto& event : event_queue_) {
89+
PostEvent(event);
90+
}
91+
event_queue_.clear();
92+
on_listen_called_ = true;
93+
return nullptr;
94+
},
95+
[&](const EncodableValue* arguments)
96+
-> std::unique_ptr<flutter::StreamHandlerError<EncodableValue>> {
97+
on_listen_called_ = false;
98+
return nullptr;
99+
});
100+
101+
channel_->SetStreamHandler(std::move(handler));
102+
}
103+
104+
virtual ~EventChannelProxyImpl() {}
105+
106+
void Success(const EncodableValue& event, bool cache_event = true) override {
107+
if (on_listen_called_) {
108+
PostEvent(event);
109+
} else {
110+
if (cache_event) {
111+
event_queue_.push_back(event);
112+
}
113+
}
114+
}
115+
116+
void PostEvent(const EncodableValue& event) {
117+
if(task_runner_) {
118+
std::weak_ptr<EventSink> weak_sink = sink_;
119+
task_runner_->EnqueueTask([weak_sink, event]() {
120+
auto sink = weak_sink.lock();
121+
if (sink) {
122+
sink->Success(event);
123+
}
124+
});
125+
} else {
102126
sink_->Success(event);
103-
} else {
104-
if (cache_event) {
105-
event_queue_.push_back(event);
106-
}
107-
}
108-
}
109-
110-
private:
111-
std::unique_ptr<EventChannel> channel_;
112-
std::unique_ptr<EventSink> sink_;
113-
std::list<EncodableValue> event_queue_;
114-
bool on_listen_called_ = false;
115-
};
127+
}
128+
}
129+
130+
private:
131+
std::unique_ptr<EventChannel> channel_;
132+
std::shared_ptr<flutter::EventSink<flutter::EncodableValue>> sink_;
133+
std::list<EncodableValue> event_queue_;
134+
bool on_listen_called_ = false;
135+
TaskRunner* task_runner_;
136+
};
116137

117138
std::unique_ptr<EventChannelProxy> EventChannelProxy::Create(
118139
BinaryMessenger* messenger,
140+
TaskRunner* task_runner,
119141
const std::string& channelName) {
120-
return std::make_unique<EventChannelProxyImpl>(messenger, channelName);
121-
}
142+
return std::make_unique<EventChannelProxyImpl>(messenger, task_runner, channelName);
143+
}

common/cpp/src/flutter_data_channel.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ namespace flutter_webrtc_plugin {
77
FlutterRTCDataChannelObserver::FlutterRTCDataChannelObserver(
88
scoped_refptr<RTCDataChannel> data_channel,
99
BinaryMessenger* messenger,
10+
TaskRunner* task_runner,
1011
const std::string& channelName)
11-
: event_channel_(EventChannelProxy::Create(messenger, channelName)),
12+
: event_channel_(EventChannelProxy::Create(messenger, task_runner, channelName)),
1213
data_channel_(data_channel) {
1314
data_channel_->RegisterObserver(this);
1415
}
@@ -53,7 +54,7 @@ void FlutterDataChannel::CreateDataChannel(
5354
"FlutterWebRTC/dataChannelEvent" + peerConnectionId + uuid;
5455

5556
std::unique_ptr<FlutterRTCDataChannelObserver> observer(
56-
new FlutterRTCDataChannelObserver(data_channel, base_->messenger_,
57+
new FlutterRTCDataChannelObserver(data_channel, base_->messenger_, base_->task_runner_,
5758
event_channel));
5859

5960
base_->lock();

common/cpp/src/flutter_frame_cryptor.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void FlutterFrameCryptor::FrameCryptorFactoryCreateFrameCryptor(
166166
keyProvider);
167167
std::string event_channel = "FlutterWebRTC/frameCryptorEvent" + uuid;
168168

169-
scoped_refptr<FlutterFrameCryptorObserver> observer(new RefCountedObject<FlutterFrameCryptorObserver>(base_->messenger_, event_channel));
169+
scoped_refptr<FlutterFrameCryptorObserver> observer(new RefCountedObject<FlutterFrameCryptorObserver>(base_->messenger_, base_->task_runner_, event_channel));
170170

171171
frameCryptor->RegisterRTCFrameCryptorObserver(observer);
172172

@@ -192,7 +192,7 @@ void FlutterFrameCryptor::FrameCryptorFactoryCreateFrameCryptor(
192192

193193
std::string event_channel = "FlutterWebRTC/frameCryptorEvent" + uuid;
194194

195-
scoped_refptr<FlutterFrameCryptorObserver> observer(new RefCountedObject<FlutterFrameCryptorObserver>(base_->messenger_, event_channel));
195+
scoped_refptr<FlutterFrameCryptorObserver> observer(new RefCountedObject<FlutterFrameCryptorObserver>(base_->messenger_, base_->task_runner_, event_channel));
196196

197197
frameCryptor->RegisterRTCFrameCryptorObserver(observer.get());
198198

common/cpp/src/flutter_peerconnection.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ void FlutterPeerConnection::CreateRTCPeerConnection(
338338

339339
std::unique_ptr<FlutterPeerConnectionObserver> observer(
340340
new FlutterPeerConnectionObserver(base_, pc, base_->messenger_,
341+
base_->task_runner_,
341342
event_channel, uuid));
342343

343344
base_->peerconnection_observers_[uuid] = std::move(observer);
@@ -1118,9 +1119,10 @@ FlutterPeerConnectionObserver::FlutterPeerConnectionObserver(
11181119
FlutterWebRTCBase* base,
11191120
scoped_refptr<RTCPeerConnection> peerconnection,
11201121
BinaryMessenger* messenger,
1122+
TaskRunner* task_runner,
11211123
const std::string& channel_name,
11221124
std::string& peerConnectionId)
1123-
: event_channel_(EventChannelProxy::Create(messenger, channel_name)),
1125+
: event_channel_(EventChannelProxy::Create(messenger, task_runner, channel_name)),
11241126
peerconnection_(peerconnection),
11251127
base_(base),
11261128
id_(peerConnectionId) {
@@ -1326,6 +1328,7 @@ void FlutterPeerConnectionObserver::OnDataChannel(
13261328

13271329
std::unique_ptr<FlutterRTCDataChannelObserver> observer(
13281330
new FlutterRTCDataChannelObserver(data_channel, base_->messenger_,
1331+
base_->task_runner_,
13291332
event_channel));
13301333

13311334
base_->lock();

common/cpp/src/flutter_video_renderer.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ FlutterVideoRenderer::~FlutterVideoRenderer() {}
77
void FlutterVideoRenderer::initialize(
88
TextureRegistrar* registrar,
99
BinaryMessenger* messenger,
10+
TaskRunner* task_runner,
1011
std::unique_ptr<flutter::TextureVariant> texture,
1112
int64_t trxture_id) {
1213
registrar_ = registrar;
1314
texture_ = std::move(texture);
1415
texture_id_ = trxture_id;
1516
std::string channel_name =
1617
"FlutterWebRTC/Texture" + std::to_string(texture_id_);
17-
event_channel_ = EventChannelProxy::Create(messenger, channel_name);
18+
event_channel_ = EventChannelProxy::Create(messenger, task_runner, channel_name);
1819
}
1920

2021
const FlutterDesktopPixelBuffer* FlutterVideoRenderer::CopyPixelBuffer(
@@ -121,7 +122,7 @@ void FlutterVideoRendererManager::CreateVideoRendererTexture(
121122
}));
122123

123124
auto texture_id = base_->textures_->RegisterTexture(textureVariant.get());
124-
texture->initialize(base_->textures_, base_->messenger_,
125+
texture->initialize(base_->textures_, base_->messenger_, base_->task_runner_,
125126
std::move(textureVariant), texture_id);
126127
renderers_[texture_id] = texture;
127128
EncodableMap params;

common/cpp/src/flutter_webrtc.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ namespace flutter_webrtc_plugin {
66

77
FlutterWebRTC::FlutterWebRTC(FlutterWebRTCPlugin* plugin)
88
: FlutterWebRTCBase::FlutterWebRTCBase(plugin->messenger(),
9-
plugin->textures()),
9+
plugin->textures(),
10+
plugin->task_runner()),
1011
FlutterVideoRendererManager::FlutterVideoRendererManager(this),
1112
FlutterMediaStream::FlutterMediaStream(this),
1213
FlutterPeerConnection::FlutterPeerConnection(this),

common/cpp/src/flutter_webrtc_base.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ namespace flutter_webrtc_plugin {
88
const char* kEventChannelName = "FlutterWebRTC.Event";
99

1010
FlutterWebRTCBase::FlutterWebRTCBase(BinaryMessenger* messenger,
11-
TextureRegistrar* textures)
12-
: messenger_(messenger), textures_(textures) {
11+
TextureRegistrar* textures,
12+
TaskRunner *task_runner)
13+
: messenger_(messenger), task_runner_(task_runner), textures_(textures) {
1314
LibWebRTC::Initialize();
1415
factory_ = LibWebRTC::CreateRTCPeerConnectionFactory();
1516
audio_device_ = factory_->GetAudioDevice();
1617
video_device_ = factory_->GetVideoDevice();
1718
desktop_device_ = factory_->GetDesktopDevice();
18-
event_channel_ = EventChannelProxy::Create(messenger_, kEventChannelName);
19+
event_channel_ = EventChannelProxy::Create(messenger_, task_runner_, kEventChannelName);
1920
}
2021

2122
FlutterWebRTCBase::~FlutterWebRTCBase() {

elinux/flutter_webrtc_plugin.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin {
3737

3838
TextureRegistrar* textures() { return textures_; }
3939

40+
TaskRunner* task_runner() { return nullptr; }
41+
4042
private:
4143
// Creates a plugin that communicates on the given channel.
4244
FlutterWebRTCPluginImpl(PluginRegistrar* registrar,

linux/flutter_webrtc_plugin.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin {
3737

3838
TextureRegistrar* textures() { return textures_; }
3939

40+
TaskRunner* task_runner() { return nullptr; }
41+
4042
private:
4143
// Creates a plugin that communicates on the given channel.
4244
FlutterWebRTCPluginImpl(PluginRegistrar* registrar,

windows/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ add_library(${PLUGIN_NAME} SHARED
2222
"../common/cpp/src/flutter_webrtc_base.cc"
2323
"../third_party/uuidxx/uuidxx.cc"
2424
"flutter_webrtc_plugin.cc"
25+
"task_runner_windows.cc"
2526
)
2627

2728
include_directories(

0 commit comments

Comments
 (0)
0