libcamera v0.7.2 Supporting cameras in Linux since 2019

Loading...
Searching...
No Matches
swstats_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 software statistics implementation
10 */
11
12#pragma once
13
14#include <stdint.h>
15#include <vector>
16
17#include <libcamera/base/signal.h>
18
19#include <libcamera/framebuffer.h>
20#include <libcamera/geometry.h>
21
22#include "libcamera/internal/bayer_format.h"
23#include "libcamera/internal/shared_mem_object.h"
24#include "libcamera/internal/software_isp/swisp_stats.h"
25
26#include "benchmark.h"
27
28 namespace libcamera {
29
30 class CameraManager;
31 class MappedFrameBuffer;
32 class PixelFormat;
33 struct StreamConfiguration;
34
35 class SwStatsCpu
36{
37 public:
38 SwStatsCpu(const CameraManager &cm);
39 ~SwStatsCpu() = default;
40
41 /*
42 * The combination of pipeline + sensor delays means that
43 * exposure changes can take up to 3 frames to get applied,
44 * Run stats once every 4 frames to ensure any previous
45 * exposure changes have been applied.
46 */
47 static constexpr uint32_t kStatPerNumFrames = 4;
48
49 bool isValid() const { return sharedStats_.fd().isValid(); }
50
51 const SharedFD &getStatsFD() { return sharedStats_.fd(); }
52
53 const Size &patternSize() { return patternSize_; }
54
55 int configure(const StreamConfiguration &inputCfg, unsigned int statsBufferCount = 1);
56 void setWindow(const Rectangle &window);
57 void startFrame(uint32_t frame);
58 void finishFrame(uint32_t frame, uint32_t bufferId);
59 void processFrame(uint32_t frame, uint32_t bufferId, MappedFrameBuffer &input);
60
61 void processLine0(uint32_t frame, unsigned int y, const uint8_t *src[], unsigned int statsBufferIndex = 0)
62 {
63 if (frame % kStatPerNumFrames)
64 return;
65
66 if ((y & ySkipMask_) || y < static_cast<unsigned int>(window_.y) ||
67 y >= (window_.y + window_.height))
68 return;
69
70 (this->*stats0_)(src, stats_[statsBufferIndex]);
71 }
72
73 void processLine2(uint32_t frame, unsigned int y, const uint8_t *src[], unsigned int statsBufferIndex = 0)
74 {
75 if (frame % kStatPerNumFrames)
76 return;
77
78 if ((y & ySkipMask_) || y < static_cast<unsigned int>(window_.y) ||
79 y >= (window_.y + window_.height))
80 return;
81
82 (this->*stats2_)(src, stats_[statsBufferIndex]);
83 }
84
85 Signal<uint32_t, uint32_t> statsReady;
86
87 private:
88 using statsProcessFn = void (SwStatsCpu::*)(const uint8_t *src[], SwIspStats &stats);
89 using processFrameFn = void (SwStatsCpu::*)(MappedFrameBuffer &in);
90
91 int setupStandardBayerOrder(BayerFormat::Order order);
92 /* Bayer 8 bpp unpacked */
93 void statsBGGR8Line0(const uint8_t *src[], SwIspStats &stats);
94 /* Bayer 10 bpp unpacked */
95 void statsBGGR10Line0(const uint8_t *src[], SwIspStats &stats);
96 /* Bayer 12 bpp unpacked */
97 void statsBGGR12Line0(const uint8_t *src[], SwIspStats &stats);
98 /* Bayer 10 bpp packed */
99 void statsBGGR10PLine0(const uint8_t *src[], SwIspStats &stats);
100 void statsGBRG10PLine0(const uint8_t *src[], SwIspStats &stats);
101 /* Bayer 12 bpp packed */
102 void statsBGGR12PLine0(const uint8_t *src[], SwIspStats &stats);
103 void statsGBRG12PLine0(const uint8_t *src[], SwIspStats &stats);
104
105 void processBayerFrame2(MappedFrameBuffer &in);
106
107 processFrameFn processFrame_;
108
109 /* Variables set by configure(), used every line */
110 statsProcessFn stats0_;
111 statsProcessFn stats2_;
112 bool swapLines_;
113
114 unsigned int ySkipMask_;
115
116 Rectangle window_;
117
118 Size patternSize_;
119
120 unsigned int xShift_;
121 unsigned int stride_;
122 unsigned int sumShift_;
123
124 std::vector<SwIspStats> stats_;
125 SharedMemObject<SwIspStats> sharedStats_;
126 Benchmark bench_;
127};
128
129} /* 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::Benchmark
Simple builtin benchmark.
Definition benchmark.h:22
libcamera::CameraManager
Provide access and manage all cameras in the system.
Definition camera_manager.h:25
libcamera::MappedFrameBuffer
Map a FrameBuffer using the MappedBuffer interface.
Definition mapped_framebuffer.h:47
libcamera::PixelFormat
libcamera image pixel format
Definition pixel_format.h:17
libcamera::Rectangle
Describe a rectangle's position and dimensions.
Definition geometry.h:247
libcamera::SharedFD
RAII-style wrapper for file descriptors.
Definition shared_fd.h:17
libcamera::SharedMemObject
Helper class to allocate an object in shareable memory.
Definition shared_mem_object.h:60
libcamera::Signal
Generic signal and slot communication mechanism.
Definition signal.h:39
libcamera::Size
Describe a two-dimensional size.
Definition geometry.h:51
libcamera::SwStatsCpu::kStatPerNumFrames
static constexpr uint32_t kStatPerNumFrames
Run stats once every kStatPerNumFrames frames.
Definition swstats_cpu.h:47
libcamera::SwStatsCpu::getStatsFD
const SharedFD & getStatsFD()
Get the file descriptor for the statistics.
Definition swstats_cpu.h:51
libcamera::SwStatsCpu::statsReady
Signal< uint32_t, uint32_t > statsReady
Signals that the statistics are ready.
Definition swstats_cpu.h:85
libcamera::SwStatsCpu::processLine2
void processLine2(uint32_t frame, unsigned int y, const uint8_t *src[], unsigned int statsBufferIndex=0)
Process line 2 and 3.
Definition swstats_cpu.h:73
libcamera::SwStatsCpu::finishFrame
void finishFrame(uint32_t frame, uint32_t bufferId)
Finish statistics calculation for the current frame.
Definition swstats_cpu.cpp:405
libcamera::SwStatsCpu::SwStatsCpu
SwStatsCpu(const CameraManager &cm)
Construct a SwStatsCpu object.
Definition swstats_cpu.cpp:162
libcamera::SwStatsCpu::setWindow
void setWindow(const Rectangle &window)
Specify window coordinates over which to gather statistics.
Definition swstats_cpu.cpp:559
libcamera::SwStatsCpu::configure
int configure(const StreamConfiguration &inputCfg, unsigned int statsBufferCount=1)
Configure the statistics object for the passed in input format.
Definition swstats_cpu.cpp:468
libcamera::SwStatsCpu::processLine0
void processLine0(uint32_t frame, unsigned int y, const uint8_t *src[], unsigned int statsBufferIndex=0)
Process line 0.
Definition swstats_cpu.h:61
libcamera::SwStatsCpu::processFrame
void processFrame(uint32_t frame, uint32_t bufferId, MappedFrameBuffer &input)
Calculate statistics for a frame in one go.
Definition swstats_cpu.cpp:605
libcamera::SwStatsCpu::isValid
bool isValid() const
Gets whether the statistics object is valid.
Definition swstats_cpu.h:49
libcamera::SwStatsCpu::patternSize
const Size & patternSize()
Get the pattern size.
Definition swstats_cpu.h:53
libcamera::SwStatsCpu::startFrame
void startFrame(uint32_t frame)
Reset state to start statistics gathering for a new frame.
Definition swstats_cpu.cpp:384
framebuffer.h
Frame buffer handling.
geometry.h
Data structures related to geometric objects.
libcamera
Top-level libcamera namespace.
Definition backtrace.h:17
signal.h
Signal & slot implementation.
libcamera::StreamConfiguration
Configuration parameters for a stream.
Definition stream.h:40
libcamera::SwIspStats
Struct that holds the statistics for the Software ISP.
Definition swisp_stats.h:24