mov: some fixes for MP4 parsing
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 24 Oct 2020 16:19:04 +0000 (18:19 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 24 Oct 2020 16:50:03 +0000 (18:50 +0200)
nihav-commonfmt/src/demuxers/mov.rs

index 5a0e4f9c374733a4968c9318cbfc5a3c9022e20d..1c52dfe24a06ef57d27aa1b05c138a394efef895 100644 (file)
@@ -335,7 +335,7 @@ fn read_hdlr(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult
     let _comp_flags         = br.read_u32be()?;
     let _comp_flags_mask    = br.read_u32be()?;
 
     let _comp_flags         = br.read_u32be()?;
     let _comp_flags_mask    = br.read_u32be()?;
 
-    if comp_type == mktag!(b"mhlr") {
+    if comp_type == mktag!(b"mhlr") || comp_type == 0 {
         if comp_subtype == mktag!(b"vide") {
             track.stream_type = StreamType::Video;
         } else if comp_subtype == mktag!(b"soun") {
         if comp_subtype == mktag!(b"vide") {
             track.stream_type = StreamType::Video;
         } else if comp_subtype == mktag!(b"soun") {
@@ -630,14 +630,15 @@ fn read_stsd(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult
 }
 
 fn read_stts(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult<u64> {
 }
 
 fn read_stts(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult<u64> {
-    validate!(size >= 16);
+    validate!(size >= 8);
     let start_pos = br.tell();
     let version             = br.read_byte()?;
     validate!(version == 0);
     let _flags              = br.read_u24be()?;
     let entries             = br.read_u32be()? as usize;
     validate!(entries as u64 <= (size - 8) / 8);
     let start_pos = br.tell();
     let version             = br.read_byte()?;
     validate!(version == 0);
     let _flags              = br.read_u24be()?;
     let entries             = br.read_u32be()? as usize;
     validate!(entries as u64 <= (size - 8) / 8);
-    if entries == 1 {
+    if entries == 0 {
+    } else if entries == 1 {
         let _count          = br.read_u32be()?;
         let tb_num          = br.read_u32be()?;
         if let Some(ref mut stream) = track.stream {
         let _count          = br.read_u32be()?;
         let tb_num          = br.read_u32be()?;
         if let Some(ref mut stream) = track.stream {