]> git.nihav.org Git - nihav.git/commitdiff
mov: handle special flattened files
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 12 Sep 2026 14:24:10 +0000 (16:24 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 12 Sep 2026 14:24:10 +0000 (16:24 +0200)
They seem to simply concatenate various data forks, usually with some
irrelevant data around moov atom.

nihav-commonfmt/src/demuxers/mov/mod.rs

index e670353273f0c443680836688bd3ce12005cbdac..b83993c5d112c4cb63d6479e801a6d32d63bb545 100644 (file)
@@ -746,6 +746,10 @@ impl<'a> MOVDemuxer<'a> {
         }
     }
     fn read_root(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
+        let mut old_flat_file = false;
+        let mut moov_seen = false;
+        let mut mdat_seen = false;
+
         self.depth = 0;
         let cur_pos = self.src.tell();
         self.src.seek(SeekFrom::End(0))?;
@@ -756,9 +760,21 @@ impl<'a> MOVDemuxer<'a> {
             if ret.is_err() { break; }
             let (ctype, size) = ret.unwrap();
             let size = if size == u64::MAX { self.file_size - self.src.tell() } else { size };
+            if size == 256-8 && ctype < 0x10000 {
+                println!("Probably an old flattened file, skipping garbage in the middle...");
+                self.src.read_skip(256 - 4)?;
+                old_flat_file = true;
+                continue;
+            }
             if self.print_chunks {
                 print_cname(ctype, size, self.src.tell(), 0);
             }
+            if ctype == mktag!(b"moov") {
+                moov_seen = true;
+            }
+            if ctype == mktag!(b"mdat") {
+                mdat_seen = true;
+            }
             if IGNORED_CHUNKS.contains(&ctype) {
                 self.src.skip64(size)?;
                 continue;
@@ -773,6 +789,9 @@ impl<'a> MOVDemuxer<'a> {
             }
             validate!(read_size <= size);
             self.src.skip64(size - read_size)?;
+            if old_flat_file && moov_seen && mdat_seen {
+                break;
+            }
         }
 //todo check if all needed chunks are found
         Ok(())