summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/agc_algorithm.hpp
blob: 61595ea2b0065e4492d570180c79df71c1915441 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (C) 2019, Raspberry Pi (Trading) Limited
 *
 * agc_algorithm.hpp - AGC/AEC control algorithm interface
 */
#pragma once

#include <libcamera/base/utils.h>

#include "algorithm.hpp"

namespace RPiController {

class AgcAlgorithm : public Algorithm
{
public:
	AgcAlgorithm(Controller *controller) : Algorithm(controller) {}
	// An AGC algorithm must provide the following:
	virtual unsigned int GetConvergenceFrames() const = 0;
	virtual void SetEv(double ev) = 0;
	virtual void SetFlickerPeriod(libcamera::utils::Duration flicker_period) = 0;
	virtual void SetFixedShutter(libcamera::utils::Duration fixed_shutter) = 0;
	virtual void SetMaxShutter(libcamera::utils::Duration max_shutter) = 0;
	virtual void SetFixedAnalogueGain(double fixed_analogue_gain) = 0;
	virtual void SetMeteringMode(std::string const &metering_mode_name) = 0;
	virtual void SetExposureMode(std::string const &exposure_mode_name) = 0;
	virtual void
	SetConstraintMode(std::string const &contraint_mode_name) = 0;
};

} // namespace RPiController
*/ #ifndef __LIBCAMERA_CAMERA_H__ #define __LIBCAMERA_CAMERA_H__ #include <memory> #include <set> #include <stdint.h> #include <string> #include <libcamera/controls.h> #include <libcamera/request.h> #include <libcamera/signal.h> #include <libcamera/stream.h> namespace libcamera { class FrameBuffer; class FrameBufferAllocator; class PipelineHandler; class Request; class CameraConfiguration { public: enum Status { Valid, Adjusted, Invalid, }; using iterator = std::vector<StreamConfiguration>::iterator; using const_iterator = std::vector<StreamConfiguration>::const_iterator; virtual ~CameraConfiguration(); void addConfiguration(const StreamConfiguration &cfg); virtual Status validate() = 0; StreamConfiguration &at(unsigned int index); const StreamConfiguration &at(unsigned int index) const; StreamConfiguration &operator[](unsigned int index) { return at(index); } const StreamConfiguration &operator[](unsigned int index) const { return at(index); } iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; bool empty() const; std::size_t size() const; protected: CameraConfiguration(); std::vector<StreamConfiguration> config_; }; class Camera final : public std::enable_shared_from_this<Camera> { public: static std::shared_ptr<Camera> create(PipelineHandler *pipe, const std::string &name, const std::set<Stream *> &streams); Camera(const Camera &) = delete; Camera &operator=(const Camera &) = delete; const std::string &name() const; Signal<Request *, FrameBuffer *> bufferCompleted; Signal<Request *> requestCompleted; Signal<Camera *> disconnected; int acquire(); int release(); const ControlInfoMap &controls(); const ControlList &properties(); const std::set<Stream *> &streams() const; std::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles); int configure(CameraConfiguration *config); Request *createRequest(uint64_t cookie = 0); int queueRequest(Request *request); int start(); int stop(); private: Camera(PipelineHandler *pipe, const std::string &name, const std::set<Stream *> &streams); ~Camera(); class Private; std::unique_ptr<Private> p_; friend class PipelineHandler; void disconnect(); void requestComplete(Request *request); friend class FrameBufferAllocator; int exportFrameBuffers(Stream *stream, std::vector<std::unique_ptr<FrameBuffer>> *buffers); int freeFrameBuffers(Stream *stream); /* \todo Remove allocator_ from the exposed API */ FrameBufferAllocator *allocator_; }; } /* namespace libcamera */ #endif /* __LIBCAMERA_CAMERA_H__ */