pub(crate) struct BoxBuilder {
buf: Vec<u8>,
}
impl BoxBuilder {
pub(crate) fn new() -> Self {
Self { buf: Vec::new() }
}
pub(crate) fn begin_box(&mut self, box_type: &[u8; 4]) -> usize {
let start = self.buf.len();
self.buf.extend_from_slice(&[0, 0, 0, 0]);
self.buf.extend_from_slice(box_type);
start
}
pub(crate) fn end_box(&mut self, start: usize) {
let size = (self.buf.len() - start) as u32;
self.buf[start..start + 4].copy_from_slice(&size.to_be_bytes());
}
pub(crate) fn full_box(&mut self, version: u8, flags: u32) {
self.buf.push(version);
self.buf.extend_from_slice(&flags.to_be_bytes()[1..]);
}
pub(crate) fn u8(&mut self, value: u8) {
self.buf.push(value);
}
pub(crate) fn u16(&mut self, value: u16) {
self.buf.extend_from_slice(&value.to_be_bytes());
}
pub(crate) fn u32(&mut self, value: u32) {
self.buf.extend_from_slice(&value.to_be_bytes());
}
pub(crate) fn bytes(&mut self, data: &[u8]) {
self.buf.extend_from_slice(data);
}
pub(crate) fn reserve_u32(&mut self) -> usize {
let pos = self.buf.len();
self.buf.extend_from_slice(&[0, 0, 0, 0]);
pos
}
pub(crate) fn patch_u32(&mut self, pos: usize, value: u32) {
self.buf[pos..pos + 4].copy_from_slice(&value.to_be_bytes());
}
pub(crate) fn len(&self) -> usize {
self.buf.len()
}
pub(crate) fn into_vec(self) -> Vec<u8> {
self.buf
}
}