libcamera/
camera_manager.rs1use std::{
2 ffi::{CStr, CString},
3 io,
4 marker::PhantomData,
5 ptr::NonNull,
6};
7
8use libcamera_sys::*;
9
10use crate::{camera::Camera, logging::LoggingLevel, utils::handle_result};
11
12pub struct CameraManager {
14 ptr: NonNull<libcamera_camera_manager_t>,
15}
16
17impl CameraManager {
18 pub fn new() -> io::Result<Self> {
20 let ptr = NonNull::new(unsafe { libcamera_camera_manager_create() }).unwrap();
21 let ret = unsafe { libcamera_camera_manager_start(ptr.as_ptr()) };
22 handle_result(ret)?;
23 Ok(CameraManager { ptr })
24 }
25
26 pub fn version(&self) -> &str {
28 unsafe { CStr::from_ptr(libcamera_camera_manager_version(self.ptr.as_ptr())) }
29 .to_str()
30 .unwrap()
31 }
32
33 pub fn cameras(&self) -> CameraList<'_> {
35 unsafe { CameraList::from_ptr(NonNull::new(libcamera_camera_manager_cameras(self.ptr.as_ptr())).unwrap()) }
36 }
37
38 pub fn log_set_level(&self, category: &str, level: LoggingLevel) {
46 let category = CString::new(category).expect("category contains null byte");
47 let level: &CStr = level.into();
48 unsafe {
49 libcamera_log_set_level(category.as_ptr(), level.as_ptr());
50 }
51 }
52}
53
54impl Drop for CameraManager {
55 fn drop(&mut self) {
56 unsafe {
57 libcamera_camera_manager_stop(self.ptr.as_ptr());
58 libcamera_camera_manager_destroy(self.ptr.as_ptr());
59 }
60 }
61}
62
63pub struct CameraList<'d> {
64 ptr: NonNull<libcamera_camera_list_t>,
65 _phantom: PhantomData<&'d ()>,
66}
67
68impl CameraList<'_> {
69 pub(crate) unsafe fn from_ptr(ptr: NonNull<libcamera_camera_list_t>) -> Self {
70 Self {
71 ptr,
72 _phantom: Default::default(),
73 }
74 }
75
76 pub fn len(&self) -> usize {
78 unsafe { libcamera_camera_list_size(self.ptr.as_ptr()) }
79 }
80
81 pub fn is_empty(&self) -> bool {
83 self.len() == 0
84 }
85
86 pub fn get(&self, index: usize) -> Option<Camera<'_>> {
90 let cam_ptr = unsafe { libcamera_camera_list_get(self.ptr.as_ptr(), index as _) };
91 NonNull::new(cam_ptr).map(|p| unsafe { Camera::from_ptr(p) })
92 }
93}
94
95impl Drop for CameraList<'_> {
96 fn drop(&mut self) {
97 unsafe {
98 libcamera_camera_list_destroy(self.ptr.as_ptr());
99 }
100 }
101}