From 35eaaa361930e0d955d518189b9b332e5b3290a2 Mon Sep 17 00:00:00 2001
From: Dzung Hoang <dthoang-at-yahoo.com@ffmpeg.org>
Date: Sat, 25 Mar 2017 12:40:08 +0100
Subject: [PATCH] libavcodec/exr : add support for scanline file where offsets
 are set to zero.

---
 libavcodec/exr.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/libavcodec/exr.c b/libavcodec/exr.c
index 034920f..620862f 100644
--- a/libavcodec/exr.c
+++ b/libavcodec/exr.c
@@ -1639,6 +1639,9 @@ static int decode_frame(AVCodecContext *avctx, void *data,
     int y, ret;
     int out_line_size;
     int nb_blocks;/* nb scanline or nb tile */
+    uint64_t *table;/* scanline offset table */
+    uint8_t *marker;/* used to recreate invalid scanline offset table */
+    uint8_t *head;
 
     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
 
@@ -1726,6 +1729,20 @@ static int decode_frame(AVCodecContext *avctx, void *data,
     if (bytestream2_get_bytes_left(&s->gb) < nb_blocks * 8)
         return AVERROR_INVALIDDATA;
 
+    // check offset table and recreate it if need
+    if (!s->is_tile && bytestream2_peek_le64(&s->gb) == 0) {
+        head = avpkt->data;
+        table = (uint64_t *)s->gb.buffer;
+        marker = head + bytestream2_tell(&s->gb) + nb_blocks * 8;
+
+        av_log(s->avctx, AV_LOG_DEBUG, "recreating invalid scanline offset table\n");
+
+        for (y = 0; y < nb_blocks; y++) {
+            table[y] = marker - head;
+            marker += ((uint32_t *)marker)[1] + 8;
+        }
+    }
+
     // save pointer we are going to use in decode_block
     s->buf      = avpkt->data;
     s->buf_size = avpkt->size;
-- 
1.9.3 (Apple Git-50)

