From patchwork Thu Feb 2 15:09:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 40214 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp425188pzk; Thu, 2 Feb 2023 07:10:06 -0800 (PST) X-Google-Smtp-Source: AK7set+PomfrZ8fLI+sJIPwiyOPq2PsUWrbXsArycetHci31PpwJTmhrYXqNKKpcCFMVhZO1XCcM X-Received: by 2002:a17:906:9c95:b0:88a:723:f646 with SMTP id fj21-20020a1709069c9500b0088a0723f646mr7218720ejc.75.1675350606444; Thu, 02 Feb 2023 07:10:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675350606; cv=none; d=google.com; s=arc-20160816; b=nEXNzCX+sBaMKDjuWyKJUcdjgxT5/CxzLSYRDdVdv6ww1hS6Ywst0trqmHosEl4Ujd aT3zq1rpHRgEqfjSCRK4jTZzyvdo0+rD8e1cH+NAaJo+nYBxv6+186+jFm5eKc1wXrIX 87EKTWgML81yLt3jWabHq7Thrc56PjBIijGhaUD4TxI0+lyc6Oea538HhW74qXauH6Q9 g0olllqtV9dOQjL9upzsCynw5USAUPe3xb4kUdhZkvDokkafJE0AzezSWaBsII3p595a IdlMYXbWZRsE+YHa1zUjJb1JxYy4GmA94g5QOQiktsX9NpoPG1DG90xwD+MET2Lb8OJi s4BA== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=rZ7V2NXTpFDjuMeFm7izX5pd1zzmcpkuPp4kVH+1r30=; b=l5Tu8qbnxDmWOdc9cq/dYtYrNT1vG7G2L/jZMQ6m/21SNfEosL9vzsF8K7u7sdJN6e Daz3mmLbjjuKF7b8pdz3z3GhlK/CAuVbeToTuD0Y/emePkQn/5LrF7CdDSt0ZIs3/3oK FZC7bA/CPqmThbYJSbYnLiWe312bIZv181Z3BVRI/enKjuOU3/GPHRbbxjEqorChqyL0 tgykhvKXnY2uccr/eHAtHTdyzw7+iyqmIF120RogedIAe8LiJ70ndfjOPV6cLbMuF5g3 tuD784XrrLFw3dWwOwZGLfUW4+heijzBAjD5YxjcvzLsTysx1DWvPO1wQi5ZrxgNMMaX mlew== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=TT41DEBf; 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 20-20020a170906005400b0087bd4039179si28689792ejg.92.2023.02.02.07.10.05; Thu, 02 Feb 2023 07:10:06 -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=20210112 header.b=TT41DEBf; 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 89B7A68BD7C; Thu, 2 Feb 2023 17:09:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-il1-f174.google.com (mail-il1-f174.google.com [209.85.166.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1192668B4A7 for ; Thu, 2 Feb 2023 17:09:43 +0200 (EET) Received: by mail-il1-f174.google.com with SMTP id x6so854443ilv.7 for ; Thu, 02 Feb 2023 07:09:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wLdi06ovCU2E7TKA0MS9qUhKm7S9jlZOnFQJ/cM2lyg=; b=TT41DEBfb3qw9p0mHaQn83C2MVl7vckkhPk7wPW8IvbrSVchcXhhvjBx1EQANdyo1B 66haEZnW8PWNRn00rHX0RqlgAn+DZxdjjSizJ75uD5JKxiMONo/7qPtvagljgACY4gtr 17nBAB6+D3Tw+KeFzvTP3F/7soURXc1uOfMGAsYj/4gp8YA5UibI0Pc33d1Mhu1Rtm1S jcIA7Euks6SgnC9qpCIwjFNmHsakkKBXMO2RrFs4r4ujk5Wn9XfbZ59IKjIpLeYk3sWm PuraEqXFrs0auJkTw/JXhR82q0jhusRtmIFkxfIlCI09jxqa1cgZSSkZV0Vb+nqxzK3y uYnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wLdi06ovCU2E7TKA0MS9qUhKm7S9jlZOnFQJ/cM2lyg=; b=2WcZvCChkQH3psb+PZAKCvr/RXgghZGNpRLl93I17G2PnHt+1793B7ZYp4dsrwMcYK Fpv2TiXgNAmjvt2kowrlRSkm5rRKpZumU3bclO141HLIkT1iRLW3my7nbaj13Pjm2uoU Kp6f2ljATKoRi2b61eZPC4LNDSth5FKYZFlbrp2ancrpwpKONMhFPitx52OnPwTWDqMq L0B9hBJa0v/UcTyLO1fRbrA7RiRP1ceSnj4cUsFq2/X2lAUt+Nb+JDx3CNMD8GSivsXM 7S0DVZZQzusrNajZqUslV8M07AISGmazsfdGQZseDXFsCThr3NTJRZ7UPzrBT/xjAEy/ POyQ== X-Gm-Message-State: AO0yUKXKt4jeKn+meFa2keyumylCXoLFWZWSkBvnuIIQqv7jbm9i2QU+ cO3nPNLFaSG8BVxATWX9R+by4791zYEZLw== X-Received: by 2002:a05:6e02:1746:b0:30d:bf1a:b174 with SMTP id y6-20020a056e02174600b0030dbf1ab174mr5643388ill.1.1675350581657; Thu, 02 Feb 2023 07:09:41 -0800 (PST) Received: from gauss.local (c-68-41-54-207.hsd1.mi.comcast.net. [68.41.54.207]) by smtp.gmail.com with ESMTPSA id r7-20020a92d987000000b0030f43cefc4bsm6570122iln.53.2023.02.02.07.09.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Feb 2023 07:09:41 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Thu, 2 Feb 2023 10:09:36 -0500 Message-Id: <20230202150938.22297-2-leo.izen@gmail.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230202150938.22297-1-leo.izen@gmail.com> References: <20230202150938.22297-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 1/3] avcodec/pngenc: avoid writing cICP when inappropriate 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: Leo Izen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: A85GPCPJaEJY We parse the fallback cHRM on decode and correctly determine that we have BT.709 primaries, but unknown TRC. This causes us to write cICP where we shouldn't. Primaries without transfer can be handled entirely by cHRM, so we should only write cICP if we actually know the transfer function. Additionally, we should avoid writing cICP if there's an ICC profile because the spec says decoders must prioritize cICP over the ICC profile. Signed-off-by: Leo Izen --- libavcodec/pngenc.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index 2393161c3b..81b95c143d 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -412,14 +412,25 @@ static int encode_headers(AVCodecContext *avctx, const AVFrame *pict) } } + side_data = av_frame_get_side_data(pict, AV_FRAME_DATA_ICC_PROFILE); + if ((ret = png_write_iccp(s, side_data))) + return ret; + /* write colorspace information */ if (pict->color_primaries == AVCOL_PRI_BT709 && pict->color_trc == AVCOL_TRC_IEC61966_2_1) { s->buf[0] = 1; /* rendering intent, relative colorimetric by default */ png_write_chunk(&s->bytestream, MKTAG('s', 'R', 'G', 'B'), s->buf, 1); - } else if (pict->color_primaries != AVCOL_PRI_UNSPECIFIED || - pict->color_trc != AVCOL_TRC_UNSPECIFIED) { - /* these values match H.273 so no translation is needed */ + } else if (pict->color_trc != AVCOL_TRC_UNSPECIFIED && !side_data) { + /* + * Avoid writing cICP if the transfer is unknown. Known primaries + * with unknown transfer can be handled by cHRM. + * + * We also avoid writing cICP if an ICC Profile is present, because + * the standard requires that cICP overrides iCCP. + * + * These values match H.273 so no translation is needed. + */ s->buf[0] = pict->color_primaries; s->buf[1] = pict->color_trc; s->buf[2] = 0; /* colorspace = RGB */ @@ -432,10 +443,6 @@ static int encode_headers(AVCodecContext *avctx, const AVFrame *pict) if (png_get_gama(pict->color_trc, s->buf)) png_write_chunk(&s->bytestream, MKTAG('g', 'A', 'M', 'A'), s->buf, 4); - side_data = av_frame_get_side_data(pict, AV_FRAME_DATA_ICC_PROFILE); - if ((ret = png_write_iccp(s, side_data))) - return ret; - /* put the palette if needed, must be after colorspace information */ if (s->color_type == PNG_COLOR_TYPE_PALETTE) { int has_alpha, alpha, i; From patchwork Thu Feb 2 15:09:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 40215 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp425362pzk; Thu, 2 Feb 2023 07:10:16 -0800 (PST) X-Google-Smtp-Source: AK7set86ezVs6UsbKkv+3427OBi1ZHJkAdD8ssyQnNlIpjPWgphEzI47zVWyjuHOoLIF9DnJr3op X-Received: by 2002:a17:906:f07:b0:86c:a3ed:1442 with SMTP id z7-20020a1709060f0700b0086ca3ed1442mr6363929eji.4.1675350616229; Thu, 02 Feb 2023 07:10:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675350616; cv=none; d=google.com; s=arc-20160816; b=jwWvahppUHHXwCylTTI43i4n3gOaxLSefLkbvLF1um819tN7Qc86HQ1s4/Z9xS66ZU Tx2TUhr3SjQIsw7hMm/a+Zceqqp118GbzL5u4YP/lca6yuiw7dPp7INvexQrbXH/t/8a 0sP+6b58NfIDiolOcUdhcJkvUEttsDU1fSB+TamIsz5Dh2LCHK+GjvdWtkvpLr8Rfy49 aR/oVmv1vRTLVnxLP2nW3yQYZLFmVECy1DRxCGw+jVS5HtwsEA0rVbghqLJoZ2nIwXkO nM3+A0tKvufF85e3q4zqckeT9EN+1z72FsGyGGa9MeJ6QGyu1w+Tv07QvWjCuFW2cJgS IiaA== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=mj+OGXMOrAp5nJwsuqGfrFnqQdKRq7KqXI98KxTfhCw=; b=z5oXg0Dmm613O5Ka+HpfYHXkGk+qzGmEgK5knDUvp7bwJ0CR7M+QR1TaxQ4eSruYKi JBTH8I3csffzeWdiOHhJAJvb5SfbLF7QZlfvxnpKmxdGyXLe44D5poysQP2WZbLqnlES de9LGP2lDzzWRDx13zTfQL+5PMNWOnOUSxkdfQVISzF/i2jgdyYAwUU62ZjgmLp4ieLC 5SjraaW2n90KBcg3tktMEt21uHVLAeF/6jBbuZH95U5gJGral44nuS7BU1Ts6145i92K cM5YcmB70YFoq4XR9TF8Dt0ODMzZH0gaJOPCuxy8ecwCdunAERBjvK7OVV/u9DAaKN3c IyHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=gTr65HfX; 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 az6-20020a170907904600b0084d43e4541csi24372354ejc.720.2023.02.02.07.10.15; Thu, 02 Feb 2023 07:10:16 -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=20210112 header.b=gTr65HfX; 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 8F72E68BDD7; Thu, 2 Feb 2023 17:09:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-il1-f177.google.com (mail-il1-f177.google.com [209.85.166.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA68768BD51 for ; Thu, 2 Feb 2023 17:09:43 +0200 (EET) Received: by mail-il1-f177.google.com with SMTP id i17so846074ils.11 for ; Thu, 02 Feb 2023 07:09:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HDBb1p4tKLAoAL7jhSaSP1VQoHXkAl1OECPOAzdhh7Y=; b=gTr65HfXmgEoCfICBkrMsgt9KprAlSMhQ8XiJ5j6sueXV2BNqq3I5WxF4za7NCknNW G0rqE9V8nQ/PTyQdjtEiWrEJ5GIsV525S4fr+29QIwEiM8sYXr8D/ovun4tQNC597zLy u8GWpW63YatzQNmNg7TAI6z/YWt/Zl7e3KFLlOGNbiwOER4tNKOZHE8unLc4jyqkAsDJ YjDwva2ytcoCpAh/0xm9gEYGMKcjFFnUKU2x/X87kFcH0vWgdVUqTe57tiXQun/f5VC9 wTYlnirVeS0EpF/mIL2BEBd+XgZq5ng/zdTk0ID/gGFrYuaNLIh0NsXaDwSBr2DUiOhW o3cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HDBb1p4tKLAoAL7jhSaSP1VQoHXkAl1OECPOAzdhh7Y=; b=t7ylGibzSgKGxo9uJWi08bb5pOsUVGQ7oKzrDikXwsMbr0nink5gFBUgIOn+p1eotp WD/t5UDR/m4reWhSNl1j4rzaS/Ms/8zffMEV9cF+NlKHpPc01A4hxapGDdKYQCf5o2PE 1KWcQOvcUCV2M5pJl9frwNRtrwnHVa8n3Jhah5hwqPapokmDzF4PzjPGgpqZ3bO1fg5N tWToW8Dr7aYMKBAJ9Lov2ScX5owuDpY3kjv+T1232k4ZIHVCOCSM0YRP0++85MI7xjTo s8X1MpIAkMgVPLQHYOfpm+h/y6Pwn3/g06x/3PPBIlKVMLLcqxZsw65hHudsINPQ7lmr 4t3g== X-Gm-Message-State: AO0yUKXNdKLbSopoQ97m0UYP6Tx/JtyRavqBbZWFLi1t9/9/Zd2zmzdj V5zWlTF1JpqsOFl1sxCLy03eLO+WIAMESQ== X-Received: by 2002:a05:6e02:1d14:b0:312:7220:e87e with SMTP id i20-20020a056e021d1400b003127220e87emr4259473ila.2.1675350582324; Thu, 02 Feb 2023 07:09:42 -0800 (PST) Received: from gauss.local (c-68-41-54-207.hsd1.mi.comcast.net. [68.41.54.207]) by smtp.gmail.com with ESMTPSA id r7-20020a92d987000000b0030f43cefc4bsm6570122iln.53.2023.02.02.07.09.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Feb 2023 07:09:42 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Thu, 2 Feb 2023 10:09:37 -0500 Message-Id: <20230202150938.22297-3-leo.izen@gmail.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230202150938.22297-1-leo.izen@gmail.com> References: <20230202150938.22297-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 2/3] avcodec/pngdec: read colorspace info when decoding with AVDISCARD_ALL 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: Leo Izen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: g68peTk9BP0b These chunks are lightweight and it's useful information to have when running ffmpeg -i or ffprobe, for example. --- libavcodec/pngdec.c | 103 ++++++++++++++++++----------------- tests/ref/fate/png-icc | 8 +-- tests/ref/fate/png-side-data | 2 +- 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 0d969decf2..a80e0d15bb 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -1203,7 +1203,7 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, if (avctx->codec_id == AV_CODEC_ID_PNG && avctx->skip_frame == AVDISCARD_ALL) { - return 0; + goto exit_loop; } if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && length == 0) { @@ -1256,6 +1256,9 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, case MKTAG('t', 'E', 'X', 't'): case MKTAG('I', 'D', 'A', 'T'): case MKTAG('t', 'R', 'N', 'S'): + case MKTAG('s', 'R', 'G', 'B'): + case MKTAG('c', 'I', 'C', 'P'): + case MKTAG('c', 'H', 'R', 'M'): break; default: continue; @@ -1382,6 +1385,56 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, } exit_loop: + if (s->have_cicp) { + if (s->cicp_primaries >= AVCOL_PRI_NB) + av_log(avctx, AV_LOG_WARNING, "unrecognized cICP primaries\n"); + else + avctx->color_primaries = p->color_primaries = s->cicp_primaries; + if (s->cicp_trc >= AVCOL_TRC_NB) + av_log(avctx, AV_LOG_WARNING, "unrecognized cICP transfer\n"); + else + avctx->color_trc = p->color_trc = s->cicp_trc; + /* we don't support tv-range RGB */ + avctx->color_range = p->color_range = AVCOL_RANGE_JPEG; + if (s->cicp_range == 0) + av_log(avctx, AV_LOG_WARNING, "unsupported tv-range cICP chunk\n"); + } else if (s->iccp_data) { + AVFrameSideData *sd = av_frame_new_side_data(p, AV_FRAME_DATA_ICC_PROFILE, s->iccp_data_len); + if (!sd) { + ret = AVERROR(ENOMEM); + goto fail; + } + memcpy(sd->data, s->iccp_data, s->iccp_data_len); + + av_dict_set(&sd->metadata, "name", s->iccp_name, 0); + } else if (s->have_srgb) { + avctx->color_primaries = p->color_primaries = AVCOL_PRI_BT709; + avctx->color_trc = p->color_trc = AVCOL_TRC_IEC61966_2_1; + } else if (s->have_chrm) { + AVColorPrimariesDesc desc; + enum AVColorPrimaries prim; + desc.wp.x = av_make_q(s->white_point[0], 100000); + desc.wp.y = av_make_q(s->white_point[1], 100000); + desc.prim.r.x = av_make_q(s->display_primaries[0][0], 100000); + desc.prim.r.y = av_make_q(s->display_primaries[0][1], 100000); + desc.prim.g.x = av_make_q(s->display_primaries[1][0], 100000); + desc.prim.g.y = av_make_q(s->display_primaries[1][1], 100000); + desc.prim.b.x = av_make_q(s->display_primaries[2][0], 100000); + desc.prim.b.y = av_make_q(s->display_primaries[2][1], 100000); + prim = av_csp_primaries_id_from_desc(&desc); + if (prim != AVCOL_PRI_UNSPECIFIED) + avctx->color_primaries = p->color_primaries = prim; + else + av_log(avctx, AV_LOG_WARNING, "unknown cHRM primaries\n"); + } + + /* these chunks override gAMA */ + if (s->iccp_data || s->have_srgb || s->have_cicp) + av_dict_set(&s->frame_metadata, "gamma", NULL, 0); + + avctx->colorspace = p->colorspace = AVCOL_SPC_RGB; + avctx->color_range = p->color_range = AVCOL_RANGE_JPEG; + if (avctx->codec_id == AV_CODEC_ID_PNG && avctx->skip_frame == AVDISCARD_ALL) { return 0; @@ -1499,56 +1552,8 @@ static void clear_frame_metadata(PNGDecContext *s) static int output_frame(PNGDecContext *s, AVFrame *f) { - AVCodecContext *avctx = s->avctx; int ret; - if (s->have_cicp) { - if (s->cicp_primaries >= AVCOL_PRI_NB) - av_log(avctx, AV_LOG_WARNING, "unrecognized cICP primaries\n"); - else - avctx->color_primaries = f->color_primaries = s->cicp_primaries; - if (s->cicp_trc >= AVCOL_TRC_NB) - av_log(avctx, AV_LOG_WARNING, "unrecognized cICP transfer\n"); - else - avctx->color_trc = f->color_trc = s->cicp_trc; - avctx->color_range = f->color_range = - s->cicp_range == 0 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; - } else if (s->iccp_data) { - AVFrameSideData *sd = av_frame_new_side_data(f, AV_FRAME_DATA_ICC_PROFILE, s->iccp_data_len); - if (!sd) { - ret = AVERROR(ENOMEM); - goto fail; - } - memcpy(sd->data, s->iccp_data, s->iccp_data_len); - - av_dict_set(&sd->metadata, "name", s->iccp_name, 0); - } else if (s->have_srgb) { - avctx->color_primaries = f->color_primaries = AVCOL_PRI_BT709; - avctx->color_trc = f->color_trc = AVCOL_TRC_IEC61966_2_1; - } else if (s->have_chrm) { - AVColorPrimariesDesc desc; - enum AVColorPrimaries prim; - desc.wp.x = av_make_q(s->white_point[0], 100000); - desc.wp.y = av_make_q(s->white_point[1], 100000); - desc.prim.r.x = av_make_q(s->display_primaries[0][0], 100000); - desc.prim.r.y = av_make_q(s->display_primaries[0][1], 100000); - desc.prim.g.x = av_make_q(s->display_primaries[1][0], 100000); - desc.prim.g.y = av_make_q(s->display_primaries[1][1], 100000); - desc.prim.b.x = av_make_q(s->display_primaries[2][0], 100000); - desc.prim.b.y = av_make_q(s->display_primaries[2][1], 100000); - prim = av_csp_primaries_id_from_desc(&desc); - if (prim != AVCOL_PRI_UNSPECIFIED) - avctx->color_primaries = f->color_primaries = prim; - else - av_log(avctx, AV_LOG_WARNING, "unknown cHRM primaries\n"); - } - - /* these chunks override gAMA */ - if (s->iccp_data || s->have_srgb || s->have_cicp) - av_dict_set(&s->frame_metadata, "gamma", NULL, 0); - - avctx->colorspace = f->colorspace = AVCOL_SPC_RGB; - if (s->stereo_mode >= 0) { AVStereo3D *stereo3d = av_stereo3d_create_side_data(f); if (!stereo3d) { diff --git a/tests/ref/fate/png-icc b/tests/ref/fate/png-icc index 14de544639..1f4eab1fb0 100644 --- a/tests/ref/fate/png-icc +++ b/tests/ref/fate/png-icc @@ -1,5 +1,5 @@ -a50d37a0e72bddea2fcbba6fb773e2a0 *tests/data/fate/png-icc.image2 -49397 tests/data/fate/png-icc.image2 +c460cd06a88ace94d7c76a6309aa8fb8 *tests/data/fate/png-icc.image2 +49441 tests/data/fate/png-icc.image2 #tb 0: 1/25 #media_type 0: video #codec_id 0: rawvideo @@ -21,7 +21,7 @@ pkt_duration_time=0.040000 duration=1 duration_time=0.040000 pkt_pos=0 -pkt_size=49397 +pkt_size=49441 width=128 height=128 pix_fmt=rgb24 @@ -34,7 +34,7 @@ top_field_first=0 repeat_pict=0 color_range=pc color_space=gbr -color_primaries=unknown +color_primaries=bt709 color_transfer=unknown chroma_location=unspecified [SIDE_DATA] diff --git a/tests/ref/fate/png-side-data b/tests/ref/fate/png-side-data index a4c16eb395..8f955f76bc 100644 --- a/tests/ref/fate/png-side-data +++ b/tests/ref/fate/png-side-data @@ -26,7 +26,7 @@ top_field_first=0 repeat_pict=0 color_range=pc color_space=gbr -color_primaries=unknown +color_primaries=bt709 color_transfer=unknown chroma_location=unspecified [SIDE_DATA] From patchwork Thu Feb 2 15:09:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 40216 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp425516pzk; Thu, 2 Feb 2023 07:10:26 -0800 (PST) X-Google-Smtp-Source: AK7set/gXwtI4w7XEK2ktT4L6O6/XZ4yurMGfakPE1+KTb+afesn2+JrkwOnm9Bxo158VflQk8MC X-Received: by 2002:a17:906:dc92:b0:88d:ba89:1841 with SMTP id cs18-20020a170906dc9200b0088dba891841mr2409090ejc.18.1675350626241; Thu, 02 Feb 2023 07:10:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675350626; cv=none; d=google.com; s=arc-20160816; b=MyK2r1hS4ciFto+6OvuJWCHcVKJTJZGlFkdS/pY262CN8VTYzmQrMUDNdX69TmfWjh ExytGnPACkjKxsGwrSGDBcc8R0XgwLTMuww2r69yD+FB2ZN5Dt0RLe44a5YI/bEr8Hbm wbWK08AowlTAbzgDAF1BDR+TC+oAaR5OnYs4S6E+zUBw+wuK0qQ4Y/tIpBHi7zvYZ8Jr DoRKYf2HpbrJoXUzdSHXtE6y+eb/HOTWa4HzAIIPGicRTm5SQzMFj+t2tEjVHvwRcSFs jtuS1Jw3jjvgZcXOG5aE4Vg7NZsIrsANjD7xUFpG4sx3k9M6pcq/GyuQwK41wwPrESPW tXrw== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=ZkxB7siM+00iubpzz464LSmuTUnnIY0rXAqxQVKD9hU=; b=jKEJpOK/e/QyIky+jglEpJzvKH4vJR81HPBdwG47LuCBuz3nVDrVZSs/FPx6sjbqiu 6BDg5mIzr1xA3NL7tkcb9d/0VhJ/ZKO3v//S1I7KavKN1aqWAB7gV5TfDR5QI1Dbb49e 4crQ+jtKtIZy1x2ty4Kv6gwIyZtU770s9U9WxL4XCw7IyR46+8myRQAmYIWCkVbMXKzU FrO2XXlAMuisc3SRRpNNU5wSd6andMmCEMiIHwr+JrjA2we+1xpqDZ15Qa39tG7i5DCw SZopk/7VIFzD1Egi4/t1weV84/VEjuT0nDHymKLO2SiVF3JzJ4GmzS0Eiio6q3G8q9IK OpGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=ahH1z1CZ; 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 ay8-20020a056402202800b004a228df7d48si18504916edb.560.2023.02.02.07.10.25; Thu, 02 Feb 2023 07:10:26 -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=20210112 header.b=ahH1z1CZ; 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 98B4368BDC3; Thu, 2 Feb 2023 17:09:52 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-il1-f178.google.com (mail-il1-f178.google.com [209.85.166.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 487CE68B0F9 for ; Thu, 2 Feb 2023 17:09:44 +0200 (EET) Received: by mail-il1-f178.google.com with SMTP id m15so850021ilh.9 for ; Thu, 02 Feb 2023 07:09:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8vUfwPP+jsvCH9KJnqfQeY4cCrK4M0n15hb/E1p1xPQ=; b=ahH1z1CZCPUgQ6k7arcapKwDTIQpvPAXiocVdLbiwzVwOuoUcy6xiS9YSVWOe91t1p 1T6YJ96uqcT7CZlZhWVWBCg7ysvh3mTF4eS6qUGghDrYw3P8EPP9ZrNDJ7wkgI3Lr8a5 9vzG54/bSWTbhdqVUG8t0HxyO8k7N09lj4BGYc17DjRDhteEjyT9tt7UksoSVO98MuhT 7nG+yASR/5N+QQ7Y/wSjS0/E12cDC60JLDk7rZWnpApH24qmVddZxbCGwY43nVoXlr+Y HYjjr2reNquuSviXmjDtDWdQwG9Gg66lv9Hr9a17rc7RDzBvoKaEkLZr6I47ldn+8hW3 7vYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8vUfwPP+jsvCH9KJnqfQeY4cCrK4M0n15hb/E1p1xPQ=; b=u/D7rjRk3ShqB49r26VzwsPMHTIElQa1Rkx5lS63BnFJJBRvBOFOxJwRg3TfH2XiiO 2lM6ZDtYR7fzq4ytvhY3K4Xn//OcHJRwR+Evvq12FGeFA77zMgNMEDUt+wx7CEjniUPw iCZ36y1ZNou0NcVN+iYRUPJiuTAAOhJtOTnNtxc4LhPGUNfn5+87b4E/MGyKqHMrGF13 saKygJGJQ+tcT9Mygdc8AWe4Of9AVUp5XTlOZaY8zhWlAh0ZO14l6lvPc4azsWyU45a+ mbMY5NobGR0FOtVpxN64nie5eXUyIfrF3BabcvtNfGpqtB36an7j2G1Z+LlGmqZiZboC r0vw== X-Gm-Message-State: AO0yUKXfDfPas3siw2XBwQy/vA2kfXvTBYNCkihnCrvdXxYFz0kTTAUq ryjrHwH6MxK01D8WPSTBeI38/cKm+wfHkQ== X-Received: by 2002:a05:6e02:152:b0:310:cc70:a152 with SMTP id j18-20020a056e02015200b00310cc70a152mr4355340ilr.2.1675350582907; Thu, 02 Feb 2023 07:09:42 -0800 (PST) Received: from gauss.local (c-68-41-54-207.hsd1.mi.comcast.net. [68.41.54.207]) by smtp.gmail.com with ESMTPSA id r7-20020a92d987000000b0030f43cefc4bsm6570122iln.53.2023.02.02.07.09.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Feb 2023 07:09:42 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Thu, 2 Feb 2023 10:09:38 -0500 Message-Id: <20230202150938.22297-4-leo.izen@gmail.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230202150938.22297-1-leo.izen@gmail.com> References: <20230202150938.22297-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 3/3] avcodec/pngdec: populate enum transfer values from gAMA chunk 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: Leo Izen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xD/B1HBBNvzp If the gAMA chunk is present, the gamma-transfer described by it often matches one of our enum values (e.g. gamma = 2.2). If so, we should populate the corresponding fields in AVCodecContext and AVFrame, provided that some other chunk isn't already providing that info. --- libavcodec/pngdec.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index a80e0d15bb..b7751c64d8 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -75,6 +75,7 @@ typedef struct PNGDecContext { int have_chrm; uint32_t white_point[2]; uint32_t display_primaries[3][2]; + int gamma; int have_srgb; int have_cicp; enum AVColorPrimaries cicp_primaries; @@ -1259,6 +1260,7 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, case MKTAG('s', 'R', 'G', 'B'): case MKTAG('c', 'I', 'C', 'P'): case MKTAG('c', 'H', 'R', 'M'): + case MKTAG('g', 'A', 'M', 'A'): break; default: continue; @@ -1361,10 +1363,10 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, case MKTAG('g', 'A', 'M', 'A'): { AVBPrint bp; char *gamma_str; - int num = bytestream2_get_be32(&gb_chunk); + s->gamma = bytestream2_get_be32(&gb_chunk); av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); - av_bprintf(&bp, "%i/%i", num, 100000); + av_bprintf(&bp, "%i/%i", s->gamma, 100000); ret = av_bprint_finalize(&bp, &gamma_str); if (ret < 0) return ret; @@ -1429,8 +1431,27 @@ exit_loop: } /* these chunks override gAMA */ - if (s->iccp_data || s->have_srgb || s->have_cicp) + if (s->iccp_data || s->have_srgb || s->have_cicp) { av_dict_set(&s->frame_metadata, "gamma", NULL, 0); + } else if (s->gamma) { + /* + * These values are 100000/2.2, 100000/2.8, 100000/2.6, and + * 100000/1.0 respectively. 45455, 35714, and 38462, and 100000. + * There's a 0.001 gamma tolerance here in case of floating + * point issues when the PNG was written. + * + * None of the other enums have a pure gamma curve so it makes + * sense to leave those to sRGB and cICP. + */ + if (s->gamma > 45355 && s->gamma < 45555) + avctx->color_trc = p->color_trc = AVCOL_TRC_GAMMA22; + else if (s->gamma > 35614 && s->gamma < 35814) + avctx->color_trc = p->color_trc = AVCOL_TRC_GAMMA28; + else if (s->gamma > 38362 && s->gamma < 38562) + avctx->color_trc = p->color_trc = AVCOL_TRC_SMPTE428; + else if (s->gamma > 99900 && s->gamma < 100100) + avctx->color_trc = p->color_trc = AVCOL_TRC_LINEAR; + } avctx->colorspace = p->colorspace = AVCOL_SPC_RGB; avctx->color_range = p->color_range = AVCOL_RANGE_JPEG;