summaryrefslogtreecommitdiff
path: root/libavcodec/dpx.c
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2016-06-15 17:45:51 +0200
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2016-06-15 17:45:51 +0200
commitaec96e233f60cc0c0477b5e96750c323ea636d36 (patch)
treebbfec2b4b13f6de1d85eb857bfd209f5c99e7111 /libavcodec/dpx.c
parent346b3c5c415a0841707ef3ec3bfa71941055cd69 (diff)
lavc/dpx: Support decoding 12 bit colourspace with transparency information.
Diffstat (limited to 'libavcodec/dpx.c')
-rw-r--r--libavcodec/dpx.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index b439e1093b..e4dd1b05b5 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -264,11 +264,13 @@ static int decode_frame(AVCodecContext *avctx,
avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
break;
case 50120:
- case 51120:
case 50121:
- case 51121:
avctx->pix_fmt = AV_PIX_FMT_GBRP12;
break;
+ case 51120:
+ case 51121:
+ avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
+ break;
case 6161:
avctx->pix_fmt = AV_PIX_FMT_GRAY16BE;
break;
@@ -338,9 +340,10 @@ static int decode_frame(AVCodecContext *avctx,
break;
case 12:
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] = read16(&buf, endian) >> 4;
dst[2]++;
@@ -348,11 +351,10 @@ static int decode_frame(AVCodecContext *avctx,
dst[0]++;
*dst[1] = read16(&buf, endian) >> 4;
dst[1]++;
- // For 12 bit, ignore alpha
if (elements == 4)
- buf += 2;
+ *dst[3]++ = read16(&buf, endian) >> 4;
}
- for (i = 0; i < 3; i++)
+ for (i = 0; i < elements; i++)
ptr[i] += p->linesize[i];
// Jump to next aligned position
buf += need_align;