1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use std::io::{Read, Seek, Write}; use serde::{Serialize}; use crate::mp4box::elst::ElstBox; use crate::mp4box::*; #[derive(Debug, Clone, PartialEq, Default, Serialize)] pub struct EdtsBox { pub elst: Option<ElstBox>, } impl EdtsBox { pub(crate) fn new() -> EdtsBox { Default::default() } pub fn get_type(&self) -> BoxType { BoxType::EdtsBox } pub fn get_size(&self) -> u64 { let mut size = HEADER_SIZE; if let Some(ref elst) = self.elst { size += elst.box_size(); } size } } impl Mp4Box for EdtsBox { fn box_type(&self) -> BoxType { return self.get_type(); } fn box_size(&self) -> u64 { return self.get_size(); } fn to_json(&self) -> Result<String> { Ok(serde_json::to_string(&self).unwrap()) } fn summary(&self) -> Result<String> { let s = format!(""); Ok(s) } } impl<R: Read + Seek> ReadBox<&mut R> for EdtsBox { fn read_box(reader: &mut R, size: u64) -> Result<Self> { let start = box_start(reader)?; let mut edts = EdtsBox::new(); let header = BoxHeader::read(reader)?; let BoxHeader { name, size: s } = header; match name { BoxType::ElstBox => { let elst = ElstBox::read_box(reader, s)?; edts.elst = Some(elst); } _ => {} } skip_bytes_to(reader, start + size)?; Ok(edts) } } impl<W: Write> WriteBox<&mut W> for EdtsBox { fn write_box(&self, writer: &mut W) -> Result<u64> { let size = self.box_size(); BoxHeader::new(self.box_type(), size).write(writer)?; if let Some(ref elst) = self.elst { elst.write_box(writer)?; } Ok(size) } }