Skip to content

Commit 20db61e

Browse files
committed
Make the roundtrip encoding pass
This is done by storing box names and their contents instead of just raw bytes
1 parent 0550c9d commit 20db61e

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

src/mp4box/meta.rs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub enum MetaBox {
2121
hdlr: HdlrBox,
2222

2323
#[serde(skip)]
24-
data: Vec<u8>,
24+
data: Vec<(BoxType, Vec<u8>)>,
2525
},
2626
}
2727

@@ -41,7 +41,13 @@ impl MetaBox {
4141
size += ilst.box_size();
4242
}
4343
}
44-
Self::Unknown { hdlr, data } => size += hdlr.box_size() + data.len() as u64,
44+
Self::Unknown { hdlr, data } => {
45+
size += hdlr.box_size()
46+
+ data
47+
.iter()
48+
.map(|(_, data)| data.len() as u64 + HEADER_SIZE)
49+
.sum::<u64>()
50+
}
4551
}
4652
size
4753
}
@@ -147,8 +153,27 @@ impl<R: Read + Seek> ReadBox<&mut R> for MetaBox {
147153
Ok(MetaBox::Mdir { ilst })
148154
}
149155
_ => {
150-
let mut data = vec![0u8; (end - current) as usize];
151-
reader.read_exact(&mut data)?;
156+
let mut data = Vec::new();
157+
158+
while current < end {
159+
// Get box header.
160+
let header = BoxHeader::read(reader)?;
161+
let BoxHeader { name, size: s } = header;
162+
163+
match name {
164+
BoxType::HdlrBox => {
165+
skip_box(reader, s)?;
166+
}
167+
_ => {
168+
let mut box_data = vec![0; (s - HEADER_SIZE) as usize];
169+
reader.read_exact(&mut box_data)?;
170+
171+
data.push((name, box_data));
172+
}
173+
}
174+
175+
current = reader.stream_position()?;
176+
}
152177

153178
Ok(MetaBox::Unknown { hdlr, data })
154179
}
@@ -178,7 +203,12 @@ impl<W: Write> WriteBox<&mut W> for MetaBox {
178203
ilst.write_box(writer)?;
179204
}
180205
}
181-
Self::Unknown { data, .. } => writer.write_all(data)?,
206+
Self::Unknown { data, .. } => {
207+
for (box_type, data) in data {
208+
BoxHeader::new(*box_type, data.len() as u64 + HEADER_SIZE).write(writer)?;
209+
writer.write_all(data)?;
210+
}
211+
}
182212
}
183213
Ok(size)
184214
}
@@ -235,10 +265,14 @@ mod tests {
235265

236266
let meta_box = MetaBox::read_box(&mut reader, header.size).unwrap();
237267

238-
239268
// this contains \xa9too box in the ilst
240269
// it designates the tool that created the file, but is not yet supported by this crate
241-
assert_eq!(meta_box, MetaBox::Mdir { ilst: Some(IlstBox::default()) });
270+
assert_eq!(
271+
meta_box,
272+
MetaBox::Mdir {
273+
ilst: Some(IlstBox::default())
274+
}
275+
);
242276
}
243277

244278
#[test]
@@ -247,10 +281,10 @@ mod tests {
247281
handler_type: FourCC::from(*b"test"),
248282
..Default::default()
249283
};
250-
let src_data = b"123";
284+
let src_data = (BoxType::UnknownBox(0x42494241), b"123".to_vec());
251285
let src_box = MetaBox::Unknown {
252286
hdlr: src_hdlr,
253-
data: src_data.to_vec(),
287+
data: vec![src_data],
254288
};
255289

256290
let mut buf = Vec::new();

0 commit comments

Comments
 (0)