Commit 753088a2 authored by Martin Vignali's avatar Martin Vignali Committed by Paul B Mahol

avcodec/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.
parent 43a4276c
...@@ -1262,6 +1262,7 @@ static int check_header_variable(EXRContext *s, ...@@ -1262,6 +1262,7 @@ static int check_header_variable(EXRContext *s,
static int decode_header(EXRContext *s) static int decode_header(EXRContext *s)
{ {
int magic_number, version, i, flags, sar = 0; int magic_number, version, i, flags, sar = 0;
int layer_match = 0;
s->current_channel_offset = 0; s->current_channel_offset = 0;
s->xmin = ~0; s->xmin = ~0;
...@@ -1332,14 +1333,21 @@ static int decode_header(EXRContext *s) ...@@ -1332,14 +1333,21 @@ static int decode_header(EXRContext *s)
if (strcmp(s->layer, "") != 0) { if (strcmp(s->layer, "") != 0) {
if (strncmp(ch_gb.buffer, s->layer, strlen(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); ch_gb.buffer += strlen(s->layer);
if (*ch_gb.buffer == '.') if (*ch_gb.buffer == '.')
ch_gb.buffer++; /* skip dot if not given */ ch_gb.buffer++; /* skip dot if not given */
} else {
av_log(s->avctx, AV_LOG_INFO, 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") || if (!strcmp(ch_gb.buffer, "R") ||
!strcmp(ch_gb.buffer, "X") || !strcmp(ch_gb.buffer, "X") ||
!strcmp(ch_gb.buffer, "U")) !strcmp(ch_gb.buffer, "U"))
...@@ -1357,6 +1365,7 @@ static int decode_header(EXRContext *s) ...@@ -1357,6 +1365,7 @@ static int decode_header(EXRContext *s)
else else
av_log(s->avctx, AV_LOG_WARNING, av_log(s->avctx, AV_LOG_WARNING,
"Unsupported channel %.256s.\n", ch_gb.buffer); "Unsupported channel %.256s.\n", ch_gb.buffer);
}
/* skip until you get a 0 */ /* skip until you get a 0 */
while (bytestream2_get_bytes_left(&ch_gb) > 0 && while (bytestream2_get_bytes_left(&ch_gb) > 0 &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment