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

Reply via email to