Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions libcamera-sys/c_api/camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,28 @@ int libcamera_camera_stop(libcamera_camera_t *cam) {
return cam->get()->stop();
}

libcamera_sensor_configuration_t *libcamera_sensor_configuration_create()
{
return new libcamera_sensor_configuration_t();
}

void libcamera_sensor_configuration_set_bit_depth(libcamera_sensor_configuration_t *config, unsigned int bit_depth)
{
config->bitDepth = bit_depth;
}

void libcamera_sensor_configuration_set_output_size(libcamera_sensor_configuration_t *config, unsigned int width, unsigned int height)
{
config->outputSize = libcamera::Size(width, height);
}

void libcamera_camera_set_sensor_configuration(libcamera_camera_configuration_t *config, const libcamera_sensor_configuration_t *sensor_config)
{
config->sensorConfig = *sensor_config;
}

void libcamera_sensor_configuration_destroy(libcamera_sensor_configuration_t *config) {
delete config;
}

}
8 changes: 8 additions & 0 deletions libcamera-sys/c_api/camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ typedef void libcamera_request_completed_cb_t(void*, libcamera_request_t*);
#ifdef __cplusplus
#include <libcamera/camera.h>

typedef libcamera::SensorConfiguration libcamera_sensor_configuration_t;
typedef libcamera::CameraConfiguration libcamera_camera_configuration_t;
typedef libcamera::CameraConfiguration::Status libcamera_camera_configuration_status_t;
typedef std::shared_ptr<libcamera::Camera> libcamera_camera_t;
Expand All @@ -27,6 +28,7 @@ extern "C" {
#else
typedef enum libcamera_camera_configuration_status libcamera_camera_configuration_status_t;
typedef struct libcamera_camera_configuration_t libcamera_camera_configuration_t;
typedef struct libcamera_sensor_configuration_t libcamera_sensor_configuration_t;
typedef struct libcamera_camera_t libcamera_camera_t;
#endif

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

libcamera_sensor_configuration_t *libcamera_sensor_configuration_create();
void libcamera_sensor_configuration_destroy(libcamera_sensor_configuration_t *config);
void libcamera_sensor_configuration_set_bit_depth(libcamera_sensor_configuration_t *config, unsigned int bit_depth);
void libcamera_sensor_configuration_set_output_size(libcamera_sensor_configuration_t *config, unsigned int width, unsigned int height);
void libcamera_camera_set_sensor_configuration(libcamera_camera_configuration_t *config, const libcamera_sensor_configuration_t *sensor_config);

#ifdef __cplusplus
}
#endif
Expand Down
39 changes: 39 additions & 0 deletions libcamera/src/camera.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,41 @@ impl TryFrom<libcamera_camera_configuration_status_t> for CameraConfigurationSta
}
}

pub struct SensorConfiguration {
item: NonNull<libcamera_sensor_configuration_t>,
}

impl SensorConfiguration {
pub fn new() -> Self {
let ptr = NonNull::new(unsafe { libcamera_sensor_configuration_create() }).unwrap();
Self { item: ptr }
}

pub fn from_ptr(ptr: NonNull<libcamera_sensor_configuration_t>) -> Self {
Self { item: ptr }
}

pub fn set_bit_depth(&mut self, depth: u32) {
unsafe { libcamera_sensor_configuration_set_bit_depth(self.item.as_ptr(), depth) }
}

pub fn set_output_size(&mut self, width: u32, height: u32) {
unsafe { libcamera_sensor_configuration_set_output_size(self.item.as_ptr(), width, height) }
}
}

impl Default for SensorConfiguration {
fn default() -> Self {
Self::new()
}
}

impl Drop for SensorConfiguration {
fn drop(&mut self) {
unsafe { libcamera_sensor_configuration_destroy(self.item.as_ptr()) }
}
}

/// Camera configuration.
///
/// Contains [StreamConfigurationRef] for each stream used by the camera.
Expand Down Expand Up @@ -87,6 +122,10 @@ impl CameraConfiguration {
NonNull::new(ptr).map(|p| unsafe { StreamConfigurationRef::from_ptr(p) })
}

pub fn set_sensor_configuration(&mut self, mode: SensorConfiguration) {
unsafe { libcamera_camera_set_sensor_configuration(self.ptr.as_ptr(), mode.item.as_ptr()) }
}

/// Returns number of streams within camera configuration.
pub fn len(&self) -> usize {
unsafe { libcamera_camera_configuration_size(self.ptr.as_ptr()) }
Expand Down