mp4san 0.5.3

An MP4 file sanitizer.
Documentation
use derive_builder::Builder;

use crate::parse::{fourcc, Co64Box, MdiaBox, MinfBox, MoovBox, Mp4Box, StblBox, StcoBox, TrakBox};

use super::{test_dinf, test_hdlr, test_mdhd, test_mvhd, test_stsc, test_stsd, test_stsz, test_stts, test_tkhd};

#[derive(Builder)]
#[builder(name = "TestMoovBuilder", build_fn(name = "build_spec"))]
pub struct TestMoovSpec {
    #[builder(default)]
    #[builder(setter(into, each(name = "add_co_entry")))]
    pub co_entries: Vec<u64>,

    #[builder(default = "true")]
    pub stco: bool,

    #[builder(default)]
    pub co64: bool,

    #[builder(default = "true")]
    pub stbl: bool,

    #[builder(default = "true")]
    pub minf: bool,

    #[builder(default = "true")]
    pub mdia: bool,

    #[builder(default = "true")]
    pub trak: bool,
}

impl TestMoovBuilder {
    pub fn build(&self) -> Mp4Box<MoovBox> {
        let spec = self.build_spec().unwrap();
        let chunk_count = spec.co_entries.len() as u32;

        let mut stbl = vec![test_stsd(), test_stts(chunk_count), test_stsc(), test_stsz(chunk_count)];
        if spec.co64 {
            let entries = spec.co_entries.iter().cloned();
            stbl.push(Mp4Box::with_data(Co64Box::from_iter(entries).into()).unwrap().into());
        }
        if spec.stco {
            let entries = spec.co_entries.into_iter().map(|entry| entry as u32);
            stbl.push(Mp4Box::with_data(StcoBox::from_iter(entries).into()).unwrap().into());
        }

        let mut minf = vec![test_dinf()];
        if spec.stbl {
            minf.push(Mp4Box::with_data(StblBox::with_children(stbl).into()).unwrap().into());
        }

        let mut mdia = vec![test_mdhd(), test_hdlr(fourcc::META)];
        if spec.minf {
            mdia.push(Mp4Box::with_data(MinfBox::with_children(minf).into()).unwrap().into());
        }

        let mut trak = vec![test_tkhd(1)];
        if spec.mdia {
            trak.push(Mp4Box::with_data(MdiaBox::with_children(mdia).into()).unwrap().into());
        }

        let mut moov = vec![test_mvhd()];
        if spec.trak {
            moov.push(Mp4Box::with_data(TrakBox::with_children(trak).into()).unwrap().into());
        }
        Mp4Box::with_data(MoovBox::with_children(moov).into()).unwrap()
    }
}