From patchwork Thu Feb 7 19:07:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carl Eugen Hoyos X-Patchwork-Id: 11989 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4BD45448D9C for ; Thu, 7 Feb 2019 21:07:18 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2EC2368A875; Thu, 7 Feb 2019 21:07:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-it1-f171.google.com (mail-it1-f171.google.com [209.85.166.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D60B368A845 for ; Thu, 7 Feb 2019 21:07:11 +0200 (EET) Received: by mail-it1-f171.google.com with SMTP id d11so2540029itf.2 for ; Thu, 07 Feb 2019 11:07:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=FRqe3qaKb/dW589PNaUHQROKBQGkyvmDvdWPoy0rQJU=; b=dyglRk0YW4Jh6RuK/yJM23s+PYTZSUFzJd+Sj+YRpN0kwUuPYHOnFuXoO4gW1xyK93 A16Y3AKA1bjah9IFB9NtIZZ8Pdt9dU9JnC2U78vrcqEX0VPgW7b1KYTOPB06dKiwzIfk Gcjw0WoHZdUTU1zL/tj6QDdxCXzB3Iz3yCTn2908eLNtSqxUkBG8P9oaJnfS/RQgpCkc qPrUaMK6J7NwyhThPlWSYPLB1QmlMBHOmI4OejbRmDRAziPdGl4OovPDKXdeKiQIAOzC fWrmodidE+dOtMZnDYH3sp1zkIPG9u0rwqyXtR/soItojEVP+8YuNg7oY4UDxCPPe7ah y+pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=FRqe3qaKb/dW589PNaUHQROKBQGkyvmDvdWPoy0rQJU=; b=p951I4j1urg7VIGp/OToq5BF4qwYKvAptLIPPlvSBeSwnFXJBXTROtJG4ksAgXiC2K 0FRnIp0iXEVRxOXmKrzqwTcfL6a4wLIx6Kmo5H1Rt0WU05KWH/bifi/wIpw2SJXTLorG UjxR3f2YWDegV3S70BcsDPYtR7cgpJ9HCsSy18/9NuN2zJfw8r6GTdIVZPyym3/DRFET qap6wET6OcZedCY0mQIiktqmASc3IAOipRc5qyRHr89eAhsJksIaCnIZFI1d4a6wlEV8 bsP6CqXLCA8uOoXPqJsVG+KiT+bu5gdPPJm48V6uq03xMdwftqHf8AmIhn92TQmZ1Mp3 HVUg== X-Gm-Message-State: AHQUAuaTuMWZMfyylmF11KJ5QHMMn0QHWnVU7MJjSGP1+eeJYY3IAKS9 mDl8m+CkzctEf1LRFM64b45BxysJPd3Gjd6/4HOUvQ== X-Google-Smtp-Source: AHgI3IaOFXO0vpsyeRHgh/StODskCzzsOxGsSEaDOMxaZMTla4U00wQ92r5lSw85pDgNH1V96toTaSnlnxD2m5MDIYs= X-Received: by 2002:a24:6f51:: with SMTP id x78mr4444108itb.121.1549566429829; Thu, 07 Feb 2019 11:07:09 -0800 (PST) MIME-Version: 1.0 Received: by 2002:a02:c890:0:0:0:0:0 with HTTP; Thu, 7 Feb 2019 11:07:08 -0800 (PST) From: Carl Eugen Hoyos Date: Thu, 7 Feb 2019 20:07:08 +0100 Message-ID: To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH]lavc/tiff: Allow decoding of cmyka (five components) X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hi! Attached patch fixes ticket #7675. Please comment, Carl Eugen From 7c1f5eeb2c266c33f57d8e2b78bacfba3b30a471 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Thu, 7 Feb 2019 20:05:10 +0100 Subject: [PATCH] lavc/tiff: Allow decoding of cmyka (five components). Fixes ticket #7675. --- libavcodec/tiff.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index 112f5b5..aad3934 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -827,6 +827,10 @@ static int init_image(TiffContext *s, ThreadFrame *frame) case 324: s->avctx->pix_fmt = s->photometric == TIFF_PHOTOMETRIC_SEPARATED ? AV_PIX_FMT_RGB0 : AV_PIX_FMT_RGBA; break; + case 405: + if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED) + s->avctx->pix_fmt = AV_PIX_FMT_RGBA; + break; case 483: s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGB48LE : AV_PIX_FMT_RGB48BE; break; @@ -944,7 +948,7 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) s->height = value; break; case TIFF_BPP: - if (count > 4U) { + if (count > 5U) { av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", value, count); @@ -975,7 +979,7 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) "Samples per pixel requires a single value, many provided\n"); return AVERROR_INVALIDDATA; } - if (value > 4U) { + if (value > 5U) { av_log(s->avctx, AV_LOG_ERROR, "Samples per pixel %d is too large\n", value); return AVERROR_INVALIDDATA; @@ -1449,10 +1453,19 @@ again: planes = s->planar ? s->bppcount : 1; for (plane = 0; plane < planes; plane++) { + uint8_t *five_planes = NULL; int remaining = avpkt->size; int decoded_height; stride = p->linesize[plane]; dst = p->data[plane]; + if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED && + s->avctx->pix_fmt == AV_PIX_FMT_RGBA) { + stride = stride * 5 / 4; + five_planes = + dst = av_malloc(stride * s->height); + if (!dst) + return AVERROR(ENOMEM); + } for (i = 0; i < s->height; i += s->rps) { if (i) dst += s->rps * stride; @@ -1485,7 +1498,7 @@ again: av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported"); return AVERROR_PATCHWELCOME; } - dst = p->data[plane]; + dst = five_planes ? five_planes : p->data[plane]; soff = s->bpp >> 3; if (s->planar) soff = FFMAX(soff / s->bppcount, 1); @@ -1532,21 +1545,25 @@ again: } if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED && - s->avctx->pix_fmt == AV_PIX_FMT_RGB0) { + (s->avctx->pix_fmt == AV_PIX_FMT_RGB0 || s->avctx->pix_fmt == AV_PIX_FMT_RGBA)) { + int x = s->avctx->pix_fmt == AV_PIX_FMT_RGB0 ? 4 : 5; + uint8_t *src = five_planes ? five_planes : p->data[plane]; dst = p->data[plane]; for (i = 0; i < s->height; i++) { for (j = 0; j < s->width; j++) { - int k = 255 - dst[4 * j + 3]; - int r = (255 - dst[4 * j ]) * k; - int g = (255 - dst[4 * j + 1]) * k; - int b = (255 - dst[4 * j + 2]) * k; + int k = 255 - src[x * j + 3]; + int r = (255 - src[x * j ]) * k; + int g = (255 - src[x * j + 1]) * k; + int b = (255 - src[x * j + 2]) * k; dst[4 * j ] = r * 257 >> 16; dst[4 * j + 1] = g * 257 >> 16; dst[4 * j + 2] = b * 257 >> 16; - dst[4 * j + 3] = 255; + dst[4 * j + 3] = s->avctx->pix_fmt == AV_PIX_FMT_RGBA ? src[x * j + 4] : 255; } + src += stride; dst += p->linesize[plane]; } + av_freep(&five_planes); } } -- 1.7.10.4