Skip to content

Commit 31a0a85

Browse files
Added SensorConfiguration struct
This struct allows to define a specific sensor configuration and provide it to camera configuration before validate call. It allows user to specify exact sensor mode that needs to be used
1 parent a7f8462 commit 31a0a85

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

libcamera-sys/c_api/camera.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,28 @@ int libcamera_camera_stop(libcamera_camera_t *cam) {
9191
return cam->get()->stop();
9292
}
9393

94+
libcamera_sensor_configuration_t *libcamera_sensor_configuration_create()
95+
{
96+
return new libcamera_sensor_configuration_t();
97+
}
98+
99+
void libcamera_sensor_configuration_set_bit_depth(libcamera_sensor_configuration_t *config, unsigned int bit_depth)
100+
{
101+
config->bitDepth = bit_depth;
102+
}
103+
104+
void libcamera_sensor_configuration_set_output_size(libcamera_sensor_configuration_t *config, unsigned int width, unsigned int height)
105+
{
106+
config->outputSize = libcamera::Size(width, height);
107+
}
108+
109+
void libcamera_camera_set_sensor_configuration(libcamera_camera_configuration_t *config, const libcamera_sensor_configuration_t *sensor_config)
110+
{
111+
config->sensorConfig = *sensor_config;
112+
}
113+
114+
void libcamera_sensor_configuration_destroy(libcamera_sensor_configuration_t *config) {
115+
delete config;
116+
}
117+
94118
}

libcamera-sys/c_api/camera.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ typedef void libcamera_request_completed_cb_t(void*, libcamera_request_t*);
1919
#ifdef __cplusplus
2020
#include <libcamera/camera.h>
2121

22+
typedef libcamera::SensorConfiguration libcamera_sensor_configuration_t;
2223
typedef libcamera::CameraConfiguration libcamera_camera_configuration_t;
2324
typedef libcamera::CameraConfiguration::Status libcamera_camera_configuration_status_t;
2425
typedef std::shared_ptr<libcamera::Camera> libcamera_camera_t;
@@ -27,6 +28,7 @@ extern "C" {
2728
#else
2829
typedef enum libcamera_camera_configuration_status libcamera_camera_configuration_status_t;
2930
typedef struct libcamera_camera_configuration_t libcamera_camera_configuration_t;
31+
typedef struct libcamera_sensor_configuration_t libcamera_sensor_configuration_t;
3032
typedef struct libcamera_camera_t libcamera_camera_t;
3133
#endif
3234

@@ -51,6 +53,12 @@ int libcamera_camera_queue_request(libcamera_camera_t *cam, libcamera_request_t
5153
int libcamera_camera_start(libcamera_camera_t *cam, const libcamera_control_list_t *controls);
5254
int libcamera_camera_stop(libcamera_camera_t *cam);
5355

56+
libcamera_sensor_configuration_t *libcamera_sensor_configuration_create();
57+
void libcamera_sensor_configuration_destroy(libcamera_sensor_configuration_t *config);
58+
void libcamera_sensor_configuration_set_bit_depth(libcamera_sensor_configuration_t *config, unsigned int bit_depth);
59+
void libcamera_sensor_configuration_set_output_size(libcamera_sensor_configuration_t *config, unsigned int width, unsigned int height);
60+
void libcamera_camera_set_sensor_configuration(libcamera_camera_configuration_t *config, const libcamera_sensor_configuration_t *sensor_config);
61+
5462
#ifdef __cplusplus
5563
}
5664
#endif

libcamera/src/camera.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,41 @@ impl TryFrom<libcamera_camera_configuration_status_t> for CameraConfigurationSta
5555
}
5656
}
5757

58+
pub struct SensorConfiguration {
59+
item: NonNull<libcamera_sensor_configuration_t>,
60+
}
61+
62+
impl SensorConfiguration {
63+
pub fn new() -> Self {
64+
let ptr = NonNull::new(unsafe { libcamera_sensor_configuration_create() }).unwrap();
65+
Self { item: ptr }
66+
}
67+
68+
pub fn from_ptr(ptr: NonNull<libcamera_sensor_configuration_t>) -> Self {
69+
Self { item: ptr }
70+
}
71+
72+
pub fn set_bit_depth(&mut self, depth: u32) {
73+
unsafe { libcamera_sensor_configuration_set_bit_depth(self.item.as_ptr(), depth) }
74+
}
75+
76+
pub fn set_output_size(&mut self, width: u32, height: u32) {
77+
unsafe { libcamera_sensor_configuration_set_output_size(self.item.as_ptr(), width, height) }
78+
}
79+
}
80+
81+
impl Default for SensorConfiguration {
82+
fn default() -> Self {
83+
Self::new()
84+
}
85+
}
86+
87+
impl Drop for SensorConfiguration {
88+
fn drop(&mut self) {
89+
unsafe { libcamera_sensor_configuration_destroy(self.item.as_ptr()) }
90+
}
91+
}
92+
5893
/// Camera configuration.
5994
///
6095
/// Contains [StreamConfigurationRef] for each stream used by the camera.
@@ -87,6 +122,10 @@ impl CameraConfiguration {
87122
NonNull::new(ptr).map(|p| unsafe { StreamConfigurationRef::from_ptr(p) })
88123
}
89124

125+
pub fn set_sensor_configuration(&mut self, mode: SensorConfiguration) {
126+
unsafe { libcamera_camera_set_sensor_configuration(self.ptr.as_ptr(), mode.item.as_ptr()) }
127+
}
128+
90129
/// Returns number of streams within camera configuration.
91130
pub fn len(&self) -> usize {
92131
unsafe { libcamera_camera_configuration_size(self.ptr.as_ptr()) }

0 commit comments

Comments
 (0)