12 #include <condition_variable>
25 #include <libcamera/base/span.h>
26 #include <libcamera/camera.h>
27 #include <libcamera/camera_manager.h>
28 #include <libcamera/control_ids.h>
29 #include <libcamera/controls.h>
30 #include <libcamera/formats.h>
31 #include <libcamera/framebuffer_allocator.h>
32 #include <libcamera/property_ids.h>
38 namespace controls = libcamera::controls;
39 namespace properties = libcamera::properties;
57 using Size = libcamera::Size;
89 LibcameraApp(std::unique_ptr<Options>
const opts =
nullptr);
108 Stream *
GetStream(std::string
const &name,
unsigned int *w =
nullptr,
unsigned int *h =
nullptr,
109 unsigned int *stride =
nullptr)
const;
111 unsigned int *stride =
nullptr)
const;
112 Stream *
StillStream(
unsigned int *w =
nullptr,
unsigned int *h =
nullptr,
unsigned int *stride =
nullptr)
const;
113 Stream *
RawStream(
unsigned int *w =
nullptr,
unsigned int *h =
nullptr,
unsigned int *stride =
nullptr)
const;
114 Stream *
VideoStream(
unsigned int *w =
nullptr,
unsigned int *h =
nullptr,
unsigned int *stride =
nullptr)
const;
115 Stream *
LoresStream(
unsigned int *w =
nullptr,
unsigned int *h =
nullptr,
unsigned int *stride =
nullptr)
const;
121 void StreamDimensions(
Stream const *stream,
unsigned int *w,
unsigned int *h,
unsigned int *stride)
const;
127 template <
typename T>
131 template <
typename U>
134 std::unique_lock<std::mutex> lock(mutex_);
135 queue_.push(std::forward<U>(msg));
140 std::unique_lock<std::mutex> lock(mutex_);
141 cond_.wait(lock, [
this] {
return !queue_.empty(); });
142 T msg = std::move(queue_.front());
148 std::unique_lock<std::mutex> lock(mutex_);
153 std::queue<T> queue_;
155 std::condition_variable cond_;
161 void requestComplete(
Request *request);
162 void configureDenoise(
const std::string &denoise_mode);
164 std::unique_ptr<CameraManager> camera_manager_;
165 std::shared_ptr<Camera> camera_;
166 bool camera_acquired_ =
false;
167 std::unique_ptr<CameraConfiguration> configuration_;
168 std::map<FrameBuffer *, std::vector<libcamera::Span<uint8_t>>> mapped_buffers_;
169 std::map<std::string, Stream *> streams_;
171 std::map<Stream *, std::queue<FrameBuffer *>> frame_buffers_;
172 std::queue<Request *> free_requests_;
173 std::vector<std::unique_ptr<Request>> requests_;
174 std::mutex completed_requests_mutex_;
175 std::set<CompletedRequest *> completed_requests_;
176 bool camera_started_ =
false;
177 std::mutex camera_stop_mutex_;
178 MessageQueue<Msg> msg_queue_;
180 std::mutex control_mutex_;
183 uint64_t last_timestamp_;
184 uint64_t sequence_ = 0;
192 auto exp = ctrls.get(libcamera::controls::ExposureTime);
196 auto ag = ctrls.get(libcamera::controls::AnalogueGain);
200 auto dg = ctrls.get(libcamera::controls::DigitalGain);
204 auto cg = ctrls.get(libcamera::controls::ColourGains);
210 auto fom = ctrls.get(libcamera::controls::FocusFoM);
214 auto ae = ctrls.get(libcamera::controls::AeLocked);
219 std::string
ToString(std::string &info_string)
const
221 std::string parsed(info_string);
223 for (
auto const &t : tokens)
225 std::size_t pos = parsed.find(t);
226 if (pos != std::string::npos)
228 std::stringstream value;
229 value << std::fixed << std::setprecision(2);
233 else if (t ==
"%fps")
235 else if (t ==
"%exp")
245 else if (t ==
"%focus")
247 else if (t ==
"%aelock")
250 parsed.replace(pos, t.length(), value.str());
268 inline static const std::string tokens[] = {
"%frame",
"%fps",
"%exp",
"%ag",
"%dg",
269 "%rg",
"%bg",
"%focus",
"%aelock" };
279 std::scoped_lock other_lock(other.mutex_);
285 std::scoped_lock other_lock(other.mutex_);
286 data_ = std::move(other.data_);
290 template <
typename T>
291 void Set(std::string
const &tag, T &&value)
293 std::scoped_lock
lock(mutex_);
294 data_.insert_or_assign(tag, std::forward<T>(value));
297 template <
typename T>
298 int Get(std::string
const &tag, T &value)
const
300 std::scoped_lock
lock(mutex_);
301 auto it = data_.find(tag);
302 if (it == data_.end())
304 value = std::any_cast<T>(it->second);
310 std::scoped_lock
lock(mutex_);
316 std::scoped_lock
lock(mutex_, other.mutex_);
323 std::scoped_lock
lock(mutex_, other.mutex_);
324 data_ = std::move(other.data_);
331 std::scoped_lock
lock(mutex_, other.mutex_);
332 data_.merge(other.data_);
335 template <
typename T>
340 auto it = data_.find(tag);
341 if (it == data_.end())
343 return std::any_cast<T>(&it->second);
346 template <
typename T>
350 data_.insert_or_assign(tag, std::forward<T>(value));
360 mutable std::mutex mutex_;
361 std::map<std::string, std::any> data_;
Class for initialising a Camera object and capturing frames.
Definition: Camera.h:45
Definition: libcamera_app.hpp:42
void StopCamera()
Definition: libcamera_app.cpp:250
libcamera::ControlList ControlList
Definition: libcamera_app.hpp:46
libcamera::Rectangle Rectangle
Definition: libcamera_app.hpp:58
void ConfigureViewfinder()
Definition: libcamera_app.cpp:123
static constexpr unsigned int FLAG_STILL_DOUBLE_BUFFER
Definition: libcamera_app.hpp:81
static constexpr unsigned int FLAG_VIDEO_JPEG_COLOURSPACE
Definition: libcamera_app.hpp:87
Stream * StillStream(unsigned int *w=nullptr, unsigned int *h=nullptr, unsigned int *stride=nullptr) const
Definition: libcamera_app.cpp:348
static constexpr unsigned int FLAG_STILL_BUFFER_MASK
Definition: libcamera_app.hpp:83
Stream * ViewfinderStream(unsigned int *w=nullptr, unsigned int *h=nullptr, unsigned int *stride=nullptr) const
Definition: libcamera_app.cpp:343
libcamera::CameraConfiguration CameraConfiguration
Definition: libcamera_app.hpp:50
libcamera::Size Size
Definition: libcamera_app.hpp:57
Stream * LoresStream(unsigned int *w=nullptr, unsigned int *h=nullptr, unsigned int *stride=nullptr) const
Definition: libcamera_app.cpp:363
libcamera::StreamConfiguration StreamConfiguration
Definition: libcamera_app.hpp:55
static constexpr unsigned int FLAG_STILL_NONE
Definition: libcamera_app.hpp:77
void Teardown()
Definition: libcamera_app.cpp:150
virtual ~LibcameraApp()
Definition: libcamera_app.cpp:20
libcamera::StreamRoles StreamRoles
Definition: libcamera_app.hpp:53
void CloseCamera()
Definition: libcamera_app.cpp:62
libcamera::StreamRole StreamRole
Definition: libcamera_app.hpp:52
Options * GetOptions() const
Definition: libcamera_app.hpp:92
static constexpr unsigned int FLAG_STILL_TRIPLE_BUFFER
Definition: libcamera_app.hpp:82
void PostMessage(MsgType &t, MsgPayload &p)
Definition: libcamera_app.cpp:328
std::unique_ptr< Options > options_
Definition: libcamera_app.hpp:124
static constexpr unsigned int FLAG_STILL_RAW
Definition: libcamera_app.hpp:80
void OpenCamera()
Definition: libcamera_app.cpp:32
libcamera::FrameBufferAllocator FrameBufferAllocator
Definition: libcamera_app.hpp:51
libcamera::Request Request
Definition: libcamera_app.hpp:47
LibcameraApp(std::unique_ptr< Options > const opts=nullptr)
Definition: libcamera_app.cpp:11
void StreamDimensions(Stream const *stream, unsigned int *w, unsigned int *h, unsigned int *stride) const
Definition: libcamera_app.cpp:393
Request::BufferMap BufferMap
Definition: libcamera_app.hpp:56
static constexpr unsigned int FLAG_VIDEO_NONE
Definition: libcamera_app.hpp:85
libcamera::PixelFormat PixelFormat
Definition: libcamera_app.hpp:54
std::variant< CompletedRequestPtr > MsgPayload
Definition: libcamera_app.hpp:64
std::vector< libcamera::Span< uint8_t > > Mmap(FrameBuffer *buffer) const
Definition: libcamera_app.cpp:379
Stream * VideoStream(unsigned int *w=nullptr, unsigned int *h=nullptr, unsigned int *stride=nullptr) const
Definition: libcamera_app.cpp:358
static constexpr unsigned int FLAG_STILL_BGR
Definition: libcamera_app.hpp:78
Msg Wait()
Definition: libcamera_app.cpp:284
Stream * GetStream(std::string const &name, unsigned int *w=nullptr, unsigned int *h=nullptr, unsigned int *stride=nullptr) const
Definition: libcamera_app.cpp:333
void ConfigureStill(unsigned int flags=FLAG_STILL_NONE)
Definition: libcamera_app.cpp:76
static constexpr unsigned int FLAG_VIDEO_RAW
Definition: libcamera_app.hpp:86
std::string const & CameraId() const
Definition: libcamera_app.cpp:27
libcamera::Stream Stream
Definition: libcamera_app.hpp:44
libcamera::FrameBuffer FrameBuffer
Definition: libcamera_app.hpp:45
void SetControls(ControlList &controls)
Definition: libcamera_app.cpp:387
Stream * RawStream(unsigned int *w=nullptr, unsigned int *h=nullptr, unsigned int *stride=nullptr) const
Definition: libcamera_app.cpp:353
MsgType
Definition: libcamera_app.hpp:60
Stream * GetMainStream() const
Definition: libcamera_app.cpp:368
libcamera::CameraManager CameraManager
Definition: libcamera_app.hpp:48
void StartCamera()
Definition: libcamera_app.cpp:174
static constexpr unsigned int FLAG_STILL_RGB
Definition: libcamera_app.hpp:79
Definition: libcamera_app_options.hpp:45
std::shared_ptr< CompletedRequest > CompletedRequestPtr
Definition: libcamera_app.hpp:36
Definition: libcamera_app.hpp:365
libcamera::Request Request
Definition: libcamera_app.hpp:368
CompletedRequest(unsigned int seq, Request *r)
Definition: libcamera_app.hpp:370
float framerate
Definition: libcamera_app.hpp:379
libcamera::ControlList ControlList
Definition: libcamera_app.hpp:367
Metadata post_process_metadata
Definition: libcamera_app.hpp:380
Request * request
Definition: libcamera_app.hpp:378
ControlList metadata
Definition: libcamera_app.hpp:377
libcamera::Request::BufferMap BufferMap
Definition: libcamera_app.hpp:366
BufferMap buffers
Definition: libcamera_app.hpp:376
unsigned int sequence
Definition: libcamera_app.hpp:375
Definition: libcamera_app.hpp:188
std::array< float, 2 > colour_gains
Definition: libcamera_app.hpp:261
float digital_gain
Definition: libcamera_app.hpp:260
float exposure_time
Definition: libcamera_app.hpp:258
float focus
Definition: libcamera_app.hpp:262
float analogue_gain
Definition: libcamera_app.hpp:259
std::string ToString(std::string &info_string) const
Definition: libcamera_app.hpp:219
bool aelock
Definition: libcamera_app.hpp:264
float fps
Definition: libcamera_app.hpp:263
unsigned int sequence
Definition: libcamera_app.hpp:257
FrameInfo(libcamera::ControlList &ctrls)
Definition: libcamera_app.hpp:189
Definition: libcamera_app.hpp:66
MsgPayload payload
Definition: libcamera_app.hpp:73
Msg(MsgType const &t)
Definition: libcamera_app.hpp:67
Msg(MsgType const &t, T p)
Definition: libcamera_app.hpp:69
MsgType type
Definition: libcamera_app.hpp:72