From patchwork Sun Feb 4 09:35:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 46007 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7b08:b0:19e:8a94:b663 with SMTP id s8csp143849pzh; Sun, 4 Feb 2024 01:36:19 -0800 (PST) X-Google-Smtp-Source: AGHT+IFB1pJ2NwSNFavu0Y/RV7V+A4vbqC0+qxs/mRbrJrLcYngp8MhEvxng+roscYMOGYSsj8uA X-Received: by 2002:a05:6402:12ca:b0:55f:4602:bf7d with SMTP id k10-20020a05640212ca00b0055f4602bf7dmr2805095edx.26.1707039379425; Sun, 04 Feb 2024 01:36:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707039379; cv=none; d=google.com; s=arc-20160816; b=vo2FRSw/3IKsLQuDyi+VtEgi1oXZaDRANrSHTHxag9T4UqGiEc6TTZ06IHCSg4dXRc 5HCJI4q8i7QDMQFrHYnoWT6TGGyECx5T8BnX7BopY2zOZlWmTKS8F3gb7mg2KPdAn52Q YKX5Gjm+gqcxYdHkhCTFTmvsfj14cFIr5IO5b+S3x10hU+0WMC1+ky848kQR4890CfKS gWEoQijhFwZE1OsAnHI007fT+Y6Gm/jxOlHXlqBW4EPv5LZ90k5HROSxzGGWsMr2wqUu DJtmhg6Sb9IWjVtpdpGHfYcQb38Zhcnd9FNNW+soJHTnRdV/E2yoQPfhNOk2ONPHtsMV KIFw== 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=+S+kd6qWlB3rafbvD1vaqXg7xxcDGJIdu1Va7oftrUQ=; b=u6W3HYYbVu8r8/xQX1Yn5ObffBdrLmrKid4DnPfLIfkbMayOwHvMlO2DQmqC28CJ0B mSRHYGw87lgje7Nw3WLvHKUD2Vtmj3Uo7NlGjURVdXjuaUUG+6ieCCgyLn3Ps7P/SIAy uhNHhv4dWddzA/DaOEKK09MqA/iwk4csiTecEXvyWH28RDiWO/Qc2Axk03Cjg4LNPGle LdT9iNehEjTfidicox14EyQLFkLScmvsQSBP0pJANA21EDg9rcaXD65zhjZg93rn9jLa vOZcQ4GGMcNNOUvxXV5pSHIwUEkJll+FjChHa5uwmr2ieDKHR9l6Tc0QOvpkPV+rHjIy Xw2Q==; 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=Ng834W5z; 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; AJvYcCV3UgBpdIGnnr/bDwsGJyOZBq3Qn7FivsRWoqOd4UwIPGn426PzpFQBXXYdPr5DqsTO9o77PXMd8fsTFI7Hgg4bhw4uTfy0hK3/vCQxJu9s8t4EN6FlhdKVLsFV/6nkey93HOmWed3LNSHXKmbz/3l93HcLax1jEMiIXIh1Ru0so+lub1hMN6YCIects1fA7XssKZtrNRsRv0NzelgZ9R0gPiyDgqR/2SCgCaVahJ8PxrmQO7MYdPQngnC/oubwWTsmuwkUcK49t2g0ZqP/1gBNcw+QHYttAD+kwSzcrePU6o/iXm9WboEcgYCAsPzk9d8kHEX28JT/8LAvp63/L/M/tXSJXQDQND4iuyBFuePlkolkS84VhGr5UndPSk1CIvzkOOBoa1XOEYzyYgWvkH05xvvI48FD31diSrpW4cgrFN5CK9GHnbI80oNnQs9wovBW4MdmNw/wVUWnvJUguA8ct0qgV0MJrQKv3SCW1i4T27PaVHhZiAUz91EtK7rJrb9B2MVRBfT3iuViFKXtgQ2bqdtrVM1MgRrXpaOKMGXaDcEWUGiSk+2oP7Vmarh8wyNqrw0IGrqVToOPkiiAYHRCUoQQOMgn+dRZwdIhkgW2V2aqax152iup4OgumvJQfTOVxamWwBYqo/5hmdpgKMlAGrz/AlAECNUgm17VhFBEzbK9gwuNnP5aj7Ta4OgBO5LUipDiVKvBTDbNxCI0A8jDWOigjANx2lRSBia7rAPcfw0UKbB5nsLT9u46Swh6uBHsPBvggLIlR+BIGZOEekn5rSZDlv6XrXQzBLhw2wrVMS08cmsm2Ri2nXSOrwt2L1F9isF7KbhN9Hhan7Z1EBesxD8yUaBJf58qvJytsQRdwGtq0S8ezMDcLgpnuDvyevrkw4W9htg2PEqLHbvfUGDKlmOtGJbKFAQQCDYkxjl9bSQWR3muUr+YCY/eTKZaAQleYk HXxdmpG7m8E8tcxgUBwAxbkK2a0A+0enoBKTV9yWsT2Y+edx1uvV4j2HvDqZ8UMwmxshpFJmLZs7Ra9VVMcoTNEI/qtwsbmtlN4VI7LC5Mf+ffF49FZ0F0ywZ1b7otJDEHvSW4Az3qX68Ntb8c3pxlvGuOjP8wBlBEvABumwuyk6cL83JA8EK06Xc5jyTRkdDmLog+1L41oUHgkXyA/tzQxWDn+3rK2bTBL3Uiu7+3NTOWYNWvmdiHavl0fCGRADl80Oz5wEU/WdHXYU4nN8Xre4M1fPuY7yiYbc5mMmOwoDzy61p9WjEb0tluLmyOlDv6YFOpLvKCzswf9i5PbxWdPZFBqPjfyJavgu1sxgow6TUwtEMNM1TjVlXzGGQBuaAXsOxKSZjRUv0Ju6o546YOqrYFidKBjQmg5Glq2THzD/79KodbFwSTewu2pqb1F2py8UjM+V9aSBGZr9KIbfk1yhKhDk1KVN3biN7uz3QPpFMoF6iUoAc3Jvw1ac6LLU794rHwiEue9++cdal/MCz8PmtiK4LA30S77b/Vgj9yFXQ6mbyd6PSHzhTH7Mx0wmqUzZtNcD0mus/G+s/76g0leIWCNTuZ6gO1ALda/o2l Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n7-20020a5099c7000000b0055f5a3732a4si2705322edb.690.2024.02.04.01.36.19; Sun, 04 Feb 2024 01:36:19 -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=Ng834W5z; 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 B32E368D164; Sun, 4 Feb 2024 11:36:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com [209.85.167.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AB88868D14F for ; Sun, 4 Feb 2024 11:36:02 +0200 (EET) Received: by mail-oi1-f176.google.com with SMTP id 5614622812f47-3bc21303a35so1178326b6e.0 for ; Sun, 04 Feb 2024 01:36:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707039361; x=1707644161; 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=Ng834W5zB8ayDn8XaKwfYKiVbD/C3h7YtfPwizsA+TWGxqwvgaKm4VxwgaHoVIRqeb 1/Y/JyCsmZX1FHK/Oumw0SjjFcs8+grEWY6R/D4nl2c/dLE1XQUXCsLEgbNoAEqVGmcP VI0fx/Wvh+7hxmi3z7jFllNNNINVwjfaoPxtFgqZnSmHsr7Ei3A9XbFQlhYVd/Ah+9yY 43omuFtqQ+A8UFzqx8mo/Rz0NyyujRvODcabObNCwkfDVxyv0kpELgmYXJA/oStIruUe Lbw02KP9jCgWdvBP7NygwDIub+jBIy5WQB0Eu+K6hhnHWPMLiWfWfr3poBqTJfbIItUK rvSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707039361; x=1707644161; 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=pbQZcmI4nPNJE9WGRlV7VYNUf+YlBM6rZcYgT9tHOYp4H0Ksbwvce20BViykrtiUeE yHx629bwrVNA5OU+P5AOgV3xQvpypvh57WezzfRrfl7wasFzzRSC6pzXgE3Sd8RG1FKI rbVRJaCGPfk3UTuRHqRKWd2nhFOaYXIttxZGhMQyGrnmo+2D92F7YAfrO3r+ZtmedE3a eiUD+l87w+uDqae+KwdeSyXL4Tj9nYv9Zb03mM17bH2imzDPCasrehqrqZ3kqdLt1PVR djIqPDOSHcci6YFgXkVhUtmInBhh3cHWA4LZ4k1sFD4duTnPqkdcfAcWaBaRTH//qOO2 onMQ== X-Gm-Message-State: AOJu0YzEg88FGETj/5S0yjSOVQ2UPw9p+yrfvuJm2HUnLCgvPvWnE0Xi VOX9+njAQNe3R9T2lIsGr7UUD1dN86EArDfSec8CBYayxOg9cUK7lr0rHtd7 X-Received: by 2002:a9d:5914:0:b0:6dc:8bc:43f0 with SMTP id t20-20020a9d5914000000b006dc08bc43f0mr12388974oth.3.1707039360854; Sun, 04 Feb 2024 01:36:00 -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 lz8-20020a0562145c4800b006837a012417sm2594431qvb.51.2024.02.04.01.36.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 04 Feb 2024 01:36:00 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Sun, 4 Feb 2024 04:35:57 -0500 Message-ID: <20240204093558.793427-2-leo.izen@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240204093558.793427-1-leo.izen@gmail.com> References: <20240204093558.793427-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 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: 8pqtKfzFPvev 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"); From patchwork Sun Feb 4 09:35:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 46008 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7b08:b0:19e:8a94:b663 with SMTP id s8csp143895pzh; Sun, 4 Feb 2024 01:36:27 -0800 (PST) X-Google-Smtp-Source: AGHT+IHUSurzVZVqUSf+baO6QaPd2xe+tvKpe9PwCkrMZkOGqs1L/+FqUhSBIeOS1CQTZRv/9jAw X-Received: by 2002:a17:906:3148:b0:a37:35de:c716 with SMTP id e8-20020a170906314800b00a3735dec716mr2487067eje.34.1707039386926; Sun, 04 Feb 2024 01:36:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707039386; cv=none; d=google.com; s=arc-20160816; b=YFhcUE5Ms9eA9UAPRSjCKwO4DGRdYxOAihnozGWxyYjmWgAobzHo9i+ym+rbZRF5Jx fRbYg+7MeYEPVXGIG3UTCDJq3WbUQ9zoi4w1e6ZQCzKgn6SNZ4N9kURMhjGxiGkcwn/v Q4hbOdXbeq4vIr1RRmaaohvic1nc/uTnnTe/ny4uWW6x5DOVmvo3eslPtU3R+6QDOPVX HtFQrEy4adUgesngMQHS4gxc4NH1ZOwE6t55F5rBz2vqTuXdNvklG5M8vVBNPCkDrxCk kMxJthVZLVxrnNKhtPkxSIWgT8RcIP+r/5rqyaHUNP9Wj3KGa7Cefj3xiHfT6pO2WJnx GgJw== 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=TCS8ttwPX+aGvUiDFplJCbYN1bnh2MH/H4Knk2WVJUA=; fh=PwydjL7vX5b2hCk80upBklqmsPAojnLiJo7zBcI0NTU=; b=1JIGVPI1GfYYw4PsQvHfz0Thco0UiOmmenc4uMnUCxaGTImebukjyvUHJJQ+SGAj1X I6HuwpCF0DzztAqfIYg8GIxYVYYxs5/tHNO90CUKFJAqrfYenn/5gy7fGDu0YB62wSh1 7R/6crHMjkqGzM2X/1CiFEW4cAhMxQgBbK96F2o8nbJNZoidfOETEAt9hKwajtX+u9iL h0Efx+cFf4C7GdJ1EhDA6reYfxI3w/QCjYyW/ME5NIu+9kLh4PJAqI4cJS2dxSXiqPgo z0KN9tHQE4Jis9LG/RZ2C1CB8c+PW/NTWMhPT+yPFu/ydNjzTDtuTg4frCiaub2nUyfn MnJw==; 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=g+NtrFI2; 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; AJvYcCVp2/dWHinj6okLAJqGqUCwdkGJ3UC4o6FFpYKkVH0wJUnhtJePLvfXsmraj3xA1uBxwVcdFJMUl3w3GeP01R2K4qZdsLotbgKyQVzsNqWoIKHW0c0/fsC38a0kLMF3la8t4z0DJ0ykuFJkBFUA4wbyr7TDXhSlbhBBlHEHGRRhzFdmkk+DOJPtUepcLRhb2NTjGn97Op1xLYiGgnJ7UD5v4vxcJWT+1ONSbgWIJTPoN5tUCtcYaBy7cth/f8kR0NiGyLMrpEFMuoDopVUZqUzCI3gr5mncG7qy6BvPzjSasTTjdir4WmJNO5EKT5WF4njt8jpAhgEe/MiCpbGlKLE3OzjKTIhe5cD9CwTNkW9gYMliH+YZxmWWI9GGkrW1kI5MaWPneOnNJRM+KwwLczkhyA0jMC+m9M8rxY4K1CYQ5eL5Gae19wSyh39RyIpcjcVFQlJy7BU4i4Pji6cswFFzPlCeBK0jmFjFEgnYp6NQtsTtwCP29y49/nBej4UaM1V5LwkDh98Iiy264zey4hCaIo0TS613Kr5YHcxVwizLpsfDrbJxkd9toQoU16dlRhZIfjPBUZbnNJxm668ANPcoWXJIM/3sMLi+i/D7rcUw/lGyrlnoU+x5z4EfuXmz7DG2mvnJin+RXmeQli1kE4+RYg0Hp5ZR02nElxMyclwPm/LrDRo9VqJYiEgdv2LBK2fQGySdgvtwr7dEqTJ1AvMktNWBDemU2uuXCmsCFwIm7ToXa8wjP0ZrychaOtQ+MmWZZ6qn2szYwTgf4cnfx6P0IV1vFYD8NYbgrpw/9WkJSX/53cvhfCSMdyWp6Sxa8hKb2GV8Il0OjylUD8Jubsq/J1OuLHs6ETG9thmLTD7gpuHLnCfJDm/yu2YEDA7r4KldWyTH24y8DZu+p+7C8kepl/yvn+Zg5Pomhzi3blwG5kFqYuGp/gn2Za5FmK3VF3Qbdo RKi8BU7LEDWhY6Rqt2eZQs1Abo90RX4T11EIbBYAtPcy4ZDoAKMbnC0VlX/PwqKjH5Vl6WxXIHnl3bOLJdtiw/nTMhniVafG4R1w9Q8B23grPTgqEqPEUn5XD68qWlYF8pbkxc4JdWdlTOLjpmbwT5H2EjixZVW6tNaVVYMXxxbNizqmIiMhapTV3cQSIeiWH+xLpPiiZtDlJBqfJu1N+ONqKmwgsU5mHCPDApBOnxeAIgix4KJ6foHIXcncTLuqkBdGmbS5D1htLqdPqSy5diNK2x6GIl2AnX2Xn7hTI0mETe6sYekwQT/3ndXFwBKAJiCa55SudeZZ3vuZ/NNJbr7qwI1Xab/jahdl8RKzuIcVBhxx5lHisFa3N++NSI8VXktDkvQAZEIdEFcuYdkZNbxaXGHzdujCVzbdSUqXNV7lWnTsC5aqy29Ks3B4pzArxVT+Q9mF1I5+r64B2SFj9A7fFzul1T2suWTRH3fnkh+dhMXaW9BQkuLTtpg/BCXwj4wj1rtFqD6X6NKpNA/NMNpzDxqSgCt2yM62el/4vVG3+q+tJPsisbQCuwhW9z+8fazIANFGYfFF0i862vYNhnP4d4fxY83GkpreTWO2GK/oCwgQoHKnomEsCpyzlQ+PvAMqSOIXlm Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id lj5-20020a170906f9c500b00a36f973465fsi2630658ejb.309.2024.02.04.01.36.26; Sun, 04 Feb 2024 01:36: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=20230601 header.b=g+NtrFI2; 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 C769668D181; Sun, 4 Feb 2024 11:36:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f180.google.com (mail-qk1-f180.google.com [209.85.222.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9A7968D159 for ; Sun, 4 Feb 2024 11:36:02 +0200 (EET) Received: by mail-qk1-f180.google.com with SMTP id af79cd13be357-783cdbecfe2so130115285a.0 for ; Sun, 04 Feb 2024 01:36:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707039361; x=1707644161; 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=SEkkYhFpzXL90OBNYrj/c7vvwtIbvEdjuGW2XUkV+yM=; b=g+NtrFI2D2BC6BLZ3s8dCgIO8i8ockm/1FhS2Ir8SXBoiTWg4mqRM/cnRPRV6w8b6+ QujHOW2CjWG7DK00qk35v4YXRocku3YB43+Twr/MQ8yOy2333tMe525JikpwRhTdDtp7 vVkgj+AawRobgD6UQ1bNdUhz5Ll8pTQNyjgWJd2iV3yAp4orHFMrnlmvYCnP1h2V0fTS GHfesoqLI9glAGEeSJ/9XXrft3VJ3AEaT0oZ6/BnBq8lTEk3pi2T8jCjnOg149gjNAgv u2lx+Q0e3dXF0GrfWv8LUZ3bzZHXtIhNxL/SfKgc8N97+ovPjQUyFyOM4ufg0I6As61p yhIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707039361; x=1707644161; 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=SEkkYhFpzXL90OBNYrj/c7vvwtIbvEdjuGW2XUkV+yM=; b=b7+WkswpAT4fWK8/mWF2juZyjDTdG4zLWk2G3YST38glznZL4cDQ4Shp9kbXlelDcj MP7yra3uZ8fRE62qJDlaapfMD49Fkwz16MV//ToV2R1EOucSDF1ukPvIBjatdRaOotki tZj8VsunOtdDxBZDvpJ1ihcS3aOx4qTBMf2eNe1plol+itI+LGh+E/NtJQuhJYpVgWj0 zC32OzkLHZMmpkWrUlPUcrLBFQmjMoPUU/HO2l0k2hG0YHEj7+D5BoYWxuHJJnT0UqID 1vaaGhCtK3o6l0pqN9jUNMuqf3OzuT2Xp1d3PgTc4D4EknyooU8e2f1fn+3PXMWIKpFO fFfQ== X-Gm-Message-State: AOJu0Yxtqi6U29clliP+eYmGaEcjEn21UJOUzgq6tlTZzbW3HPYPn5LP aUGrkTZ2j8tR25tS7b0MSRKP9n3CwcF/yQKIqQef6bljb5WWP73KIEerhRvE X-Received: by 2002:ad4:58aa:0:b0:68c:43cf:619d with SMTP id ea10-20020ad458aa000000b0068c43cf619dmr10600435qvb.4.1707039361437; Sun, 04 Feb 2024 01:36:01 -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 lz8-20020a0562145c4800b006837a012417sm2594431qvb.51.2024.02.04.01.36.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 04 Feb 2024 01:36:01 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Sun, 4 Feb 2024 04:35:58 -0500 Message-ID: <20240204093558.793427-3-leo.izen@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240204093558.793427-1-leo.izen@gmail.com> References: <20240204093558.793427-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/2] avcodec/pngenc: write 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: 4yNEI5HbZBpg 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 encoder to save this metadata as the corresponding chunks in the PNG stream. Signed-off-by: Leo Izen --- libavcodec/pngenc.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index f0650962d2..50689cb50c 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -32,6 +32,7 @@ #include "libavutil/crc.h" #include "libavutil/csp.h" #include "libavutil/libm.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/opt.h" #include "libavutil/rational.h" #include "libavutil/stereo3d.h" @@ -294,8 +295,9 @@ static int png_write_row(AVCodecContext *avctx, const uint8_t *data, int size) return 0; } -#define AV_WB32_PNG(buf, n) AV_WB32(buf, lrint((n) * 100000)) -#define AV_WB32_PNG_D(buf, d) AV_WB32_PNG(buf, av_q2d(d)) +#define PNG_LRINT(d, divisor) lrint((d) * (divisor)) +#define PNG_Q2D(q, divisor) PNG_LRINT(av_q2d(q), (divisor)) +#define AV_WB32_PNG_D(buf, q) AV_WB32(buf, PNG_Q2D(q, 100000)) static int png_get_chrm(enum AVColorPrimaries prim, uint8_t *buf) { const AVColorPrimariesDesc *desc = av_csp_primaries_desc_from_id(prim); @@ -320,7 +322,7 @@ static int png_get_gama(enum AVColorTransferCharacteristic trc, uint8_t *buf) if (gamma <= 1e-6) return 0; - AV_WB32_PNG(buf, 1.0 / gamma); + AV_WB32(buf, PNG_LRINT(1.0 / gamma, 100000)); return 1; } @@ -437,6 +439,30 @@ static int encode_headers(AVCodecContext *avctx, const AVFrame *pict) png_write_chunk(&s->bytestream, MKTAG('c', 'I', 'C', 'P'), s->buf, 4); } + side_data = av_frame_get_side_data(pict, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); + if (side_data) { + AVContentLightMetadata *clli = (AVContentLightMetadata *) side_data->data; + AV_WB32(s->buf, clli->MaxCLL * 10000); + AV_WB32(s->buf + 4, clli->MaxFALL * 10000); + png_write_chunk(&s->bytestream, MKTAG('c', 'L', 'L', 'i'), s->buf, 8); + } + + side_data = av_frame_get_side_data(pict, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); + if (side_data) { + AVMasteringDisplayMetadata *mdvc = (AVMasteringDisplayMetadata *) side_data->data; + if (mdvc->has_luminance && mdvc->has_primaries) { + for (int i = 0; i < 3; i++) { + AV_WB16(s->buf + 2*i, PNG_Q2D(mdvc->display_primaries[i][0], 50000)); + AV_WB16(s->buf + 2*i + 2, PNG_Q2D(mdvc->display_primaries[i][1], 50000)); + } + AV_WB16(s->buf + 12, PNG_Q2D(mdvc->white_point[0], 50000)); + AV_WB16(s->buf + 14, PNG_Q2D(mdvc->white_point[1], 50000)); + AV_WB32(s->buf + 16, PNG_Q2D(mdvc->max_luminance, 10000)); + AV_WB32(s->buf + 20, PNG_Q2D(mdvc->min_luminance, 10000)); + png_write_chunk(&s->bytestream, MKTAG('m', 'D', 'V', 'c'), s->buf, 24); + } + } + if (png_get_chrm(pict->color_primaries, s->buf)) png_write_chunk(&s->bytestream, MKTAG('c', 'H', 'R', 'M'), s->buf, 32); if (png_get_gama(pict->color_trc, s->buf))