@@ -253,12 +253,10 @@ CameraDevice::CameraDevice() {
253
253
}
254
254
255
255
CameraDevice::CameraDevice (flutter::PluginRegistrar *registrar,
256
- FlutterTextureRegistrar *texture_registrar,
257
256
CameraDeviceType type,
258
257
ResolutionPreset resolution_preset,
259
258
bool enable_audio)
260
259
: registrar_(registrar),
261
- texture_registrar_(texture_registrar),
262
260
type_(type),
263
261
resolution_preset_(resolution_preset),
264
262
enable_audio_(enable_audio) {
@@ -326,7 +324,39 @@ CameraDevice::CameraDevice(flutter::PluginRegistrar *registrar,
326
324
SetResolutionPreset (resolution_preset_);
327
325
328
326
// Init channels
329
- texture_id_ = FlutterRegisterExternalTexture (texture_registrar_);
327
+ texture_variant_ =
328
+ std::make_unique<flutter::TextureVariant>(flutter::GpuBufferTexture (
329
+ [this ](size_t width,
330
+ size_t height) -> const FlutterDesktopGpuBuffer * {
331
+ std::lock_guard<std::mutex> lock (mutex_);
332
+ if (packet_ == nullptr ) {
333
+ return nullptr ;
334
+ }
335
+ tbm_surface_h surface;
336
+ int ret = media_packet_get_tbm_surface (packet_, &surface);
337
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
338
+ LOG_ERROR (" media_packet_get_tbm_surface failed, error: %d" , ret);
339
+ media_packet_destroy (packet_);
340
+ packet_ = nullptr ;
341
+ return nullptr ;
342
+ }
343
+
344
+ flutter_desktop_gpu_buffer_->buffer = surface;
345
+ flutter_desktop_gpu_buffer_->width = width;
346
+ flutter_desktop_gpu_buffer_->height = height;
347
+ return flutter_desktop_gpu_buffer_.get ();
348
+ },
349
+ [this ](void *buffer) -> void {
350
+ std::lock_guard<std::mutex> lock (mutex_);
351
+ if (packet_) {
352
+ media_packet_destroy (packet_);
353
+ packet_ = nullptr ;
354
+ }
355
+ }));
356
+ texture_id_ =
357
+ registrar_->texture_registrar ()->RegisterTexture (texture_variant_.get ());
358
+ flutter_desktop_gpu_buffer_ = std::make_unique<FlutterDesktopGpuBuffer>();
359
+
330
360
LOG_DEBUG (" texture_id_[%ld]" , texture_id_);
331
361
camera_method_channel_ =
332
362
std::make_unique<CameraMethodChannel>(registrar_, texture_id_);
@@ -397,9 +427,8 @@ void CameraDevice::Dispose() {
397
427
orientation_manager_->Stop ();
398
428
}
399
429
400
- if (texture_registrar_) {
401
- FlutterUnregisterExternalTexture (texture_registrar_, texture_id_);
402
- texture_registrar_ = nullptr ;
430
+ if (texture_id_ != 0 ) {
431
+ registrar_->texture_registrar ()->UnregisterTexture (texture_id_);
403
432
}
404
433
}
405
434
@@ -921,25 +950,15 @@ void CameraDevice::Open(
921
950
}
922
951
923
952
if (!SetCameraMediaPacketPreviewCb ([](media_packet_h pkt, void *data) {
924
- tbm_surface_h surface = nullptr ;
925
- int error = media_packet_get_tbm_surface (pkt, &surface);
926
- LOG_ERROR_IF (error != MEDIA_PACKET_ERROR_NONE,
927
- " media_packet_get_tbm_surface fail - error[%d]: %s" , error,
928
- get_error_message (error));
929
-
930
- if (error == 0 ) {
931
- auto camera_device = static_cast <CameraDevice *>(data);
932
- FlutterMarkExternalTextureFrameAvailable (
933
- camera_device->GetTextureRegistrar (),
934
- camera_device->GetTextureId (), surface);
935
- }
936
-
937
- // destroy packet
938
- if (pkt) {
939
- error = media_packet_destroy (pkt);
940
- LOG_ERROR_IF (error != MEDIA_PACKET_ERROR_NONE,
941
- " media_packet_destroy fail - error[%d]: %s" , error,
942
- get_error_message (error));
953
+ auto self = static_cast <CameraDevice *>(data);
954
+ std::lock_guard<std::mutex> lock (self->mutex_ );
955
+ media_packet_h unused_packet = self->packet_ ;
956
+ self->packet_ = pkt;
957
+ if (unused_packet != nullptr ) {
958
+ media_packet_destroy (unused_packet);
959
+ } else {
960
+ self->registrar_ ->texture_registrar ()->MarkTextureFrameAvailable (
961
+ self->texture_id_ );
943
962
}
944
963
})) {
945
964
result->Error (kCameraDeviceError , " Failed to set media callback" );
0 commit comments