libcamera  v0.3.0
Supporting cameras in Linux since 2019
software_isp.h
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 /*
3  * Copyright (C) 2023, Linaro Ltd
4  *
5  * Simple software ISP implementation
6  */
7 
8 #pragma once
9 
10 #include <functional>
11 #include <initializer_list>
12 #include <map>
13 #include <memory>
14 #include <string>
15 #include <tuple>
16 #include <vector>
17 
18 #include <libcamera/base/class.h>
19 #include <libcamera/base/log.h>
20 #include <libcamera/base/signal.h>
21 #include <libcamera/base/thread.h>
22 
23 #include <libcamera/geometry.h>
24 #include <libcamera/pixel_format.h>
25 
26 #include <libcamera/ipa/soft_ipa_interface.h>
27 #include <libcamera/ipa/soft_ipa_proxy.h>
28 
30 #include "libcamera/internal/dma_heaps.h"
32 #include "libcamera/internal/shared_mem_object.h"
33 #include "libcamera/internal/software_isp/debayer_params.h"
34 
35 namespace libcamera {
36 
37 class DebayerCpu;
38 class FrameBuffer;
39 class PixelFormat;
40 struct StreamConfiguration;
41 
42 LOG_DECLARE_CATEGORY(SoftwareIsp)
43 
45 {
46 public:
47  SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor);
48  ~SoftwareIsp();
49 
50  int loadConfiguration([[maybe_unused]] const std::string &filename) { return 0; }
51 
52  bool isValid() const;
53 
54  std::vector<PixelFormat> formats(PixelFormat input);
55 
56  SizeRange sizes(PixelFormat inputFormat, const Size &inputSize);
57 
58  std::tuple<unsigned int, unsigned int>
59  strideAndFrameSize(const PixelFormat &outputFormat, const Size &size);
60 
61  int configure(const StreamConfiguration &inputCfg,
62  const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
63  const ControlInfoMap &sensorControls);
64 
65  int exportBuffers(unsigned int output, unsigned int count,
66  std::vector<std::unique_ptr<FrameBuffer>> *buffers);
67 
68  void processStats(const ControlList &sensorControls);
69 
70  int start();
71  void stop();
72 
73  int queueBuffers(FrameBuffer *input,
74  const std::map<unsigned int, FrameBuffer *> &outputs);
75 
76  void process(FrameBuffer *input, FrameBuffer *output);
77 
82 
83 private:
84  void saveIspParams();
85  void setSensorCtrls(const ControlList &sensorControls);
86  void statsReady();
87  void inputReady(FrameBuffer *input);
88  void outputReady(FrameBuffer *output);
89 
90  std::unique_ptr<DebayerCpu> debayer_;
91  Thread ispWorkerThread_;
92  SharedMemObject<DebayerParams> sharedParams_;
93  DebayerParams debayerParams_;
94  DmaHeap dmaHeap_;
95 
96  std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
97 };
98 
99 } /* namespace libcamera */
A camera sensor.
Utilities to help constructing class interfaces.
A camera sensor based on V4L2 subdevices.
Definition: camera_sensor.h:40
A map of ControlId to ControlInfo.
Definition: controls.h:306
Associate a list of ControlId with their values for an object.
Definition: controls.h:350
Helper class for dma-heap allocations.
Definition: dma_heaps.h:18
Frame buffer data and its associated dynamic metadata.
Definition: framebuffer.h:50
Create and manage cameras based on a set of media devices.
Definition: pipeline_handler.h:39
libcamera image pixel format
Definition: pixel_format.h:18
Helper class to allocate an object in shareable memory.
Definition: shared_mem_object.h:61
Generic signal and slot communication mechanism.
Definition: signal.h:40
Describe a range of sizes.
Definition: geometry.h:201
Describe a two-dimensional size.
Definition: geometry.h:53
Class for the Software ISP.
Definition: software_isp.h:45
Signal< FrameBuffer * > outputBufferReady
A signal emitted when the output frame buffer completes.
Definition: software_isp.h:79
Signal< FrameBuffer * > inputBufferReady
A signal emitted when the input frame buffer completes.
Definition: software_isp.h:78
Signal< const ControlList & > setSensorControls
A signal emitted when the values to write to the sensor controls are ready.
Definition: software_isp.h:81
int loadConfiguration([[maybe_unused]] const std::string &filename)
Load a configuration from a file.
Definition: software_isp.h:50
Signal ispStatsReady
A signal emitted when the statistics for IPA are ready.
Definition: software_isp.h:80
A thread of execution.
Definition: thread.h:29
Data structures related to geometric objects.
Logging infrastructure.
#define LOG_DECLARE_CATEGORY(name)
Declare a category of log messages.
Top-level libcamera namespace.
Definition: backtrace.h:17
Create pipelines and cameras from a set of media devices.
libcamera pixel format
Signal & slot implementation.
Struct to hold the debayer parameters.
Definition: debayer_params.h:15
Configuration parameters for a stream.
Definition: stream.h:41
Thread support.