From patchwork Sun Jun 9 15:05:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49746 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052245vqo; Sun, 9 Jun 2024 08:06:43 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCULCXChgMdTMe8DDhL5saQvar1n0oMbsE7BNKvnDfUPNVgjdVfrwdj8/GN+i7AwqduZ89FrRsXFqc0ZbH/QOW/IMryTl6MMDuvC0g== X-Google-Smtp-Source: AGHT+IHUMZzKAS772wMwN6nYgVc4VH0OTMpK0qxRqZHaZOo97yKezMw9hkEosaK49bn2CuPDlD6V X-Received: by 2002:a05:6512:1191:b0:52c:856d:dd18 with SMTP id 2adb3069b0e04-52c856debdfmr1602057e87.4.1717945603161; Sun, 09 Jun 2024 08:06:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945603; cv=none; d=google.com; s=arc-20160816; b=A5qIncdmUQrw0TGf3Y274mTBZE22ML1SXA++3OjMaTYDJTOq6BkUM8lqJK6OWtS2Fb lt6ddC3D2pfKm9zw4CEy3PT4ErkxmRoLjj47s2AX5buLQF7W3R1dq58sI04f6OsrPev3 b2bgiC9McnyHsDDXaYqxTsmgh91nuYSuvx1iyiEu9rbthp9KmWHGBuBZaa8pg1jWsnRa zUzmDC6JGv7iLdQl+WCqLCEyJLfVovpFeLF5kzfFhhTzfXSmuqw404BeNiPtgakhnP+p NRMMj5HJ3W8bpfLKmouheCB3dbzA+y/LuspG9pCGXumlaxvupORifz/EHP6Mz4/b1oiK /JLw== 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=sEutW+/SxcgJ/TH9UTqhzAuGHtNz6bAzFCQ02s2kRYk=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=IeQnweVTpU4VKRZuxXfEYoc2TC6EfRLfo5Yy1mi93mb0+LPGssNiK9IkWiRXam2K2L LkyF7zoRfGsmKP/Ygzyscr8A2KXlf+M2QaLppDR2T/AG8GwFPuOQAJqfFmwOD+bE1znF bYe4P/+NNCufCp92ikPZc7xLEFS1aR2rcXDtZotDRkz/nhzYMEvxvOwCXmy9rZzU/EHR tXfosby6JAXbXRkaeVtzguqNSV6j6zHCivLXiGYj6GYyxL854T9J1/Tr03/bF+1GN4rS ve3KRVevEKXjS9zAXuIWRweHoMwdFUnUhsvZp7TW0dNhccGTauKnG0j7f2KV+y/bYq/4 Dr0w==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=r8sTX0Z8; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52bb41eb9f7si2214692e87.524.2024.06.09.08.06.42; Sun, 09 Jun 2024 08:06:43 -0700 (PDT) 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=@haasn.xyz header.s=mail header.b=r8sTX0Z8; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EECE768D595; Sun, 9 Jun 2024 18:06:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 89D8768D3AF for ; Sun, 9 Jun 2024 18:05:58 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1717945557; bh=NKbRpJFI4ytIwpzjU1WORNwZHdqsdFQ2L+iBh8Me/EU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r8sTX0Z8jCOOriexnzUfBiiRYu6pCHzyaL/m4D84fzRU0dQTcvjSZFsh2xsJqvvMj tk6TK0kqU8hbxWbclKonjqjhgi9FTqKePWtEUscAzMsxgf7O5nxZTWK1QyR8s2eiRA WpE/cX27UFGlQTpVo/HCPFOBjC+fxgjXx5OG/J/E= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 4459C41AF9; Sun, 9 Jun 2024 17:05:57 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:47 +0200 Message-ID: <20240609150553.72865-2-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240609150553.72865-1-ffmpeg@haasn.xyz> References: <20240609150553.72865-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/8] avcodec/dovi_rpu: properly handle vdr_dm_metadata_present 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: Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 63XaAPVdE3S9 From: Niklas Haas When this is 0, the metadata is explicitly inferred to stated default values from the spec, rather than inferred from the previous frame's values. Likewise, when encoding, instead of checking if the value changed since the last frame, we need to check if it differs from the default. --- libavcodec/dovi_rpu.c | 43 ++++++++++++++++++++++++++++++++++++++++ libavcodec/dovi_rpu.h | 3 +++ libavcodec/dovi_rpudec.c | 2 ++ libavcodec/dovi_rpuenc.c | 10 +++++----- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index b26c19dd5e..91134e031d 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -86,3 +86,46 @@ int ff_dovi_guess_profile_hevc(const AVDOVIRpuDataHeader *hdr) return 0; /* unknown */ } + +const AVDOVIColorMetadata ff_dovi_color_default = { + .dm_metadata_id = 0, + .scene_refresh_flag = 0, + .ycc_to_rgb_matrix = { + { 9575, 8192 }, + { 0, 8192 }, + { 14742, 8192 }, + { 9575, 8192 }, + { 1754, 8192 }, + { 4383, 8192 }, + { 9575, 8192 }, + { 17372, 8192 }, + { 0, 8192 }, + }, + .ycc_to_rgb_offset = { + { 1, 4 }, + { 2, 1 }, + { 2, 1 }, + }, + .rgb_to_lms_matrix = { + { 5845, 16384 }, + { 9702, 16384 }, + { 837, 16384 }, + { 2568, 16384 }, + { 12256, 16384 }, + { 1561, 16384 }, + { 0, 16384 }, + { 679, 16384 }, + { 15705, 16384 }, + }, + .signal_eotf = 39322, + .signal_eotf_param0 = 15867, + .signal_eotf_param1 = 228, + .signal_eotf_param2 = 1383604, + .signal_bit_depth = 14, + .signal_color_space = 0, + .signal_chroma_format = 0, + .signal_full_range_flag = 1, + .source_min_pq = 62, + .source_max_pq = 3696, + .source_diagonal = 42, +}; diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 8ce0c88e9d..c784afbe4b 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -157,4 +157,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, */ int ff_dovi_guess_profile_hevc(const AVDOVIRpuDataHeader *hdr); +/* Default values for AVDOVIColorMetadata */ +extern const AVDOVIColorMetadata ff_dovi_color_default; + #endif /* AVCODEC_DOVI_RPU_H */ diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index d1dcc3a262..cf2152988c 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -616,6 +616,8 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, color->source_min_pq = get_bits(gb, 12); color->source_max_pq = get_bits(gb, 12); color->source_diagonal = get_bits(gb, 10); + } else { + s->color = &ff_dovi_color_default; } /* Parse extension blocks */ diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 3c3e0f84c0..242cd76c58 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -441,7 +441,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, const AVDOVIRpuDataHeader *hdr; const AVDOVIDataMapping *mapping; const AVDOVIColorMetadata *color; - int vdr_dm_metadata_changed, vdr_rpu_id, use_prev_vdr_rpu, profile, + int vdr_dm_metadata_present, vdr_rpu_id, use_prev_vdr_rpu, profile, buffer_size, rpu_size, pad, zero_run; int num_ext_blocks_v1, num_ext_blocks_v2; uint32_t crc; @@ -512,7 +512,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } } - vdr_dm_metadata_changed = !s->color || memcmp(s->color, color, sizeof(*color)); + vdr_dm_metadata_present = memcmp(color, &ff_dovi_color_default, sizeof(*color)); use_prev_vdr_rpu = !memcmp(&s->vdr[vdr_rpu_id]->mapping, mapping, sizeof(*mapping)); buffer_size = 12 /* vdr seq info */ + 5 /* CRC32 + terminator */; @@ -529,7 +529,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } } } - if (vdr_dm_metadata_changed) + if (vdr_dm_metadata_present) buffer_size += 67; av_fast_padded_malloc(&s->rpu_buf, &s->rpu_buf_sz, buffer_size); @@ -560,7 +560,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } s->header = *hdr; - put_bits(pb, 1, vdr_dm_metadata_changed); + put_bits(pb, 1, vdr_dm_metadata_present); put_bits(pb, 1, use_prev_vdr_rpu); set_ue_golomb(pb, vdr_rpu_id); s->mapping = &s->vdr[vdr_rpu_id]->mapping; @@ -632,7 +632,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, memcpy(&s->vdr[vdr_rpu_id]->mapping, mapping, sizeof(*mapping)); } - if (vdr_dm_metadata_changed) { + if (vdr_dm_metadata_present) { const int denom = profile == 4 ? (1 << 30) : (1 << 28); set_ue_golomb(pb, color->dm_metadata_id); /* affected_dm_id */ set_ue_golomb(pb, color->dm_metadata_id); /* current_dm_id */