blob: 3ad0dd3360bb67817abf7088883973b59ae632c6 [file] [log] [blame]
// Copyright 2020 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_LIB_VIRTUAL_CAMERA_VIRTUAL_CAMERA_IMPL_H_
#define SRC_CAMERA_LIB_VIRTUAL_CAMERA_VIRTUAL_CAMERA_IMPL_H_
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/cpp/wait.h>
#include <lib/zx/clock.h>
#include <queue>
#include "src/camera/lib/fake_camera/fake_camera.h"
#include "src/camera/lib/virtual_camera/virtual_camera.h"
namespace camera {
class VirtualCameraImpl : public VirtualCamera {
public:
VirtualCameraImpl();
~VirtualCameraImpl() override;
static fit::result<std::unique_ptr<VirtualCamera>, zx_status_t> Create(
fidl::InterfaceHandle<fuchsia::sysmem::Allocator> allocator);
fidl::InterfaceRequestHandler<fuchsia::camera3::Device> GetHandler() override;
fit::result<void, std::string> CheckFrame(const void* data, size_t size,
const fuchsia::camera3::FrameInfo& info) override;
private:
void OnNewRequest(fidl::InterfaceRequest<fuchsia::camera3::Device> request);
void OnDestruction();
void OnSetBufferCollection(fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken> token);
void FrameTick();
void FillFrame(uint32_t buffer_index);
void EmbedMetadata(const fuchsia::camera3::FrameInfo& info);
async::Loop loop_;
fuchsia::sysmem::AllocatorPtr allocator_;
std::unique_ptr<FakeCamera> camera_;
std::shared_ptr<FakeStream> stream_;
std::optional<fuchsia::sysmem::BufferCollectionInfo_2> buffers_;
zx::time interrupt_start_time_;
uint64_t frame_count_;
std::queue<uint32_t> free_buffers_;
std::map<uint32_t, std::unique_ptr<async::Wait>> frame_waiters_;
};
} // namespace camera
#endif // SRC_CAMERA_LIB_VIRTUAL_CAMERA_VIRTUAL_CAMERA_IMPL_H_