From: michaelni via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> To: ffmpeg-devel@ffmpeg.org Cc: michaelni <code@ffmpeg.org> Subject: [FFmpeg-devel] [PATCH] avcodec/exr: Simple check for available channels (PR #20551) Date: Thu, 18 Sep 2025 23:28:19 -0000 Message-ID: <175823810018.25.5400474625042925718@463a07221176> (raw) PR #20551 opened by michaelni URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20551 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20551.patch The existing is_luma check is fragile as depending on the order of channels it can be set or reset No testcase Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> >From 37895af982ce07a74e02e80d40a23ad55034fcb6 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <michael@niedermayer.cc> Date: Fri, 19 Sep 2025 00:20:36 +0200 Subject: [PATCH] avcodec/exr: Simple check for available channels The existing is_luma check is fragile as depending on the order of channels it can be set or reset No testcase Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> --- libavcodec/exr.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/libavcodec/exr.c b/libavcodec/exr.c index e6051567d1..cf6de22a42 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -175,6 +175,9 @@ typedef struct EXRContext { int is_luma;/* 1 if there is an Y plane */ +#define M(chr) (1<<chr - 'A') + int has_channel; ///< combinatin of flags representing the channel codes A-Z + GetByteContext gb; const uint8_t *buf; int buf_size; @@ -1608,6 +1611,7 @@ static int decode_header(EXRContext *s, AVFrame *frame) s->is_tile = 0; s->is_multipart = 0; s->is_luma = 0; + s->has_channel = 0; s->current_part = 0; if (bytestream2_get_bytes_left(gb) < 10) { @@ -1711,23 +1715,26 @@ static int decode_header(EXRContext *s, AVFrame *frame) } if (layer_match) { /* only search channel if the layer match is valid */ + if (strlen(ch_gb.buffer) == 1) { + int ch_chr = av_toupper(*ch_gb.buffer); + if (ch_chr >= 'A' && ch_chr <= 'Z') + s->has_channel |= M(ch_chr); + av_log(0,0, "%c\n", ch_chr); + } + if (!av_strcasecmp(ch_gb.buffer, "R") || !av_strcasecmp(ch_gb.buffer, "X") || !av_strcasecmp(ch_gb.buffer, "U")) { channel_index = 0; - s->is_luma = 0; } else if (!av_strcasecmp(ch_gb.buffer, "G") || !av_strcasecmp(ch_gb.buffer, "V")) { channel_index = 1; - s->is_luma = 0; } else if (!av_strcasecmp(ch_gb.buffer, "Y")) { channel_index = 1; - s->is_luma = 1; } else if (!av_strcasecmp(ch_gb.buffer, "B") || !av_strcasecmp(ch_gb.buffer, "Z") || !av_strcasecmp(ch_gb.buffer, "W")) { channel_index = 2; - s->is_luma = 0; } else if (!av_strcasecmp(ch_gb.buffer, "A")) { channel_index = 3; } else { @@ -1803,6 +1810,20 @@ static int decode_header(EXRContext *s, AVFrame *frame) s->current_channel_offset += 4; } } + if (!((M('R') + M('G') + M('B')) & ~s->has_channel)) { + s->is_luma = 0; + } else if (!((M('X') + M('Y') + M('Z')) & ~s->has_channel)) { + s->is_luma = 0; + } else if (!((M('Y') + M('U') + M('V')) & ~s->has_channel)) { + s->is_luma = 0; + } else if (!((M('Y') ) & ~s->has_channel) && + !((M('R') + M('G') + M('B') + M('U') + M('V') + M('X') + M('Z')) & s->has_channel)) { + s->is_luma = 1; + } else { + avpriv_request_sample(s->avctx, "Uncommon channel combination"); + ret = AVERROR(AVERROR_PATCHWELCOME); + goto fail; + } /* Check if all channels are set with an offset or if the channels * are causing an overflow */ -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
reply other threads:[~2025-09-18 23:28 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=175823810018.25.5400474625042925718@463a07221176 \ --to=ffmpeg-devel@ffmpeg.org \ --cc=code@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git