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