lavc/dpx: Support decoding 10 bit colourspace with transparency information.
authorCarl Eugen Hoyos <cehoyos@ag.or.at>
Tue, 14 Jun 2016 15:02:34 +0000 (17:02 +0200)
committerCarl Eugen Hoyos <cehoyos@ag.or.at>
Tue, 14 Jun 2016 15:02:34 +0000 (17:02 +0200)
Fixes one sample from ticket #5639.

libavcodec/dpx.c

index af7276a..b439e10 100644 (file)
@@ -256,11 +256,13 @@ static int decode_frame(AVCodecContext *avctx,
         avctx->pix_fmt = AV_PIX_FMT_RGBA;
         break;
     case 50100:
-    case 51100:
     case 50101:
-    case 51101:
         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
         break;
+    case 51100:
+    case 51101:
+        avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
+        break;
     case 50120:
     case 51120:
     case 50121:
@@ -313,9 +315,10 @@ static int decode_frame(AVCodecContext *avctx,
     switch (bits_per_color) {
     case 10:
         for (x = 0; x < avctx->height; x++) {
-            uint16_t *dst[3] = {(uint16_t*)ptr[0],
+            uint16_t *dst[4] = {(uint16_t*)ptr[0],
                                 (uint16_t*)ptr[1],
-                                (uint16_t*)ptr[2]};
+                                (uint16_t*)ptr[2],
+                                (uint16_t*)ptr[3]};
             for (y = 0; y < avctx->width; y++) {
                 *dst[2]++ = read10in32(&buf, &rgbBuffer,
                                        &n_datum, endian);
@@ -323,13 +326,13 @@ static int decode_frame(AVCodecContext *avctx,
                                        &n_datum, endian);
                 *dst[1]++ = read10in32(&buf, &rgbBuffer,
                                        &n_datum, endian);
-                // For 10 bit, ignore alpha
                 if (elements == 4)
+                    *dst[3]++ =
                     read10in32(&buf, &rgbBuffer,
                                &n_datum, endian);
             }
             n_datum = 0;
-            for (i = 0; i < 3; i++)
+            for (i = 0; i < elements; i++)
                 ptr[i] += p->linesize[i];
         }
         break;