mirror of
https://github.com/alfg/mp4-rust.git
synced 2025-01-03 08:58:40 +00:00
commit
682f8a93c1
28 changed files with 515 additions and 129 deletions
116
examples/mp4dump.rs
Normal file
116
examples/mp4dump.rs
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::io::{self, BufReader};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use mp4::{Result, Mp4Box};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
|
if args.len() < 2 {
|
||||||
|
println!("Usage: mp4dump <filename>");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Err(err) = dump(&args[1]) {
|
||||||
|
let _ = writeln!(io::stderr(), "{}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dump<P: AsRef<Path>>(filename: &P) -> Result<()> {
|
||||||
|
let f = File::open(filename)?;
|
||||||
|
let boxes = get_boxes(f)?;
|
||||||
|
|
||||||
|
// print out boxes
|
||||||
|
for b in boxes.iter() {
|
||||||
|
println!("[{}] size={}", b.name, b.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Default)]
|
||||||
|
pub struct Box {
|
||||||
|
name: String,
|
||||||
|
size: u64,
|
||||||
|
indent: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_boxes(file: File) -> Result<Vec<Box>> {
|
||||||
|
let size = file.metadata()?.len();
|
||||||
|
let reader = BufReader::new(file);
|
||||||
|
let mp4 = mp4::Mp4Reader::read_header(reader, size)?;
|
||||||
|
|
||||||
|
// collect known boxes
|
||||||
|
let mut boxes = Vec::new();
|
||||||
|
|
||||||
|
// ftyp, moov, mvhd
|
||||||
|
boxes.push(build_box(&mp4.ftyp));
|
||||||
|
boxes.push(build_box(&mp4.moov));
|
||||||
|
boxes.push(build_box(&mp4.moov.mvhd));
|
||||||
|
|
||||||
|
// trak.
|
||||||
|
for track in mp4.tracks().iter() {
|
||||||
|
boxes.push(build_box(&track.trak));
|
||||||
|
boxes.push(build_box(&track.trak.tkhd));
|
||||||
|
if let Some(ref edts) = track.trak.edts {
|
||||||
|
boxes.push(build_box(edts));
|
||||||
|
if let Some(ref elst) = edts.elst {
|
||||||
|
boxes.push(build_box(elst));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trak.mdia
|
||||||
|
let mdia = &track.trak.mdia;
|
||||||
|
boxes.push(build_box(mdia));
|
||||||
|
boxes.push(build_box(&mdia.mdhd));
|
||||||
|
boxes.push(build_box(&mdia.hdlr));
|
||||||
|
boxes.push(build_box(&track.trak.mdia.minf));
|
||||||
|
|
||||||
|
// trak.mdia.minf
|
||||||
|
let minf = &track.trak.mdia.minf;
|
||||||
|
if let Some(ref vmhd) = &minf.vmhd {
|
||||||
|
boxes.push(build_box(vmhd));
|
||||||
|
}
|
||||||
|
if let Some(ref smhd) = &minf.smhd {
|
||||||
|
boxes.push(build_box(smhd));
|
||||||
|
}
|
||||||
|
|
||||||
|
// trak.mdia.minf.stbl
|
||||||
|
let stbl = &track.trak.mdia.minf.stbl;
|
||||||
|
boxes.push(build_box(stbl));
|
||||||
|
boxes.push(build_box(&stbl.stsd));
|
||||||
|
if let Some(ref avc1) = &stbl.stsd.avc1 {
|
||||||
|
boxes.push(build_box(avc1));
|
||||||
|
}
|
||||||
|
if let Some(ref mp4a) = &stbl.stsd.mp4a {
|
||||||
|
boxes.push(build_box(mp4a));
|
||||||
|
}
|
||||||
|
boxes.push(build_box(&stbl.stts));
|
||||||
|
if let Some(ref ctts) = &stbl.ctts {
|
||||||
|
boxes.push(build_box(ctts));
|
||||||
|
}
|
||||||
|
if let Some(ref stss) = &stbl.stss {
|
||||||
|
boxes.push(build_box(stss));
|
||||||
|
}
|
||||||
|
boxes.push(build_box(&stbl.stsc));
|
||||||
|
boxes.push(build_box(&stbl.stsz));
|
||||||
|
if let Some(ref stco) = &stbl.stco {
|
||||||
|
boxes.push(build_box(stco));
|
||||||
|
}
|
||||||
|
if let Some(ref co64) = &stbl.co64 {
|
||||||
|
boxes.push(build_box(co64));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(boxes)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_box<M: Mp4Box + std::fmt::Debug>(ref m: &M) -> Box {
|
||||||
|
return Box{
|
||||||
|
name: m.box_type().to_string(),
|
||||||
|
size: m.box_size(),
|
||||||
|
indent: 0,
|
||||||
|
};
|
||||||
|
}
|
27
examples/simple.rs
Normal file
27
examples/simple.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
use mp4;
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
|
if args.len() < 2 {
|
||||||
|
println!("Usage: mp4dump <filename>");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let filename = &args[1];
|
||||||
|
let f = File::open(filename).unwrap();
|
||||||
|
let mp4 = mp4::read_mp4(f).unwrap();
|
||||||
|
|
||||||
|
println!("Major Brand: {}", mp4.major_brand());
|
||||||
|
|
||||||
|
for track in mp4.tracks().iter() {
|
||||||
|
println!("Track: #{}({}) {} {}",
|
||||||
|
track.track_id(),
|
||||||
|
track.language(),
|
||||||
|
track.track_type().unwrap(),
|
||||||
|
track.box_type().unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
11
src/lib.rs
11
src/lib.rs
|
@ -1,3 +1,6 @@
|
||||||
|
use std::io::{BufReader};
|
||||||
|
use std::fs::File;
|
||||||
|
|
||||||
mod error;
|
mod error;
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
|
|
||||||
|
@ -7,6 +10,7 @@ mod types;
|
||||||
pub use types::*;
|
pub use types::*;
|
||||||
|
|
||||||
mod mp4box;
|
mod mp4box;
|
||||||
|
pub use mp4box::{Mp4Box};
|
||||||
|
|
||||||
mod track;
|
mod track;
|
||||||
pub use track::{Mp4Track, TrackConfig};
|
pub use track::{Mp4Track, TrackConfig};
|
||||||
|
@ -16,3 +20,10 @@ pub use reader::Mp4Reader;
|
||||||
|
|
||||||
mod writer;
|
mod writer;
|
||||||
pub use writer::{Mp4Config, Mp4Writer};
|
pub use writer::{Mp4Config, Mp4Writer};
|
||||||
|
|
||||||
|
pub fn read_mp4(f: File) -> Result<Mp4Reader<BufReader<File>>> {
|
||||||
|
let size = f.metadata()?.len();
|
||||||
|
let reader = BufReader::new(f);
|
||||||
|
let mp4 = reader::Mp4Reader::read_header(reader, size)?;
|
||||||
|
Ok(mp4)
|
||||||
|
}
|
|
@ -43,18 +43,26 @@ impl Avc1Box {
|
||||||
avcc: AvcCBox::new(&config.seq_param_set, &config.pic_param_set),
|
avcc: AvcCBox::new(&config.seq_param_set, &config.pic_param_set),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl Mp4Box for Avc1Box {
|
pub fn get_type(&self) -> BoxType {
|
||||||
fn box_type() -> BoxType {
|
|
||||||
BoxType::Avc1Box
|
BoxType::Avc1Box
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + 8 + 70 + self.avcc.box_size()
|
HEADER_SIZE + 8 + 70 + self.avcc.box_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for Avc1Box {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for Avc1Box {
|
impl<R: Read + Seek> ReadBox<&mut R> for Avc1Box {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -102,7 +110,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Avc1Box {
|
||||||
impl<W: Write> WriteBox<&mut W> for Avc1Box {
|
impl<W: Write> WriteBox<&mut W> for Avc1Box {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
writer.write_u32::<BigEndian>(0)?; // reserved
|
writer.write_u32::<BigEndian>(0)?; // reserved
|
||||||
writer.write_u16::<BigEndian>(0)?; // reserved
|
writer.write_u16::<BigEndian>(0)?; // reserved
|
||||||
|
@ -154,7 +162,7 @@ impl AvcCBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for AvcCBox {
|
impl Mp4Box for AvcCBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::AvcCBox
|
BoxType::AvcCBox
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +217,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for AvcCBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for AvcCBox {
|
impl<W: Write> WriteBox<&mut W> for AvcCBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
writer.write_u8(self.configuration_version)?;
|
writer.write_u8(self.configuration_version)?;
|
||||||
writer.write_u8(self.avc_profile_indication)?;
|
writer.write_u8(self.avc_profile_indication)?;
|
||||||
|
|
|
@ -10,16 +10,26 @@ pub struct Co64Box {
|
||||||
pub entries: Vec<u64>,
|
pub entries: Vec<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for Co64Box {
|
impl Co64Box {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::Co64Box
|
BoxType::Co64Box
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (8 * self.entries.len() as u64)
|
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (8 * self.entries.len() as u64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for Co64Box {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for Co64Box {
|
impl<R: Read + Seek> ReadBox<&mut R> for Co64Box {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -46,7 +56,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Co64Box {
|
||||||
impl<W: Write> WriteBox<&mut W> for Co64Box {
|
impl<W: Write> WriteBox<&mut W> for Co64Box {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,16 @@ pub struct CttsBox {
|
||||||
pub entries: Vec<CttsEntry>,
|
pub entries: Vec<CttsEntry>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl CttsBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::CttsBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (8 * self.entries.len() as u64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Default)]
|
#[derive(Debug, Clone, PartialEq, Default)]
|
||||||
pub struct CttsEntry {
|
pub struct CttsEntry {
|
||||||
pub sample_count: u32,
|
pub sample_count: u32,
|
||||||
|
@ -17,12 +27,12 @@ pub struct CttsEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for CttsBox {
|
impl Mp4Box for CttsBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::CttsBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (8 * self.entries.len() as u64)
|
return self.get_size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +65,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for CttsBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for CttsBox {
|
impl<W: Write> WriteBox<&mut W> for CttsBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -12,14 +12,12 @@ impl EdtsBox {
|
||||||
pub(crate) fn new() -> EdtsBox {
|
pub(crate) fn new() -> EdtsBox {
|
||||||
Default::default()
|
Default::default()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl Mp4Box for EdtsBox {
|
pub fn get_type(&self) -> BoxType {
|
||||||
fn box_type() -> BoxType {
|
|
||||||
BoxType::EdtsBox
|
BoxType::EdtsBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE;
|
let mut size = HEADER_SIZE;
|
||||||
if let Some(ref elst) = self.elst {
|
if let Some(ref elst) = self.elst {
|
||||||
size += elst.box_size();
|
size += elst.box_size();
|
||||||
|
@ -28,6 +26,16 @@ impl Mp4Box for EdtsBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for EdtsBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for EdtsBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for EdtsBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -54,7 +62,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for EdtsBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for EdtsBox {
|
impl<W: Write> WriteBox<&mut W> for EdtsBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
if let Some(ref elst) = self.elst {
|
if let Some(ref elst) = self.elst {
|
||||||
elst.write_box(writer)?;
|
elst.write_box(writer)?;
|
||||||
|
|
|
@ -18,12 +18,12 @@ pub struct ElstEntry {
|
||||||
pub media_rate_fraction: u16,
|
pub media_rate_fraction: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for ElstBox {
|
impl ElstBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::ElstBox
|
BoxType::ElstBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + HEADER_EXT_SIZE + 4;
|
let mut size = HEADER_SIZE + HEADER_EXT_SIZE + 4;
|
||||||
if self.version == 1 {
|
if self.version == 1 {
|
||||||
size += self.entries.len() as u64 * 20;
|
size += self.entries.len() as u64 * 20;
|
||||||
|
@ -35,6 +35,16 @@ impl Mp4Box for ElstBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for ElstBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for ElstBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for ElstBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -78,7 +88,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for ElstBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for ElstBox {
|
impl<W: Write> WriteBox<&mut W> for ElstBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,16 +10,26 @@ pub struct FtypBox {
|
||||||
pub compatible_brands: Vec<FourCC>,
|
pub compatible_brands: Vec<FourCC>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for FtypBox {
|
impl FtypBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::FtypBox
|
BoxType::FtypBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + 8 + (4 * self.compatible_brands.len() as u64)
|
HEADER_SIZE + 8 + (4 * self.compatible_brands.len() as u64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for FtypBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for FtypBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for FtypBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -50,7 +60,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for FtypBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for FtypBox {
|
impl<W: Write> WriteBox<&mut W> for FtypBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
writer.write_u32::<BigEndian>((&self.major_brand).into())?;
|
writer.write_u32::<BigEndian>((&self.major_brand).into())?;
|
||||||
writer.write_u32::<BigEndian>(self.minor_version)?;
|
writer.write_u32::<BigEndian>(self.minor_version)?;
|
||||||
|
|
|
@ -11,16 +11,26 @@ pub struct HdlrBox {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for HdlrBox {
|
impl HdlrBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::HdlrBox
|
BoxType::HdlrBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 20 + self.name.len() as u64 + 1
|
HEADER_SIZE + HEADER_EXT_SIZE + 20 + self.name.len() as u64 + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for HdlrBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for HdlrBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for HdlrBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -58,7 +68,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for HdlrBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for HdlrBox {
|
impl<W: Write> WriteBox<&mut W> for HdlrBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,25 @@ pub struct MdhdBox {
|
||||||
pub language: String,
|
pub language: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl MdhdBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::MdhdBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
let mut size = HEADER_SIZE + HEADER_EXT_SIZE;
|
||||||
|
|
||||||
|
if self.version == 1 {
|
||||||
|
size += 28;
|
||||||
|
} else {
|
||||||
|
assert_eq!(self.version, 0);
|
||||||
|
size += 16;
|
||||||
|
}
|
||||||
|
size += 4;
|
||||||
|
size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for MdhdBox {
|
impl Default for MdhdBox {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
MdhdBox {
|
MdhdBox {
|
||||||
|
@ -30,21 +49,12 @@ impl Default for MdhdBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for MdhdBox {
|
impl Mp4Box for MdhdBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::MdhdBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + HEADER_EXT_SIZE;
|
return self.get_size();
|
||||||
|
|
||||||
if self.version == 1 {
|
|
||||||
size += 28;
|
|
||||||
} else {
|
|
||||||
assert_eq!(self.version, 0);
|
|
||||||
size += 16;
|
|
||||||
}
|
|
||||||
size += 4;
|
|
||||||
size
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +100,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MdhdBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for MdhdBox {
|
impl<W: Write> WriteBox<&mut W> for MdhdBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,16 +10,26 @@ pub struct MdiaBox {
|
||||||
pub minf: MinfBox,
|
pub minf: MinfBox,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for MdiaBox {
|
impl MdiaBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::MdiaBox
|
BoxType::MdiaBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + self.mdhd.box_size() + self.hdlr.box_size() + self.minf.box_size()
|
HEADER_SIZE + self.mdhd.box_size() + self.hdlr.box_size() + self.minf.box_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for MdiaBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for MdiaBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for MdiaBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -77,7 +87,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MdiaBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for MdiaBox {
|
impl<W: Write> WriteBox<&mut W> for MdiaBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
self.mdhd.write_box(writer)?;
|
self.mdhd.write_box(writer)?;
|
||||||
self.hdlr.write_box(writer)?;
|
self.hdlr.write_box(writer)?;
|
||||||
|
|
|
@ -10,12 +10,12 @@ pub struct MinfBox {
|
||||||
pub stbl: StblBox,
|
pub stbl: StblBox,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for MinfBox {
|
impl MinfBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::MinfBox
|
BoxType::MinfBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE;
|
let mut size = HEADER_SIZE;
|
||||||
if let Some(ref vmhd) = self.vmhd {
|
if let Some(ref vmhd) = self.vmhd {
|
||||||
size += vmhd.box_size();
|
size += vmhd.box_size();
|
||||||
|
@ -28,6 +28,16 @@ impl Mp4Box for MinfBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for MinfBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for MinfBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for MinfBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -83,7 +93,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MinfBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for MinfBox {
|
impl<W: Write> WriteBox<&mut W> for MinfBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
if let Some(ref vmhd) = self.vmhd {
|
if let Some(ref vmhd) = self.vmhd {
|
||||||
vmhd.write_box(writer)?;
|
vmhd.write_box(writer)?;
|
||||||
|
|
|
@ -99,7 +99,7 @@ boxtype! {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Mp4Box: Sized {
|
pub trait Mp4Box: Sized {
|
||||||
fn box_type() -> BoxType;
|
fn box_type(&self) -> BoxType;
|
||||||
fn box_size(&self) -> u64;
|
fn box_size(&self) -> u64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,12 @@ pub struct MoovBox {
|
||||||
pub traks: Vec<TrakBox>,
|
pub traks: Vec<TrakBox>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for MoovBox {
|
impl MoovBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::MoovBox
|
BoxType::MoovBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + self.mvhd.box_size();
|
let mut size = HEADER_SIZE + self.mvhd.box_size();
|
||||||
for trak in self.traks.iter() {
|
for trak in self.traks.iter() {
|
||||||
size += trak.box_size();
|
size += trak.box_size();
|
||||||
|
@ -23,6 +23,16 @@ impl Mp4Box for MoovBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for MoovBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for MoovBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for MoovBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -74,7 +84,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MoovBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for MoovBox {
|
impl<W: Write> WriteBox<&mut W> for MoovBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
self.mvhd.write_box(writer)?;
|
self.mvhd.write_box(writer)?;
|
||||||
for trak in self.traks.iter() {
|
for trak in self.traks.iter() {
|
||||||
|
|
|
@ -34,14 +34,12 @@ impl Mp4aBox {
|
||||||
esds: Some(EsdsBox::new(config)),
|
esds: Some(EsdsBox::new(config)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl Mp4Box for Mp4aBox {
|
pub fn get_type(&self) -> BoxType {
|
||||||
fn box_type() -> BoxType {
|
|
||||||
BoxType::Mp4aBox
|
BoxType::Mp4aBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + 8 + 20;
|
let mut size = HEADER_SIZE + 8 + 20;
|
||||||
if let Some(ref esds) = self.esds {
|
if let Some(ref esds) = self.esds {
|
||||||
size += esds.box_size();
|
size += esds.box_size();
|
||||||
|
@ -50,6 +48,16 @@ impl Mp4Box for Mp4aBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for Mp4aBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for Mp4aBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for Mp4aBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -86,7 +94,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for Mp4aBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for Mp4aBox {
|
impl<W: Write> WriteBox<&mut W> for Mp4aBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
writer.write_u32::<BigEndian>(0)?; // reserved
|
writer.write_u32::<BigEndian>(0)?; // reserved
|
||||||
writer.write_u16::<BigEndian>(0)?; // reserved
|
writer.write_u16::<BigEndian>(0)?; // reserved
|
||||||
|
@ -124,7 +132,7 @@ impl EsdsBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for EsdsBox {
|
impl Mp4Box for EsdsBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::EsdsBox
|
BoxType::EsdsBox
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +179,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for EsdsBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for EsdsBox {
|
impl<W: Write> WriteBox<&mut W> for EsdsBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,24 @@ pub struct MvhdBox {
|
||||||
pub rate: FixedPointU16,
|
pub rate: FixedPointU16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl MvhdBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::MvhdBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
let mut size = HEADER_SIZE + HEADER_EXT_SIZE;
|
||||||
|
if self.version == 1 {
|
||||||
|
size += 28;
|
||||||
|
} else {
|
||||||
|
assert_eq!(self.version, 0);
|
||||||
|
size += 16;
|
||||||
|
}
|
||||||
|
size += 80;
|
||||||
|
size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for MvhdBox {
|
impl Default for MvhdBox {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
MvhdBox {
|
MvhdBox {
|
||||||
|
@ -29,20 +47,12 @@ impl Default for MvhdBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for MvhdBox {
|
impl Mp4Box for MvhdBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::MvhdBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + HEADER_EXT_SIZE;
|
return self.get_size();
|
||||||
if self.version == 1 {
|
|
||||||
size += 28;
|
|
||||||
} else {
|
|
||||||
assert_eq!(self.version, 0);
|
|
||||||
size += 16;
|
|
||||||
}
|
|
||||||
size += 80;
|
|
||||||
size
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +97,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for MvhdBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for MvhdBox {
|
impl<W: Write> WriteBox<&mut W> for MvhdBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,16 @@ pub struct SmhdBox {
|
||||||
pub balance: FixedPointI8,
|
pub balance: FixedPointI8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SmhdBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::SmhdBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
HEADER_SIZE + HEADER_EXT_SIZE + 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for SmhdBox {
|
impl Default for SmhdBox {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
SmhdBox {
|
SmhdBox {
|
||||||
|
@ -21,12 +31,12 @@ impl Default for SmhdBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for SmhdBox {
|
impl Mp4Box for SmhdBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::SmhdBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4
|
return self.get_size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +61,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for SmhdBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for SmhdBox {
|
impl<W: Write> WriteBox<&mut W> for SmhdBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -18,12 +18,12 @@ pub struct StblBox {
|
||||||
pub co64: Option<Co64Box>,
|
pub co64: Option<Co64Box>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for StblBox {
|
impl StblBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::StblBox
|
BoxType::StblBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE;
|
let mut size = HEADER_SIZE;
|
||||||
size += self.stsd.box_size();
|
size += self.stsd.box_size();
|
||||||
size += self.stts.box_size();
|
size += self.stts.box_size();
|
||||||
|
@ -45,6 +45,16 @@ impl Mp4Box for StblBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for StblBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for StblBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for StblBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -132,7 +142,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StblBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for StblBox {
|
impl<W: Write> WriteBox<&mut W> for StblBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
self.stsd.write_box(writer)?;
|
self.stsd.write_box(writer)?;
|
||||||
self.stts.write_box(writer)?;
|
self.stts.write_box(writer)?;
|
||||||
|
|
|
@ -10,16 +10,26 @@ pub struct StcoBox {
|
||||||
pub entries: Vec<u32>,
|
pub entries: Vec<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for StcoBox {
|
impl StcoBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::StcoBox
|
BoxType::StcoBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (4 * self.entries.len() as u64)
|
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (4 * self.entries.len() as u64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for StcoBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for StcoBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for StcoBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -46,7 +56,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StcoBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for StcoBox {
|
impl<W: Write> WriteBox<&mut W> for StcoBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,16 @@ pub struct StscBox {
|
||||||
pub entries: Vec<StscEntry>,
|
pub entries: Vec<StscEntry>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl StscBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::StscBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (12 * self.entries.len() as u64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Default)]
|
#[derive(Debug, Clone, PartialEq, Default)]
|
||||||
pub struct StscEntry {
|
pub struct StscEntry {
|
||||||
pub first_chunk: u32,
|
pub first_chunk: u32,
|
||||||
|
@ -19,12 +29,12 @@ pub struct StscEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for StscBox {
|
impl Mp4Box for StscBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::StscBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (12 * self.entries.len() as u64)
|
return self.get_size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +82,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StscBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for StscBox {
|
impl<W: Write> WriteBox<&mut W> for StscBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -12,12 +12,12 @@ pub struct StsdBox {
|
||||||
pub mp4a: Option<Mp4aBox>,
|
pub mp4a: Option<Mp4aBox>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for StsdBox {
|
impl StsdBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::StsdBox
|
BoxType::StsdBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + HEADER_EXT_SIZE + 4;
|
let mut size = HEADER_SIZE + HEADER_EXT_SIZE + 4;
|
||||||
if let Some(ref avc1) = self.avc1 {
|
if let Some(ref avc1) = self.avc1 {
|
||||||
size += avc1.box_size();
|
size += avc1.box_size();
|
||||||
|
@ -28,6 +28,16 @@ impl Mp4Box for StsdBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for StsdBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for StsdBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for StsdBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -67,7 +77,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StsdBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for StsdBox {
|
impl<W: Write> WriteBox<&mut W> for StsdBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,16 +10,26 @@ pub struct StssBox {
|
||||||
pub entries: Vec<u32>,
|
pub entries: Vec<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for StssBox {
|
impl StssBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::StssBox
|
BoxType::StssBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (4 * self.entries.len() as u64)
|
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (4 * self.entries.len() as u64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for StssBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for StssBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for StssBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -46,7 +56,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StssBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for StssBox {
|
impl<W: Write> WriteBox<&mut W> for StssBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -12,16 +12,26 @@ pub struct StszBox {
|
||||||
pub sample_sizes: Vec<u32>,
|
pub sample_sizes: Vec<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for StszBox {
|
impl StszBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::StszBox
|
BoxType::StszBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 8 + (4 * self.sample_sizes.len() as u64)
|
HEADER_SIZE + HEADER_EXT_SIZE + 8 + (4 * self.sample_sizes.len() as u64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for StszBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for StszBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for StszBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -53,7 +63,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for StszBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for StszBox {
|
impl<W: Write> WriteBox<&mut W> for StszBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,16 @@ pub struct SttsBox {
|
||||||
pub entries: Vec<SttsEntry>,
|
pub entries: Vec<SttsEntry>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SttsBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::SttsBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (8 * self.entries.len() as u64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Default)]
|
#[derive(Debug, Clone, PartialEq, Default)]
|
||||||
pub struct SttsEntry {
|
pub struct SttsEntry {
|
||||||
pub sample_count: u32,
|
pub sample_count: u32,
|
||||||
|
@ -17,12 +27,12 @@ pub struct SttsEntry {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for SttsBox {
|
impl Mp4Box for SttsBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::SttsBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 4 + (8 * self.entries.len() as u64)
|
return self.get_size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +65,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for SttsBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for SttsBox {
|
impl<W: Write> WriteBox<&mut W> for SttsBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,22 @@ pub struct Matrix {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TkhdBox {
|
impl TkhdBox {
|
||||||
|
pub fn get_type(&self) -> BoxType {
|
||||||
|
BoxType::TkhdBox
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> u64 {
|
||||||
|
let mut size = HEADER_SIZE + HEADER_EXT_SIZE;
|
||||||
|
if self.version == 1 {
|
||||||
|
size += 32;
|
||||||
|
} else {
|
||||||
|
assert_eq!(self.version, 0);
|
||||||
|
size += 20;
|
||||||
|
}
|
||||||
|
size += 60;
|
||||||
|
size
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_width(&mut self, width: u16) {
|
pub fn set_width(&mut self, width: u16) {
|
||||||
self.width = FixedPointU16::new(width);
|
self.width = FixedPointU16::new(width);
|
||||||
}
|
}
|
||||||
|
@ -62,20 +78,12 @@ impl TkhdBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for TkhdBox {
|
impl Mp4Box for TkhdBox {
|
||||||
fn box_type() -> BoxType {
|
fn box_type(&self) -> BoxType {
|
||||||
BoxType::TkhdBox
|
return self.get_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
fn box_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE + HEADER_EXT_SIZE;
|
return self.get_size();
|
||||||
if self.version == 1 {
|
|
||||||
size += 32;
|
|
||||||
} else {
|
|
||||||
assert_eq!(self.version, 0);
|
|
||||||
size += 20;
|
|
||||||
}
|
|
||||||
size += 60;
|
|
||||||
size
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +154,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for TkhdBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for TkhdBox {
|
impl<W: Write> WriteBox<&mut W> for TkhdBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,12 @@ pub struct TrakBox {
|
||||||
pub mdia: MdiaBox,
|
pub mdia: MdiaBox,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for TrakBox {
|
impl TrakBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::TrakBox
|
BoxType::TrakBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
let mut size = HEADER_SIZE;
|
let mut size = HEADER_SIZE;
|
||||||
size += self.tkhd.box_size();
|
size += self.tkhd.box_size();
|
||||||
if let Some(ref edts) = self.edts {
|
if let Some(ref edts) = self.edts {
|
||||||
|
@ -26,6 +26,16 @@ impl Mp4Box for TrakBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for TrakBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for TrakBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for TrakBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -80,7 +90,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for TrakBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for TrakBox {
|
impl<W: Write> WriteBox<&mut W> for TrakBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
self.tkhd.write_box(writer)?;
|
self.tkhd.write_box(writer)?;
|
||||||
if let Some(ref edts) = self.edts {
|
if let Some(ref edts) = self.edts {
|
||||||
|
|
|
@ -18,16 +18,26 @@ pub struct RgbColor {
|
||||||
pub blue: u16,
|
pub blue: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mp4Box for VmhdBox {
|
impl VmhdBox {
|
||||||
fn box_type() -> BoxType {
|
pub fn get_type(&self) -> BoxType {
|
||||||
BoxType::VmhdBox
|
BoxType::VmhdBox
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_size(&self) -> u64 {
|
pub fn get_size(&self) -> u64 {
|
||||||
HEADER_SIZE + HEADER_EXT_SIZE + 8
|
HEADER_SIZE + HEADER_EXT_SIZE + 8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mp4Box for VmhdBox {
|
||||||
|
fn box_type(&self) -> BoxType {
|
||||||
|
return self.get_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_size(&self) -> u64 {
|
||||||
|
return self.get_size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: Read + Seek> ReadBox<&mut R> for VmhdBox {
|
impl<R: Read + Seek> ReadBox<&mut R> for VmhdBox {
|
||||||
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
fn read_box(reader: &mut R, size: u64) -> Result<Self> {
|
||||||
let start = box_start(reader)?;
|
let start = box_start(reader)?;
|
||||||
|
@ -55,7 +65,7 @@ impl<R: Read + Seek> ReadBox<&mut R> for VmhdBox {
|
||||||
impl<W: Write> WriteBox<&mut W> for VmhdBox {
|
impl<W: Write> WriteBox<&mut W> for VmhdBox {
|
||||||
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
fn write_box(&self, writer: &mut W) -> Result<u64> {
|
||||||
let size = self.box_size();
|
let size = self.box_size();
|
||||||
BoxHeader::new(Self::box_type(), size).write(writer)?;
|
BoxHeader::new(self.box_type(), size).write(writer)?;
|
||||||
|
|
||||||
write_box_header_ext(writer, self.version, self.flags)?;
|
write_box_header_ext(writer, self.version, self.flags)?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue