Skip to main content

linux_media/
media_link_enum.rs

1use 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/// Enumerates MediaPads and/or MediaLinks associated to an Entity specified with id.
12#[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}