| // 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_ |