From patchwork Tue Dec 12 19:41:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 45093 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1225:b0:181:818d:5e7f with SMTP id v37csp3838006pzf; Tue, 12 Dec 2023 11:41:28 -0800 (PST) X-Google-Smtp-Source: AGHT+IFdQzxc1O6D/XdmMTbp8EGG8uqlvfbTZKAIVjArWBhIs9eDXOnfe4UXRG8MBFeNHhVb+tYk X-Received: by 2002:a17:906:1019:b0:a1d:79a9:3a1f with SMTP id 25-20020a170906101900b00a1d79a93a1fmr2382799ejm.264.1702410088612; Tue, 12 Dec 2023 11:41:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702410088; cv=none; d=google.com; s=arc-20160816; b=rN7cRFUqdnNYKnT3n7hzChuQZgIGrkfceWYiYEjaiCxDe6VAigi/uzSrB+trcHCgs9 xKIUnO9broFy8+doWvALyNvXrxXo42b9W7aIX5faCwLhhpTz8pmBxtYuoZhPCxXM1+uA j7N/JM+bGCSAizvJMbxv6cOTJ3qe54mYDJFmPNw7VEuPWTANGQ/UTMEnPH/V+79zL8tk jF+4FfINjctuesknrT+Om6mXkppNYCqQPlD7aeeLEPDd3/ee0btgP9BQDgO/QkXXnwlX Rnbeu2rViFAdaJa5H/TWQ/M1XPxmi7htep2S59fr/n4O6p7vn8Kr75rK4bQ413ujbSfM jf4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=y0hOQCM28oZpiygnRU8zjBFzyV7x2jTmqDo1NW3PKRA=; fh=KQnOJH00Qx8FT32ZHR6XiKnfrWXzvaqJg0Klai6qfUg=; b=qsPkeDAEiNYOQ49WhNjHghRTgPfH7kTD7rmHLHbrysigY63/15n/qZDhmqZiIE9a4R riO0wPfFjMw3ofKlL5NNVxEZ752+rAAaY8yPDqU7ysWLk/REojyhLcn7uxOPGzuuIvtn qnHiyDj+Vp8ZhlaRZUO28Hl5g7cLBjNQU88ahuALKPdiix8eiqcjqQlaE/gZVSzuCJdX bc6u6KHCNAcBzir8FFLqiSMCVSP5qmogvhQiQkvNASec+tVvpivGuplyayU2U1OYtuCD 1QJ7UT3voF/ypK7mqLklT+wdybO8fTF0v5ytXKz9NLDfBS9hPrRiff6ejo0m+3BqrzBn r7Rw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=Sb2Rgbtn; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id gr21-20020a170906e2d500b00a1e3a24808esi4593289ejb.817.2023.12.12.11.41.28; Tue, 12 Dec 2023 11:41:28 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=Sb2Rgbtn; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7B67368D0EB; Tue, 12 Dec 2023 21:41:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f171.google.com (mail-oi1-f171.google.com [209.85.167.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2661A68CF97 for ; Tue, 12 Dec 2023 21:41:17 +0200 (EET) Received: by mail-oi1-f171.google.com with SMTP id 5614622812f47-3b9d6935ce3so487063b6e.0 for ; Tue, 12 Dec 2023 11:41:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1702410075; x=1703014875; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=5CeFdcYJCxTrVmj0tQ4Xg/wfqyCfo00lrbmfN6Oe84o=; b=Sb2RgbtnkhsgnTOHGOyzJwAUiJ18uMPTsO7nvQPVCPkNZpWAQ29dkMhEMUTd1SxQyi 8DV5WLBpDzuheX0m4iWmYhFQkz7ooDn+Ea5vRbJUjD/jLedJHFhOr7W6fJio4bBm7G9/ doEMp6JfIPbAvfqaKhiXkLY2PFUVXiIUDXIRCkLXQavQqvkmRAX1PmEDAkytk4htV5Fb rf03tkhMSDGjbM7ydrRW+pXhpxjHtdtKVZL33i1CiJdGkb3PoaaV+vYOdTWcJS9lfjeV za4LNdvQ8VyqDyoZ2gjDsNoi403vrk6E7keqjNjewpXAPa0eb5cmaEbBBFm0EqQpmlDi 1kpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702410075; x=1703014875; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=5CeFdcYJCxTrVmj0tQ4Xg/wfqyCfo00lrbmfN6Oe84o=; b=q3hNhJIAaCLKOo7ihP1kq9OKIipgIUKOb4hrHAzD2J3NSngXbuxgVetPsD1QLN85nf 7GvRIkFZgHHRjaf3qcRj2AtGgyMbiTJZbp1uGxilXYN5obbReoTulLoxm8Lev8l+tzwV wO1BOVnDA967h6NRyhvadhDjMa7pgdtKKztLyY/mjBzFyH7bbVbTdC7dcrP49tagvXI4 rp9MqOKig8ryXbZkucu5KU7a7+Ii4zyQz1GIXanOSHN+VSPF3hX3loJmg1itvEVHzLVH IW/NEtswSG4UG9zFXHW5UCHeYDfTdzjpxGMlHBe5EvxOtl323Ij992CYlJT0jxyAvaU6 7eAw== X-Gm-Message-State: AOJu0Yxn8ypT2Sdk/ZvOyFkoncJmWBg6Y75VwI2D5Zaioq5Eqzznid2D 8YtfHmsTbeQ69e9Ep6RHTSG+DJHTqDk= X-Received: by 2002:a05:6808:f91:b0:3b8:9714:34a7 with SMTP id o17-20020a0568080f9100b003b8971434a7mr13298320oiw.4.1702410075351; Tue, 12 Dec 2023 11:41:15 -0800 (PST) Received: from gauss.local (c-68-56-149-176.hsd1.mi.comcast.net. [68.56.149.176]) by smtp.gmail.com with ESMTPSA id br6-20020a05622a1e0600b00425962ee7bdsm1380939qtb.18.2023.12.12.11.41.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Dec 2023 11:41:14 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Tue, 12 Dec 2023 14:41:01 -0500 Message-ID: <20231212194101.461371-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/pngdec: improve handling of bad cICP range tags X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: =?utf-8?q?Kacper_Michaj=C5=82ow?= , Leo Izen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4UpIFrdIq0Zh FFmpeg doesn't support tv-range RGB throughout most of its pipeline, so we should keep the warning. However, in case something does support it we should at least keep it tagged properly. Additionally, the encoder writes this tag if the space is tagged as such so this makes a round trip work as it should. Also, PNG doesn't support nonzero matrices but we only warn and ignore in that case, so we have no reason to error out for illegal cICP ranges either (i.e. greater than 1). Signed-off-by: Leo Izen Reported-by: Kacper Michajłow --- libavcodec/pngdec.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index d812ffd348..d1aae4c70e 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -661,8 +661,13 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) av_log(avctx, AV_LOG_WARNING, "unrecognized cICP transfer\n"); else avctx->color_trc = frame->color_trc = s->cicp_trc; - if (s->cicp_range == 0) - av_log(avctx, AV_LOG_WARNING, "unsupported tv-range cICP chunk\n"); + if (s->cicp_range == 0) { + av_log(avctx, AV_LOG_WARNING, "tv-range cICP tag found. Colors may be wrong\n"); + avctx->color_range = frame->color_range = AVCOL_RANGE_MPEG; + } else if (s->cicp_range != 1) { + /* we already printed a warning when parsing the cICP chunk */ + avctx->color_range = frame->color_range = AVCOL_RANGE_UNSPECIFIED; + } } else if (s->iccp_data) { AVFrameSideData *sd = av_frame_new_side_data(frame, AV_FRAME_DATA_ICC_PROFILE, s->iccp_data_len); if (!sd) @@ -713,9 +718,10 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) avctx->color_trc = frame->color_trc = AVCOL_TRC_LINEAR; } - /* we only support pc-range RGB */ + /* PNG only supports RGB */ avctx->colorspace = frame->colorspace = AVCOL_SPC_RGB; - avctx->color_range = frame->color_range = AVCOL_RANGE_JPEG; + if (!s->have_cicp || s->cicp_range == 1) + avctx->color_range = frame->color_range = AVCOL_RANGE_JPEG; /* * tRNS sets alpha depth to full, so we ignore sBIT if set. @@ -1455,11 +1461,8 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, if (bytestream2_get_byte(&gb_chunk) != 0) av_log(avctx, AV_LOG_WARNING, "nonzero cICP matrix\n"); s->cicp_range = bytestream2_get_byte(&gb_chunk); - if (s->cicp_range != 0 && s->cicp_range != 1) { - av_log(avctx, AV_LOG_ERROR, "invalid cICP range: %d\n", s->cicp_range); - ret = AVERROR_INVALIDDATA; - goto fail; - } + if (s->cicp_range != 0 && s->cicp_range != 1) + av_log(avctx, AV_LOG_WARNING, "invalid cICP range: %d\n", s->cicp_range); s->have_cicp = 1; break; case MKTAG('s', 'R', 'G', 'B'): @@ -1814,8 +1817,6 @@ static av_cold int png_dec_init(AVCodecContext *avctx) { PNGDecContext *s = avctx->priv_data; - avctx->color_range = AVCOL_RANGE_JPEG; - s->avctx = avctx; s->last_picture.f = av_frame_alloc(); s->picture.f = av_frame_alloc();