@@ -196,10 +196,12 @@ std::string CameraStateStr(CameraState s) {
196196
197197Camera::Camera (int camera_id, flutter::TextureRegistrar* texture_registrar,
198198 flutter::MethodChannel<flutter::EncodableValue>* channel,
199- CameraConfig config)
199+ CameraConfig config,
200+ PlatformTaskPoster platform_task_poster)
200201 : camera_id_(camera_id),
201202 texture_registrar_(texture_registrar),
202203 channel_(channel),
204+ platform_task_poster_(std::move(platform_task_poster)),
203205 config_(std::move(config)) {}
204206
205207Camera::~Camera () {
@@ -1188,6 +1190,8 @@ void Camera::PostImageStreamFrame(const uint8_t* data, int width, int height) {
11881190
11891191void Camera::ImageStreamLoop () {
11901192 CoInitializeEx (nullptr , COINIT_MULTITHREADED );
1193+ auto * channel = channel_;
1194+ const int camera_id = camera_id_;
11911195
11921196 while (image_stream_running_.load ()) {
11931197 ImageStreamSlot local;
@@ -1201,18 +1205,21 @@ void Camera::ImageStreamLoop() {
12011205 image_stream_slot_.dirty = false ;
12021206 }
12031207
1204- channel_->InvokeMethod (
1205- " imageStreamFrame" ,
1206- std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{
1207- {flutter::EncodableValue (" cameraId" ),
1208- flutter::EncodableValue (camera_id_)},
1209- {flutter::EncodableValue (" width" ),
1210- flutter::EncodableValue (local.width )},
1211- {flutter::EncodableValue (" height" ),
1212- flutter::EncodableValue (local.height )},
1213- {flutter::EncodableValue (" bytes" ),
1214- flutter::EncodableValue (local.data )},
1215- }));
1208+ platform_task_poster_ (
1209+ [channel, camera_id, local = std::move (local)]() mutable {
1210+ channel->InvokeMethod (
1211+ " imageStreamFrame" ,
1212+ std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{
1213+ {flutter::EncodableValue (" cameraId" ),
1214+ flutter::EncodableValue (camera_id)},
1215+ {flutter::EncodableValue (" width" ),
1216+ flutter::EncodableValue (local.width )},
1217+ {flutter::EncodableValue (" height" ),
1218+ flutter::EncodableValue (local.height )},
1219+ {flutter::EncodableValue (" bytes" ),
1220+ flutter::EncodableValue (local.data )},
1221+ }));
1222+ });
12161223 }
12171224
12181225 CoUninitialize ();
@@ -1241,14 +1248,18 @@ void Camera::ResumePreview() {
12411248// ============================================================================
12421249
12431250void Camera::SendError (const std::string& description) {
1244- channel_->InvokeMethod (
1245- " cameraError" ,
1246- std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{
1247- {flutter::EncodableValue (" cameraId" ),
1248- flutter::EncodableValue (camera_id_)},
1249- {flutter::EncodableValue (" description" ),
1250- flutter::EncodableValue (description)},
1251- }));
1251+ auto * channel = channel_;
1252+ int camera_id = camera_id_;
1253+ platform_task_poster_ ([channel, camera_id, description]() {
1254+ channel->InvokeMethod (
1255+ " cameraError" ,
1256+ std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{
1257+ {flutter::EncodableValue (" cameraId" ),
1258+ flutter::EncodableValue (camera_id)},
1259+ {flutter::EncodableValue (" description" ),
1260+ flutter::EncodableValue (description)},
1261+ }));
1262+ });
12521263}
12531264
12541265// ============================================================================
@@ -1373,12 +1384,18 @@ void Camera::DisposeInternal() {
13731384 texture_.reset ();
13741385 }
13751386
1376- channel_->InvokeMethod (
1377- " cameraClosing" ,
1378- std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{
1379- {flutter::EncodableValue (" cameraId" ),
1380- flutter::EncodableValue (camera_id_)},
1381- }));
1387+ {
1388+ auto * channel = channel_;
1389+ int camera_id = camera_id_;
1390+ platform_task_poster_ ([channel, camera_id]() {
1391+ channel->InvokeMethod (
1392+ " cameraClosing" ,
1393+ std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{
1394+ {flutter::EncodableValue (" cameraId" ),
1395+ flutter::EncodableValue (camera_id)},
1396+ }));
1397+ });
1398+ }
13821399
13831400 {
13841401 std::lock_guard<std::mutex> lk (state_mutex_);
0 commit comments