blob: c2bee8da8346d7617b5cc98566e9a394100abcfb [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CAMERA_EXAMPLES_DEMO_CAMERA_COMMON_STREAM_SHIM_H_
#define SRC_CAMERA_EXAMPLES_DEMO_CAMERA_COMMON_STREAM_SHIM_H_
#include <fuchsia/camera/common/cpp/fidl.h>
#include <fuchsia/camera2/cpp/fidl.h>
#include <memory>
namespace camera {
// This class provides a shim to serve a fuchsia::camera2::Stream interface to a caller using a
// fuchsia::camera::common::Stream client connection.
class CameraCommonStreamShim : public fuchsia::camera2::Stream {
public:
CameraCommonStreamShim(fuchsia::camera::common::StreamPtr stream,
fuchsia::camera2::Stream_EventSender* event_handler)
: stream_(std::move(stream)), event_handler_(event_handler) {
stream_.events().OnFrameAvailable = [this](fuchsia::camera::common::FrameAvailableEvent event) {
event_handler_->OnFrameAvailable(Convert(event));
};
}
virtual void Start() override { stream_->Start(); }
virtual void Stop() override { stream_->Stop(); }
virtual void ReleaseFrame(uint32_t buffer_id) override { stream_->ReleaseFrame(buffer_id); }
virtual void AcknowledgeFrameError() override {}
virtual void SetRegionOfInterest(float x_min, float y_min, float x_max, float y_max,
SetRegionOfInterestCallback callback) override {
callback(ZX_ERR_NOT_SUPPORTED);
}
virtual void SetImageFormat(uint32_t image_format_index,
SetImageFormatCallback callback) override {
callback(ZX_ERR_NOT_SUPPORTED);
}
virtual void GetImageFormats(GetImageFormatsCallback callback) override {
callback(std::vector<fuchsia::sysmem::ImageFormat_2>());
}
static fuchsia::camera2::FrameAvailableInfo Convert(
fuchsia::camera::common::FrameAvailableEvent x) {
fuchsia::camera2::FrameAvailableInfo ret;
ret.frame_status = Convert(x.frame_status);
ret.buffer_id = x.buffer_id;
ret.metadata = Convert(x.metadata);
return ret;
}
static fuchsia::camera2::FrameStatus Convert(fuchsia::camera::common::FrameStatus frame_status) {
switch (frame_status) {
case fuchsia::camera::common::FrameStatus::OK:
return fuchsia::camera2::FrameStatus::OK;
case fuchsia::camera::common::FrameStatus::ERROR_FRAME:
return fuchsia::camera2::FrameStatus::ERROR_FRAME;
case fuchsia::camera::common::FrameStatus::ERROR_BUFFER_FULL:
return fuchsia::camera2::FrameStatus::ERROR_BUFFER_FULL;
default:
FXL_LOG(ERROR) << "Inconvertible Value " << static_cast<uint32_t>(frame_status);
return fuchsia::camera2::FrameStatus::OK;
}
}
static fuchsia::camera2::FrameMetadata Convert(fuchsia::camera::common::Metadata metadata) {
fuchsia::camera2::FrameMetadata ret;
ret.set_timestamp(metadata.timestamp);
return ret;
}
private:
fuchsia::camera::common::StreamPtr stream_;
fuchsia::camera2::Stream_EventSender* event_handler_;
};
} // namespace camera
#endif // SRC_CAMERA_EXAMPLES_DEMO_CAMERA_COMMON_STREAM_SHIM_H_