async_mp4/mp4box/
box_unknown.rs1use 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}