Skip to content

Commit 12142fd

Browse files
authored
Merge pull request #407 from mozilla/empty-duration
empty_duration is in the mvhd's time base
2 parents b363e13 + 89fd2ba commit 12142fd

File tree

3 files changed

+141
-134
lines changed

3 files changed

+141
-134
lines changed

mp4parse/src/lib.rs

Lines changed: 129 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1888,135 +1888,6 @@ impl DataBox {
18881888
}
18891889
}
18901890

1891-
#[cfg(test)]
1892-
mod media_data_box_tests {
1893-
use super::*;
1894-
1895-
impl DataBox {
1896-
fn at_offset(file_offset: u64, data: std::vec::Vec<u8>) -> Self {
1897-
DataBox {
1898-
metadata: DataBoxMetadata::Mdat { file_offset },
1899-
data: data.into(),
1900-
}
1901-
}
1902-
}
1903-
1904-
#[test]
1905-
fn extent_with_length_before_mdat_returns_none() {
1906-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1907-
let extent = Extent::WithLength { offset: 0, len: 2 };
1908-
1909-
assert!(mdat.get(&extent).is_none());
1910-
}
1911-
1912-
#[test]
1913-
fn extent_to_end_before_mdat_returns_none() {
1914-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1915-
let extent = Extent::ToEnd { offset: 0 };
1916-
1917-
assert!(mdat.get(&extent).is_none());
1918-
}
1919-
1920-
#[test]
1921-
fn extent_with_length_crossing_front_mdat_boundary_returns_none() {
1922-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1923-
let extent = Extent::WithLength { offset: 99, len: 3 };
1924-
1925-
assert!(mdat.get(&extent).is_none());
1926-
}
1927-
1928-
#[test]
1929-
fn extent_with_length_which_is_subset_of_mdat() {
1930-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1931-
let extent = Extent::WithLength {
1932-
offset: 101,
1933-
len: 2,
1934-
};
1935-
1936-
assert_eq!(mdat.get(&extent), Some(&[1, 1][..]));
1937-
}
1938-
1939-
#[test]
1940-
fn extent_to_end_which_is_subset_of_mdat() {
1941-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1942-
let extent = Extent::ToEnd { offset: 101 };
1943-
1944-
assert_eq!(mdat.get(&extent), Some(&[1, 1, 1, 1][..]));
1945-
}
1946-
1947-
#[test]
1948-
fn extent_with_length_which_is_all_of_mdat() {
1949-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1950-
let extent = Extent::WithLength {
1951-
offset: 100,
1952-
len: 5,
1953-
};
1954-
1955-
assert_eq!(mdat.get(&extent), Some(mdat.data.as_slice()));
1956-
}
1957-
1958-
#[test]
1959-
fn extent_to_end_which_is_all_of_mdat() {
1960-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1961-
let extent = Extent::ToEnd { offset: 100 };
1962-
1963-
assert_eq!(mdat.get(&extent), Some(mdat.data.as_slice()));
1964-
}
1965-
1966-
#[test]
1967-
fn extent_with_length_crossing_back_mdat_boundary_returns_none() {
1968-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1969-
let extent = Extent::WithLength {
1970-
offset: 103,
1971-
len: 3,
1972-
};
1973-
1974-
assert!(mdat.get(&extent).is_none());
1975-
}
1976-
1977-
#[test]
1978-
fn extent_with_length_after_mdat_returns_none() {
1979-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1980-
let extent = Extent::WithLength {
1981-
offset: 200,
1982-
len: 2,
1983-
};
1984-
1985-
assert!(mdat.get(&extent).is_none());
1986-
}
1987-
1988-
#[test]
1989-
fn extent_to_end_after_mdat_returns_none() {
1990-
let mdat = DataBox::at_offset(100, vec![1; 5]);
1991-
let extent = Extent::ToEnd { offset: 200 };
1992-
1993-
assert!(mdat.get(&extent).is_none());
1994-
}
1995-
1996-
#[test]
1997-
fn extent_with_length_which_overflows_usize() {
1998-
let mdat = DataBox::at_offset(std::u64::MAX - 1, vec![1; 5]);
1999-
let extent = Extent::WithLength {
2000-
offset: std::u64::MAX,
2001-
len: std::usize::MAX,
2002-
};
2003-
2004-
assert!(mdat.get(&extent).is_none());
2005-
}
2006-
2007-
// The end of the range would overflow `usize` if it were calculated, but
2008-
// because the range end is unbounded, we don't calculate it.
2009-
#[test]
2010-
fn extent_to_end_which_overflows_usize() {
2011-
let mdat = DataBox::at_offset(std::u64::MAX - 1, vec![1; 5]);
2012-
let extent = Extent::ToEnd {
2013-
offset: std::u64::MAX,
2014-
};
2015-
2016-
assert_eq!(mdat.get(&extent), Some(&[1, 1, 1, 1][..]));
2017-
}
2018-
}
2019-
20201891
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
20211892
struct PropertyIndex(u16);
20221893
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)]
@@ -6289,3 +6160,132 @@ fn write_be_u32<T: WriteBytesExt>(des: &mut T, num: u32) -> Result<()> {
62896160
des.write_u32::<byteorder::BigEndian>(num)
62906161
.map_err(From::from)
62916162
}
6163+
6164+
#[cfg(test)]
6165+
mod media_data_box_tests {
6166+
use super::*;
6167+
6168+
impl DataBox {
6169+
fn at_offset(file_offset: u64, data: std::vec::Vec<u8>) -> Self {
6170+
DataBox {
6171+
metadata: DataBoxMetadata::Mdat { file_offset },
6172+
data: data.into(),
6173+
}
6174+
}
6175+
}
6176+
6177+
#[test]
6178+
fn extent_with_length_before_mdat_returns_none() {
6179+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6180+
let extent = Extent::WithLength { offset: 0, len: 2 };
6181+
6182+
assert!(mdat.get(&extent).is_none());
6183+
}
6184+
6185+
#[test]
6186+
fn extent_to_end_before_mdat_returns_none() {
6187+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6188+
let extent = Extent::ToEnd { offset: 0 };
6189+
6190+
assert!(mdat.get(&extent).is_none());
6191+
}
6192+
6193+
#[test]
6194+
fn extent_with_length_crossing_front_mdat_boundary_returns_none() {
6195+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6196+
let extent = Extent::WithLength { offset: 99, len: 3 };
6197+
6198+
assert!(mdat.get(&extent).is_none());
6199+
}
6200+
6201+
#[test]
6202+
fn extent_with_length_which_is_subset_of_mdat() {
6203+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6204+
let extent = Extent::WithLength {
6205+
offset: 101,
6206+
len: 2,
6207+
};
6208+
6209+
assert_eq!(mdat.get(&extent), Some(&[1, 1][..]));
6210+
}
6211+
6212+
#[test]
6213+
fn extent_to_end_which_is_subset_of_mdat() {
6214+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6215+
let extent = Extent::ToEnd { offset: 101 };
6216+
6217+
assert_eq!(mdat.get(&extent), Some(&[1, 1, 1, 1][..]));
6218+
}
6219+
6220+
#[test]
6221+
fn extent_with_length_which_is_all_of_mdat() {
6222+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6223+
let extent = Extent::WithLength {
6224+
offset: 100,
6225+
len: 5,
6226+
};
6227+
6228+
assert_eq!(mdat.get(&extent), Some(mdat.data.as_slice()));
6229+
}
6230+
6231+
#[test]
6232+
fn extent_to_end_which_is_all_of_mdat() {
6233+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6234+
let extent = Extent::ToEnd { offset: 100 };
6235+
6236+
assert_eq!(mdat.get(&extent), Some(mdat.data.as_slice()));
6237+
}
6238+
6239+
#[test]
6240+
fn extent_with_length_crossing_back_mdat_boundary_returns_none() {
6241+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6242+
let extent = Extent::WithLength {
6243+
offset: 103,
6244+
len: 3,
6245+
};
6246+
6247+
assert!(mdat.get(&extent).is_none());
6248+
}
6249+
6250+
#[test]
6251+
fn extent_with_length_after_mdat_returns_none() {
6252+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6253+
let extent = Extent::WithLength {
6254+
offset: 200,
6255+
len: 2,
6256+
};
6257+
6258+
assert!(mdat.get(&extent).is_none());
6259+
}
6260+
6261+
#[test]
6262+
fn extent_to_end_after_mdat_returns_none() {
6263+
let mdat = DataBox::at_offset(100, vec![1; 5]);
6264+
let extent = Extent::ToEnd { offset: 200 };
6265+
6266+
assert!(mdat.get(&extent).is_none());
6267+
}
6268+
6269+
#[test]
6270+
fn extent_with_length_which_overflows_usize() {
6271+
let mdat = DataBox::at_offset(std::u64::MAX - 1, vec![1; 5]);
6272+
let extent = Extent::WithLength {
6273+
offset: std::u64::MAX,
6274+
len: std::usize::MAX,
6275+
};
6276+
6277+
assert!(mdat.get(&extent).is_none());
6278+
}
6279+
6280+
// The end of the range would overflow `usize` if it were calculated, but
6281+
// because the range end is unbounded, we don't calculate it.
6282+
#[test]
6283+
fn extent_to_end_which_overflows_usize() {
6284+
let mdat = DataBox::at_offset(std::u64::MAX - 1, vec![1; 5]);
6285+
let extent = Extent::ToEnd {
6286+
offset: std::u64::MAX,
6287+
};
6288+
6289+
assert_eq!(mdat.get(&extent), Some(&[1, 1, 1, 1][..]));
6290+
}
6291+
}

