SmartSpectra C++ SDK
Measure human vitals from video with SmartSpectra C++ SDK.
Loading...
Searching...
No Matches
v4l2_camera_source.hpp
1//
2// Created by Claude Code
3// Copyright (c) 2024 Presage Technologies
4//
5
6#pragma once
7// === standard library includes (if any) ===
8#include <vector>
9#include <cstdint>
10// === third-party includes (if any) ===
11#include <opencv2/core.hpp>
12#include <absl/status/status.h>
13#include <linux/videodev2.h>
14// === local includes (if any) ===
15#include <smartspectra/video_source/video_source.hpp>
16#include <smartspectra/video_source/settings.hpp>
17#include "camera.hpp"
18
19namespace presage::smartspectra::video_source::v4l2 {
20
26class V4l2CameraSource : public VideoSource {
27public:
28 ~V4l2CameraSource() override;
29
30 // Explicitly delete copy and move operations (manages file descriptor and mmap'd memory)
31 V4l2CameraSource() = default;
32 V4l2CameraSource(const V4l2CameraSource&) = delete;
33 V4l2CameraSource& operator=(const V4l2CameraSource&) = delete;
34 V4l2CameraSource(V4l2CameraSource&&) = delete;
35 V4l2CameraSource& operator=(V4l2CameraSource&&) = delete;
36
37 absl::Status Initialize(const VideoSourceSettings& settings) override;
38
39 int GetWidth() override;
40 int GetHeight() override;
41
42 void ProducePreTransformFrame(cv::Mat& frame) override;
43
44 bool SupportsExactFrameTimestamp() const override;
45 int64_t GetFrameTimestamp() const override;
46
47 // Exposure controls
48 absl::Status TurnOnAutoExposure() override;
49 absl::Status TurnOffAutoExposure() override;
50 absl::Status ToggleAutoExposure() override;
51 absl::StatusOr<bool> IsAutoExposureOn() override;
52 absl::Status IncreaseExposure() override;
53 absl::Status DecreaseExposure() override;
54 absl::Status SetExposure(double value) override;
55 absl::StatusOr<double> GetExposure() override;
56 bool SupportsExposureControls() override;
57
58 // White balance controls
59 bool SupportsWhiteBalanceControls() override;
60 absl::Status TurnOnAutoWhiteBalance() override;
61 absl::Status TurnOffAutoWhiteBalance() override;
62 absl::Status ToggleAutoWhiteBalance() override;
63 absl::StatusOr<bool> IsAutoWhiteBalanceOn() override;
64 absl::Status IncreaseWhiteBalance() override;
65 absl::Status DecreaseWhiteBalance() override;
66 absl::Status SetWhiteBalance(double value) override;
67 absl::StatusOr<double> GetWhiteBalance() override;
68
69 // Gain controls
70 bool SupportsGainControl() override;
71 absl::Status IncreaseGain() override;
72 absl::Status DecreaseGain() override;
73 absl::Status SetGain(double value) override;
74 absl::StatusOr<double> GetGain() override;
75
76 // Compressed frame support (for MJPEG)
77 bool SupportsCompressedOutput() override;
78 bool ProduceCompressedFrame(std::vector<uint8_t>& jpeg_data) override;
79
80 InputTransformMode GetDefaultInputTransformMode() override;
81
82private:
83 // Device file descriptor
84 int fd_ = -1;
85
86 // Camera configuration
87 int device_index_ = 0;
88 int width_ = 0;
89 int height_ = 0;
90 uint32_t pixelformat_ = 0;
91 camera::CaptureCodec codec_ = camera::CaptureCodec::MJPG;
92 presage::camera::AutoExposureConfiguration auto_exposure_configuration_;
93 int exposure_step_ = 50;
94 int white_balance_step_ = 100;
95 int gain_step_ = 10;
96 bool log_verbose_controls_ = false;
97
98 // Control ranges for normalization (min, max)
99 std::pair<int32_t, int32_t> exposure_range_ = {0, 0};
100 std::pair<int32_t, int32_t> white_balance_range_ = {0, 0};
101 std::pair<int32_t, int32_t> gain_range_ = {0, 0};
102
103 // v4l2 buffer management
104 static constexpr size_t kBufferCount = 4;
105 struct v4l2_buffer current_buffer_;
106 void* buffers_[kBufferCount] = {nullptr};
107 size_t buffer_lengths_[kBufferCount] = {0};
108
109 // Frame caching for compressed/uncompressed dual output
110 std::vector<uint8_t> cached_compressed_frame_;
111 bool has_cached_compressed_frame_ = false;
112 int64_t cached_frame_timestamp_us_ = 0;
113
114 // Timestamp conversion (v4l2 CLOCK_MONOTONIC → epoch)
115 int64_t monotonic_to_epoch_offset_us_ = -1;
116 int64_t ConvertMonotonicToEpoch(int64_t monotonic_us);
117
118 // v4l2 device management
119 absl::Status OpenDevice(int device_index);
120 absl::Status SetFormat(int width, int height, uint32_t pixelformat);
121 absl::Status RequestBuffers();
122 absl::Status MapBuffers();
123 absl::Status QueueBuffers();
124 absl::Status StartStreaming();
125 absl::Status StopStreaming();
126 void CleanupDevice();
127
128 // Frame capture
129 absl::Status CaptureFrame();
130
131 // Format conversion (YUYV/RGB → BGR)
132 void ConvertFrameToBGR(const uint8_t* data, size_t length, uint32_t pixelformat, cv::Mat& output);
133
134 // V4L2 control helpers
135 absl::Status SetV4l2Control(uint32_t control_id, int32_t value);
136 absl::StatusOr<int32_t> GetV4l2Control(uint32_t control_id);
137 absl::StatusOr<std::pair<int32_t, int32_t>> GetV4l2ControlRange(uint32_t control_id);
138 std::string GetV4l2ControlName(uint32_t control_id);
139
140 // Framerate management
141 absl::Status ResetFrameInterval();
142 absl::Status RestartDevice();
143};
144
145} // namespace presage::smartspectra::video_source::v4l2
Abstract interface for camera/video input sources.
Definition video_source.hpp:30
absl::Status TurnOnAutoWhiteBalance() override
Enable automatic white balance mode.
Definition v4l2_camera_source.cpp:771
absl::StatusOr< bool > IsAutoExposureOn() override
Check if automatic exposure is currently enabled.
Definition v4l2_camera_source.cpp:614
bool SupportsCompressedOutput() override
Definition v4l2_camera_source.cpp:374
absl::Status TurnOffAutoExposure() override
Disable automatic exposure and switch to manual mode.
Definition v4l2_camera_source.cpp:563
bool SupportsWhiteBalanceControls() override
Check if this video source supports white balance controls.
Definition v4l2_camera_source.cpp:765
absl::Status DecreaseWhiteBalance() override
Decrease white balance temperature by a fixed hardware-specific step.
Definition v4l2_camera_source.cpp:833
absl::Status TurnOffAutoWhiteBalance() override
Disable automatic white balance and switch to manual mode.
Definition v4l2_camera_source.cpp:780
absl::Status DecreaseGain() override
Decrease gain by a fixed hardware-specific step.
Definition v4l2_camera_source.cpp:927
bool SupportsGainControl() override
Check if this video source supports gain controls.
Definition v4l2_camera_source.cpp:901
absl::Status IncreaseGain() override
Increase gain by a fixed hardware-specific step.
Definition v4l2_camera_source.cpp:907
absl::StatusOr< bool > IsAutoWhiteBalanceOn() override
Check if automatic white balance is currently enabled.
Definition v4l2_camera_source.cpp:799
absl::Status SetWhiteBalance(double value) override
Set white balance temperature to a normalized value.
Definition v4l2_camera_source.cpp:862
absl::Status IncreaseExposure() override
Increase exposure by a fixed hardware-specific step.
Definition v4l2_camera_source.cpp:660
absl::Status IncreaseWhiteBalance() override
Increase white balance temperature by a fixed hardware-specific step.
Definition v4l2_camera_source.cpp:804
bool SupportsExposureControls() override
Check if this video source supports exposure controls.
Definition v4l2_camera_source.cpp:755
bool ProduceCompressedFrame(std::vector< uint8_t > &jpeg_data) override
Definition v4l2_camera_source.cpp:378
absl::Status SetExposure(double value) override
Set exposure to a normalized value.
Definition v4l2_camera_source.cpp:720
absl::StatusOr< double > GetGain() override
Get current gain as a normalized value.
Definition v4l2_camera_source.cpp:965
absl::StatusOr< double > GetWhiteBalance() override
Get current white balance temperature as a normalized value.
Definition v4l2_camera_source.cpp:880
absl::Status SetGain(double value) override
Set gain to a normalized value.
Definition v4l2_camera_source.cpp:947
absl::StatusOr< double > GetExposure() override
Get current exposure as a normalized value.
Definition v4l2_camera_source.cpp:738
absl::Status DecreaseExposure() override
Decrease exposure by a fixed hardware-specific step.
Definition v4l2_camera_source.cpp:690
absl::Status ToggleAutoWhiteBalance() override
Toggle between automatic and manual white balance modes.
Definition v4l2_camera_source.cpp:790
absl::Status TurnOnAutoExposure() override
Enable automatic exposure mode.
Definition v4l2_camera_source.cpp:552
int64_t GetFrameTimestamp() const override
Definition v4l2_camera_source.cpp:192
absl::Status Initialize(const VideoSourceSettings &settings) override
Definition v4l2_camera_source.cpp:36
absl::Status ToggleAutoExposure() override
Toggle between automatic and manual exposure modes.
Definition v4l2_camera_source.cpp:585
InputTransformMode
Transformation applied to frames prior to processing.
Definition input_transform.hpp:19
Configuration options for constructing a VideoSource.
Definition settings.hpp:23