1
0
Fork 0
mirror of https://github.com/alfg/mp4-rust.git synced 2024-10-05 09:41:56 +00:00

Refactoring (#17)

* Add ReadBox trait

* Add boxtype macro

* Remove offset in BoxHeader

* Fix parsing error when box has largesize

* Remove duplicated codes reading version and flags

* Update examples

* Fix test failure

* Rename I/O position moving functions

* skip_read() to skip_bytes()
* skip_read_to() to skip_bytes_to()
* skip_write() to write_zeros()

* Rename I/O position moving functions

* skip_read() to skip_bytes()
* skip_read_to() to skip_bytes_to()

* Ensure skip_bytes() does not go back.

Co-authored-by: Byungwan Jun <unipro.kr@gmail.com>
This commit is contained in:
Ian Jun 2020-08-07 12:35:08 +09:00 committed by GitHub
parent b5367032a7
commit 0abb242037
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 42 additions and 43 deletions

View file

@ -72,7 +72,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Avc1Box {
let vertresolution = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?); let vertresolution = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?);
reader.read_u32::<BigEndian>()?; // reserved reader.read_u32::<BigEndian>()?; // reserved
let frame_count = reader.read_u16::<BigEndian>()?; let frame_count = reader.read_u16::<BigEndian>()?;
skip_read(reader, 32)?; // compressorname skip_bytes(reader, 32)?; // compressorname
let depth = reader.read_u16::<BigEndian>()?; let depth = reader.read_u16::<BigEndian>()?;
reader.read_i16::<BigEndian>()?; // pre-defined reader.read_i16::<BigEndian>()?; // pre-defined
@ -81,7 +81,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Avc1Box {
if name == BoxType::AvcCBox { if name == BoxType::AvcCBox {
let avcc = AvcCBox::read_box(reader, s)?; let avcc = AvcCBox::read_box(reader, s)?;
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(Avc1Box { Ok(Avc1Box {
data_reference_index, data_reference_index,
@ -118,7 +118,7 @@ impl<W: Write> WriteBox<&mut W> for Avc1Box {
writer.write_u32::<BigEndian>(0)?; // reserved writer.write_u32::<BigEndian>(0)?; // reserved
writer.write_u16::<BigEndian>(self.frame_count)?; writer.write_u16::<BigEndian>(self.frame_count)?;
// skip compressorname // skip compressorname
skip_write(writer, 32)?; write_zeros(writer, 32)?;
writer.write_u16::<BigEndian>(self.depth)?; writer.write_u16::<BigEndian>(self.depth)?;
writer.write_i16::<BigEndian>(-1)?; // pre-defined writer.write_i16::<BigEndian>(-1)?; // pre-defined
@ -192,7 +192,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for AvcCBox {
picture_parameter_sets.push(nal_unit); picture_parameter_sets.push(nal_unit);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(AvcCBox { Ok(AvcCBox {
configuration_version, configuration_version,

View file

@ -33,7 +33,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Co64Box {
entries.push(chunk_offset); entries.push(chunk_offset);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(Co64Box { Ok(Co64Box {
version, version,

View file

@ -42,7 +42,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for CttsBox {
entries.push(entry); entries.push(entry);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(CttsBox { Ok(CttsBox {
version, version,

View file

@ -45,7 +45,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for EdtsBox {
_ => {} _ => {}
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(edts) Ok(edts)
} }

View file

@ -65,7 +65,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for ElstBox {
entries.push(entry); entries.push(entry);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(ElstBox { Ok(ElstBox {
version, version,

View file

@ -37,7 +37,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for FtypBox {
brands.push(From::from(b)); brands.push(From::from(b));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(FtypBox { Ok(FtypBox {
major_brand: From::from(major), major_brand: From::from(major),

View file

@ -30,7 +30,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for HdlrBox {
reader.read_u32::<BigEndian>()?; // pre-defined reader.read_u32::<BigEndian>()?; // pre-defined
let handler = reader.read_u32::<BigEndian>()?; let handler = reader.read_u32::<BigEndian>()?;
skip_read(reader, 12)?; // reserved skip_bytes(reader, 12)?; // reserved
let buf_size = size - HEADER_SIZE - HEADER_EXT_SIZE - 20 - 1; let buf_size = size - HEADER_SIZE - HEADER_EXT_SIZE - 20 - 1;
let mut buf = vec![0u8; buf_size as usize]; let mut buf = vec![0u8; buf_size as usize];
@ -44,7 +44,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for HdlrBox {
_ => String::from("null"), _ => String::from("null"),
}; };
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(HdlrBox { Ok(HdlrBox {
version, version,

View file

@ -73,7 +73,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MdhdBox {
let language_code = reader.read_u16::<BigEndian>()?; let language_code = reader.read_u16::<BigEndian>()?;
let language = language_string(language_code); let language = language_string(language_code);
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(MdhdBox { Ok(MdhdBox {
version, version,

View file

@ -64,7 +64,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MdiaBox {
return Err(Error::BoxNotFound(BoxType::MinfBox)); return Err(Error::BoxNotFound(BoxType::MinfBox));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(MdiaBox { Ok(MdiaBox {
mdhd: mdhd.unwrap(), mdhd: mdhd.unwrap(),

View file

@ -70,7 +70,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MinfBox {
return Err(Error::BoxNotFound(BoxType::StblBox)); return Err(Error::BoxNotFound(BoxType::StblBox));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(MinfBox { Ok(MinfBox {
vmhd, vmhd,

View file

@ -180,28 +180,27 @@ pub fn write_box_header_ext<W: Write>(w: &mut W, v: u8, f: u32) -> Result<u64> {
Ok(4) Ok(4)
} }
pub fn box_start<R: Seek>(reader: &mut R) -> Result<u64> { pub fn box_start<R: Seek>(seeker: &mut R) -> Result<u64> {
Ok(reader.seek(SeekFrom::Current(0))? - HEADER_SIZE) Ok(seeker.seek(SeekFrom::Current(0))? - HEADER_SIZE)
} }
pub fn skip_read<R: Read + Seek>(reader: &mut R, size: i64) -> Result<()> { pub fn skip_bytes<S: Seek>(seeker: &mut S, size: u64) -> Result<()> {
assert!(size >= 0); seeker.seek(SeekFrom::Current(size as i64))?;
reader.seek(SeekFrom::Current(size))?;
Ok(()) Ok(())
} }
pub fn skip_read_to<R: Read + Seek>(reader: &mut R, pos: u64) -> Result<()> { pub fn skip_bytes_to<S: Seek>(seeker: &mut S, pos: u64) -> Result<()> {
reader.seek(SeekFrom::Start(pos))?; seeker.seek(SeekFrom::Start(pos))?;
Ok(()) Ok(())
} }
pub fn skip_box<R: Read + Seek>(reader: &mut R, size: u64) -> Result<()> { pub fn skip_box<S: Seek>(seeker: &mut S, size: u64) -> Result<()> {
let start = box_start(reader)?; let start = box_start(seeker)?;
skip_read_to(reader, start + size)?; skip_bytes_to(seeker, start + size)?;
Ok(()) Ok(())
} }
pub fn skip_write<W: Write>(writer: &mut W, size: u64) -> Result<()> { pub fn write_zeros<W: Write>(writer: &mut W, size: u64) -> Result<()> {
for _ in 0..size { for _ in 0..size {
writer.write_u8(0)?; writer.write_u8(0)?;
} }

View file

@ -62,7 +62,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MoovBox {
return Err(Error::BoxNotFound(BoxType::MvhdBox)); return Err(Error::BoxNotFound(BoxType::MvhdBox));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(MoovBox { Ok(MoovBox {
mvhd: mvhd.unwrap(), mvhd: mvhd.unwrap(),

View file

@ -65,7 +65,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Mp4aBox {
if name == BoxType::EsdsBox { if name == BoxType::EsdsBox {
let esds = EsdsBox::read_box(reader, s)?; let esds = EsdsBox::read_box(reader, s)?;
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(Mp4aBox { Ok(Mp4aBox {
data_reference_index, data_reference_index,
@ -153,7 +153,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for EsdsBox {
return Err(Error::InvalidData("ESDescriptor not found")); return Err(Error::InvalidData("ESDescriptor not found"));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(EsdsBox { Ok(EsdsBox {
version, version,
@ -285,7 +285,7 @@ impl<R: Read + Seek> ReadDesc<&mut R> for ESDescriptor {
sl_config = Some(SLConfigDescriptor::read_desc(reader, desc_size)?); sl_config = Some(SLConfigDescriptor::read_desc(reader, desc_size)?);
} }
_ => { _ => {
skip_read(reader, desc_size as i64 - 1)?; skip_bytes(reader, desc_size as u64 - 1)?;
} }
} }
current = reader.seek(SeekFrom::Current(0))?; current = reader.seek(SeekFrom::Current(0))?;
@ -378,7 +378,7 @@ impl<R: Read + Seek> ReadDesc<&mut R> for DecoderConfigDescriptor {
dec_specific = Some(DecoderSpecificDescriptor::read_desc(reader, desc_size)?); dec_specific = Some(DecoderSpecificDescriptor::read_desc(reader, desc_size)?);
} }
_ => { _ => {
skip_read(reader, desc_size as i64 - 1)?; skip_bytes(reader, desc_size as u64 - 1)?;
} }
} }
current = reader.seek(SeekFrom::Current(0))?; current = reader.seek(SeekFrom::Current(0))?;

View file

@ -70,7 +70,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MvhdBox {
}; };
let rate = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?); let rate = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?);
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(MvhdBox { Ok(MvhdBox {
version, version,
@ -106,7 +106,7 @@ impl<W: Write> WriteBox<&mut W> for MvhdBox {
writer.write_u32::<BigEndian>(self.rate.raw_value())?; writer.write_u32::<BigEndian>(self.rate.raw_value())?;
// XXX volume, ... // XXX volume, ...
skip_write(writer, 76)?; write_zeros(writer, 76)?;
Ok(size) Ok(size)
} }

View file

@ -38,7 +38,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for SmhdBox {
let balance = FixedPointI8::new_raw(reader.read_i16::<BigEndian>()?); let balance = FixedPointI8::new_raw(reader.read_i16::<BigEndian>()?);
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(SmhdBox { Ok(SmhdBox {
version, version,

View file

@ -114,7 +114,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StblBox {
return Err(Error::Box2NotFound(BoxType::StcoBox, BoxType::Co64Box)); return Err(Error::Box2NotFound(BoxType::StcoBox, BoxType::Co64Box));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(StblBox { Ok(StblBox {
stsd: stsd.unwrap(), stsd: stsd.unwrap(),

View file

@ -33,7 +33,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StcoBox {
entries.push(chunk_offset); entries.push(chunk_offset);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(StcoBox { Ok(StcoBox {
version, version,

View file

@ -59,7 +59,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StscBox {
} }
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(StscBox { Ok(StscBox {
version, version,

View file

@ -53,7 +53,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StsdBox {
_ => {} _ => {}
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(StsdBox { Ok(StsdBox {
version, version,

View file

@ -33,7 +33,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StssBox {
entries.push(sample_number); entries.push(sample_number);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(StssBox { Ok(StssBox {
version, version,

View file

@ -38,7 +38,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StszBox {
} }
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(StszBox { Ok(StszBox {
version, version,

View file

@ -42,7 +42,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for SttsBox {
entries.push(entry); entries.push(entry);
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(SttsBox { Ok(SttsBox {
version, version,

View file

@ -124,7 +124,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for TkhdBox {
let width = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?); let width = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?);
let height = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?); let height = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?);
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(TkhdBox { Ok(TkhdBox {
version, version,

View file

@ -67,7 +67,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for TrakBox {
return Err(Error::BoxNotFound(BoxType::MdiaBox)); return Err(Error::BoxNotFound(BoxType::MdiaBox));
} }
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(TrakBox { Ok(TrakBox {
tkhd: tkhd.unwrap(), tkhd: tkhd.unwrap(),

View file

@ -41,7 +41,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for VmhdBox {
blue: reader.read_u16::<BigEndian>()?, blue: reader.read_u16::<BigEndian>()?,
}; };
skip_read_to(reader, start + size)?; skip_bytes_to(reader, start + size)?;
Ok(VmhdBox { Ok(VmhdBox {
version, version,