async_mp4/mp4box/
vmhd.rs

1
2use async_trait::async_trait;
3use crate::{default_flags, full_box};
4use crate::bytes_read::{Mp4Readable, ReadMp4};
5use crate::bytes_write::{Mp4Writable, WriteMp4};
6use crate::error::MP4Error;
7
8#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
9pub struct VideoGraphicsMode(pub u16);
10
11impl VideoGraphicsMode {
12    pub const COPY: VideoGraphicsMode = VideoGraphicsMode(0);
13}
14
15impl Mp4Writable for VideoGraphicsMode {
16    fn byte_size(&self) -> usize {
17        self.0.byte_size()
18    }
19
20    fn write<W: WriteMp4>(&self, writer: &mut W) -> Result<usize, MP4Error> {
21        self.0.write(writer)
22    }
23}
24#[async_trait]
25impl Mp4Readable for VideoGraphicsMode {
26    async fn read<R: ReadMp4>(reader: &mut R) -> Result<Self, MP4Error> {
27        Ok(Self(u16::read(reader).await?))
28    }
29}
30
31default_flags!(VmhdFlags, 1);
32
33full_box! {
34    box (b"vmhd", Vmhd, VmhdBox, VmhdFlags)
35    data {
36        mode: VideoGraphicsMode,
37        color: [u16; 3]
38    }
39}
40
41impl Default for Vmhd {
42    fn default() -> Self {
43        Self {
44            mode: VideoGraphicsMode::COPY,
45            color: Default::default()
46        }
47    }
48}
49
50#[cfg(test)]
51mod test {
52    use crate::bytes_read::Mp4Readable;
53    use crate::error::MP4Error;
54    use crate::header::BoxHeader;
55    use crate::mp4box::box_trait::{BoxRead, BoxWrite, PartialBox};
56    use crate::mp4box::vmhd::{Vmhd, VmhdBox};
57
58    #[test]
59    pub fn test_rebuild() -> Result<(), MP4Error> {
60        futures::executor::block_on(async {
61            let base = VmhdBox::default();
62            let mut buf = vec![];
63            let mut cursor = std::io::Cursor::new(&mut buf);
64            let pos = base.write(&mut cursor)?;
65            assert_eq!(pos as u64, cursor.position());
66            let mut cursor = futures::io::Cursor::new(&mut buf);
67            let header = BoxHeader::read(&mut cursor).await?;
68            assert_eq!(header.id, Vmhd::ID);
69            let new = VmhdBox::read(header, &mut cursor).await?;
70            assert_eq!(base, new);
71            Ok(())
72        })
73    }
74
75}