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 B755048B81 for ; Sun, 4 Feb 2024 09:36:24 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8D6F568D180; Sun, 4 Feb 2024 11:36:10 +0200 (EET) 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-Google-Smtp-Source: AGHT+IFuhsvQZXHZsr6S6dHXupUlFVGkOD7lqkkonAUNqRpSCKTQ+zQKvAAgVwPE30Zg5BJocadgKQ== 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 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..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)) -- 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".