Skip to content

Commit bb09f0d

Browse files
author
Adrian
committed
- Add feature flag for XML metadata
- Introduce XmlBox enum instead of two separate fields
1 parent 92b53d2 commit bb09f0d

File tree

5 files changed

+32
-9
lines changed

5 files changed

+32
-9
lines changed

mp4parse/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ criterion = "0.3"
4242

4343
[features]
4444
3gpp = []
45+
meta-xml = []
4546

4647
[[bench]]
4748
name = "avif_benchmark"

mp4parse/src/boxes.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@ box_database!(
176176
MetadataItemListEntry 0x696c_7374, // "ilst"
177177
MetadataItemDataEntry 0x6461_7461, // "data"
178178
MetadataItemNameBox 0x6e61_6d65, // "name"
179+
#[cfg(feature = "meta-xml")]
179180
MetadataXMLBox 0x786d_6c20, // "xml "
181+
#[cfg(feature = "meta-xml")]
180182
MetadataBXMLBox 0x6278_6d6c, // "bxml"
181183
UserdataBox 0x7564_7461, // "udta"
182184
AlbumEntry 0xa961_6c62, // "©alb"

mp4parse/src/lib.rs

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -752,10 +752,19 @@ 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+
/// Metadata
756+
#[cfg(feature = "meta-xml")]
757+
pub xml: Option<XmlBox>,
758+
}
759+
760+
/// See ISOBMFF (ISO 14496-12:2015) § 8.11.2.1
761+
#[cfg(feature = "meta-xml")]
762+
#[derive(Debug)]
763+
pub enum XmlBox {
755764
/// XML metadata
756-
pub xml: Option<TryString>,
765+
StringXmlBox(TryString),
757766
/// Binary XML metadata
758-
pub bxml: Option<TryVec<u8>>,
767+
BinaryXmlBox(TryVec<u8>),
759768
}
760769

761770
/// Internal data structures.
@@ -4062,15 +4071,18 @@ fn read_udta<T: Read>(src: &mut BMFFBox<T>) -> Result<UserdataBox> {
40624071
Ok(udta)
40634072
}
40644073

4065-
/// Parse a metadata box inside a udta box
4074+
/// Parse the meta box
4075+
/// See ISOBMFF (ISO 14496-12:2015) § 8.111.
40664076
fn read_meta<T: Read>(src: &mut BMFFBox<T>) -> Result<MetadataBox> {
40674077
let (_, _) = read_fullbox_extra(src)?;
40684078
let mut iter = src.box_iter();
40694079
let mut meta = MetadataBox::default();
40704080
while let Some(mut b) = iter.next_box()? {
40714081
match b.head.name {
40724082
BoxType::MetadataItemListEntry => read_ilst(&mut b, &mut meta)?,
4083+
#[cfg(feature = "meta-xml")]
40734084
BoxType::MetadataXMLBox => read_xml_(&mut b, &mut meta)?,
4085+
#[cfg(feature = "meta-xml")]
40744086
BoxType::MetadataBXMLBox => read_bxml(&mut b, &mut meta)?,
40754087
_ => skip_box_content(&mut b)?,
40764088
};
@@ -4080,18 +4092,24 @@ fn read_meta<T: Read>(src: &mut BMFFBox<T>) -> Result<MetadataBox> {
40804092
}
40814093

40824094
/// Parse a XML box inside a meta box
4095+
/// See ISOBMFF (ISO 14496-12:2015) § 8.11.2
4096+
#[cfg(feature = "meta-xml")]
40834097
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)?);
4098+
if read_fullbox_version_no_flags(src)? != 0 {
4099+
return Err(Error::Unsupported("unsupported XmlBox version"));
4100+
}
4101+
meta.xml = Some(XmlBox::StringXmlBox(src.read_into_try_vec()?));
40874102
Ok(())
40884103
}
40894104

40904105
/// Parse a Binary XML box inside a meta box
4106+
/// See ISOBMFF (ISO 14496-12:2015) § 8.11.2
4107+
#[cfg(feature = "meta-xml")]
40914108
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)?);
4109+
if read_fullbox_version_no_flags(src)? != 0 {
4110+
return Err(Error::Unsupported("unsupported XmlBox version"));
4111+
}
4112+
meta.xml = Some(XmlBox::BinaryXmlBox(src.read_into_try_vec()?));
40954113
Ok(())
40964114
}
40974115

mp4parse_capi/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ env_logger = "0.8"
3535

3636
[features]
3737
3gpp = ["mp4parse/3gpp"]
38+
meta-xml = ["mp4parse/meta-xml"]

mp4parse_capi/cbindgen.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ rename_variants = "QualifiedScreamingSnakeCase"
1818

1919
[defines]
2020
"feature = 3gpp" = "MP4PARSE_FEATURE_3GPP"
21+
"feature = meta-xml" = "MP4PARSE_FEATURE_META_XML"

0 commit comments

Comments
 (0)