diff options
author | Martin Vignali <martin.vignali@gmail.com> | 2016-06-28 13:23:43 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-06-30 17:57:59 +0200 |
commit | 37c83b53730aed3205dab3055aefffa642763ea4 (patch) | |
tree | 6f500f1b7358f37c39081b241f79fcffcf968bcd | |
parent | 3e730278f5a8e5ec3f9593700488a940f38dfac1 (diff) | |
download | ffmpeg-37c83b53730aed3205dab3055aefffa642763ea4.tar.gz |
libavcodec/exr : fix decoding piz float file.
fix ticket #5674
the size of data to process in piz_uncompress, is now calc
using the pixel type of each channel.
the data reorganization, alos take care about the size of
each channel
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit d9e1e08133234dc4501413f0e3211f3a268049bc)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/exr.c | 37 |
1 files changed, 27 insertions, 10 deletions
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; } |