mov: fix an exotic paletted MOV reading
authorKostya Shishkov <kostya.shishkov@gmail.com>
Tue, 14 Dec 2021 11:48:22 +0000 (12:48 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Tue, 14 Dec 2021 11:48:22 +0000 (12:48 +0100)
nihav-commonfmt/src/demuxers/mov.rs

index 23781a9f45143c6a1a4e815f1bdeb17a0c41bb31..aea8ecb8dfc149816a2f3fe8b7f51bd66cf9d4bc 100644 (file)
@@ -43,10 +43,11 @@ fn read_chunk_header(br: &mut ByteReader) -> DemuxerResult<(u32, u64)> {
 
 fn read_palette(br: &mut ByteReader, size: u64, pal: &mut [u8; 1024]) -> DemuxerResult<u64> {
     let _seed           = br.read_u32be()?;
 
 fn read_palette(br: &mut ByteReader, size: u64, pal: &mut [u8; 1024]) -> DemuxerResult<u64> {
     let _seed           = br.read_u32be()?;
-    let _flags          = br.read_u16be()?;
+    let flags           = br.read_u16be()?;
     let palsize         = (br.read_u16be()? as usize) + 1;
     validate!(palsize <= 256);
     let palsize         = (br.read_u16be()? as usize) + 1;
     validate!(palsize <= 256);
-    validate!((palsize as u64) * 8 + 8 == size);
+    validate!(flags == 0 || flags == 0x4000 || flags == 0x8000);
+    validate!((palsize as u64) * 8 + 8 <= size);
     for i in 0..palsize {
         let a           = br.read_u16be()?;
         let r           = br.read_u16be()?;
     for i in 0..palsize {
         let a           = br.read_u16be()?;
         let r           = br.read_u16be()?;
@@ -55,7 +56,12 @@ fn read_palette(br: &mut ByteReader, size: u64, pal: &mut [u8; 1024]) -> Demuxer
         pal[i * 4]     = (r >> 8) as u8;
         pal[i * 4 + 1] = (g >> 8) as u8;
         pal[i * 4 + 2] = (b >> 8) as u8;
         pal[i * 4]     = (r >> 8) as u8;
         pal[i * 4 + 1] = (g >> 8) as u8;
         pal[i * 4 + 2] = (b >> 8) as u8;
-        pal[i * 4 + 3] = (a >> 8) as u8;
+        if flags == 0x8000 {
+            pal[i * 4 + 3] = (a >> 8) as u8;
+        }
+    }
+    if flags == 0x4000 {
+        br.read_skip(8)?;
     }
     Ok(size)
 }
     }
     Ok(size)
 }