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