1
0
Fork 0
mirror of https://github.com/alfg/mp4-rust.git synced 2024-06-02 13:39:54 +00:00

fix "mdat size too large"

This commit is contained in:
Precision 2022-08-08 13:09:55 +08:00
parent 0cd2abb60a
commit 911c2b6774
2 changed files with 10 additions and 4 deletions

View file

@ -194,7 +194,8 @@ boxtype! {
NameBox => 0xa96e616d,
DayBox => 0xa9646179,
CovrBox => 0x636f7672,
DescBox => 0x64657363
DescBox => 0x64657363,
WideBox => 0x77696465
}
pub trait Mp4Box: Sized {

View file

@ -71,6 +71,7 @@ impl<W: Write + Seek> Mp4Writer<W> {
// TODO largesize
let mdat_pos = writer.seek(SeekFrom::Current(0))?;
BoxHeader::new(BoxType::MdatBox, HEADER_SIZE).write(&mut writer)?;
BoxHeader::new(BoxType::WideBox, HEADER_SIZE).write(&mut writer)?;
let tracks = Vec::new();
let timescale = config.timescale;
@ -117,10 +118,14 @@ impl<W: Write + Seek> Mp4Writer<W> {
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>(1 as u32)?;
self.writer.seek(SeekFrom::Start(self.mdat_pos + 8))?;
self.writer.write_u64::<BigEndian>(mdat_size)?;
} else {
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))?;
self.writer.write_u32::<BigEndian>(mdat_size as u32)?;
self.writer.seek(SeekFrom::Start(mdat_end))?;
Ok(())
}