mp4parse/src/unstable.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ impl<'a> SampleToChunkIterator<'a> {
465465
/// (n * s) / d is split into floor(n / d) * s + (n % d) * s / d.
466466
///
467467
/// Return None on overflow or if the denominator is zero.
468-
fn rational_scale<T, S>(numerator: T, denominator: T, scale2: S) -> Option<T>
468+
pub fn rational_scale<T, S>(numerator: T, denominator: T, scale2: S) -> Option<T>
469469
where
470470
T: PrimInt + Zero,
471471
S: PrimInt,

mp4parse_capi/src/lib.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
3636

3737
use byteorder::WriteBytesExt;
38+
use mp4parse::unstable::rational_scale;
3839
use std::convert::TryFrom;
3940
use std::convert::TryInto;
4041

@@ -628,15 +629,21 @@ pub unsafe extern "C" fn mp4parse_get_track_info(
628629

629630
let track = &context.tracks[track_index];
630631

631-
if let (Some(timescale), Some(_)) = (track.timescale, context.timescale) {
632+
if let (Some(timescale), Some(context_timescale)) = (track.timescale, context.timescale) {
632633
info.time_scale = timescale.0 as u32;
633634
let media_time: CheckedInteger<u64> = track
634635
.media_time
635636
.map_or(0.into(), |media_time| media_time.0.into());
636637

637-
let empty_duration: CheckedInteger<u64> = track
638-
.empty_duration
639-
.map_or(0.into(), |empty_duration| empty_duration.0.into());
638+
// Empty duration is in the context's timescale, convert it and return it in the track's
639+
// timescale
640+
let empty_duration: CheckedInteger<u64> =
641+
match track.empty_duration.map_or(Some(0), |empty_duration| {
642+
rational_scale(empty_duration.0, context_timescale.0, timescale.0)
643+
}) {
644+
Some(time) => mp4parse::unstable::CheckedInteger(time),
645+
None => return Mp4parseStatus::Invalid,
646+
};
640647

641648
info.media_time = match media_time - empty_duration {
642649
Some(difference) => difference,

0 commit comments

Comments
 (0)