scuffle_mp4/boxes/types/
btrt.rs

1use std::io;
2
3use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
4use bytes::Bytes;
5
6use crate::boxes::header::BoxHeader;
7use crate::boxes::traits::BoxType;
8
9#[derive(Debug, Clone, PartialEq)]
10/// BitRate Box
11/// ISO/IEC 14496-12:2022(E) - 8.5.2
12pub struct Btrt {
13    pub header: BoxHeader,
14    pub buffer_size_db: u32,
15    pub max_bitrate: u32,
16    pub avg_bitrate: u32,
17}
18
19impl BoxType for Btrt {
20    const NAME: [u8; 4] = *b"btrt";
21
22    fn demux(header: BoxHeader, data: Bytes) -> io::Result<Self> {
23        let mut reader = io::Cursor::new(data);
24
25        let buffer_size_db = reader.read_u32::<BigEndian>()?;
26        let max_bitrate = reader.read_u32::<BigEndian>()?;
27        let avg_bitrate = reader.read_u32::<BigEndian>()?;
28
29        Ok(Self {
30            header,
31
32            buffer_size_db,
33            max_bitrate,
34            avg_bitrate,
35        })
36    }
37
38    fn primitive_size(&self) -> u64 {
39        4 // buffer_size_db
40        + 4 // max_bitrate
41        + 4 // avg_bitrate
42    }
43
44    fn primitive_mux<T: io::Write>(&self, writer: &mut T) -> io::Result<()> {
45        writer.write_u32::<BigEndian>(self.buffer_size_db)?;
46        writer.write_u32::<BigEndian>(self.max_bitrate)?;
47        writer.write_u32::<BigEndian>(self.avg_bitrate)?;
48
49        Ok(())
50    }
51}