diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index b2f76807a..ecd209860 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.1 + +* Apply texture api change. + ## 0.3.0 * Update camera to 0.9.4. diff --git a/packages/camera/README.md b/packages/camera/README.md index ac494539f..55af812f3 100644 --- a/packages/camera/README.md +++ b/packages/camera/README.md @@ -26,7 +26,7 @@ This package is not an _endorsed_ implementation of `camera`. Therefore, you hav ```yaml dependencies: camera: ^0.9.4 - camera_tizen: ^0.3.0 + camera_tizen: ^0.3.1 ``` Then you can import `camera` in your Dart code: diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 85b79c161..5ed3f5beb 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_tizen description: Tizen implementation of the camera plugin homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/camera -version: 0.3.0 +version: 0.3.1 dependencies: camera_platform_interface: ^2.1.1 diff --git a/packages/camera/tizen/src/camera_device.cc b/packages/camera/tizen/src/camera_device.cc index edd736cc4..a52abc00d 100644 --- a/packages/camera/tizen/src/camera_device.cc +++ b/packages/camera/tizen/src/camera_device.cc @@ -40,15 +40,6 @@ std::string CreateTempFileName(const std::string &prefix, return file_name; } -bool IsValidMediaPacket(media_packet_h media_packet) { - tbm_surface_h surface = nullptr; - int ret = media_packet_get_tbm_surface(media_packet, &surface); - if (ret != MEDIA_PACKET_ERROR_NONE) { - return false; - } - return true; -} - ExifTagOrientation ChooseExifTagOrientatoin(OrientationType device_orientation, bool is_front_lens_facing) { ExifTagOrientation orientation = ExifTagOrientation::kTopLeft; @@ -343,22 +334,9 @@ CameraDevice::CameraDevice(flutter::PluginRegistrar *registrar, [this](size_t width, size_t height) -> const FlutterDesktopGpuBuffer * { std::lock_guard lock(mutex_); - if (prepared_packet_ && !IsValidMediaPacket(prepared_packet_)) { - media_packet_destroy(prepared_packet_); - prepared_packet_ = nullptr; - } - if (current_packet_ && !IsValidMediaPacket(current_packet_)) { - media_packet_destroy(current_packet_); - current_packet_ = nullptr; - } - if (!prepared_packet_ && !current_packet_) { + if (!current_packet_) { return nullptr; } - if (prepared_packet_ && !current_packet_) { - current_packet_ = prepared_packet_; - prepared_packet_ = nullptr; - } - tbm_surface_h surface = nullptr; int ret = media_packet_get_tbm_surface(current_packet_, &surface); if (ret != MEDIA_PACKET_ERROR_NONE) { @@ -370,14 +348,13 @@ CameraDevice::CameraDevice(flutter::PluginRegistrar *registrar, flutter_desktop_gpu_buffer_->buffer = surface; flutter_desktop_gpu_buffer_->width = width; flutter_desktop_gpu_buffer_->height = height; + flutter_desktop_gpu_buffer_->release_callback = + [](void *release_context) { + CameraDevice *cd = (CameraDevice *)release_context; + cd->ReleaseMediaPacket(); + }; + flutter_desktop_gpu_buffer_->release_context = this; return flutter_desktop_gpu_buffer_.get(); - }, - [this](void *buffer) -> void { - std::lock_guard lock(mutex_); - if (current_packet_) { - media_packet_destroy(current_packet_); - current_packet_ = nullptr; - } })); texture_id_ = registrar_->texture_registrar()->RegisterTexture(texture_variant_.get()); @@ -401,6 +378,14 @@ CameraDevice::CameraDevice(flutter::PluginRegistrar *registrar, CameraDevice::~CameraDevice() { Dispose(); } +void CameraDevice::ReleaseMediaPacket() { + std::lock_guard lock(mutex_); + if (current_packet_) { + media_packet_destroy(current_packet_); + current_packet_ = nullptr; + } +} + bool CameraDevice::CreateCamera() { int error = camera_create((camera_device_e)type_, &camera_); RETV_LOG_ERROR_IF(error != CAMERA_ERROR_NONE, false, @@ -461,11 +446,6 @@ void CameraDevice::Dispose() { media_packet_destroy(current_packet_); current_packet_ = nullptr; } - - if (prepared_packet_) { - media_packet_destroy(prepared_packet_); - prepared_packet_ = nullptr; - } } bool CameraDevice::ForeachCameraSupportedCaptureResolutions( @@ -988,17 +968,17 @@ void CameraDevice::Open( if (!SetCameraMediaPacketPreviewCb([](media_packet_h packet, void *data) { auto self = static_cast(data); std::lock_guard lock(self->mutex_); - if (self->prepared_packet_) { - media_packet_destroy(self->prepared_packet_); - self->prepared_packet_ = packet; + if (self->current_packet_) { + media_packet_destroy(self->current_packet_); + self->current_packet_ = packet; return; } if (self->is_preview_paused_) { media_packet_destroy(packet); - self->prepared_packet_ = nullptr; + self->current_packet_ = nullptr; return; } - self->prepared_packet_ = packet; + self->current_packet_ = packet; self->registrar_->texture_registrar()->MarkTextureFrameAvailable( self->texture_id_); })) { diff --git a/packages/camera/tizen/src/camera_device.h b/packages/camera/tizen/src/camera_device.h index aa4168861..7813fe949 100644 --- a/packages/camera/tizen/src/camera_device.h +++ b/packages/camera/tizen/src/camera_device.h @@ -253,6 +253,8 @@ class CameraDevice { void PausePreview() { is_preview_paused_ = true; } void ResumePreview() { is_preview_paused_ = false; } + void ReleaseMediaPacket(); + private: bool CreateCamera(); bool ClearCameraAutoFocusArea(); @@ -329,7 +331,6 @@ class CameraDevice { std::unique_ptr texture_variant_; std::unique_ptr flutter_desktop_gpu_buffer_; media_packet_h current_packet_{nullptr}; - media_packet_h prepared_packet_{nullptr}; std::mutex mutex_;