@@ -2275,7 +2275,7 @@ impl<'a, T: Read> BoxIter<'a, T> {
2275
2275
match r {
2276
2276
Ok ( h) => Ok ( Some ( BMFFBox {
2277
2277
head : h,
2278
- content : self . src . take ( h. size - h. offset ) ,
2278
+ content : self . src . take ( h. size . saturating_sub ( h. offset ) ) ,
2279
2279
} ) ) ,
2280
2280
Err ( Error :: UnexpectedEOF ) => Ok ( None ) ,
2281
2281
Err ( e) => Err ( e) ,
@@ -2337,7 +2337,13 @@ fn read_box_header<T: ReadBytesExt>(src: &mut T) -> Result<BoxHeader> {
2337
2337
let name = BoxType :: from ( be_u32 ( src) ?) ;
2338
2338
let size = match size32 {
2339
2339
// valid only for top-level box and indicates it's the last box in the file. usually mdat.
2340
- 0 => return Err ( Error :: Unsupported ( "unknown sized box" ) ) ,
2340
+ 0 => {
2341
+ if name == BoxType :: MediaDataBox {
2342
+ 0
2343
+ } else {
2344
+ return Err ( Error :: Unsupported ( "unknown sized box" ) ) ;
2345
+ }
2346
+ }
2341
2347
1 => {
2342
2348
let size64 = be_u64 ( src) ?;
2343
2349
if size64 < BoxHeader :: MIN_LARGE_SIZE {
@@ -2375,7 +2381,7 @@ fn read_box_header<T: ReadBytesExt>(src: &mut T) -> Result<BoxHeader> {
2375
2381
} else {
2376
2382
None
2377
2383
} ;
2378
- assert ! ( offset <= size) ;
2384
+ assert ! ( offset <= size || size == 0 ) ;
2379
2385
Ok ( BoxHeader {
2380
2386
name,
2381
2387
size,
@@ -2536,7 +2542,26 @@ pub fn read_avif<T: Read>(f: &mut T, strictness: ParseStrictness) -> Result<Avif
2536
2542
}
2537
2543
BoxType :: MediaDataBox => {
2538
2544
let file_offset = b. offset ( ) ;
2539
- let data = b. read_into_try_vec ( ) ?;
2545
+ let data = if b. head . size == 0 {
2546
+ // Unknown sized `mdat`, read in chunks until EOF.
2547
+ const BUF_SIZE : usize = 64 * 1024 ;
2548
+ let mut data = TryVec :: with_capacity ( BUF_SIZE ) ?;
2549
+ loop {
2550
+ let got = fallible_collections:: try_read_up_to (
2551
+ b. content . get_mut ( ) ,
2552
+ BUF_SIZE as u64 ,
2553
+ & mut data,
2554
+ ) ?;
2555
+ if got == 0 {
2556
+ // Mark `content` as consumed.
2557
+ b. content . set_limit ( 0 ) ;
2558
+ break ;
2559
+ }
2560
+ }
2561
+ data
2562
+ } else {
2563
+ b. read_into_try_vec ( ) ?
2564
+ } ;
2540
2565
media_storage. push ( DataBox :: from_mdat ( file_offset, data) ) ?;
2541
2566
}
2542
2567
_ => skip_box_content ( & mut b) ?,
0 commit comments