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}