From patchwork Sat Feb 3 02:28:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 45986 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a28:b0:199:de12:6fa6 with SMTP id cj40csp1329623pzb; Fri, 2 Feb 2024 18:28:44 -0800 (PST) X-Google-Smtp-Source: AGHT+IGUYUQ2NmOUD7EOJCa2hgvoP+6DHUa2GkKog8G7SX+6Otvq2/+i2LLBcrktTVbJyqD9Rm92 X-Received: by 2002:ac2:4549:0:b0:511:34ff:2bb6 with SMTP id j9-20020ac24549000000b0051134ff2bb6mr1937747lfm.41.1706927324661; Fri, 02 Feb 2024 18:28:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1706927324; cv=none; d=google.com; s=arc-20160816; b=ss3Dp3F3q0bhhY5G07uHKT7WbzNuK4ti2Jpp55VSkG9pwxHlqkkLAkFjcN3gACjxZX ZWMHoBa2zmSmNzlBsCtY6DFoxD2iZhu77fPuajjXAR4OXCvi2MzUi4UYg/D7tPnUmy8C pAIiyGip4YFJYAd9PM3D5CX9PYRwlorE346mImDaBz5dl4ns5sAxs3DmEOIrUab0PU7m KSYvDU2SQ+t7OWHMsyKJa3F/p57Fu0is2fr/PrPtEN1VnaGaQsFgR/UfuGjFxJHDdPLS ykyFIaSq5+rtMNeNzcLjHEdBDQ3eRmZw3uFLulCjxhh7v73psBbqB2EkIBcsHwLdVQxi e/LQ== 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=jGUfDcbn3K3X83lYL3evhywtF1s7XXA4Uqo3+al5Biw=; fh=8CxuQ7iUk8wklSFuXaG6ywsWKwJtQyI2wATGClGmyj8=; b=SLKR2cTukJme45IC03HYPan3LJ82dIfB0ywyvAAUMb/vHrhjV6DBgmsgxLFPCVWkVy FvSN6tBCqkEZax4Rt7p9T4EIJ04BIv8wXiwLXb6P30N3mYI5HL6moxXzJo+YU6z0Rk/z M8pozvvk6evR2Cw4Vu6ODuLc+Zh7MOFxwEUjA0tcCRDTZXpH/1nTx9Jt01+APCzGYWS6 +8eoh0eL8hWt/ba+56UaHfcX5hZ5M2Krgq+ogqxQteZ6RdP2qy8JwtKyEMzTc+nhFJKY q+LBSjJEZNyTE8tR/Sez9Nf1we/34DekdAawGI1I/lZy5ukJ1zsOn2mY0jah2UGrAY1t EpLw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=lX77xg41; 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 X-Forwarded-Encrypted: i=0; AJvYcCVVaq+i2UjIQHxUo8g1T4prAjua2Q8E4bLxZy1pEKZEhP2EDUj7+fWmKy+ay9nVDgE8HxqHeZZxulMxVIVYzghpSz2RIP/uSrju8DiFBA40Umg+3PsBwwSNRy+TLD/ikxiLdelhUMyIn6CpeU/pQKvasY/bLQZZFLrSH0VyuJ77T0Wj7peTvnhiKklxhDHFWABnsShAFm3IUw+136ZaIaNevDbhRhi7peTY4ZK0KwZb4jJfVmLQdl1je4E/9UZz1IXoJ5PfeDoo1OY7zWahlCj/LX1klc8iNYr4//y0P9RkU8Cz/TWutQ9vHXVCPh2jGCKuo6orHf6N2/oD3qSUt7yPIYw0No5Zz2HtClPGDOlhP9B8Eq8bpDAV22ztD7Fkkk7YojZ+Pzm0xc5rHAttBMI2MPt7QpxXVc/aBz2O29j6KwSuDdmU2AHLMSRHfKwYWe5gH+W/XoSW95qVYcRgCTiL9+fkULd8FOd0f0JvXJBGuaFX6YiVJ3Lj4ZF2ie202mvXXPIusADGrD8lFchDjrhTB8yYPREAtGhT0EetAkTSlTh93t5BfS/+wdNTow/jWSqZbfE0g32HmmawjSY1UX+UPKgsz4qxT/gglP3/n+3Brlc2dUVzeaTBBjxjN2Go04R6LEhxKNtFOjgTCofwtPN8HU6lm2HWpLgHiBA2iWLaD5LRBqb7D0nqaVkv3f0bYYx5eNLPmUF5OX6sUy/WvLaNBw6i6MiU+Zx/scBRhNMPbDdLGjLgZbOzbGnmLb7T50QpoAlBYzv8GoP/wVCml5gGqJmG2ztzUi+P1BDhbOapAJ4vhJ+KatjIdbBctHplLjspWqQ7HBtEUavzVhJtOVpFfO+4ODIKBX5Wi3zS/0pypIyFmbeCv9B/C6aR6Uw8ej+/0tLYbmH06KFwsmUD7m5PvJNfpkf7KTbWXLMZWjp+NlfIAw5941NaAx/pbqpa2oaktY xQDM+KCvKMY1nyxuXpgVJaKTsZ6Ua/pR2GxWnQl6ued5qEpoK7SgVwq7dltu6ay3Jp4u4m0wP+CduqpMB4VmCi/lLMYkdFz4xpOALO7OCY/s4kbjAySXmngGML6wHFuGV+Crj0thvNCmufWVjhcdI29x1MvaqHMxQkipNAlOSXZQEUJCIWtvDgX3lnACzs7EL6OaN97czoP8/qnf5Dqs/YeD7mD0/WCT3/+qh0deYa8+BiwxM4QHKywth8Meyh4WSThwdI/xeFG88AQLO5RLmNbjPenS0Ezyhsv3AIIAS+26h5FT7uYsp4sNirbIoMSbaIf5k97r0QZE2BO+O6XM67M22f03cuylLmo6bVi6SAaHNvATIBHT6rnJdH8F1O0JFNfoBx5MdlhS3eZGzpXEkHPDofbX4cRp7CJcz36ZtScHk+lH1USx3PMsHCSJxgLPdebHMcWWHeUuWaTwilPIC8dprYp/hRHvkR+/Nw4/1MNfrH/aCx037mkdVaLg+U+Cr+wx92xdwOs4x42ngn8wAT11ZuxKH0pdyMYaNnKmD7UgVFbZ0BYi2QLoxmG4QJBOEEF4m0rz6dRG3tJLVN2UZtDqSyo9DcHqlzEdurMFxz Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a14-20020aa7cf0e000000b005600a0d25fbsi563743edy.63.2024.02.02.18.28.44; Fri, 02 Feb 2024 18:28:44 -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=lX77xg41; 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 B927868D10E; Sat, 3 Feb 2024 04:28:31 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 88AF668D10E for ; Sat, 3 Feb 2024 04:28:23 +0200 (EET) Received: by mail-qt1-f180.google.com with SMTP id d75a77b69052e-4280f3ec702so7425311cf.0 for ; Fri, 02 Feb 2024 18:28:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706927302; x=1707532102; darn=ffmpeg.org; 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=tvOJWO40b9AKWcb884QDYCohflBmKbIezEfSfLJt5oE=; b=lX77xg41tKMabRoIA4vFNj0DA2HzKXxHftG2i8rsk4ogKW+hCCkmkP8OYIt697rxmn dV26c8hHHpLODfQ8mDmrPs7kJrDzzA6PEt9kCASlbbCbgB54Zdi4HkuE+R/zrIq7r/0W 5t+lgyMZRrwYSSHHCOX68ofkIhRP4071tZg2YB6PSQk1ZrVG++nBd50KGNWDhUuzir48 eyTxtY4D0rtLXv/xSIpJyRCYO5OXBv4Gj8tzCFEBQ71CW+SwFjfRjMK6xNMgFttCg78V jOxrvCLF59i6jENBucMEukLfqPhP0BSZISjH01CsZuXixgxy1paqlt+uUGSIBtL135dg xeVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706927302; x=1707532102; 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=tvOJWO40b9AKWcb884QDYCohflBmKbIezEfSfLJt5oE=; b=Ef82t+rcl+n5KDRDdrGhXK0C+j2qHLAjK1m4/+P8pfIWPvLqj+u246z6uiWZgs/zaj RMrWzTjBscAHI6jv+tb8cpHu6IeMGas7v220XY4T+8uvLC0FXRTzzuKaiX+4ixJL2kGF m8DyXx2chlFfycx/M7q2vgjH3sns5xb8oDyG1r6dAs7Fr9XXIYp3LaDlKXMF0D6l515/ 6bnlTQ6xJzfgTspa1btjBIupcqXUTxBVnoONKdBph3OExS5r3D09Y3Sxpv5NtQb6SdqI 3sGUoz806CRoOGIoGtiahHt2Uc5YDR2LgLgF8hvsJZq7d2NVUWrKuUjsQhtEnXTeWr5a YW9Q== X-Gm-Message-State: AOJu0YxCyg3PI9jPCK2CvELu+8mumfox9sdW0b0vQL/x3UNChyApbUYu oOLzE3ouyglq8737PldVR60x6sb0KuJGi+Nf9gF9vJn5XworHMKRKJ5z+DBr X-Received: by 2002:a05:620a:4016:b0:783:e064:5fe1 with SMTP id h22-20020a05620a401600b00783e0645fe1mr10098990qko.1.1706927301944; Fri, 02 Feb 2024 18:28:21 -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 fh13-20020a05622a588d00b0042aa2f96d4asm1380984qtb.62.2024.02.02.18.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Feb 2024 18:28:21 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Feb 2024 21:28:18 -0500 Message-ID: <20240203022819.726562-2-leo.izen@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240203022819.726562-1-leo.izen@gmail.com> References: <20240203022819.726562-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/pngdec: read cLLi and mDVc chunks 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: R6z6fXOhQuxC These chunks contain the Content Light Level Information and the Mastering Display Color Volume information that FFmpeg already supports as AVFrameSideData. This patch adds support for the png decoder to read these chunks if present and attach the corresponding side data to the decoded frame. Signed-off-by: Leo Izen --- libavcodec/pngdec.c | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index d1aae4c70e..026da30c25 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -29,6 +29,7 @@ #include "libavutil/csp.h" #include "libavutil/imgutils.h" #include "libavutil/intreadwrite.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/pixfmt.h" #include "libavutil/rational.h" #include "libavutil/stereo3d.h" @@ -81,6 +82,14 @@ typedef struct PNGDecContext { enum AVColorPrimaries cicp_primaries; enum AVColorTransferCharacteristic cicp_trc; enum AVColorRange cicp_range; + int have_clli; + uint32_t clli_max; + uint32_t clli_avg; + int have_mdvc; + uint16_t mdvc_primaries[3][2]; + uint16_t mdvc_white_point[2]; + uint32_t mdvc_max_lum; + uint32_t mdvc_min_lum; enum PNGHeaderState hdr_state; enum PNGImageState pic_state; @@ -731,6 +740,36 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) if (!s->has_trns && s->significant_bits > 0) avctx->bits_per_raw_sample = s->significant_bits; + if (s->have_clli) { + AVContentLightMetadata *clli = + av_content_light_metadata_create_side_data(frame); + if (!clli) + return AVERROR(ENOMEM); + /* + * 0.0001 divisor value + * see: https://www.w3.org/TR/png-3/#cLLi-chunk + */ + clli->MaxCLL = s->clli_max / 10000; + clli->MaxFALL = s->clli_avg / 10000; + } + + if (s->have_mdvc) { + AVMasteringDisplayMetadata *mdvc = + av_mastering_display_metadata_create_side_data(frame); + if (!mdvc) + return AVERROR(ENOMEM); + mdvc->has_primaries = 1; + for (int i = 0; i < 3; i++) { + mdvc->display_primaries[i][0] = av_make_q(s->mdvc_primaries[i][0], 50000); + mdvc->display_primaries[i][1] = av_make_q(s->mdvc_primaries[i][1], 50000); + } + mdvc->white_point[0] = av_make_q(s->mdvc_white_point[0], 50000); + mdvc->white_point[1] = av_make_q(s->mdvc_white_point[1], 50000); + mdvc->has_luminance = 1; + mdvc->max_luminance = av_make_q(s->mdvc_max_lum, 10000); + mdvc->min_luminance = av_make_q(s->mdvc_min_lum, 10000); + } + return 0; } @@ -1508,6 +1547,30 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, break; } + case MKTAG('c', 'L', 'L', 'i'): + if (bytestream2_get_bytes_left(&gb_chunk) != 8) { + av_log(avctx, AV_LOG_WARNING, "Invalid cLLi chunk size: %d\n", bytestream2_get_bytes_left(&gb_chunk)); + break; + } + s->have_clli = 1; + s->clli_max = bytestream2_get_be32u(&gb_chunk); + s->clli_avg = bytestream2_get_be32u(&gb_chunk); + break; + case MKTAG('m', 'D', 'V', 'c'): + if (bytestream2_get_bytes_left(&gb_chunk) != 24) { + av_log(avctx, AV_LOG_WARNING, "Invalid mDVc chunk size: %d\n", bytestream2_get_bytes_left(&gb_chunk)); + break; + } + s->have_mdvc = 1; + for (int i = 0; i < 3; i++) { + s->mdvc_primaries[i][0] = bytestream2_get_be16u(&gb_chunk); + s->mdvc_primaries[i][1] = bytestream2_get_be16u(&gb_chunk); + } + s->mdvc_white_point[0] = bytestream2_get_be16u(&gb_chunk); + s->mdvc_white_point[1] = bytestream2_get_be16u(&gb_chunk); + s->mdvc_max_lum = bytestream2_get_be32u(&gb_chunk); + s->mdvc_min_lum = bytestream2_get_be32u(&gb_chunk); + break; case MKTAG('I', 'E', 'N', 'D'): if (!(s->pic_state & PNG_ALLIMAGE)) av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");