X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fexr.c;h=78527270d1e5301cd2a25b3cb0c340ebf8e0e924;hb=c5c6e307812a72b7f4ecc5a88db221a9b9a003d2;hp=c250eea423a100af2d1a5dd0059769e6b306d7f5;hpb=bd0db4a32d85d027da4d4dc00490c20048090312;p=ffmpeg diff --git a/libavcodec/exr.c b/libavcodec/exr.c index c250eea423a..78527270d1e 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -882,6 +882,22 @@ static int pxr24_uncompress(EXRContext *s, const uint8_t *src, bytestream_put_le16(&out, pixel); } break; + case EXR_UINT: + ptr[0] = in; + ptr[1] = ptr[0] + s->xdelta; + ptr[2] = ptr[1] + s->xdelta; + ptr[3] = ptr[2] + s->xdelta; + in = ptr[3] + s->xdelta; + + for (j = 0; j < s->xdelta; ++j) { + uint32_t diff = (*(ptr[0]++) << 24) | + (*(ptr[1]++) << 16) | + (*(ptr[2]++) << 8 ) | + (*(ptr[3]++)); + pixel += diff; + bytestream_put_le32(&out, pixel); + } + break; default: return AVERROR_INVALIDDATA; } @@ -1428,17 +1444,15 @@ static int decode_header(EXRContext *s) return AVERROR_PATCHWELCOME; } - if (s->channel_offsets[channel_index] == -1){/* channel have not been previously assign */ - if (channel_index >= 0) { - if (s->pixel_type != EXR_UNKNOWN && - s->pixel_type != current_pixel_type) { - av_log(s->avctx, AV_LOG_ERROR, - "RGB channels not of the same depth.\n"); - return AVERROR_INVALIDDATA; - } - s->pixel_type = current_pixel_type; - s->channel_offsets[channel_index] = s->current_channel_offset; + if (channel_index >= 0 && s->channel_offsets[channel_index] == -1) { /* channel has not been previously assigned */ + if (s->pixel_type != EXR_UNKNOWN && + s->pixel_type != current_pixel_type) { + av_log(s->avctx, AV_LOG_ERROR, + "RGB channels not of the same depth.\n"); + return AVERROR_INVALIDDATA; } + s->pixel_type = current_pixel_type; + s->channel_offsets[channel_index] = s->current_channel_offset; } s->channels = av_realloc(s->channels, @@ -1450,7 +1464,11 @@ static int decode_header(EXRContext *s) channel->xsub = xsub; channel->ysub = ysub; - s->current_channel_offset += 1 << current_pixel_type; + if (current_pixel_type == EXR_HALF) { + s->current_channel_offset += 2; + } else {/* Float or UINT32 */ + s->current_channel_offset += 4; + } } /* Check if all channels are set with an offset or if the channels