[camera] Source code refactoring (#31)

Changes:
* Source code refactoring
* Add temporary code for camera image stream APIs
This commit is contained in:
Hidenori Matsubayashi
2021-08-17 17:49:36 +09:00
committed by GitHub
parent 736eb878ee
commit 34feab80cc
11 changed files with 173 additions and 71 deletions
+58 -21
View File
@@ -11,11 +11,12 @@
#include <memory>
#include "camera_stream_handler_impl.h"
#include "channels/event_channel_image_stream.h"
#include "channels/method_channel_camera.h"
#include "channels/method_channel_device.h"
#include "events/camera_initialized_event.h"
#include "gst_camera.h"
#include "messages/messages.h"
#include "method_channel/method_channel_camera.h"
#include "method_channel/method_channel_device.h"
namespace {
constexpr char kCameraChannelName[] = "plugins.flutter.io/camera";
@@ -82,6 +83,12 @@ class CameraPlugin : public flutter::Plugin {
void HandleInitializeCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void HandleStartImageStreamCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void HandleStopImageStreamCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
void HandleGetMaxZoomLevelCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
@@ -105,6 +112,9 @@ class CameraPlugin : public flutter::Plugin {
std::unique_ptr<flutter::TextureVariant> texture_;
std::unique_ptr<GstCamera> camera_ = nullptr;
int64_t texture_id_;
std::unique_ptr<EventChannelImageStream> event_channel_image_stream_ =
nullptr;
std::unique_ptr<MethodChannelCamera> method_channel_camera_;
std::unique_ptr<MethodChannelDevice> method_channel_device_;
};
@@ -168,9 +178,9 @@ void CameraPlugin::HandleMethodCall(
} else if (!method_name.compare(kCameraChannelApiSetFocusPoint)) {
result->NotImplemented();
} else if (!method_name.compare(kCameraChannelApiStartImageStream)) {
result->NotImplemented();
HandleStartImageStreamCall(method_call.arguments(), std::move(result));
} else if (!method_name.compare(kCameraChannelApiStopImageStream)) {
result->NotImplemented();
HandleStopImageStreamCall(method_call.arguments(), std::move(result));
} else if (!method_name.compare(kCameraChannelApiGetMaxZoomLevel)) {
HandleGetMaxZoomLevelCall(method_call.arguments(), std::move(result));
} else if (!method_name.compare(kCameraChannelApiGetMinZoomLevel)) {
@@ -208,28 +218,30 @@ void CameraPlugin::HandleAvailableCamerasCall(
void CameraPlugin::HandleCreateCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
// auto meta = CreateMessage::FromMap(message);
buffer_ = std::make_unique<FlutterDesktopPixelBuffer>();
texture_ =
std::make_unique<flutter::TextureVariant>(flutter::PixelBufferTexture(
[host = this](size_t width,
size_t height) -> const FlutterDesktopPixelBuffer* {
host->buffer_->width = host->camera_->GetPreviewWidth();
host->buffer_->height = host->camera_->GetPreviewHeight();
host->buffer_->buffer = host->camera_->GetPreviewFrameBuffer();
return host->buffer_.get();
[this](size_t width,
size_t height) -> const FlutterDesktopPixelBuffer* {
buffer_->width = camera_->GetPreviewWidth();
buffer_->height = camera_->GetPreviewHeight();
buffer_->buffer = camera_->GetPreviewFrameBuffer();
// TODO: We need to handle this code (event_channel_image_stream_)
// in the proper place, but the Camera plugin doesn't have a main
// loop.
if (event_channel_image_stream_) {
event_channel_image_stream_->Send(buffer_->width, buffer_->height,
buffer_->buffer);
}
return buffer_.get();
}));
auto texture_id = texture_registrar_->RegisterTexture(texture_.get());
auto stream_handler = std::make_unique<CameraStreamHandlerImpl>(
// OnNotifyInitialized
[]() {},
// OnNotifyFrameDecoded
[texture_id, host = this]() {
host->texture_registrar_->MarkTextureFrameAvailable(texture_id);
},
// OnNotifyCompleted
[]() {});
auto stream_handler =
std::make_unique<CameraStreamHandlerImpl>([texture_id, this]() {
texture_registrar_->MarkTextureFrameAvailable(texture_id);
});
camera_ = std::make_unique<GstCamera>(std::move(stream_handler));
texture_id_ = texture_id;
@@ -273,6 +285,31 @@ void CameraPlugin::HandleInitializeCall(
result->Success();
}
void CameraPlugin::HandleStartImageStreamCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
// TODO: Support StartImageStream API.
#if 0
event_channel_image_stream_ =
std::make_unique<EventChannelImageStream>(plugin_registrar_);
result->Success();
#else
result->NotImplemented();
#endif
}
void CameraPlugin::HandleStopImageStreamCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
// TODO: Support StopImageStream API.
#if 0
event_channel_image_stream_ = nullptr;
result->Success();
#else
result->NotImplemented();
#endif
}
void CameraPlugin::HandleGetMaxZoomLevelCall(
const flutter::EncodableValue* message,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {