From 0ccaa073b1da6617cd83308e9bd1fa506f36d925 Mon Sep 17 00:00:00 2001 From: Jensenn Date: Mon, 25 Sep 2023 15:14:21 -0600 Subject: [PATCH 1/3] Add UUID box reading --- src/mp4box/mod.rs | 6 +++- src/mp4box/uuid.rs | 74 ++++++++++++++++++++++++++++++++++++++++++++++ src/reader.rs | 10 ++++++- 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/mp4box/uuid.rs diff --git a/src/mp4box/mod.rs b/src/mp4box/mod.rs index 4bbdd41..7c4cd12 100644 --- a/src/mp4box/mod.rs +++ b/src/mp4box/mod.rs @@ -46,6 +46,7 @@ //! mehd //! trex //! emsg +//! uuid //! moof //! mfhd //! traf @@ -102,6 +103,7 @@ pub(crate) mod trex; pub(crate) mod trun; pub(crate) mod tx3g; pub(crate) mod udta; +pub(crate) mod uuid; pub(crate) mod vmhd; pub(crate) mod vp09; pub(crate) mod vpcc; @@ -146,6 +148,7 @@ pub use trex::TrexBox; pub use trun::TrunBox; pub use tx3g::Tx3gBox; pub use udta::UdtaBox; +pub use uuid::UuidBox; pub use vmhd::VmhdBox; pub use vp09::Vp09Box; pub use vpcc::VpccBox; @@ -238,7 +241,8 @@ boxtype! { CovrBox => 0x636f7672, DescBox => 0x64657363, WideBox => 0x77696465, - WaveBox => 0x77617665 + WaveBox => 0x77617665, + UuidBox => 0x75756964 } pub trait Mp4Box: Sized { diff --git a/src/mp4box/uuid.rs b/src/mp4box/uuid.rs new file mode 100644 index 0000000..14aa474 --- /dev/null +++ b/src/mp4box/uuid.rs @@ -0,0 +1,74 @@ +use serde::Serialize; +use std::io::{Read, Seek, Write}; + +use crate::mp4box::*; + +#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize)] +pub struct UuidBox { + pub extended_type: [u8; 16], + pub data: Vec, +} + +impl UuidBox { + pub fn get_type(&self) -> BoxType { + BoxType::UuidBox + } + + pub fn get_size(&self) -> u64 { + HEADER_SIZE + 16 + self.data.len() as u64 + } +} + +impl Mp4Box for UuidBox { + fn box_type(&self) -> BoxType { + self.get_type() + } + + fn box_size(&self) -> u64 { + self.get_size() + } + + fn to_json(&self) -> Result { + Ok(serde_json::to_string(&self).unwrap()) + } + + fn summary(&self) -> Result { + let s = format!("extended_type: {:02x?}", self.extended_type); + Ok(s) + } +} + +impl ReadBox<&mut R> for UuidBox { + fn read_box(reader: &mut R, size: u64) -> Result { + let start = box_start(reader)?; + + let mut extended_type = [0; 16]; + reader.read_exact(&mut extended_type)?; + + let data_size = (start + size) + .checked_sub(reader.stream_position()?) + .ok_or(Error::InvalidData("uuid size too small"))?; + let mut data = vec![0; data_size as usize]; + reader.read_exact(&mut data)?; + + skip_bytes_to(reader, start + size)?; + + Ok(UuidBox { + extended_type, + data, + }) + } +} + +impl WriteBox<&mut W> for UuidBox { + fn write_box(&self, writer: &mut W) -> Result { + let size = self.box_size(); + + BoxHeader::new(self.box_type(), size).write(writer)?; + + writer.write_all(&self.extended_type)?; + writer.write_all(&self.data)?; + + Ok(size) + } +} diff --git a/src/reader.rs b/src/reader.rs index e5ac296..5a67b68 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -12,6 +12,7 @@ pub struct Mp4Reader { pub moov: MoovBox, pub moofs: Vec, pub emsgs: Vec, + pub uuids: Vec, tracks: HashMap, size: u64, @@ -26,6 +27,7 @@ impl Mp4Reader { let mut moofs = Vec::new(); let mut moof_offsets = Vec::new(); let mut emsgs = Vec::new(); + let mut uuids = Vec::new(); let mut current = start; while current < size { @@ -67,6 +69,10 @@ impl Mp4Reader { let emsg = EmsgBox::read_box(&mut reader, s)?; emsgs.push(emsg); } + BoxType::UuidBox => { + let uuid = UuidBox::read_box(&mut reader, s)?; + uuids.push(uuid); + } _ => { // XXX warn!() skip_box(&mut reader, s)?; @@ -124,6 +130,7 @@ impl Mp4Reader { moov: moov.unwrap(), moofs, emsgs, + uuids, size, tracks, }) @@ -209,7 +216,8 @@ impl Mp4Reader { ftyp: self.ftyp.clone(), moov: self.moov.clone(), moofs, - emsgs: Vec::new(), + emsgs: self.emsgs.clone(), + uuids: self.uuids.clone(), tracks, size, }) From 1a90e8d6fbf1931d15d72770d5ee67ea5384d323 Mon Sep 17 00:00:00 2001 From: Jensenn Date: Tue, 26 Mar 2024 15:18:26 -0600 Subject: [PATCH 2/3] Add uuid box reading to read_fragment_header --- src/reader.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/reader.rs b/src/reader.rs index 5a67b68..1365c3f 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -145,6 +145,7 @@ impl Mp4Reader { let mut moofs = Vec::new(); let mut moof_offsets = Vec::new(); + let mut uuids = Vec::new(); let mut current = start; while current < size { @@ -173,6 +174,10 @@ impl Mp4Reader { moofs.push(moof); moof_offsets.push(moof_offset); } + BoxType::UuidBox => { + let uuid = UuidBox::read_box(&mut reader, s)?; + uuids.push(uuid); + } _ => { // XXX warn!() skip_box(&mut reader, s)?; @@ -216,8 +221,8 @@ impl Mp4Reader { ftyp: self.ftyp.clone(), moov: self.moov.clone(), moofs, - emsgs: self.emsgs.clone(), - uuids: self.uuids.clone(), + emsgs: Vec::new(), + uuids, tracks, size, }) From af3b69e6a4ee4ef081fdf14ce267f5f96864db50 Mon Sep 17 00:00:00 2001 From: Jensenn Date: Tue, 26 Mar 2024 15:22:59 -0600 Subject: [PATCH 3/3] Fix clippy issue --- src/track.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/track.rs b/src/track.rs index 7eada83..4f38588 100644 --- a/src/track.rs +++ b/src/track.rs @@ -261,7 +261,7 @@ impl Mp4Track { pub fn sequence_parameter_set(&self) -> Result<&[u8]> { if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 { - match avc1.avcc.sequence_parameter_sets.get(0) { + match avc1.avcc.sequence_parameter_sets.first() { Some(nal) => Ok(nal.bytes.as_ref()), None => Err(Error::EntryInStblNotFound( self.track_id(), @@ -276,7 +276,7 @@ impl Mp4Track { pub fn picture_parameter_set(&self) -> Result<&[u8]> { if let Some(ref avc1) = self.trak.mdia.minf.stbl.stsd.avc1 { - match avc1.avcc.picture_parameter_sets.get(0) { + match avc1.avcc.picture_parameter_sets.first() { Some(nal) => Ok(nal.bytes.as_ref()), None => Err(Error::EntryInStblNotFound( self.track_id(),