Skip to main content

async_mp4/mp4box/
box_unknown.rs

1use crate::header::BoxHeader;
2use async_trait::async_trait;
3use futures::{AsyncReadExt};
4use crate::bytes_read::ReadMp4;
5use crate::bytes_write::{Mp4Writable, WriteMp4};
6use crate::error::MP4Error;
7use crate::id::BoxId;
8use crate::mp4box::box_trait::{BoxRead, BoxWrite, IBox};
9use crate::r#type::BoxType;
10use crate::size::BoxSize;
11
12#[derive(Debug, Clone, Eq, PartialEq, Hash)]
13pub struct UnknownBox
14{
15    pub id: BoxType,
16    pub data: Vec<u8>
17}
18
19impl UnknownBox {
20    fn header(&self) -> BoxHeader {
21        BoxHeader::from_id_and_inner_size(self.id, self.data.byte_size())
22    }
23}
24
25impl BoxWrite for UnknownBox
26{
27    fn write<W: WriteMp4>(&self, writer: &mut W) -> Result<usize, MP4Error> {
28        let mut count = 0;
29        count += self.header().write(writer)?;
30        count += self.data.write(writer)?;
31        Ok(count)
32    }
33}
34
35impl IBox for UnknownBox
36{
37    fn byte_size(&self) -> usize {
38        self.header().byte_size() + self.data.byte_size()
39    }
40
41    const ID: BoxType = BoxType::Id(BoxId(*b"    "));
42}
43
44#[async_trait]
45impl BoxRead for UnknownBox
46{
47    async fn read<R: ReadMp4>(header: BoxHeader, reader: &mut R) -> Result<Self, MP4Error> {
48        let data = match header.size_minus_self() {
49            BoxSize::Known(size) => {
50                let mut vec = vec![0u8; size];
51                reader.read_exact(vec.as_mut_slice()).await?;
52                vec
53            }
54            BoxSize::Unknown => {
55                let mut vec = vec![];
56                reader.read_to_end(&mut vec).await?;
57                vec
58            }
59        };
60        Ok(Self { id: header.id, data })
61    }
62}