From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 093444844C for ; Sat, 3 Feb 2024 02:28:50 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8F8BA68D16C; Sat, 3 Feb 2024 04:28:32 +0200 (EET) Received: from mail-qk1-f171.google.com (mail-qk1-f171.google.com [209.85.222.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6848368A96F for ; Sat, 3 Feb 2024 04:28:24 +0200 (EET) Received: by mail-qk1-f171.google.com with SMTP id af79cd13be357-783cdbecfe2so88373885a.0 for ; Fri, 02 Feb 2024 18:28:24 -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=l5fCDpfD4/yAZneg+E7Nr1yNTtTDNI4II3gvwJaGX00=; b=cGJ8p3lhk6EJzINYlz7Plj52Q8BI6eHe2AoM3aJdsDyEWcLRbGGSuD1g2gPuU1ykIb Qerknogj1Cir4nRqsY+aUbGG+Tk7CF8iaE1Aidb3RJ3LnyMVir2MB8e3iTpkyADdf8/N BCzgtWoywOroTL7jz5/OZsG2ssHeo+cnGvGOGo73dAbAXVz0Tqmu5/VHiQZbvfss8XqE etUSfWcgM2DyZ1E9wP096YvrtarVhourBwE1GC0AXJkBSAz6PeTT12jOWjM9JrPnlrFC 7/h5cmrRB86kchikznl2kQ+u6bHO4GgP5fvy4Uu/8v7Kdtu6ygUG9tjZ1QPiwf30WaBO xHmQ== 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=l5fCDpfD4/yAZneg+E7Nr1yNTtTDNI4II3gvwJaGX00=; b=npSH4rW2dvni/zq/aEg6RvGusUBhvZP4UTolqc2VNMqjhWmpYFNcYLnK2wgOTCVOhQ hkDGVLCc+99ZGEatl1XrjxPO+X+7ISJoUamuO0yiLINEH/LxdcdlDrdGZuwCQci+zJ1P rjL1R2aDj3xWZ6swvfAd2VsFFV7DWc5rlrJWDFEFYs8lQzssVa/Vys1n7QUIVqvaCPdN cFEFcW3tWk1zLZ+2pbjQ3VCjuOVbvmEMhFWpHIIqq6VJg+H8a2id7bwKs3V6Q1Zv1Xp9 eX2RRB1AJ8Xgo98SxVem7rzUsghbpZ3RCRKTqoEU1JChlReeaJjvgZ/5R8AYpHUJqwWx JGZQ== X-Gm-Message-State: AOJu0YyXmxA+9wlxynprUubhU9rjyqyGwXBCEx6oFIwQ615BL36J5gRa oFICa8ENvf2fLiOoB8X0DZGW/AwsVGakXvxNvKnvcMj6iBug/7ou2Sz+MjVQ X-Google-Smtp-Source: AGHT+IHoF20WkaVyPDPqINQ8otItDZznZK21POkePeA1mXKP+nfQKKRY46tSZaeDy4INktz/ZIg2kg== X-Received: by 2002:a05:622a:170f:b0:42b:eebd:2ae5 with SMTP id h15-20020a05622a170f00b0042beebd2ae5mr8576308qtk.4.1706927302508; Fri, 02 Feb 2024 18:28:22 -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.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Feb 2024 18:28:22 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Feb 2024 21:28:19 -0500 Message-ID: <20240203022819.726562-3-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 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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..aab56d6d07 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, 10000)) 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, 10000)); 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)) -- 2.43.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".