Skip to content

Commit 181a7a6

Browse files
authored
[camera] Apply new external texture APIs (#119)
Signed-off-by: Boram Bae <[email protected]>
1 parent ad518d1 commit 181a7a6

File tree

6 files changed

+65
-49
lines changed

6 files changed

+65
-49
lines changed

packages/camera/CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
## 0.1.0
22

3-
* Initial release.
3+
* Initial release.
4+
5+
## 0.2.0
6+
7+
* Apply new external texture APIs

packages/camera/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ This package is not an _endorsed_ implementation of `camera`. Therefore, you hav
2626
```yaml
2727
dependencies:
2828
camera: ^0.8.1
29-
camera_tizen: ^0.1.0
29+
camera_tizen: ^0.2.0
3030
```
3131
3232
Then you can import `camera` in your Dart code:

packages/camera/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: camera_tizen
22
description: Tizen implementation of the camera plugin
33
homepage: https://github.com/flutter-tizen/plugins
4-
version: 0.1.0
4+
version: 0.2.0
55

66
dependencies:
77
flutter:

packages/camera/tizen/src/camera_device.cc

+44-25
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,10 @@ CameraDevice::CameraDevice() {
253253
}
254254

255255
CameraDevice::CameraDevice(flutter::PluginRegistrar *registrar,
256-
FlutterTextureRegistrar *texture_registrar,
257256
CameraDeviceType type,
258257
ResolutionPreset resolution_preset,
259258
bool enable_audio)
260259
: registrar_(registrar),
261-
texture_registrar_(texture_registrar),
262260
type_(type),
263261
resolution_preset_(resolution_preset),
264262
enable_audio_(enable_audio) {
@@ -326,7 +324,39 @@ CameraDevice::CameraDevice(flutter::PluginRegistrar *registrar,
326324
SetResolutionPreset(resolution_preset_);
327325

328326
// 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+
330360
LOG_DEBUG("texture_id_[%ld]", texture_id_);
331361
camera_method_channel_ =
332362
std::make_unique<CameraMethodChannel>(registrar_, texture_id_);
@@ -397,9 +427,8 @@ void CameraDevice::Dispose() {
397427
orientation_manager_->Stop();
398428
}
399429

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_);
403432
}
404433
}
405434

@@ -921,25 +950,15 @@ void CameraDevice::Open(
921950
}
922951

