diff options
author | Martin Vignali <martin.vignali@gmail.com> | 2017-03-18 20:24:55 +0300 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-03-30 00:28:35 +0300 |
commit | b4016ef31a6ea007e481427ade35ac35d1519170 (patch) | |
tree | a81c07d9b64f6ae1382b5eacdea4114532d7bb96 /libavcodec/exr.c | |
parent | b265e5ba50b86f2ca640e3a565bd54f7e4292bb0 (diff) |
avcodec/exr: add support for uint32
Diffstat (limited to 'libavcodec/exr.c')
-rw-r--r-- | libavcodec/exr.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/libavcodec/exr.c b/libavcodec/exr.c index 034920ff6c..ddce1e50f1 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -3,7 +3,7 @@ * Copyright (c) 2006 Industrial Light & Magic, a division of Lucas Digital Ltd. LLC * Copyright (c) 2009 Jimmy Christensen * - * B44/B44A, Tile added by Jokyo Images support by CNC - French National Center for Cinema + * B44/B44A, Tile, UINT32 added by Jokyo Images support by CNC - French National Center for Cinema * * This file is part of FFmpeg. * @@ -1236,7 +1236,7 @@ static int decode_block(AVCodecContext *avctx, void *tdata, *ptr_x++ = exr_flt2uint(bytestream_get_le32(&a)); } } - } else { + } else if (s->pixel_type == EXR_HALF) { // 16-bit for (x = 0; x < td->xsize; x++) { int c; @@ -1247,6 +1247,15 @@ static int decode_block(AVCodecContext *avctx, void *tdata, if (channel_buffer[3]) *ptr_x++ = exr_halflt2uint(bytestream_get_le16(&a)); } + } else if (s->pixel_type == EXR_UINT) { + for (x = 0; x < td->xsize; x++) { + for (c = 0; c < rgb_channel_count; c++) { + *ptr_x++ = bytestream_get_le32(&rgb[c]) >> 16; + } + + if (channel_buffer[3]) + *ptr_x++ = bytestream_get_le32(&a) >> 16; + } } // Zero out the end if xmax+1 is not w @@ -1648,6 +1657,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, switch (s->pixel_type) { case EXR_FLOAT: case EXR_HALF: + case EXR_UINT: if (s->channel_offsets[3] >= 0) { if (!s->is_luma) { avctx->pix_fmt = AV_PIX_FMT_RGBA64; @@ -1662,9 +1672,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, } } break; - case EXR_UINT: - avpriv_request_sample(avctx, "32-bit unsigned int"); - return AVERROR_PATCHWELCOME; default: av_log(avctx, AV_LOG_ERROR, "Missing channel list.\n"); return AVERROR_INVALIDDATA; |