11#include <opencv2/core.hpp>
12#include <absl/status/status.h>
13#include <linux/videodev2.h>
15#include <smartspectra/video_source/video_source.hpp>
16#include <smartspectra/video_source/settings.hpp>
19namespace presage::smartspectra::video_source::v4l2 {
28 ~V4l2CameraSource()
override;
31 V4l2CameraSource() =
default;
32 V4l2CameraSource(
const V4l2CameraSource&) =
delete;
33 V4l2CameraSource& operator=(
const V4l2CameraSource&) =
delete;
34 V4l2CameraSource(V4l2CameraSource&&) =
delete;
35 V4l2CameraSource& operator=(V4l2CameraSource&&) =
delete;
39 int GetWidth()
override;
40 int GetHeight()
override;
42 void ProducePreTransformFrame(cv::Mat& frame)
override;
44 bool SupportsExactFrameTimestamp()
const override;
73 absl::Status
SetGain(
double value)
override;
74 absl::StatusOr<double>
GetGain()
override;
87 int device_index_ = 0;
90 uint32_t pixelformat_ = 0;
91 camera::CaptureCodec codec_ = camera::CaptureCodec::MJPG;
93 int exposure_step_ = 50;
94 int white_balance_step_ = 100;
96 bool log_verbose_controls_ =
false;
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};
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};
110 std::vector<uint8_t> cached_compressed_frame_;
111 bool has_cached_compressed_frame_ =
false;
112 int64_t cached_frame_timestamp_us_ = 0;
115 int64_t monotonic_to_epoch_offset_us_ = -1;
116 int64_t ConvertMonotonicToEpoch(int64_t monotonic_us);
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();
129 absl::Status CaptureFrame();
132 void ConvertFrameToBGR(
const uint8_t* data,
size_t length, uint32_t pixelformat, cv::Mat& output);
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);
141 absl::Status ResetFrameInterval();
142 absl::Status RestartDevice();
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