From 4154f2a1d0f2b1165d43aa3c039f09894a809c98 Mon Sep 17 00:00:00 2001
From: Martin Vignali <martin.vignali@gmail.com>
Date: Sat, 4 Jun 2016 17:42:20 +0200
Subject: [PATCH 1/2] libavcodec/exr : fix layer detection. Only test a channel
 if the layer name match. Avoid to try to mix channel between the main layer
 (rgba layer), and the layer request by the user.

---
 libavcodec/exr.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/libavcodec/exr.c b/libavcodec/exr.c
index 2c4f15e..55bdf6e 100644
--- a/libavcodec/exr.c
+++ b/libavcodec/exr.c
@@ -1262,6 +1262,7 @@ static int check_header_variable(EXRContext *s,
 static int decode_header(EXRContext *s)
 {
     int magic_number, version, i, flags, sar = 0;
+    int layer_match = 0;
 
     s->current_channel_offset = 0;
     s->xmin               = ~0;
@@ -1332,14 +1333,21 @@ static int decode_header(EXRContext *s)
 
                 if (strcmp(s->layer, "") != 0) {
                     if (strncmp(ch_gb.buffer, s->layer, strlen(s->layer)) == 0) {
+                        layer_match = 1;
+                        av_log(s->avctx, AV_LOG_INFO,
+                               "Channel match layer : %s.\n", ch_gb.buffer);
                         ch_gb.buffer += strlen(s->layer);
                         if (*ch_gb.buffer == '.')
                             ch_gb.buffer++;         /* skip dot if not given */
+                    } else {
                         av_log(s->avctx, AV_LOG_INFO,
-                               "Layer %s.%s matched.\n", s->layer, ch_gb.buffer);
+                               "Channel doesn't match layer : %s.\n", ch_gb.buffer);
                     }
+                } else {
+                    layer_match = 1;
                 }
 
+                if (layer_match) { /* only search channel if the layer match is valid */
                 if (!strcmp(ch_gb.buffer, "R") ||
                     !strcmp(ch_gb.buffer, "X") ||
                     !strcmp(ch_gb.buffer, "U"))
@@ -1357,6 +1365,7 @@ static int decode_header(EXRContext *s)
                 else
                     av_log(s->avctx, AV_LOG_WARNING,
                            "Unsupported channel %.256s.\n", ch_gb.buffer);
+                }
 
                 /* skip until you get a 0 */
                 while (bytestream2_get_bytes_left(&ch_gb) > 0 &&
-- 
1.9.3 (Apple Git-50)

