Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expanded support for Libcamera Controls (ControlInfoMap and ControlInfo) #46

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
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
33 changes: 30 additions & 3 deletions libcamera-meta/src/bin/generate_from_git.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,35 @@ mod generate_rust {
}
out += "}\n";

let ffi_binding = match ty {
ControlsType::Control => "libcamera_control_name_from_id",
ControlsType::Property => "libcamera_property_name_by_id",
};

out += &format!("impl {} {{\n", name);
out += r#"
fn id(&self) -> u32 {
*self as u32
}
"#;
out += "\n";
out += r#"
pub fn name(&self) -> String {
unsafe {"#;
out += &format!(" let c_str = {}(self.id());\n", ffi_binding);
out += r#"
if c_str.is_null() {
// Handle null pointer as empty strings
return "".into();
}
// Convert the C string to a Rust &str
CStr::from_ptr(c_str).to_str().unwrap().into()
}
}
"#;

out += "}\n";

let mut dyn_variants = String::new();

for ctrl in controls.iter() {
Expand Down Expand Up @@ -422,7 +451,7 @@ mod generate_rust {

pub fn generate_controls_file(controls: &[Control], ty: ControlsType) -> String {
let header = r#"
use std::ops::{{Deref, DerefMut}};
use std::{ffi::CStr, ops::{{Deref, DerefMut}}};
use num_enum::{{IntoPrimitive, TryFromPrimitive}};
#[allow(unused_imports)]
use crate::control::{{Control, Property, ControlEntry, DynControlEntry}};
Expand All @@ -431,8 +460,6 @@ mod generate_rust {
use crate::geometry::{{Rectangle, Size}};
#[allow(unused_imports)]
use libcamera_sys::*;


"#;

let file = format!("{header}\n{}", generate_controls(controls, ty));
Expand Down
6 changes: 3 additions & 3 deletions libcamera-sys/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ doctest = false
[dependencies]

[build-dependencies]
bindgen = "0.66.1"
pkg-config = "0.3.26"
cc = "1.0"
bindgen = "0.70"
pkg-config = "0.3"
cc = "1"
146 changes: 142 additions & 4 deletions libcamera-sys/c_api/controls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,51 @@

extern "C" {

const char *libcamera_control_name(enum libcamera_control_id id) {
enum libcamera_control_id_enum libcamera_control_id(libcamera_control_id_t *control){
return (enum libcamera_control_id_enum)control->id();
}

const char *libcamera_control_name(libcamera_control_id_t *control){
return control->name().c_str();
}

enum libcamera_control_type libcamera_control_type(libcamera_control_id_t *control) {
return (enum libcamera_control_type) control->type();
}

const libcamera_control_id_t *libcamera_control_from_id(enum libcamera_control_id_enum id){
auto it = libcamera::controls::controls.find(id);
if (it != libcamera::controls::controls.end())
return it->second;
else
return nullptr;
}

const char *libcamera_control_name_from_id(enum libcamera_control_id_enum id) {
auto it = libcamera::controls::controls.find(id);
if (it != libcamera::controls::controls.end())
return it->second->name().c_str();
else
return nullptr;
}

enum libcamera_control_type libcamera_control_type(enum libcamera_control_id id) {
enum libcamera_control_type libcamera_control_type_from_id(enum libcamera_control_id_enum id) {
auto it = libcamera::controls::controls.find(id);
if (it != libcamera::controls::controls.end())
return (enum libcamera_control_type)it->second->type();
else
return LIBCAMERA_CONTROL_TYPE_NONE;
}

const char *libcamera_property_name(enum libcamera_property_id id) {
const char *libcamera_property_name_by_id(enum libcamera_property_id id) {
auto it = libcamera::properties::properties.find(id);
if (it != libcamera::properties::properties.end())
return it->second->name().c_str();
else
return nullptr;
}

enum libcamera_control_type libcamera_property_type(enum libcamera_property_id id) {
enum libcamera_control_type libcamera_property_type_by_id(enum libcamera_property_id id) {
auto it = libcamera::properties::properties.find(id);
if (it != libcamera::properties::properties.end())
return (enum libcamera_control_type)it->second->type();
Expand Down Expand Up @@ -120,4 +140,122 @@ void libcamera_control_value_set(libcamera_control_value_t *val, enum libcamera_
memcpy(storage.data(), data, storage.size());
}

size_t libcamera_control_value_size() {
return sizeof(libcamera::ControlValue);
}

const libcamera_control_value_t *libcamera_control_info_max(libcamera_control_info_t *val){
return &val->max();
}
const libcamera_control_value_t *libcamera_control_info_min(libcamera_control_info_t *val){
return &val->min();
}
const libcamera_control_value_t *libcamera_control_info_def(libcamera_control_info_t *val){
return &val->def();
}

const libcamera_control_value_t* libcamera_control_info_values(const libcamera_control_info_t* info, size_t* size)
{
if (!info || !size) return nullptr;
const std::vector<libcamera::ControlValue>& values = info->values();
*size = values.size();
return reinterpret_cast<const libcamera_control_value_t*>(values.data());
}

bool libcamera_control_id_map_add(libcamera_control_id_map_t *idmap, unsigned int key, const libcamera_control_id_t *control_id)
{
if (!idmap || !control_id)
return false;

(*idmap)[key] = control_id;
return true;
}

const libcamera_control_id_t *libcamera_control_id_map_get(libcamera_control_id_map_t *idmap, unsigned int key)
{
if (!idmap)
return nullptr;

auto it = idmap->find(key);
if (it != idmap->end())
return it->second;
return nullptr;
}


const libcamera_control_info_t *libcamera_control_info_map_at(libcamera_control_info_map_t *map, unsigned int key)
{
if (!map)
return nullptr;

try {
return &map->at(key);
} catch (const std::out_of_range &) {
return nullptr;
}
}

size_t libcamera_control_info_map_count(const libcamera_control_info_map_t *map, unsigned int key)
{
if (!map)
return 0;

return map->count(key);
}

size_t libcamera_control_info_map_size(const libcamera_control_info_map_t *map)
{
if (!map)
return 0;

return map->size();
}

const libcamera_control_info_t *libcamera_control_info_map_find(const libcamera_control_info_map_t *map, unsigned int key)
{
if (!map)
return nullptr;

auto it = map->find(key);
if (it != map->end()) {
return &it->second;
}

return nullptr;
}


libcamera_control_info_map_iter_t* libcamera_control_info_map_iter_create(const libcamera_control_info_map_t* map) {
if (!map) return nullptr;
libcamera_control_info_map_iter_t* iter = new libcamera_control_info_map_iter_t();
iter->current = map->begin();
iter->end = map->end();
return iter;
}

bool libcamera_control_info_map_iter_has_next(const libcamera_control_info_map_iter_t* iter) {
if (!iter) return false;
return iter->current != iter->end;
}

unsigned int libcamera_control_info_map_iter_key(const libcamera_control_info_map_iter_t* iter) {
if (!iter || iter->current == iter->end) return 0;
return iter->current->first->id();
}

const libcamera_control_info_t* libcamera_control_info_map_iter_value(const libcamera_control_info_map_iter_t* iter) {
if (!iter || iter->current == iter->end) return nullptr;
return &(iter->current->second);
}

void libcamera_control_info_map_iter_next(libcamera_control_info_map_iter_t* iter) {
if (!iter || iter->current == iter->end) return;
++(iter->current);
}

void libcamera_control_info_map_iter_destroy(libcamera_control_info_map_iter_t* iter) {
delete iter;
}


}
52 changes: 47 additions & 5 deletions libcamera-sys/c_api/controls.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,35 @@ struct libcamera_control_list_iter {
libcamera::ControlList::iterator it;
};

struct libcamera_control_info_map_iter {
libcamera::ControlInfoMap::const_iterator current;
libcamera::ControlInfoMap::const_iterator end;
};


typedef libcamera::ControlValue libcamera_control_value_t;
typedef libcamera::ControlList libcamera_control_list_t;
typedef struct libcamera_control_list_iter libcamera_control_list_iter_t;
typedef struct libcamera_control_info_map_iter libcamera_control_info_map_iter_t;
typedef libcamera::ControlInfoMap libcamera_control_info_map_t;
typedef libcamera::ControlIdMap libcamera_control_id_map_t;
typedef libcamera::ControlId libcamera_control_id_t;
typedef libcamera::ControlInfo libcamera_control_info_t;

extern "C" {
#else
typedef struct libcamera_control_value libcamera_control_value_t;
typedef struct libcamera_control_list libcamera_control_list_t;
typedef struct libcamera_control_list_iter libcamera_control_list_iter_t;
typedef struct libcamera_control_info_map_iter libcamera_control_info_map_iter_t;
typedef struct libcamera_control_info_map libcamera_control_info_map_t;
typedef struct libcamera_control_id libcamera_control_id_t;
typedef struct libcamera_control_info libcamera_control_info_t;
typedef struct libcamera_control_id_map libcamera_control_id_map_t;

#endif

enum libcamera_control_id { libcamera_control_id_DUMMY };
enum libcamera_control_id_enum { libcamera_control_id_DUMMY };
enum libcamera_property_id { libcamera_property_id_DUMMY };

enum libcamera_control_type {
Expand All @@ -42,12 +57,16 @@ enum libcamera_control_type {
};

// --- libcamera_control_id ---
const char *libcamera_control_name(enum libcamera_control_id id);
enum libcamera_control_type libcamera_control_type(enum libcamera_control_id id);
const libcamera_control_id_t *libcamera_control_from_id(enum libcamera_control_id_enum id);
const char *libcamera_control_name_from_id(enum libcamera_control_id_enum id);
enum libcamera_control_type libcamera_control_type_from_id(enum libcamera_control_id_enum id);

enum libcamera_control_id_enum libcamera_control_id(libcamera_control_id_t *control);
const char *libcamera_control_name(libcamera_control_id_t *control);
enum libcamera_control_type libcamera_control_type(libcamera_control_id_t *control);
// --- libcamera_property_id ---
const char *libcamera_property_name(enum libcamera_property_id id);
enum libcamera_control_type libcamera_property_type(enum libcamera_property_id id);
const char *libcamera_property_name_by_id(enum libcamera_property_id id);
enum libcamera_control_type libcamera_property_type_by_id(enum libcamera_property_id id);

// --- libcamera_control_list_t ---
libcamera_control_list_t *libcamera_control_list_create();
Expand All @@ -72,6 +91,29 @@ bool libcamera_control_value_is_array(const libcamera_control_value_t *val);
size_t libcamera_control_value_num_elements(const libcamera_control_value_t *val);
const void *libcamera_control_value_get(const libcamera_control_value_t *val);
void libcamera_control_value_set(libcamera_control_value_t *val, enum libcamera_control_type type, const void *data, bool is_array, size_t num_elements);
size_t libcamera_control_value_size();
// --- libcamera_control_info_t ---
const libcamera_control_value_t *libcamera_control_info_max(libcamera_control_info_t *val);
const libcamera_control_value_t *libcamera_control_info_min(libcamera_control_info_t *val);
const libcamera_control_value_t *libcamera_control_info_def(libcamera_control_info_t *val);
const libcamera_control_value_t* libcamera_control_info_values(const libcamera_control_info_t* info, size_t* size);
// --- libcamera_control_id_map ---
bool libcamera_control_id_map_add(libcamera_control_id_map_t *idmap, unsigned int key, const libcamera_control_id_t *control_id);
const libcamera_control_id_t *libcamera_control_id_map_get(libcamera_control_id_map_t *idmap, unsigned int key);

// --- libcamera_control_info_map ---
const libcamera_control_info_t *libcamera_control_info_map_at(libcamera_control_info_map_t *map, unsigned int key);
size_t libcamera_control_info_map_size(const libcamera_control_info_map_t *map);
size_t libcamera_control_info_map_count(const libcamera_control_info_map_t *map, unsigned int key);
const libcamera_control_info_t * libcamera_control_info_map_find(const libcamera_control_info_map_t *map, unsigned int key);

// --- libcamera_control_info_map_iter_t ---
libcamera_control_info_map_iter_t* libcamera_control_info_map_iter_create(const libcamera_control_info_map_t* map);
bool libcamera_control_info_map_iter_has_next(const libcamera_control_info_map_iter_t* iter);
unsigned int libcamera_control_info_map_iter_key(const libcamera_control_info_map_iter_t* iter);
const libcamera_control_info_t* libcamera_control_info_map_iter_value(const libcamera_control_info_map_iter_t* iter);
void libcamera_control_info_map_iter_next(libcamera_control_info_map_iter_t* iter);
void libcamera_control_info_map_iter_destroy(libcamera_control_info_map_iter_t* iter);

#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion libcamera/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@ smallvec = "1.10"
thiserror = "1.0"

[build-dependencies]
libcamera-sys = { path = "../libcamera-sys", version = "0.3.0" }
# libcamera-sys = { path = "../libcamera-sys", version = "0.3.0" }
semver = "1.0.22"
6 changes: 1 addition & 5 deletions libcamera/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ use std::{
use semver::{Comparator, Op, Version};

fn main() {
let libcamera_version = Version::new(
libcamera_sys::LIBCAMERA_VERSION_MAJOR as _,
libcamera_sys::LIBCAMERA_VERSION_MINOR as _,
libcamera_sys::LIBCAMERA_VERSION_PATCH as _,
);
let libcamera_version = Version::new(0, 3, 2);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hi if your doing this so you can cross compile i hope #48 should help, could you try it yourself to confirm?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey sorry for the hold up, yes it in fact did work! for cross and on my host machine.


let versioned_files = Path::new("versioned_files");
let mut candidates = std::fs::read_dir(versioned_files)
Expand Down
Loading
Loading