linux_media/
media_link_enum.rs1use std::os::fd::AsRawFd;
2
3use serde::{Deserialize, Serialize};
4
5use crate::error;
6use crate::ioctl;
7use crate::{EntityId, MediaEntityDesc, MediaLinkDesc, MediaPadDesc};
8
9use linux_media_sys as media;
10
11#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize)]
13pub struct MediaLinksEnum {
14 entity: EntityId,
15 pads: Vec<MediaPadDesc>,
16 links: Vec<MediaLinkDesc>,
17}
18
19fn zeros_vec<T>(num: usize) -> Vec<T>
20where
21 T: Clone,
22{
23 let mut xs = vec![];
24 xs.resize(num, unsafe { std::mem::zeroed() });
25 xs
26}
27
28impl MediaLinksEnum {
29 pub fn new<F>(fd: F, entity: EntityId) -> error::Result<Self>
30 where
31 F: AsRawFd,
32 {
33 let desc = MediaEntityDesc::from_fd(fd.as_raw_fd(), entity)?;
34 let mut enum_links: media::media_links_enum = unsafe { std::mem::zeroed() };
35 enum_links.entity = entity.into();
36 unsafe {
37 let mut pads: Vec<media::media_pad_desc> = zeros_vec(desc.pads);
38 enum_links.pads = pads.as_mut_ptr();
39
40 let mut links: Vec<media::media_link_desc> = zeros_vec(desc.links);
41 enum_links.links = links.as_mut_ptr();
42
43 ioctl!(fd, media::MEDIA_IOC_ENUM_LINKS, &mut enum_links)?;
44 Ok(Self {
45 entity,
46 pads: pads.into_iter().map(Into::into).collect(),
47 links: links.into_iter().map(Into::into).collect(),
48 })
49 }
50 }
51
52 pub fn entity(&self) -> EntityId {
53 self.entity
54 }
55
56 pub fn pads(&self) -> &[MediaPadDesc] {
57 self.pads.as_ref()
58 }
59
60 pub fn links(&self) -> &[MediaLinkDesc] {
61 self.links.as_ref()
62 }
63}