libcamera v0.3.2 Supporting cameras in Linux since 2019

Loading...
Searching...
No Matches
debayer_cpu.h
1/* SPDX-License-Identifier: LGPL-2.1-or-later */
2/*
3 * Copyright (C) 2023, Linaro Ltd
4 * Copyright (C) 2023, Red Hat Inc.
5 *
6 * Authors:
7 * Hans de Goede <hdegoede@redhat.com>
8 *
9 * CPU based debayering header
10 */
11
12#pragma once
13
14#include <memory>
15#include <stdint.h>
16#include <vector>
17
18#include <libcamera/base/object.h>
19
20#include "libcamera/internal/bayer_format.h"
21
22#include "debayer.h"
23#include "swstats_cpu.h"
24
25 namespace libcamera {
26
27 class DebayerCpu : public Debayer, public Object
28{
29 public:
30 DebayerCpu(std::unique_ptr<SwStatsCpu> stats);
31 ~DebayerCpu();
32
33 int configure(const StreamConfiguration &inputCfg,
34 const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs);
35 Size patternSize(PixelFormat inputFormat);
36 std::vector<PixelFormat> formats(PixelFormat input);
37 std::tuple<unsigned int, unsigned int>
38 strideAndFrameSize(const PixelFormat &outputFormat, const Size &size);
39 void process(FrameBuffer *input, FrameBuffer *output, DebayerParams params);
40 SizeRange sizes(PixelFormat inputFormat, const Size &inputSize);
41
47 const SharedFD &getStatsFD() { return stats_->getStatsFD(); }
48
54 unsigned int frameSize() { return outputConfig_.frameSize; }
55
56 private:
85 using debayerFn = void (DebayerCpu::*)(uint8_t *dst, const uint8_t *src[]);
86
87 /* 8-bit raw bayer format */
88 template<bool addAlphaByte>
89 void debayer8_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);
90 template<bool addAlphaByte>
91 void debayer8_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);
92 /* unpacked 10-bit raw bayer format */
93 template<bool addAlphaByte>
94 void debayer10_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);
95 template<bool addAlphaByte>
96 void debayer10_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);
97 /* unpacked 12-bit raw bayer format */
98 template<bool addAlphaByte>
99 void debayer12_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);
100 template<bool addAlphaByte>
101 void debayer12_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);
102 /* CSI-2 packed 10-bit raw bayer format (all the 4 orders) */
103 template<bool addAlphaByte>
104 void debayer10P_BGBG_BGR888(uint8_t *dst, const uint8_t *src[]);
105 template<bool addAlphaByte>
106 void debayer10P_GRGR_BGR888(uint8_t *dst, const uint8_t *src[]);
107 template<bool addAlphaByte>
108 void debayer10P_GBGB_BGR888(uint8_t *dst, const uint8_t *src[]);
109 template<bool addAlphaByte>
110 void debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[]);
111
112 struct DebayerInputConfig {
113 Size patternSize;
114 unsigned int bpp; /* Memory used per pixel, not precision */
115 unsigned int stride;
116 std::vector<PixelFormat> outputFormats;
117 };
118
119 struct DebayerOutputConfig {
120 unsigned int bpp; /* Memory used per pixel, not precision */
121 unsigned int stride;
122 unsigned int frameSize;
123 };
124
125 int getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config);
126 int getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config);
127 int setupStandardBayerOrder(BayerFormat::Order order);
128 int setDebayerFunctions(PixelFormat inputFormat, PixelFormat outputFormat);
129 void setupInputMemcpy(const uint8_t *linePointers[]);
130 void shiftLinePointers(const uint8_t *linePointers[], const uint8_t *src);
131 void memcpyNextLine(const uint8_t *linePointers[]);
132 void process2(const uint8_t *src, uint8_t *dst);
133 void process4(const uint8_t *src, uint8_t *dst);
134
135 /* Max. supported Bayer pattern height is 4, debayering this requires 5 lines */
136 static constexpr unsigned int kMaxLineBuffers = 5;
137
138 DebayerParams::ColorLookupTable red_;
139 DebayerParams::ColorLookupTable green_;
140 DebayerParams::ColorLookupTable blue_;
141 debayerFn debayer0_;
142 debayerFn debayer1_;
143 debayerFn debayer2_;
144 debayerFn debayer3_;
145 Rectangle window_;
146 DebayerInputConfig inputConfig_;
147 DebayerOutputConfig outputConfig_;
148 std::unique_ptr<SwStatsCpu> stats_;
149 std::vector<uint8_t> lineBuffers_[kMaxLineBuffers];
150 unsigned int lineBufferLength_;
151 unsigned int lineBufferPadding_;
152 unsigned int lineBufferIndex_;
153 unsigned int xShift_; /* Offset of 0/1 applied to window_.x */
154 bool enableInputMemcpy_;
155 bool swapRedBlueGains_;
156 unsigned int measuredFrames_;
157 int64_t frameProcessTime_;
158 /* Skip 30 frames for things to stabilize then measure 30 frames */
159 static constexpr unsigned int kFramesToSkip = 30;
160 static constexpr unsigned int kLastFrameToMeasure = 60;
161};
162
163} /* namespace libcamera */
bayer_format.h
Class to represent Bayer formats and manipulate them.
libcamera::BayerFormat::Order
Order
The order of the colour channels in the Bayer pattern.
Definition bayer_format.h:25
libcamera::DebayerCpu
Class for debayering on the CPU.
Definition debayer_cpu.h:28
libcamera::DebayerCpu::patternSize
Size patternSize(PixelFormat inputFormat)
Get the width and height at which the bayer pattern repeats.
Definition debayer_cpu.cpp:541
libcamera::DebayerCpu::sizes
SizeRange sizes(PixelFormat inputFormat, const Size &inputSize)
Get the supported output sizes for the given input format and size.
Definition debayer_cpu.cpp:815
libcamera::DebayerCpu::DebayerCpu
DebayerCpu(std::unique_ptr< SwStatsCpu > stats)
Constructs a DebayerCpu object.
Definition debayer_cpu.cpp:39
libcamera::DebayerCpu::frameSize
unsigned int frameSize()
Get the output frame size.
Definition debayer_cpu.h:54
libcamera::DebayerCpu::process
void process(FrameBuffer *input, FrameBuffer *output, DebayerParams params)
Process the bayer data into the requested format.
Definition debayer_cpu.cpp:751
libcamera::DebayerCpu::configure
int configure(const StreamConfiguration &inputCfg, const std::vector< std::reference_wrapper< StreamConfiguration > > &outputCfgs)
Configure the debayer object according to the passed in parameters.
Definition debayer_cpu.cpp:468
libcamera::DebayerCpu::formats
std::vector< PixelFormat > formats(PixelFormat input)
Get the supported output formats.
Definition debayer_cpu.cpp:551
libcamera::DebayerCpu::strideAndFrameSize
std::tuple< unsigned int, unsigned int > strideAndFrameSize(const PixelFormat &outputFormat, const Size &size)
Get the stride and the frame size.
Definition debayer_cpu.cpp:562
libcamera::DebayerCpu::getStatsFD
const SharedFD & getStatsFD()
Get the file descriptor for the statistics.
Definition debayer_cpu.h:47
libcamera::Debayer
Base debayering class.
Definition debayer.h:31
libcamera::FrameBuffer
Frame buffer data and its associated dynamic metadata.
Definition framebuffer.h:49
libcamera::Object
Base object to support automatic signal disconnection.
Definition object.h:25
libcamera::PixelFormat
libcamera image pixel format
Definition pixel_format.h:17
libcamera::SharedFD
RAII-style wrapper for file descriptors.
Definition shared_fd.h:17
libcamera::SizeRange
Describe a range of sizes.
Definition geometry.h:201
libcamera::Size
Describe a two-dimensional size.
Definition geometry.h:53
libcamera
Top-level libcamera namespace.
Definition backtrace.h:17
object.h
Base object to support automatic signal disconnection.
libcamera::DebayerParams
Struct to hold the debayer parameters.
Definition debayer_params.h:18
libcamera::DebayerParams::ColorLookupTable
std::array< uint8_t, kRGBLookupSize > ColorLookupTable
Type of the lookup tables for red, green, blue values.
Definition debayer_params.h:21
libcamera::StreamConfiguration
Configuration parameters for a stream.
Definition stream.h:40