[FFmpeg-cvslog] libavcodec/exr : fix decoding piz float file.
Martin Vignali
git at videolan.org
Thu Jun 30 18:04:00 CEST 2016
ffmpeg | branch: release/3.1 | Martin Vignali <martin.vignali at gmail.com> | Tue Jun 28 13:23:43 2016 +0200| [37c83b53730aed3205dab3055aefffa642763ea4] | committer: Michael Niedermayer
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 at gmail.com>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
(cherry picked from commit d9e1e08133234dc4501413f0e3211f3a268049bc)
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=37c83b53730aed3205dab3055aefffa642763ea4
---
libavcodec/exr.c | 37 +++++++++++++++++++++++++++----------
1 file changed, 27 insertions(+), 10 deletions(-)
diff --git a/libavcodec/exr.c b/libavcodec/exr.c
index c87187c..cabe329 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;
}
More information about the ffmpeg-cvslog
mailing list