| // Copyright 2017 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. |
| |
| #pragma once |
| |
| #include <zircon/device/camera.h> |
| // #include <camera-driver-proto/camera-proto.h> |
| #include <zircon/types.h> |
| #include <zx/channel.h> |
| #include <zx/vmo.h> |
| #include <fbl/unique_ptr.h> |
| #include <fbl/vector.h> |
| #include <async/auto_wait.h> |
| |
| namespace video { |
| namespace utils { |
| |
| class VideoDeviceStream { |
| public: |
| zx_status_t Open(); |
| zx_status_t GetSupportedFormats(fbl::Vector<camera_video_format_t>* out_formats) const; |
| zx_status_t SetFormat(camera_video_format_t format); |
| zx_status_t SetBuffer(const zx::vmo &vmo); |
| zx_status_t StartRingBuffer(); |
| zx_status_t StopRingBuffer(); |
| void OnNewFrame(camera_vb_frame_notify_t frame_info); |
| void ReleaseFrame(uint64_t data_offset); |
| void ResetRingBuffer(); |
| void Close(); |
| |
| protected: |
| // friend class fbl::unique_ptr<AudioDeviceStream>; |
| |
| // static bool IsChannelConnected(const zx::channel& ch); |
| |
| // The maximum size a frame will occupy in the video stream. |
| // A value of zero means that the video buffer channel is uninitialized. |
| uint32_t max_frame_size_ = 0; |
| |
| VideoDeviceStream(bool input, uint32_t dev_id); |
| VideoDeviceStream(bool input, const char* dev_path); |
| virtual ~VideoDeviceStream(); |
| |
| zx::channel stream_ch_; |
| zx::channel vb_ch_; |
| |
| async::AutoWait new_frame_waiter_; |
| const bool input_; |
| char name_[64] = { 0 }; |
| |
| }; |
| |
| } // namespace utils |
| } // namespace video |