1 //! Operations specific to MMAP-type buffers.
2 use super::*;
3 use crate::{bindings, ioctl};
4 use std::fmt::Debug;
5 use std::os::fd::AsFd;
6 
7 #[derive(Default)]
8 pub struct Mmap;
9 
10 impl Memory for Mmap {
11     const MEMORY_TYPE: MemoryType = MemoryType::Mmap;
12     type RawBacking = u32;
13 
get_plane_buffer_backing( m: &bindings::v4l2_plane__bindgen_ty_1, ) -> &Self::RawBacking14     unsafe fn get_plane_buffer_backing(
15         m: &bindings::v4l2_plane__bindgen_ty_1,
16     ) -> &Self::RawBacking {
17         &m.mem_offset
18     }
19 
get_single_planar_buffer_backing( m: &bindings::v4l2_buffer__bindgen_ty_1, ) -> &Self::RawBacking20     unsafe fn get_single_planar_buffer_backing(
21         m: &bindings::v4l2_buffer__bindgen_ty_1,
22     ) -> &Self::RawBacking {
23         &m.offset
24     }
25 
get_plane_buffer_backing_mut( m: &mut bindings::v4l2_plane__bindgen_ty_1, ) -> &mut Self::RawBacking26     unsafe fn get_plane_buffer_backing_mut(
27         m: &mut bindings::v4l2_plane__bindgen_ty_1,
28     ) -> &mut Self::RawBacking {
29         &mut m.mem_offset
30     }
31 
get_single_planar_buffer_backing_mut( m: &mut bindings::v4l2_buffer__bindgen_ty_1, ) -> &mut Self::RawBacking32     unsafe fn get_single_planar_buffer_backing_mut(
33         m: &mut bindings::v4l2_buffer__bindgen_ty_1,
34     ) -> &mut Self::RawBacking {
35         &mut m.offset
36     }
37 }
38 
39 impl SelfBacked for Mmap {}
40 
41 /// Dummy handle for a MMAP plane, to use with APIs that require handles. MMAP
42 /// buffers are backed by the device, and thus we don't need to attach any extra
43 /// information to them.
44 #[derive(Default, Debug, Clone)]
45 pub struct MmapHandle;
46 
47 // There is no information to fill with MMAP buffers ; the index is enough.
48 impl PlaneHandle for MmapHandle {
49     type Memory = Mmap;
50 
fill_v4l2_plane(&self, _plane: &mut bindings::v4l2_plane)51     fn fill_v4l2_plane(&self, _plane: &mut bindings::v4l2_plane) {}
52 }
53 
54 impl Mappable for MmapHandle {
map<D: AsFd>(device: &D, plane_info: &QueryBufPlane) -> Option<PlaneMapping>55     fn map<D: AsFd>(device: &D, plane_info: &QueryBufPlane) -> Option<PlaneMapping> {
56         ioctl::mmap(device, plane_info.mem_offset, plane_info.length).ok()
57     }
58 }
59