mirror of
https://github.com/alfg/mp4-rust.git
synced 2025-03-30 08:45:26 +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:
parent
b5367032a7
commit
0abb242037
25 changed files with 42 additions and 43 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)?;
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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))?;
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue