Hello, In attach a patch who fix, the float decoding of b44 files when there is half and float channel.
float (and uint32) data are not compressed when B44 compression is used (only half data are compressed). Comments welcome Martin Jokyo Images
From 56b7bda0aaaba9dc2833b5e31b8843c589ffd6fc Mon Sep 17 00:00:00 2001 From: Martin Vignali <martin.vign...@gmail.com> Date: Sat, 25 Jun 2016 17:56:03 +0200 Subject: [PATCH] libavcodec/exr : fix float channel read when there is half and float channels in a file --- libavcodec/exr.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/libavcodec/exr.c b/libavcodec/exr.c index 75ada24..05e72d8 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -942,9 +942,9 @@ static int b44_uncompress(EXRContext *s, const uint8_t *src, int compressed_size nbB44BlockH++; for (c = 0; c < s->nb_channels; c++) { - for (iY = 0; iY < nbB44BlockH; iY++) { - for (iX = 0; iX < nbB44BlockW; iX++) {/* For each B44 block */ - if (s->channels[c].pixel_type == EXR_HALF) {/* B44 only compress half float data */ + if (s->channels[c].pixel_type == EXR_HALF) {/* B44 only compress half float data */ + for (iY = 0; iY < nbB44BlockH; iY++) { + for (iX = 0; iX < nbB44BlockW; iX++) {/* For each B44 block */ if (stayToUncompress < 3) { av_log(s, AV_LOG_ERROR, "Not enough data for B44A block: %d", stayToUncompress); return AVERROR_INVALIDDATA; @@ -976,20 +976,15 @@ static int b44_uncompress(EXRContext *s, const uint8_t *src, int compressed_size td->uncompressed_data[indexOut + 1] = tmpBuffer[indexTmp] >> 8; } } - } else{/* Float or UINT 32 channel */ - for (y = indexHgY; y < FFMIN(indexHgY + 4, td->ysize); y++) { - for (x = indexHgX; x < FFMIN(indexHgX + 4, td->xsize); x++) { - indexOut = target_channel_offset * td->xsize + y * td->channel_line_size + 4 * x; - memcpy(&td->uncompressed_data[indexOut], sr, 4); - sr += 4; - } - } } } - } - if (s->channels[c].pixel_type == EXR_HALF) { target_channel_offset += 2; - } else { + } else {/* Float or UINT 32 channel */ + for (y = 0; y < td->ysize; y++) { + indexOut = target_channel_offset * td->xsize + y * td->channel_line_size; + memcpy(&td->uncompressed_data[indexOut], sr, td->xsize * 4); + sr += td->xsize * 4; + } target_channel_offset += 4; } } -- 1.9.3 (Apple Git-50)
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel