1
0
Fork 0
mirror of https://github.com/alfg/mp4-rust.git synced 2024-06-11 01:19:21 +00:00

when writing, mdat box is always large

This adds 8 bytes per file but allows files > 4GB.
This commit is contained in:
Andrew Straw 2022-11-04 17:00:36 +01:00
parent 0cd2abb60a
commit 696a02833b
2 changed files with 11 additions and 8 deletions

View file

@ -110,7 +110,7 @@ pub use moof::MoofBox;
pub use moov::MoovBox;
pub const HEADER_SIZE: u64 = 8;
// const HEADER_LARGE_SIZE: u64 = 16;
pub const HEADER_LARGE_SIZE: u64 = 16;
pub const HEADER_EXT_SIZE: u64 = 4;
macro_rules! boxtype {
@ -266,6 +266,13 @@ impl BoxHeader {
Ok(8)
}
}
pub fn write_large<W: Write>(&self, writer: &mut W) -> Result<u64> {
writer.write_u32::<BigEndian>(1)?;
writer.write_u32::<BigEndian>(self.name.into())?;
writer.write_u64::<BigEndian>(self.size)?;
Ok(16)
}
}
pub fn read_box_header_ext<R: Read>(reader: &mut R) -> Result<(u8, u32)> {

View file

@ -68,9 +68,8 @@ impl<W: Write + Seek> Mp4Writer<W> {
};
ftyp.write_box(&mut writer)?;
// TODO largesize
let mdat_pos = writer.seek(SeekFrom::Current(0))?;
BoxHeader::new(BoxType::MdatBox, HEADER_SIZE).write(&mut writer)?;
BoxHeader::new(BoxType::MdatBox, HEADER_LARGE_SIZE).write_large(&mut writer)?;
let tracks = Vec::new();
let timescale = config.timescale;
@ -116,11 +115,8 @@ impl<W: Write + Seek> Mp4Writer<W> {
fn update_mdat_size(&mut self) -> Result<()> {
let mdat_end = self.writer.seek(SeekFrom::Current(0))?;
let mdat_size = mdat_end - self.mdat_pos;
if mdat_size > std::u32::MAX as u64 {
return Err(Error::InvalidData("mdat size too large"));
}
self.writer.seek(SeekFrom::Start(self.mdat_pos))?;
self.writer.write_u32::<BigEndian>(mdat_size as u32)?;
self.writer.seek(SeekFrom::Start(self.mdat_pos + 8))?;
self.writer.write_u64::<BigEndian>(mdat_size)?;
self.writer.seek(SeekFrom::Start(mdat_end))?;
Ok(())
}