From d4f69d82ee62005953d9bbdc5905aa4955e0ee51 Mon Sep 17 00:00:00 2001 From: Alf Date: Sun, 12 Jan 2020 01:19:31 -0800 Subject: [PATCH] parse moov and mvhd box. --- src/main.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/main.rs b/src/main.rs index 37b05fb..f651204 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +extern crate byteorder; + use std::io::prelude::*; use std::io::{BufReader, Read, SeekFrom}; use std::fs::File; @@ -16,6 +18,7 @@ pub type Result = std::result::Result; #[derive(Debug, Default)] struct BMFF { ftyp: FtypBox, + moov: MoovBox, } impl BMFF { @@ -49,6 +52,22 @@ struct FtypBox { compatible_brands: Vec, } +#[derive(Debug, Default)] +struct MoovBox { + mvhd: MvhdBox, +} + +#[derive(Debug, Default)] +struct MvhdBox { + version: u8, + flags: u32, + creation_time: u32, + modification_time: u32, + timescale: u32, + duration: u32, + rate: u32, +} + #[derive(Default, PartialEq, Clone)] pub struct FourCC { pub value: String @@ -128,6 +147,8 @@ fn read_boxes(f: File) -> Result { } "moov" => { start = (size as u32 - HEADER_SIZE) as u64; + let moov = parse_moov_box(&mut reader, 0, size as u32).unwrap(); + bmff.moov = moov; } "moof" => { start = (size as u32 - HEADER_SIZE) as u64; @@ -191,3 +212,35 @@ fn parse_ftyp_box(f: &mut BufReader, _offset: u64, size: u32) -> Result, _offset: u64, size: u32) -> Result { + let _r = f.seek(SeekFrom::Current(8 as i64)); + let mvhd = parse_mvhd_box(f, 0, size as u32).unwrap(); + Ok(MoovBox{ + mvhd, + }) +} + +fn parse_mvhd_box(f: &mut BufReader, _offset: u64, size: u32) -> Result { + let version = f.read_u8().unwrap(); + let flags_a = f.read_u8().unwrap(); + let flags_b = f.read_u8().unwrap(); + let flags_c = f.read_u8().unwrap(); + let flags = u32::from(flags_a) << 16 | u32::from(flags_b) << 8 | u32::from(flags_c); + let creation_time = f.read_u32::().unwrap(); + let modification_time = f.read_u32::().unwrap(); + let timescale = f.read_u32::().unwrap(); + let duration = f.read_u32::().unwrap(); + let rate = f.read_u32::().unwrap(); + + + Ok(MvhdBox{ + version, + flags, + creation_time, + modification_time, + timescale, + duration, + rate, + }) +} \ No newline at end of file