diff --git a/libavcodec/exr.c b/libavcodec/exr.c index c87187c05c..cabe329c7f 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -749,6 +749,9 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize, uint16_t *tmp = (uint16_t *)td->tmp; uint8_t *out; int ret, i, j; + int pixel_half_size;/* 1 for half, 2 for float and uint32 */ + EXRChannel *channel; + int tmp_offset; if (!td->bitmap) td->bitmap = av_malloc(BITMAP_SIZE); @@ -781,24 +784,38 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize, ptr = tmp; for (i = 0; i < s->nb_channels; i++) { - EXRChannel *channel = &s->channels[i]; - int size = channel->pixel_type; + channel = &s->channels[i]; - for (j = 0; j < size; j++) - wav_decode(ptr + j, td->xsize, size, td->ysize, - td->xsize * size, maxval); - ptr += td->xsize * td->ysize * size; + if (channel->pixel_type == EXR_HALF) + pixel_half_size = 1; + else + pixel_half_size = 2; + + for (j = 0; j < pixel_half_size; j++) + wav_decode(ptr + j, td->xsize, pixel_half_size, td->ysize, + td->xsize * pixel_half_size, maxval); + ptr += td->xsize * td->ysize * pixel_half_size; } apply_lut(td->lut, tmp, dsize / sizeof(uint16_t)); out = td->uncompressed_data; - for (i = 0; i < td->ysize; i++) + for (i = 0; i < td->ysize; i++) { + tmp_offset = 0; for (j = 0; j < s->nb_channels; j++) { - uint16_t *in = tmp + j * td->xsize * td->ysize + i * td->xsize; - memcpy(out, in, td->xsize * 2); - out += td->xsize * 2; + uint16_t *in; + EXRChannel *channel = &s->channels[j]; + if (channel->pixel_type == EXR_HALF) + pixel_half_size = 1; + else + pixel_half_size = 2; + + in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size; + tmp_offset += pixel_half_size; + memcpy(out, in, td->xsize * 2 * pixel_half_size); + out += td->xsize * 2 * pixel_half_size; } + } return 0; }