Skip to content

Commit 7cb9814

Browse files
author
Adrian
committed
Add support for XML metadata box
1 parent 20d414c commit 7cb9814

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

mp4parse/src/boxes.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ box_database!(
176176
MetadataItemListEntry 0x696c_7374, // "ilst"
177177
MetadataItemDataEntry 0x6461_7461, // "data"
178178
MetadataItemNameBox 0x6e61_6d65, // "name"
179+
MetadataXMLBox 0x786d_6c20, // "xml "
180+
MetadataBXMLBox 0x6278_6d6c, // "bxml"
179181
UserdataBox 0x7564_7461, // "udta"
180182
AlbumEntry 0xa961_6c62, // "©alb"
181183
ArtistEntry 0xa941_5254, // "©ART"

mp4parse/src/lib.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,10 @@ pub struct MetadataBox {
752752
pub sort_album_artist: Option<TryString>,
753753
/// The name of the composer to sort by 'soco'
754754
pub sort_composer: Option<TryString>,
755+
/// XML metadata
756+
pub xml: Option<TryString>,
757+
/// Binary XML metadata
758+
pub bxml: Option<TryVec<u8>>,
755759
}
756760

757761
/// Internal data structures.
@@ -763,6 +767,7 @@ pub struct MediaContext {
763767
pub mvex: Option<MovieExtendsBox>,
764768
pub psshs: TryVec<ProtectionSystemSpecificHeaderBox>,
765769
pub userdata: Option<Result<UserdataBox>>,
770+
pub metadata: Option<Result<MetadataBox>>,
766771
}
767772

768773
/// An ISOBMFF item as described by an iloc box. For the sake of avoiding copies,
@@ -2307,6 +2312,11 @@ pub fn read_mp4<T: Read>(f: &mut T) -> Result<MediaContext> {
23072312
BoxType::MovieBox => {
23082313
context = Some(read_moov(&mut b, context)?);
23092314
}
2315+
BoxType::MetadataBox => {
2316+
if let Some(ctx) = &mut context {
2317+
ctx.metadata = Some(read_meta(&mut b));
2318+
}
2319+
}
23102320
_ => skip_box_content(&mut b)?,
23112321
};
23122322
check_parser_state!(b.content);
@@ -2352,6 +2362,7 @@ fn read_moov<T: Read>(f: &mut BMFFBox<T>, context: Option<MediaContext>) -> Resu
23522362
mut mvex,
23532363
mut psshs,
23542364
mut userdata,
2365+
mut metadata,
23552366
} = context.unwrap_or_default();
23562367

23572368
let mut iter = f.box_iter();
@@ -2394,6 +2405,7 @@ fn read_moov<T: Read>(f: &mut BMFFBox<T>, context: Option<MediaContext>) -> Resu
23942405
mvex,
23952406
psshs,
23962407
userdata,
2408+
metadata,
23972409
})
23982410
}
23992411

@@ -4058,13 +4070,31 @@ fn read_meta<T: Read>(src: &mut BMFFBox<T>) -> Result<MetadataBox> {
40584070
while let Some(mut b) = iter.next_box()? {
40594071
match b.head.name {
40604072
BoxType::MetadataItemListEntry => read_ilst(&mut b, &mut meta)?,
4073+
BoxType::MetadataXMLBox => read_xml_(&mut b, &mut meta)?,
4074+
BoxType::MetadataBXMLBox => read_bxml(&mut b, &mut meta)?,
40614075
_ => skip_box_content(&mut b)?,
40624076
};
40634077
check_parser_state!(b.content);
40644078
}
40654079
Ok(meta)
40664080
}
40674081

4082+
/// Parse a XML box inside a meta box
4083+
fn read_xml_<T: Read>(src: &mut BMFFBox<T>, meta: &mut MetadataBox) -> Result<()> {
4084+
let (_, _) = read_fullbox_extra(src)?;
4085+
let size = src.content.limit();
4086+
meta.xml = Some(read_buf(&mut src.content, size)?);
4087+
Ok(())
4088+
}
4089+
4090+
/// Parse a Binary XML box inside a meta box
4091+
fn read_bxml<T: Read>(src: &mut BMFFBox<T>, meta: &mut MetadataBox) -> Result<()> {
4092+
let (_, _) = read_fullbox_extra(src)?;
4093+
let size = src.content.limit();
4094+
meta.bxml = Some(read_buf(&mut src.content, size)?);
4095+
Ok(())
4096+
}
4097+
40684098
/// Parse a metadata box inside a udta box
40694099
fn read_ilst<T: Read>(src: &mut BMFFBox<T>, meta: &mut MetadataBox) -> Result<()> {
40704100
let mut iter = src.box_iter();

0 commit comments

Comments
 (0)