923952
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_);
943962
}
944963
})) {
945964
result->Error(kCameraDeviceError, "Failed to set media callback");

packages/camera/tizen/src/camera_device.h

+8-7
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
#include <flutter/encodable_value.h>
1010
#include <flutter/method_result.h>
1111
#include <flutter/plugin_registrar.h>
12-
#include <flutter_tizen_texture_registrar.h>
1312
#include <recorder.h>
1413

14+
#include <mutex>
15+
1516
#include "camera_method_channel.h"
1617
#include "device_method_channel.h"
1718
#include "orientation_manager.h"
@@ -207,16 +208,13 @@ class CameraDevice {
207208
static flutter::EncodableValue GetAvailableCameras();
208209

209210
CameraDevice();
210-
CameraDevice(flutter::PluginRegistrar *registrar,
211-
FlutterTextureRegistrar *texture_registrar,
212-
CameraDeviceType typem, ResolutionPreset resolution_preset,
213-
bool enable_audio);
211+
CameraDevice(flutter::PluginRegistrar *registrar, CameraDeviceType typem,
212+
ResolutionPreset resolution_preset, bool enable_audio);
214213
~CameraDevice();
215214

216215
void ChangeCameraDeviceType(CameraDeviceType type);
217216
void Dispose();
218217
Size GetRecommendedPreviewResolution();
219-
FlutterTextureRegistrar *GetTextureRegistrar() { return texture_registrar_; }
220218
long GetTextureId() { return texture_id_; }
221219
double GetMaxExposureOffset();
222220
double GetMinExposureOffset();
@@ -325,7 +323,10 @@ class CameraDevice {
325323

326324
long texture_id_{0};
327325
flutter::PluginRegistrar *registrar_{nullptr};
328-
FlutterTextureRegistrar *texture_registrar_{nullptr};
326+
std::unique_ptr<flutter::TextureVariant> texture_variant_;
327+
std::unique_ptr<FlutterDesktopGpuBuffer> flutter_desktop_gpu_buffer_;
328+
media_packet_h packet_{nullptr};
329+
std::mutex mutex_;
329330

330331
std::unique_ptr<CameraMethodChannel> camera_method_channel_;
331332
std::unique_ptr<DeviceMethodChannel> device_method_channel_;

packages/camera/tizen/src/camera_plugin.cc

+6-14
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include <flutter/method_channel.h>
88
#include <flutter/plugin_registrar.h>
99
#include <flutter/standard_method_codec.h>
10-
#include <flutter_tizen_texture_registrar.h>
1110

1211
#include <map>
1312
#include <memory>
@@ -36,16 +35,13 @@ bool GetValueFromEncodableMap(flutter::EncodableMap &map, std::string key,
3635

3736
class CameraPlugin : public flutter::Plugin {
3837
public:
39-
static void RegisterWithRegistrar(
40-
flutter::PluginRegistrar *registrar,
41-
FlutterTextureRegistrar *texture_registrar) {
38+
static void RegisterWithRegistrar(flutter::PluginRegistrar *registrar) {
4239
auto camera_channel =
4340
std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
4441
registrar->messenger(), CAMERA_CHANNEL_NAME,
4542
&flutter::StandardMethodCodec::GetInstance());
4643

47-
auto camera_plugin =
48-
std::make_unique<CameraPlugin>(registrar, texture_registrar);
44+
auto camera_plugin = std::make_unique<CameraPlugin>(registrar);
4945

5046
camera_channel->SetMethodCallHandler(
5147
[plugin_pointer = camera_plugin.get()](const auto &call, auto result) {
@@ -55,9 +51,7 @@ class CameraPlugin : public flutter::Plugin {
5551
registrar->AddPlugin(std::move(camera_plugin));
5652
}
5753

58-
CameraPlugin(flutter::PluginRegistrar *registrar,
59-
FlutterTextureRegistrar *texture_registrar)
60-
: registrar_(registrar), texture_registrar_(texture_registrar) {}
54+
CameraPlugin(flutter::PluginRegistrar *registrar) : registrar_(registrar) {}
6155

6256
virtual ~CameraPlugin() {}
6357

@@ -334,8 +328,8 @@ class CameraPlugin : public flutter::Plugin {
334328
ResolutionPreset resolution_preset = ResolutionPreset::kLow;
335329
StringToResolutionPreset(preset, resolution_preset);
336330

337-
camera_ = std::make_unique<CameraDevice>(
338-
registrar_, texture_registrar_, type, resolution_preset, enable_audio);
331+
camera_ = std::make_unique<CameraDevice>(registrar_, type,
332+
resolution_preset, enable_audio);
339333

340334
flutter::EncodableMap ret;
341335
ret[flutter::EncodableValue("cameraId")] =
@@ -344,7 +338,6 @@ class CameraPlugin : public flutter::Plugin {
344338
}
345339

346340
flutter::PluginRegistrar *registrar_{nullptr};
347-
FlutterTextureRegistrar *texture_registrar_{nullptr};
348341
std::unique_ptr<CameraDevice> camera_;
349342
PermissionManager pmm_;
350343
};
@@ -353,6 +346,5 @@ void CameraPluginRegisterWithRegistrar(
353346
FlutterDesktopPluginRegistrarRef registrar) {
354347
CameraPlugin::RegisterWithRegistrar(
355348
flutter::PluginRegistrarManager::GetInstance()
356-
->GetRegistrar<flutter::PluginRegistrar>(registrar),
357-
FlutterPluginRegistrarGetTexture(registrar));
349+
->GetRegistrar<flutter::PluginRegistrar>(registrar));
358350
}

0 commit comments

Comments
 (0)