]> git.nihav.org Git - nihav.git/commitdiff
8bps: support interleaved plane format
authorKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 16 Sep 2026 16:23:38 +0000 (18:23 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 16 Sep 2026 16:23:38 +0000 (18:23 +0200)
It seems to be signalled by first line size = 1.

nihav-qt/src/codecs/eightbps.rs

index d526ff477ac1b5fbb433daf28b55262bb0991205..25778f4019e337e9d005c7187e79c8821f34fa1e 100644 (file)
@@ -92,7 +92,6 @@ impl NADecoder for PlanarRGBDecoder {
         let mut buf = bufinfo.get_vbuf().unwrap();
         let frm = NASimpleVideoFrame::from_video_buf(&mut buf).unwrap();
 
-        let (size_data, rle_data) = src.split_at(self.height * 2 * planes);
         let mut pos = 0;
         let mut fdata = Frame {
                 data:   frm.data,
@@ -101,8 +100,21 @@ impl NADecoder for PlanarRGBDecoder {
                 stride: frm.stride[0],
                 step:   planes,
             };
-        for (planeno, line_sizes) in size_data.chunks_exact(self.height * 2).enumerate() {
-            pos = decode_plane(line_sizes, rle_data, pos, &mut fdata, planeno)?;
+        let plane_hdr_size = self.height * 2;
+        if read_u16be(&src).unwrap_or(0) != 1 {
+            let (size_data, rle_data) = src.split_at(plane_hdr_size * planes);
+            for (planeno, line_sizes) in size_data.chunks_exact(plane_hdr_size).enumerate() {
+                pos = decode_plane(line_sizes, rle_data, pos, &mut fdata, planeno)?;
+            }
+        } else {
+            for planeno in 0..planes {
+                validate!(2 + pos + plane_hdr_size < src.len());
+                validate!(read_u16be(&src[pos..]).unwrap_or(0) == 1);
+                pos += 2;
+                let (line_sizes, rle_data) = src[pos..].split_at(plane_hdr_size);
+                let rd_size = decode_plane(line_sizes, rle_data, 0, &mut fdata, planeno)?;
+                pos += plane_hdr_size + rd_size;
+            }
         }
 
         if self.depth == 8 {