1
0
Fork 0
mirror of https://github.com/alfg/mp4-rust.git synced 2024-05-20 01:08:06 +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>()?);
reader.read_u32::<BigEndian>()?; // reserved
let frame_count = reader.read_u16::<BigEndian>()?;
skip_read(reader, 32)?; // compressorname
skip_bytes(reader, 32)?; // compressorname
let depth = reader.read_u16::<BigEndian>()?;
reader.read_i16::<BigEndian>()?; // pre-defined
@ -81,7 +81,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Avc1Box {
if name == BoxType::AvcCBox {
let avcc = AvcCBox::read_box(reader, s)?;
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(Avc1Box {
data_reference_index,
@ -118,7 +118,7 @@ impl<W: Write> WriteBox<&mut W> for Avc1Box {
writer.write_u32::<BigEndian>(0)?; // reserved
writer.write_u16::<BigEndian>(self.frame_count)?;
// skip compressorname
skip_write(writer, 32)?;
write_zeros(writer, 32)?;
writer.write_u16::<BigEndian>(self.depth)?;
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);
}
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(AvcCBox {
configuration_version,

View file

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

View file

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

View file

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

View file

@ -37,7 +37,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for FtypBox {
brands.push(From::from(b));
}
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(FtypBox {
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
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 mut buf = vec![0u8; buf_size as usize];
@ -44,7 +44,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for HdlrBox {
_ => String::from("null"),
};
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(HdlrBox {
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 = language_string(language_code);
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(MdhdBox {
version,

View file

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

View file

@ -70,7 +70,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MinfBox {
return Err(Error::BoxNotFound(BoxType::StblBox));
}
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(MinfBox {
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)
}
pub fn box_start<R: Seek>(reader: &mut R) -> Result<u64> {
Ok(reader.seek(SeekFrom::Current(0))? - HEADER_SIZE)
pub fn box_start<R: Seek>(seeker: &mut R) -> Result<u64> {
Ok(seeker.seek(SeekFrom::Current(0))? - HEADER_SIZE)
}
pub fn skip_read<R: Read + Seek>(reader: &mut R, size: i64) -> Result<()> {
assert!(size >= 0);
reader.seek(SeekFrom::Current(size))?;
pub fn skip_bytes<S: Seek>(seeker: &mut S, size: u64) -> Result<()> {
seeker.seek(SeekFrom::Current(size as i64))?;
Ok(())
}
pub fn skip_read_to<R: Read + Seek>(reader: &mut R, pos: u64) -> Result<()> {
reader.seek(SeekFrom::Start(pos))?;
pub fn skip_bytes_to<S: Seek>(seeker: &mut S, pos: u64) -> Result<()> {
seeker.seek(SeekFrom::Start(pos))?;
Ok(())
}
pub fn skip_box<R: Read + Seek>(reader: &mut R, size: u64) -> Result<()> {
let start = box_start(reader)?;
skip_read_to(reader, start + size)?;
pub fn skip_box<S: Seek>(seeker: &mut S, size: u64) -> Result<()> {
let start = box_start(seeker)?;
skip_bytes_to(seeker, start + size)?;
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 {
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));
}
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(MoovBox {
mvhd: mvhd.unwrap(),

View file

@ -65,7 +65,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Mp4aBox {
if name == BoxType::EsdsBox {
let esds = EsdsBox::read_box(reader, s)?;
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(Mp4aBox {
data_reference_index,
@ -153,7 +153,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for EsdsBox {
return Err(Error::InvalidData("ESDescriptor not found"));
}
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(EsdsBox {
version,
@ -285,7 +285,7 @@ impl<R: Read + Seek> ReadDesc<&mut R> for ESDescriptor {
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))?;
@ -378,7 +378,7 @@ impl<R: Read + Seek> ReadDesc<&mut R> for DecoderConfigDescriptor {
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))?;

View file

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

View file

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

View file

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

View file

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

View file

@ -42,7 +42,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for SttsBox {
entries.push(entry);
}
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(SttsBox {
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 height = FixedPointU16::new_raw(reader.read_u32::<BigEndian>()?);
skip_read_to(reader, start + size)?;
skip_bytes_to(reader, start + size)?;
Ok(TkhdBox {
version,

View file

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

View file

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