Skip to content

Commit 309b9b8

Browse files
author
Bryce Van Dyk
authored
Merge pull request #219 from SingingTree/expose_encrypted_original_format
Expose encrypted original format via C API
2 parents 9d58d7f + 6c59eba commit 309b9b8

File tree

6 files changed

+57
-25
lines changed

6 files changed

+57
-25
lines changed

mp4parse/src/boxes.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ impl fmt::Display for FourCC {
9494
}
9595
}
9696

97+
impl PartialEq<&[u8; 4]> for FourCC {
98+
fn eq(&self, other: &&[u8; 4]) -> bool {
99+
self.value.eq(*other)
100+
}
101+
}
102+
97103
box_database!(
98104
FileTypeBox 0x6674_7970, // "ftyp"
99105
MediaDataBox 0x6d64_6174, // "mdat"

mp4parse/src/lib.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ pub struct TrackEncryptionBox {
538538

539539
#[derive(Debug, Default)]
540540
pub struct ProtectionSchemeInfoBox {
541-
pub code_name: TryString,
541+
pub original_format: FourCC,
542542
pub scheme_type: Option<SchemeTypeBox>,
543543
pub tenc: Option<TrackEncryptionBox>,
544544
}
@@ -3163,8 +3163,7 @@ fn read_sinf<T: Read>(src: &mut BMFFBox<T>) -> Result<ProtectionSchemeInfoBox> {
31633163
while let Some(mut b) = iter.next_box()? {
31643164
match b.head.name {
31653165
BoxType::OriginalFormatBox => {
3166-
let frma = read_frma(&mut b)?;
3167-
sinf.code_name = frma;
3166+
sinf.original_format = FourCC::from(be_u32(&mut b)?);
31683167
}
31693168
BoxType::SchemeTypeBox => {
31703169
sinf.scheme_type = Some(read_schm(&mut b)?);
@@ -3241,10 +3240,6 @@ fn read_tenc<T: Read>(src: &mut BMFFBox<T>) -> Result<TrackEncryptionBox> {
32413240
})
32423241
}
32433242

3244-
fn read_frma<T: Read>(src: &mut BMFFBox<T>) -> Result<TryString> {
3245-
read_buf(src, 4)
3246-
}
3247-
32483243
fn read_schm<T: Read>(src: &mut BMFFBox<T>) -> Result<SchemeTypeBox> {
32493244
// Flags can be used to signal presence of URI in the box, but we don't
32503245
// use the URI so don't bother storing the flags.

mp4parse/src/tests.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use std::io::Read as _;
1717
extern crate test_assembler;
1818
use self::test_assembler::*;
1919

20-
use boxes::{BoxType, FourCC};
20+
use boxes::BoxType;
2121

2222
enum BoxSize {
2323
Short(u32),
@@ -181,11 +181,11 @@ fn read_ftyp() {
181181
assert_eq!(stream.head.name, BoxType::FileTypeBox);
182182
assert_eq!(stream.head.size, 24);
183183
let parsed = super::read_ftyp(&mut stream).unwrap();
184-
assert_eq!(parsed.major_brand, FourCC::from(*b"mp42")); // mp42
184+
assert_eq!(parsed.major_brand, b"mp42"); // mp42
185185
assert_eq!(parsed.minor_version, 0);
186186
assert_eq!(parsed.compatible_brands.len(), 2);
187-
assert_eq!(parsed.compatible_brands[0], FourCC::from(*b"isom")); // isom
188-
assert_eq!(parsed.compatible_brands[1], FourCC::from(*b"mp42")); // mp42
187+
assert_eq!(parsed.compatible_brands[0], b"isom"); // isom
188+
assert_eq!(parsed.compatible_brands[1], b"mp42"); // mp42
189189
}
190190

191191
#[test]
@@ -223,11 +223,11 @@ fn read_ftyp_case() {
223223
assert_eq!(stream.head.name, BoxType::FileTypeBox);
224224
assert_eq!(stream.head.size, 24);
225225
let parsed = super::read_ftyp(&mut stream).unwrap();
226-
assert_eq!(parsed.major_brand, FourCC::from(*b"MP42"));
226+
assert_eq!(parsed.major_brand, b"MP42");
227227
assert_eq!(parsed.minor_version, 0);
228228
assert_eq!(parsed.compatible_brands.len(), 2);
229-
assert_eq!(parsed.compatible_brands[0], FourCC::from(*b"ISOM")); // ISOM
230-
assert_eq!(parsed.compatible_brands[1], FourCC::from(*b"MP42")); // MP42
229+
assert_eq!(parsed.compatible_brands[0], b"ISOM"); // ISOM
230+
assert_eq!(parsed.compatible_brands[1], b"MP42"); // MP42
231231
}
232232

233233
#[test]
@@ -474,7 +474,7 @@ fn read_hdlr() {
474474
assert_eq!(stream.head.name, BoxType::HandlerBox);
475475
assert_eq!(stream.head.size, 45);
476476
let parsed = super::read_hdlr(&mut stream).unwrap();
477-
assert_eq!(parsed.handler_type, FourCC::from(*b"vide"));
477+
assert_eq!(parsed.handler_type, b"vide");
478478
}
479479

480480
#[test]
@@ -487,7 +487,7 @@ fn read_hdlr_short_name() {
487487
assert_eq!(stream.head.name, BoxType::HandlerBox);
488488
assert_eq!(stream.head.size, 33);
489489
let parsed = super::read_hdlr(&mut stream).unwrap();
490-
assert_eq!(parsed.handler_type, FourCC::from(*b"vide"));
490+
assert_eq!(parsed.handler_type, b"vide");
491491
}
492492

493493
#[test]
@@ -500,7 +500,7 @@ fn read_hdlr_zero_length_name() {
500500
assert_eq!(stream.head.name, BoxType::HandlerBox);
501501
assert_eq!(stream.head.size, 32);
502502
let parsed = super::read_hdlr(&mut stream).unwrap();
503-
assert_eq!(parsed.handler_type, FourCC::from(*b"vide"));
503+
assert_eq!(parsed.handler_type, b"vide");
504504
}
505505

506506
fn flac_streaminfo() -> Vec<u8> {

mp4parse/tests/public.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ fn public_audio_tenc() {
309309
assert_eq!(a.codec_type, mp4::CodecType::EncryptedAudio);
310310
match a.protection_info.iter().find(|sinf| sinf.tenc.is_some()) {
311311
Some(ref p) => {
312-
assert_eq!(p.code_name, "mp4a");
312+
assert_eq!(p.original_format, b"mp4a");
313313
if let Some(ref schm) = p.scheme_type {
314-
assert_eq!(schm.scheme_type.value, *b"cenc");
314+
assert_eq!(schm.scheme_type, b"cenc");
315315
} else {
316316
panic!("Expected scheme type info");
317317
}
@@ -368,9 +368,9 @@ fn public_video_cenc() {
368368
assert_eq!(v.codec_type, mp4::CodecType::EncryptedVideo);
369369
match v.protection_info.iter().find(|sinf| sinf.tenc.is_some()) {
370370
Some(ref p) => {
371-
assert_eq!(p.code_name, "avc1");
371+
assert_eq!(p.original_format, b"avc1");
372372
if let Some(ref schm) = p.scheme_type {
373-
assert_eq!(schm.scheme_type.value, *b"cenc");
373+
assert_eq!(schm.scheme_type, b"cenc");
374374
} else {
375375
panic!("Expected scheme type info");
376376
}
@@ -441,9 +441,9 @@ fn public_audio_cbcs() {
441441
mp4::SampleEntry::Audio(ref a) => {
442442
if let Some(p) = a.protection_info.iter().find(|sinf| sinf.tenc.is_some()) {
443443
found_encrypted_sample_description = true;
444-
assert_eq!(p.code_name, "mp4a");
444+
assert_eq!(p.original_format, b"mp4a");
445445
if let Some(ref schm) = p.scheme_type {
446-
assert_eq!(schm.scheme_type.value, *b"cbcs");
446+
assert_eq!(schm.scheme_type, b"cbcs");
447447
} else {
448448
panic!("Expected scheme type info");
449449
}
@@ -526,9 +526,9 @@ fn public_video_cbcs() {
526526
assert_eq!(v.height, 300);
527527
if let Some(p) = v.protection_info.iter().find(|sinf| sinf.tenc.is_some()) {
528528
found_encrypted_sample_description = true;
529-
assert_eq!(p.code_name, "avc1");
529+
assert_eq!(p.original_format, b"avc1");
530530
if let Some(ref schm) = p.scheme_type {
531-
assert_eq!(schm.scheme_type.value, *b"cbcs");
531+
assert_eq!(schm.scheme_type, b"cbcs");
532532
} else {
533533
panic!("Expected scheme type info");
534534
}

mp4parse_capi/src/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,23 @@ pub struct Mp4parsePsshInfo {
217217
pub data: Mp4parseByteData,
218218
}
219219

220+
#[repr(u8)]
221+
#[derive(Debug, PartialEq)]
222+
pub enum OptionalFourCC {
223+
None,
224+
Some([u8; 4]),
225+
}
226+
227+
impl Default for OptionalFourCC {
228+
fn default() -> Self {
229+
Self::None
230+
}
231+
}
232+
220233
#[repr(C)]
221234
#[derive(Default, Debug)]
222235
pub struct Mp4parseSinfInfo {
236+
pub original_format: OptionalFourCC,
223237
pub scheme_type: Mp4ParseEncryptionSchemeType,
224238
pub is_encrypted: u8,
225239
pub iv_size: u8,
@@ -827,6 +841,8 @@ fn get_track_audio_info(
827841
.iter()
828842
.find(|sinf| sinf.tenc.is_some())
829843
{
844+
sample_info.protected_data.original_format =
845+
OptionalFourCC::Some(p.original_format.value);
830846
sample_info.protected_data.scheme_type = match p.scheme_type {
831847
Some(ref scheme_type_box) => {
832848
match scheme_type_box.scheme_type.value.as_ref() {
@@ -987,6 +1003,8 @@ fn mp4parse_get_track_video_info_safe(
9871003
.iter()
9881004
.find(|sinf| sinf.tenc.is_some())
9891005
{
1006+
sample_info.protected_data.original_format =
1007+
OptionalFourCC::Some(p.original_format.value);
9901008
sample_info.protected_data.scheme_type = match p.scheme_type {
9911009
Some(ref scheme_type_box) => {
9921010
match scheme_type_box.scheme_type.value.as_ref() {

mp4parse_capi/tests/test_encryption.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ fn parse_cenc() {
5151
assert_eq!((*video.sample_info).image_width, 320);
5252
assert_eq!((*video.sample_info).image_height, 240);
5353
let protected_data = &(*video.sample_info).protected_data;
54+
assert_eq!(
55+
protected_data.original_format,
56+
OptionalFourCC::Some(*b"avc1")
57+
);
5458
assert_eq!(
5559
protected_data.scheme_type,
5660
Mp4ParseEncryptionSchemeType::Cenc
@@ -79,6 +83,10 @@ fn parse_cenc() {
7983
assert_eq!((*audio.sample_info).bit_depth, 16);
8084
assert_eq!((*audio.sample_info).sample_rate, 44100);
8185
let protected_data = &(*audio.sample_info).protected_data;
86+
assert_eq!(
87+
protected_data.original_format,
88+
OptionalFourCC::Some(*b"mp4a")
89+
);
8290
assert_eq!(protected_data.is_encrypted, 0x01);
8391
assert_eq!(protected_data.iv_size, 16);
8492
assert_eq!(protected_data.kid.length, 16);
@@ -128,6 +136,10 @@ fn parse_cbcs() {
128136
assert_eq!((*video.sample_info).image_width, 400);
129137
assert_eq!((*video.sample_info).image_height, 300);
130138
let protected_data = &(*video.sample_info).protected_data;
139+
assert_eq!(
140+
protected_data.original_format,
141+
OptionalFourCC::Some(*b"avc1")
142+
);
131143
assert_eq!(
132144
protected_data.scheme_type,
133145
Mp4ParseEncryptionSchemeType::Cbcs
@@ -186,6 +198,7 @@ fn parse_unencrypted() {
186198
assert_eq!(rv, Mp4parseStatus::Ok);
187199
assert_eq!(audio.sample_info_count, 1);
188200
let protected_data = &(*audio.sample_info).protected_data;
201+
assert_eq!(protected_data.original_format, OptionalFourCC::None);
189202
assert_eq!(
190203
protected_data.scheme_type,
191204
Mp4ParseEncryptionSchemeType::None

0 commit comments

Comments
 (0)