/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2019, Google Inc. * * cio2.h - Intel IPU3 CIO2 */ #pragma once #include #include #include #include #include "libcamera/internal/v4l2_subdevice.h" #include "libcamera/internal/v4l2_videodevice.h" namespace libcamera { class CameraSensor; class FrameBuffer; class MediaDevice; class PixelFormat; class Request; class Size; class SizeRange; struct StreamConfiguration; class CIO2Device { public: static constexpr unsigned int kBufferCount = 4; CIO2Device(); std::vector formats() const; std::vector sizes(const PixelFormat &format) const; int init(const MediaDevice *media, unsigned int index); int configure(const Size &size, V4L2DeviceFormat *outputFormat); StreamConfiguration generateConfiguration(Size size) const; int exportBuffers(unsigned int count, std::vector> *buffers); V4L2SubdeviceFormat getSensorFormat(const std::vector &mbusCodes, const Size &size) const; int start(); int stop(); CameraSensor *sensor() { return sensor_.get(); } const CameraSensor *sensor() const { return sensor_.get(); } FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer); void tryReturnBuffer(FrameBuffer *buffer); Signal &bufferReady() { return output_->bufferReady; } Signal &frameStart() { return csi2_->frameStart; } Signal<> bufferAvailable; private: void freeBuffers(); void cio2BufferReady(FrameBuffer *buffer); std::unique_ptr sensor_; std::unique_ptr csi2_; std::unique_ptr output_; std::vector> buffers_; std::queue availableBuffers_; }; } /* namespace libcamera */