]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/dpx: Fix B&W film scans from Lasergraphics Inc
authorHarry Mallon <harry.mallon@codex.online>
Mon, 7 Dec 2020 10:32:14 +0000 (10:32 +0000)
committerPaul B Mahol <onemda@gmail.com>
Thu, 17 Dec 2020 12:02:49 +0000 (13:02 +0100)
Signed-off-by: Harry Mallon <harry.mallon@codex.online>
libavcodec/dpx.c

index 7b18141f97ce97d7f4818650dc278718f28da800..bd431ccbcb5fc851fb94ca6898e5d459374ce50c 100644 (file)
@@ -167,7 +167,7 @@ static int decode_frame(AVCodecContext *avctx,
     int x, y, stride, i, j, ret;
     int w, h, bits_per_color, descriptor, elements, packing;
     int yuv, color_trc, color_spec;
-    int encoding, need_align = 0;
+    int encoding, need_align = 0, unpadded_10bit = 0;
 
     unsigned int rgbBuffer = 0;
     int n_datum = 0;
@@ -574,6 +574,12 @@ static int decode_frame(AVCodecContext *avctx,
     input_device[32] = '\0';
     av_dict_set(&p->metadata, "Input Device", input_device, 0);
 
+    // Some devices do not pad 10bit samples to whole 32bit words per row
+    if (!memcmp(input_device, "Scanity", 7) ||
+        !memcmp(creator, "Lasergraphics Inc.", 18)) {
+        unpadded_10bit = 1;
+    }
+
     // Move pointer to offset from start of file
     buf =  avpkt->data + offset;
 
@@ -606,7 +612,7 @@ static int decode_frame(AVCodecContext *avctx,
                     read10in32(&buf, &rgbBuffer,
                                &n_datum, endian, shift);
             }
-            if (memcmp(input_device, "Scanity", 7))
+            if (!unpadded_10bit)
                 n_datum = 0;
             for (i = 0; i < elements; i++)
                 ptr[i] += p->linesize[i];