From patchwork Sun Jun 9 15:05:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49745 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052151vqo; Sun, 9 Jun 2024 08:06:32 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXqKKx9cg3BnnVp6uDlxHg+1c4FpcCI+TZhbajXby5yK7zQ60z913kvXhBvd7bmNYbFLpa/NWC4KKnm99hLPsOXERPDwJx90T1g6Q== X-Google-Smtp-Source: AGHT+IFA54N2e4RLKw2ljZBgg/1kZjEJ+rRxj+XtQhsyW9QrbR50SAVvHMK8845VUmW9zbB0/7K1 X-Received: by 2002:aa7:d887:0:b0:57c:58c4:3ff2 with SMTP id 4fb4d7f45d1cf-57c58c44089mr4774663a12.2.1717945591947; Sun, 09 Jun 2024 08:06:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945591; cv=none; d=google.com; s=arc-20160816; b=RNXlgb2MFqjmPdXoz9kMfK5a6Wqxj7k4tN5nElbu/MV3hw69YRgR2jO+anoLDdUP1I r+VtaJnei0md6YQRpqb5lSqz06wWaKWzBFzP53dGjbpLKo/LlYvy55hfLv9VjmigYBXA K6YR2QqqabwpZNIUq2j9hbDL+yDS5HFnSQ9K9rNkQlGIjzgCB4spOdDHY9dX97AgNY3O +hHFTW1ao5aW3pKxLPqlBfItBTkLfFqFAQ8PX9RM9ApqLJxe/kHZPgf8eau/cwd/iZg1 E51MpC125EeeDHZOrJnDWWAjGOvoOUkj++DWLw84T+YqMhuqmLUi3ZR9mp47t8BFnCY5 nahQ== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=IfupAao0aKgCcRi27yu/dD3D7lfwR74qlvbo8UPUScI=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=aNVe6hcGZ6VUijdxTX4CCsAU1Vr5B0Hg75KPu2raSMvKYcujbPEVOodbopPl7b56+S QCDHEX0Dq244lKYD5A98yGZYABtrX9JtBqCjyM8VmFzksX+WzEB18cDVHUXVH7SmqJj3 lPa8VE21XQX+AfK8wolUQUcianrlop+33gNpkG7ilbQUtcJaL0CaXP7sSebzwJTreHyq evLUDIXPO1dkytEffrdQNJcIAQNyj2kwIjh4Q3AAa1/sKcREhdgM9RRaXGjaIbpGD6rg Rs64JnmVGu190ATtwN/l4uzdXwVjOK74uxW7ecagiMWvbDcu3kNSMQX/d/QTA8BpOCwM v9lw==; 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=A+PcJm0E; 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 4fb4d7f45d1cf-57aae0f8476si3768559a12.162.2024.06.09.08.06.31; Sun, 09 Jun 2024 08:06:31 -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=A+PcJm0E; 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 B3F8168D3D0; Sun, 9 Jun 2024 18:06:08 +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 86B0D68D3A3 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=mbtglI9ixYhUQF4c1LF2dtkbMbX9uFnCrRGwxLjfp5E=; h=From:To:Cc:Subject:Date:From; b=A+PcJm0EdJcPIvMBRdljOkXyk7BKpuVncTFT7JPStSP/AEyjHSYBE9eq5NhDc1o7Y oZSD8/2rBF3SBe9hWnS9nCYz2/6E3DRhSa5VaMUd85fVB/29P+9MVotzpnoeWp42jg bMz/4dWlkD/GeMP/n+DEAt789SbTzhsRW2Wa1oi0= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 0FC1E40455; Sun, 9 Jun 2024 17:05:57 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:46 +0200 Message-ID: <20240609150553.72865-1-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/8] avdovi/dovi_rpudec: handle prev_vdr_rpu_id failures 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: vdZoibPdy+ML From: Niklas Haas According to the spec, missing previous VDR RPU IDs do not constitute an error, but we should instead fallback first to VDR RPU with ID 0, and failing that, synthesize "neutral" metadata. That's nontrivial though as the resulting metadata will be dependent on other properties of the RPU, and this case is not hit in practice so I'll defer it to a rainy day. --- libavcodec/dovi_rpudec.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 7c7eda9d09..d1dcc3a262 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -444,7 +444,12 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, if (use_prev_vdr_rpu) { int prev_vdr_rpu_id = get_ue_golomb_31(gb); VALIDATE(prev_vdr_rpu_id, 0, DOVI_MAX_DM_ID); + if (!s->vdr[prev_vdr_rpu_id]) + prev_vdr_rpu_id = 0; if (!s->vdr[prev_vdr_rpu_id]) { + /* FIXME: Technically, the spec says that in this case we should + * synthesize "neutral" vdr metadata, but easier to just error + * out as this corner case is not hit in practice */ av_log(s->logctx, AV_LOG_ERROR, "Unknown previous RPU ID: %u\n", prev_vdr_rpu_id); goto fail; 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 */ From patchwork Sun Jun 9 15:05:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49747 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052303vqo; Sun, 9 Jun 2024 08:06:51 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX9Pg0xURrb8b4QcfPzn8PrnTl/8DZmTA8ztlp+4hZIzJK/v2+eYgAqo9dSkLvrxTDjUz6xsE+9jkrim5/+tHijIyaJBQLagen9qw== X-Google-Smtp-Source: AGHT+IHxlwoOiB/vLlm820R3CTXlE2f9B2La6kjMG8C5ahgf4FNug+aTBQ3ignLT5TewRD2MXSOE X-Received: by 2002:a50:d593:0:b0:57c:6a05:afd0 with SMTP id 4fb4d7f45d1cf-57c6a05b274mr3106719a12.14.1717945611032; Sun, 09 Jun 2024 08:06:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945611; cv=none; d=google.com; s=arc-20160816; b=T7vNQZSoqonmPLxvLZgwt3Acgis4irvhFlJGIuMvMZMkffsk/J19+ck3YhEt8u8cJQ hYmpPf2lDTJYZhR9RkKSzRJaJ3LOcQpNDBcR1UAGXjxuWW8L7fCyWG0YeVF3D/ngFWiQ cJ/xLg9Nfn7W06ZimwgT5jLHlthHjOKBnxhbBLEWyaGgAY6WCQS+vomPzwT2NpkLbD57 O5pk7v2q361BZsK+uCphgZMo5lGK1WkBFEcKGd4fzJf4n+htMaOGOO+ntbBZ/HIdjCnt uab6Q5ng3RhW2E2YWH2qG1ons+qpZqBZw386vO06TUpzkAI6v/P/uQUu7sJSfx54nA3x DVZw== 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=vzyi+Qdxe80hU0ogTyhUOcvS/SC5Sz+UKRsTO1lcPNM=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=S4ldyly5ZQGuo2sURFDc2/8/Us/avLeUpzAG7cAPvIlZRsA6qFRTvHzVxqxWvZAeHT 95lw+h74OQ9+j9Eii2bcxj2DBjM2ryADTQOo8YVw4GfprfdKgE68k5nnK0JDvEdAWrlJ 9k01mmQYXt+QSz/SMM8mdTSX97ELsqxbWAWSrnkFulfAPQsYbk5YzYefNSbuWXunjhCI P0LpJFA3lYuWNemBaWKp57iQJPVOPamWqIcRZKQAGPiIzs0PJL4wmPnb4kR+kQgZ/Yd7 B+336kprcRAJz9IP2xgns1zb3MVGA1WkM9Gg4IGGlpnf3AF6/RoyN5++vy8P005HYmfB uXQw==; 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=LOIEJuyw; 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 4fb4d7f45d1cf-57aae28e1e8si3739564a12.666.2024.06.09.08.06.50; Sun, 09 Jun 2024 08:06:51 -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=LOIEJuyw; 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 2D78268D5B2; Sun, 9 Jun 2024 18:06:11 +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 8FE2B68D3D0 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=Z5iayvfcVVjETBAXXwcEHXgso2koMyKWcbGh686N0ow=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LOIEJuywY6n4vbqrJq+UR3app1yw2/kEu0gJV1eEeGy48O0UlljuFLRjiImWLFcms AOwceEad80Li8a8LhSvDoF1gt2oZ4dmIC+wsIpge630fIML4PRj86NheFJQzw4Vbfn mUP19hD8MPx0wJHQ2KkJglV0zwpuLFj2P8uNlalg= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 78C9941F18; Sun, 9 Jun 2024 17:05:57 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:48 +0200 Message-ID: <20240609150553.72865-3-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 3/8] avcodec/dovi_rpu: fix dm_metadata_id handling 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: W/SWj5ILgMi7 From: Niklas Haas Despite the suggestive size limits, this metadata ID has nothing to do with the VDR metadata ID used for the data mappings. Actually, the specification leaves them wholly unexplained, other than acknowleding their existence. Must be some secret dolby sauce. They're not even involved in DM metadata compression, which is handled using an entirely separate ID. That leaves us with a lack of anything sensible to do with these IDs. Since we unfortunately only expose one `dm_metadata_id` field to the user, just ensure that they match; which appears to always be the case in practice. If somebody ever hits this error, I would really much rather like to see the triggering file. --- libavcodec/dovi_rpu.c | 3 +++ libavcodec/dovi_rpu.h | 1 + libavcodec/dovi_rpudec.c | 30 +++++++++++++++--------------- libavcodec/dovi_rpuenc.c | 16 ++++++++-------- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 91134e031d..5130a9598d 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -28,6 +28,7 @@ void ff_dovi_ctx_unref(DOVIContext *s) { + ff_refstruct_unref(&s->dm); for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++) ff_refstruct_unref(&s->vdr[i]); ff_refstruct_unref(&s->ext_blocks); @@ -40,6 +41,7 @@ void ff_dovi_ctx_unref(DOVIContext *s) void ff_dovi_ctx_flush(DOVIContext *s) { + ff_refstruct_unref(&s->dm); for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++) ff_refstruct_unref(&s->vdr[i]); ff_refstruct_unref(&s->ext_blocks); @@ -60,6 +62,7 @@ void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0) s->header = s0->header; s->mapping = s0->mapping; s->color = s0->color; + ff_refstruct_replace(&s->dm, s0->dm); for (int i = 0; i <= DOVI_MAX_DM_ID; i++) ff_refstruct_replace(&s->vdr[i], s0->vdr[i]); ff_refstruct_replace(&s->ext_blocks, s0->ext_blocks); diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index c784afbe4b..da9bd67cde 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -74,6 +74,7 @@ typedef struct DOVIContext { /** * Private fields internal to dovi_rpu.c */ + AVDOVIColorMetadata *dm; ///< RefStruct struct DOVIVdr *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references uint8_t *rpu_buf; ///< temporary buffer unsigned rpu_buf_sz; diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index cf2152988c..3e15453705 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -568,25 +568,25 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int current_dm_id = get_ue_golomb_31(gb); VALIDATE(affected_dm_id, 0, DOVI_MAX_DM_ID); VALIDATE(current_dm_id, 0, DOVI_MAX_DM_ID); - if (!s->vdr[affected_dm_id]) { - s->vdr[affected_dm_id] = ff_refstruct_allocz(sizeof(DOVIVdr)); - if (!s->vdr[affected_dm_id]) - return AVERROR(ENOMEM); + if (affected_dm_id != current_dm_id) { + /* The spec does not explain these fields at all, and there is + * a lack of samples to understand how they're supposed to work, + * so just assert them being equal for now */ + avpriv_request_sample(s->logctx, "affected/current_dm_metadata_id " + "mismatch? %u != %u\n", affected_dm_id, current_dm_id); + ff_dovi_ctx_unref(s); + return AVERROR_PATCHWELCOME; } - if (!s->vdr[current_dm_id]) { - av_log(s->logctx, AV_LOG_ERROR, "Unknown previous RPU DM ID: %u\n", - current_dm_id); - goto fail; + if (!s->dm) { + s->dm = ff_refstruct_allocz(sizeof(AVDOVIColorMetadata)); + if (!s->dm) { + ff_dovi_ctx_unref(s); + return AVERROR(ENOMEM); + } } - /* Update current pointer based on current_dm_id */ - vdr = s->vdr[current_dm_id]; - s->color = &vdr->color; - - /* Update values of affected_dm_id */ - vdr = s->vdr[affected_dm_id]; - color = &vdr->color; + s->color = color = s->dm; color->dm_metadata_id = affected_dm_id; color->scene_refresh_flag = get_ue_golomb_31(gb); for (int i = 0; i < 9; i++) diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 242cd76c58..59e8ed6e3e 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -479,12 +479,6 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, return AVERROR(ENOMEM); } - if (!s->vdr[color->dm_metadata_id]) { - s->vdr[color->dm_metadata_id] = ff_refstruct_allocz(sizeof(DOVIVdr)); - if (!s->vdr[color->dm_metadata_id]) - return AVERROR(ENOMEM); - } - num_ext_blocks_v1 = num_ext_blocks_v2 = 0; for (int i = 0; i < metadata->num_ext_blocks; i++) { const AVDOVIDmData *dm = av_dovi_get_ext(metadata, i); @@ -515,6 +509,12 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, 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)); + if (vdr_dm_metadata_present && !s->dm) { + s->dm = ff_refstruct_allocz(sizeof(AVDOVIColorMetadata)); + if (!s->dm) + return AVERROR(ENOMEM); + } + buffer_size = 12 /* vdr seq info */ + 5 /* CRC32 + terminator */; buffer_size += num_ext_blocks_v1 * 13; buffer_size += num_ext_blocks_v2 * 28; @@ -655,8 +655,8 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, put_bits(pb, 12, color->source_max_pq); put_bits(pb, 10, color->source_diagonal); - memcpy(&s->vdr[color->dm_metadata_id]->color, color, sizeof(*color)); - s->color = &s->vdr[color->dm_metadata_id]->color; + memcpy(s->dm, color, sizeof(*color)); + s->color = s->dm; } set_ue_golomb(pb, num_ext_blocks_v1); From patchwork Sun Jun 9 15:05:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49743 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2051912vqo; Sun, 9 Jun 2024 08:06:10 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXi5Lkj+sSlmBHiLud5fc2Um08+NNWVluTwzfFGZn8xE8SqIqvnhskYC4aiSp+HxYS7l0MpTso9TgyCy5KsFHQS3kYdSKqJGj6Mrg== X-Google-Smtp-Source: AGHT+IFaDTyUbjxVbKxnjx02Q45RaDI+eXvsgimwNl/Z1xVrssME7Jw17m7bjcPQiOMLJAUAp4+3 X-Received: by 2002:a17:907:10cf:b0:a6f:11f7:e8c5 with SMTP id a640c23a62f3a-a6f11f7ede0mr122436166b.12.1717945570263; Sun, 09 Jun 2024 08:06:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945570; cv=none; d=google.com; s=arc-20160816; b=bGelAOY60xfGsGXV9nw85I6azX8aa6so3Cj3UhEXnA2Jz5ZI9Oir8deF37VtEKTPXp FqjMkKsUydFZdk7KWVcAbXoET9g911dyibSgSGqL6OsDC5yWnnJpXnOx+JqayNb13QRo 0qujOIX5/HQ2siPeJ2VToX2pTnuim3LGSJQ7A4EqmNcW35hSqqE65aJxAMTMjWQLZIpX v67SHpPA1z4QDLeMxnOPiFrAIm7Q3+Yq8mx1jCdgPubRDd5PXvuv+1DYwhnXv0zCuhKf f81UJs0L5GVA7K/Jf+kxY10XJ6niRz2Wig8jnVVEiqMi4HH5Bqi4MfO8NvA+GiGhm/i8 Xa0g== 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=Dode5OTfwYLYMeMMVKcdjf8K45PXfy3ShO5mTDMyMFQ=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=JUPOlJNZKg0tdf66aqV8aoTpJABlJe7MKx4P7kdE799De7hoJDMx/+FTw6wRZ4846h 6zINN6/hqFdDZYHC0lPSQwyYyom2LrFIXms4uoRiFfc+4qwTDYhvf+SNir8hl67t9XXp NGkk0GMP7Fvx6K7Zj9m+h70MwOUoc0cWHIZCrBdHtKRypFRORvYx7fJ/C8MDhha30GZw TueywypIhNLWWJCxsz6+lPfJKh9bhTUiyGap5S4g7VfzQF4fBJxfbq7qYCXOECXU1mDT JSPv3sB7PRFd5WV6Jh85JNN0MVvnUVvXUK3+0dJ8j5FC+cpsvkEjVMsfUkiov5FTIMcD 8I0Q==; 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=aLChc+1C; 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 a640c23a62f3a-a6f0bc2a30csi144381666b.11.2024.06.09.08.06.09; Sun, 09 Jun 2024 08:06:10 -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=aLChc+1C; 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 90EAE68D4C9; Sun, 9 Jun 2024 18:06:05 +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 8CDC368D3C6 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=vX7a6x5BL4NoaArWIDYY8zkBStupreo4e9ksqBz90ds=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aLChc+1CM0Y/YmybyMubsoV47atJqPmHqxcw8erm3HzHA4+XgCZr6hXfqX5fKHrD3 N9LfIQ6rv/gAQVb6n39I1TWK5vdFHpC8FnU4mIy5erYIQvuZBgeoa+N4Kcfr1C6xbR I4WFgNyTPg5zdHaeYvp8sEuOwEnrgonaUlbJwDQk= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id AB5E642385; Sun, 9 Jun 2024 17:05:57 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:49 +0200 Message-ID: <20240609150553.72865-4-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 4/8] avcodec/dovi_rpudec: simplify vdr handling (cosmetic) 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: uBaWDqlAex2P From: Niklas Haas Move `vdr` into local scope and point only to the field we actually care about. --- libavcodec/dovi_rpudec.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 3e15453705..753e402dc6 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -296,7 +296,6 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, { AVDOVIRpuDataHeader *hdr = &s->header; GetBitContext *gb = &(GetBitContext){0}; - DOVIVdr *vdr; int ret; uint8_t rpu_type; @@ -454,9 +453,9 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, prev_vdr_rpu_id); goto fail; } - vdr = s->vdr[prev_vdr_rpu_id]; - s->mapping = &vdr->mapping; + s->mapping = &s->vdr[prev_vdr_rpu_id]->mapping; } else { + AVDOVIDataMapping *mapping; int vdr_rpu_id = get_ue_golomb_31(gb); VALIDATE(vdr_rpu_id, 0, DOVI_MAX_DM_ID); if (!s->vdr[vdr_rpu_id]) { @@ -465,15 +464,13 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, return AVERROR(ENOMEM); } - vdr = s->vdr[vdr_rpu_id]; - s->mapping = &vdr->mapping; - - vdr->mapping.vdr_rpu_id = vdr_rpu_id; - vdr->mapping.mapping_color_space = get_ue_golomb_31(gb); - vdr->mapping.mapping_chroma_format_idc = get_ue_golomb_31(gb); + s->mapping = mapping = &s->vdr[vdr_rpu_id]->mapping; + mapping->vdr_rpu_id = vdr_rpu_id; + mapping->mapping_color_space = get_ue_golomb_31(gb); + mapping->mapping_chroma_format_idc = get_ue_golomb_31(gb); for (int c = 0; c < 3; c++) { - AVDOVIReshapingCurve *curve = &vdr->mapping.curves[c]; + AVDOVIReshapingCurve *curve = &mapping->curves[c]; int num_pivots_minus_2 = get_ue_golomb_31(gb); int pivot = 0; @@ -487,28 +484,28 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, if (use_nlq) { int nlq_pivot = 0; - vdr->mapping.nlq_method_idc = get_bits(gb, 3); + mapping->nlq_method_idc = get_bits(gb, 3); for (int i = 0; i < 2; i++) { nlq_pivot += get_bits(gb, hdr->bl_bit_depth); - vdr->mapping.nlq_pivots[i] = av_clip_uint16(nlq_pivot); + mapping->nlq_pivots[i] = av_clip_uint16(nlq_pivot); } /** * The patent mentions another legal value, NLQ_MU_LAW, but it's * not documented anywhere how to parse or apply that type of NLQ. */ - VALIDATE(vdr->mapping.nlq_method_idc, 0, AV_DOVI_NLQ_LINEAR_DZ); + VALIDATE(mapping->nlq_method_idc, 0, AV_DOVI_NLQ_LINEAR_DZ); } else { - vdr->mapping.nlq_method_idc = AV_DOVI_NLQ_NONE; + mapping->nlq_method_idc = AV_DOVI_NLQ_NONE; } - vdr->mapping.num_x_partitions = get_ue_golomb_long(gb) + 1; - vdr->mapping.num_y_partitions = get_ue_golomb_long(gb) + 1; + mapping->num_x_partitions = get_ue_golomb_long(gb) + 1; + mapping->num_y_partitions = get_ue_golomb_long(gb) + 1; /* End of rpu_data_header(), start of vdr_rpu_data_payload() */ for (int c = 0; c < 3; c++) { - AVDOVIReshapingCurve *curve = &vdr->mapping.curves[c]; + AVDOVIReshapingCurve *curve = &mapping->curves[c]; for (int i = 0; i < curve->num_pivots - 1; i++) { int mapping_idc = get_ue_golomb_31(gb); VALIDATE(mapping_idc, 0, 1); @@ -549,10 +546,10 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, if (use_nlq) { for (int c = 0; c < 3; c++) { - AVDOVINLQParams *nlq = &vdr->mapping.nlq[c]; + AVDOVINLQParams *nlq = &mapping->nlq[c]; nlq->nlq_offset = get_bits(gb, hdr->el_bit_depth); nlq->vdr_in_max = get_ue_coef(gb, hdr); - switch (vdr->mapping.nlq_method_idc) { + switch (mapping->nlq_method_idc) { case AV_DOVI_NLQ_LINEAR_DZ: nlq->linear_deadzone_slope = get_ue_coef(gb, hdr); nlq->linear_deadzone_threshold = get_ue_coef(gb, hdr); From patchwork Sun Jun 9 15:05:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49744 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052054vqo; Sun, 9 Jun 2024 08:06:23 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWXuzsgPmGBoAQ3wsSgHgVP0gl3fiKtSbYCFwLnj3otbfne/KSVH/cF8ZXOWQsbHhgSkqvOfRuJwG4reWnubJqjdApw2wIcZi+Ctw== X-Google-Smtp-Source: AGHT+IGrM12amwVagKNXe0LNs7B1vGSQQ9488QuJkSH4hkm6tcYmehTk2153MJQnKb7C9gqDB5xo X-Received: by 2002:a05:6512:2ed:b0:52c:82d9:66b8 with SMTP id 2adb3069b0e04-52c82d96730mr1660862e87.36.1717945583212; Sun, 09 Jun 2024 08:06:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945583; cv=none; d=google.com; s=arc-20160816; b=gTtTBtjaAbqziEq9nTRrsQFLUdW7uoqn8UWYGzdRKsSllb8gcBlAOfbqitSyJxaFG2 rGrpEFl7v3V5v/5gjJZ4LpT9tsLmwqXnaZdvQ3+A70B9jThm8CLoJYQTqtvMdP5+83Zh pyd0CeDXhQzR4nHm1u9shpP/aiFtHsCeDj2udxydmqZl4sh28NtbqdTB6zNy05UOyh++ Q/ddrosxZO6uRtEPjfsKZSXWxqYuoE4Ghz1LqTwbwUAa0ueif6DPzVq9+jrRZcC+9/TZ BE5WEEqPoZXWLGbHcHeKbgLkF7sWMSN4JZb1POMGLRQ1ZC/Ct5RdikEWCITZQ+UfOMGQ owUQ== 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=1i5fJ6HZ/ITlXcVxfbBrmsKs/tK4hpfUA4kVZhP7+BQ=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=BRJ31Rmm7N2KpyuP01N6E48c4hZRXZZ68HO9l1JOYJJcvU0So0rbdh6A+Ki3RsoDTu Lj4GypSvIFOA4wiKkXUPWp/uA1AeiUn/fvEKF475rIsGcqBiqW8sG9d+vZcRAGSvCair 9/73uFS1F1zKfSUW0evj0a5QxCFNu+HzOorba6W2U+unaSUDhbWrAB7SO+1LtM8MGUa4 m3Oicgc7gTjoCShr4j+owr4jhdz4jxOBEnu6HoqMeb+1qChx/rFdE0MIuB4rNNUf1Bqs rbWJuOY4hm0a/8d0O3MpHhFzXG/SbuNRRAIby7gD/f92WBrY+UZul8D5aGsbPH1FBN1e PhTw==; 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=nGWXhn1k; 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-52c814a4c89si772644e87.133.2024.06.09.08.06.22; Sun, 09 Jun 2024 08:06:23 -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=nGWXhn1k; 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 3115568D331; Sun, 9 Jun 2024 18:06:07 +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 837FF68D243 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=EHlVwvcjuPmstJYl875kUavBYgwg2YCp/piSW92bfNw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nGWXhn1kOFVwAyWbtgbhdPqfQ2RN4UZ7kwG7Gm1xHI+npLU8gdvdr4dyzrWXc8mnT 0A56pB7jDU6zNePNtcIxcdY13z4KSBSHymWjUdVLJA6yQ/5S5wpVGJTMjVyClTjEOp i+Glkq3IIFXxeovaKYAM0ZvGJC6PDxj2Pj1AOG/I= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id DF89242548; Sun, 9 Jun 2024 17:05:57 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:50 +0200 Message-ID: <20240609150553.72865-5-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 5/8] avcodec/dovi_rpu: simplify vdr type 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: cC6+6nKWWDqG From: Niklas Haas Storing the color metadata alongside the data mapping is no longer needed, so we can simplify this array's type. --- libavcodec/dovi_rpu.h | 7 +------ libavcodec/dovi_rpudec.c | 6 +++--- libavcodec/dovi_rpuenc.c | 10 +++++----- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index da9bd67cde..058d50c64f 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -75,7 +75,7 @@ typedef struct DOVIContext { * Private fields internal to dovi_rpu.c */ AVDOVIColorMetadata *dm; ///< RefStruct - struct DOVIVdr *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references + AVDOVIDataMapping *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references uint8_t *rpu_buf; ///< temporary buffer unsigned rpu_buf_sz; @@ -127,11 +127,6 @@ int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx); * The following section is for internal use only. * ***************************************************/ -typedef struct DOVIVdr { - AVDOVIDataMapping mapping; - AVDOVIColorMetadata color; -} DOVIVdr; - enum { RPU_COEFF_FIXED = 0, RPU_COEFF_FLOAT = 1, diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 753e402dc6..51f824d126 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -453,18 +453,18 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, prev_vdr_rpu_id); goto fail; } - s->mapping = &s->vdr[prev_vdr_rpu_id]->mapping; + s->mapping = s->vdr[prev_vdr_rpu_id]; } else { AVDOVIDataMapping *mapping; int vdr_rpu_id = get_ue_golomb_31(gb); VALIDATE(vdr_rpu_id, 0, DOVI_MAX_DM_ID); if (!s->vdr[vdr_rpu_id]) { - s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(DOVIVdr)); + s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(AVDOVIDataMapping)); if (!s->vdr[vdr_rpu_id]) return AVERROR(ENOMEM); } - s->mapping = mapping = &s->vdr[vdr_rpu_id]->mapping; + s->mapping = mapping = s->vdr[vdr_rpu_id]; mapping->vdr_rpu_id = vdr_rpu_id; mapping->mapping_color_space = get_ue_golomb_31(gb); mapping->mapping_chroma_format_idc = get_ue_golomb_31(gb); diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 59e8ed6e3e..8fceefe2c1 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -465,7 +465,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, vdr_rpu_id = -1; for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { - if (s->vdr[i] && !memcmp(&s->vdr[i]->mapping, mapping, sizeof(*mapping))) { + if (s->vdr[i] && !memcmp(s->vdr[i], mapping, sizeof(*mapping))) { vdr_rpu_id = i; break; } else if (vdr_rpu_id < 0 && (!s->vdr[i] || i == DOVI_MAX_DM_ID)) { @@ -474,7 +474,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } if (!s->vdr[vdr_rpu_id]) { - s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(DOVIVdr)); + s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(AVDOVIDataMapping)); if (!s->vdr[vdr_rpu_id]) return AVERROR(ENOMEM); } @@ -507,7 +507,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } 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)); + use_prev_vdr_rpu = !memcmp(s->vdr[vdr_rpu_id], mapping, sizeof(*mapping)); if (vdr_dm_metadata_present && !s->dm) { s->dm = ff_refstruct_allocz(sizeof(AVDOVIColorMetadata)); @@ -563,7 +563,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, 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; + s->mapping = s->vdr[vdr_rpu_id]; profile = s->cfg.dv_profile ? s->cfg.dv_profile : ff_dovi_guess_profile_hevc(hdr); @@ -629,7 +629,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } } - memcpy(&s->vdr[vdr_rpu_id]->mapping, mapping, sizeof(*mapping)); + memcpy(s->vdr[vdr_rpu_id], mapping, sizeof(*mapping)); } if (vdr_dm_metadata_present) { From patchwork Sun Jun 9 15:05:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49749 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052507vqo; Sun, 9 Jun 2024 08:07:10 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVoApFXh3tfZD0/CHXUqf3mzIoBMHCeqTzS5IbdiFkc1rR/Mf1QIOzC42I8Fi5xMnU84UL6fZ+eQkpXnbzZktoTeTVrDoHtriX4gA== X-Google-Smtp-Source: AGHT+IEP/bnk7HrkYkPGazNcTSs44QpFdYF1AyjuAU1wmRJjRr8CGPHqkvMSwgERvKoyFtmB3p0Y X-Received: by 2002:ac2:53a6:0:b0:52c:8517:c6ed with SMTP id 2adb3069b0e04-52c8517c80cmr1194854e87.0.1717945629926; Sun, 09 Jun 2024 08:07:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945629; cv=none; d=google.com; s=arc-20160816; b=G1Nj3+MCIEN/0dWonxBRe8ES3E3XZodXrtIvJ+iYv/+JJ34ZFjOW/G0JhNGsKEqrXn vNNANlo+SkL/8roo68UcfGnjhA4Zw/rIVAQliidN81v0sURqi2GAML6e2aqm3zPSA7T6 uWamlvSa0VNg5Mn1j40J/+JmhzuSKxyR/+vSR4VzwvjmbWKOdQdt4Hul4y6DRVLv/4xs 4+Rm8t77w29H5sAtil4Q0YAHYsjYwECYXddKvIkevfr6oZwz4jJm85kPOOnTVeXpcAsE /P+0JS1hLP9AMQUsMhUO/tY2NtJy0f3tkBuJfK1f4bkfC69ylkd3gC/zQ6XK13Gso1xb HBsA== 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=z4Np0JcMmjadOgNWs5HocJRLvKJMVoGrOdGzTKqpoXQ=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=MkTY+R2mRAn+Y6P9zSrVVyUiDRIFPZpE71c8MjRbxhloStDCsBv4NjlCkWt/zYVSmc q28F6lzPIWyvF3BBL/0AKuwENOYlYRgNJMSkV/zD1NJvAGmYOZP7vD0sL73ZNfLAqsn0 rZkSlr7xBAXoeXr1B2OeMVBOppqTq8xXBcR9Bx3c/EeoUqToIiOYDRhXd4FotZaJjor9 N2EiTDmCTr+AsRYDx/aaFA0ewW9VDm9u/+z357RN7wU29m+LPr5CmgKO+r4v73BsFJkx Ls9VJuxYeiuBJgvz8Q+Nok9QJcALqMuQwqiVeHOCVG8S1mR8g5oSGoInSZzJABHmJJOz dXmw==; 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=Svzmdfjb; 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 a640c23a62f3a-a6ef90b7708si192701566b.162.2024.06.09.08.07.09; Sun, 09 Jun 2024 08:07:09 -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=Svzmdfjb; 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 CBC4E68D5D7; Sun, 9 Jun 2024 18:06:13 +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 E424668D3FA for ; Sun, 9 Jun 2024 18:06:03 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1717945558; bh=2rvGyBMGm/dBr4RBitpc5iVv4caammGKqML30NiHWnE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Svzmdfjb2kCyoOHuv3aq9JOwGwTnpfFSTxSF2TsykYNOB5ROXkUoImy2yrwFxX2sM ZmMH2uscx+aOH8SpET7Ckv0XsYQMaGhxv6Yr311elTEwH1ERT/XaWSdG/94X623aK5 c44cv8T8W5BjyP2O9i6Hv4dop1W7+esdna29gIqA= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 2124542AC1; Sun, 9 Jun 2024 17:05:58 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:51 +0200 Message-ID: <20240609150553.72865-6-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 6/8] avcodec/dovi_rpu: guard ext blocks by 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: kZEjc7mEQsbK From: Niklas Haas In the spec, dm_metadata_present also toggles all extension blocks, so we need to move them inside the branch. --- libavcodec/dovi_rpudec.c | 25 +++++++++++++------------ libavcodec/dovi_rpuenc.c | 21 ++++++++++++--------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 51f824d126..064d74575f 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -613,22 +613,23 @@ 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 */ - s->num_ext_blocks = 0; - if ((ret = parse_ext_blocks(s, gb, 1)) < 0) { - ff_dovi_ctx_unref(s); - return ret; - } - if (get_bits_left(gb) > 48 /* padding + CRC32 + terminator */) { - if ((ret = parse_ext_blocks(s, gb, 2)) < 0) { + /* Parse extension blocks */ + s->num_ext_blocks = 0; + if ((ret = parse_ext_blocks(s, gb, 1)) < 0) { ff_dovi_ctx_unref(s); return ret; } + + if (get_bits_left(gb) > 48 /* padding + CRC32 + terminator */) { + if ((ret = parse_ext_blocks(s, gb, 2)) < 0) { + ff_dovi_ctx_unref(s); + return ret; + } + } + } else { + s->color = &ff_dovi_color_default; + s->num_ext_blocks = 0; } return 0; diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 8fceefe2c1..f7d11c9042 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -508,6 +508,8 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, vdr_dm_metadata_present = memcmp(color, &ff_dovi_color_default, sizeof(*color)); use_prev_vdr_rpu = !memcmp(s->vdr[vdr_rpu_id], mapping, sizeof(*mapping)); + if (num_ext_blocks_v1 || num_ext_blocks_v2) + vdr_dm_metadata_present = 1; if (vdr_dm_metadata_present && !s->dm) { s->dm = ff_refstruct_allocz(sizeof(AVDOVIColorMetadata)); @@ -657,18 +659,19 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, memcpy(s->dm, color, sizeof(*color)); s->color = s->dm; - } - - set_ue_golomb(pb, num_ext_blocks_v1); - align_put_bits(pb); - for (int i = 0; i < metadata->num_ext_blocks; i++) - generate_ext_v1(pb, av_dovi_get_ext(metadata, i)); - if (num_ext_blocks_v2) { - set_ue_golomb(pb, num_ext_blocks_v2); + /* Extension blocks */ + set_ue_golomb(pb, num_ext_blocks_v1); align_put_bits(pb); for (int i = 0; i < metadata->num_ext_blocks; i++) - generate_ext_v2(pb, av_dovi_get_ext(metadata, i)); + generate_ext_v1(pb, av_dovi_get_ext(metadata, i)); + + if (num_ext_blocks_v2) { + set_ue_golomb(pb, num_ext_blocks_v2); + align_put_bits(pb); + for (int i = 0; i < metadata->num_ext_blocks; i++) + generate_ext_v2(pb, av_dovi_get_ext(metadata, i)); + } } flush_put_bits(pb); From patchwork Sun Jun 9 15:05:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49750 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052594vqo; Sun, 9 Jun 2024 08:07:19 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVDpa1zPodUaCpw30wFNSmAO4gHrZW0JuHO/SEwnQwdGfQZlvHLA/01EUJrbES7MQ4ogb3Qb/DB6eHuA9FH2giW9AE+n85wu2S7wQ== X-Google-Smtp-Source: AGHT+IHIJekoNmiC4qxvY1szkJ7tDn4gUkAdHgZuxR/IJcSwUkq3IwbaWvb3QnhyU7vYJ2t0WLE9 X-Received: by 2002:a50:931a:0:b0:57c:6144:2dca with SMTP id 4fb4d7f45d1cf-57c61442e61mr2900068a12.9.1717945639577; Sun, 09 Jun 2024 08:07:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945639; cv=none; d=google.com; s=arc-20160816; b=YgFxywBkeM3j+n/k1sc3iyXuWHf7Zrxn1RgvwJp6hagIdREf/9zoHD87B1K8bmmGNn xafeGWM4obszItUhm4MjfKWc6CGNa7k8nDho/WtRZMkLVyfJl0cTQ1YvQEYR6QJfPUvj BECsG5WkRH8nwNEPYaqN4CWuXjB0blAjWP0kQbASGIH0WliG0vry3LaYHXSJh0u2Fx4a 12D7Fe9/1TETm+pafHFLNE4cF4Z2AvGLVPsPxclWz4PSl5LkXhJPV9uZQun8PZSH2AIB mCqleu0U/Oc2dnPm/Whqy/rMKfZvxIJxJZif0PpO1tBDqrU0GUoEReDcl00mQq+gQuD5 5HuQ== 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=430jRdwFU9ySmwlH0qQCJA9bmbRYM+SIaM2q+1g4o6c=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=w4hZxckzmC1eopHTbnUClf95HFB58rUg0wdeO2w4LM49/RR0n52jJdO/9Qu8eVEmRN IxHDSLB7vYYSQtxU71yCyDoLXyYSHTA9xmApcWWCQsRxiAAlznl9M+sbcPm5Fq6AiI4Y /OOFmpsj6d8vEUXTB+cNH5k3BymEAqhzm43DuvOBHPaaW5Jh0icykPzboku1sXA9p+v5 LKg4pUKWe1Us4h39DuiG/yZSSaE/ymuD1QjIM3fbHFZOnzzNeRvOr/W+LrV3mij17kvy BWrMwzoBMW7rZuv4fBIw42TbicSITbfIMKF7WeVJhGIeX1pVFuw1BKlLrGHKU21u+QIl gf3Q==; 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=AdGsbda9; 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 4fb4d7f45d1cf-57c6781e6besi1915504a12.103.2024.06.09.08.07.19; Sun, 09 Jun 2024 08:07:19 -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=AdGsbda9; 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 3938568D5FA; Sun, 9 Jun 2024 18:06:15 +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 E3B0E68D3A3 for ; Sun, 9 Jun 2024 18:06:03 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1717945558; bh=Du+iida1rErpDRc+CYfTSG6BzafPCMjWsovO7VqYsW4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AdGsbda9fuTqL28RsZVNudQ9kr0QiFPuowU0bKbeShqk+FEj6hrWvuITgz3wLCiX4 Vz3KUe/U6iHo2hFgGCrx2BH1kz7Kb2m2V9Q4TX8Mqb95mgD+SN3RQMi6xl3H0acc/y rkNv8CxAfMOYoA5Zu0A8eUU/dRLW3R91SdrOtbl0= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 5449943E93; Sun, 9 Jun 2024 17:05:58 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:52 +0200 Message-ID: <20240609150553.72865-7-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 7/8] avcodec/dovi_rpudec: reject reserved_zero_3bits != 0 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: ofjhGErpocmA From: Niklas Haas This is used by future versions of the spec to implement metadata compression. Given that we don't yet implement that spec, validate that this is equal to 0 for now. --- libavcodec/dovi_rpudec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 064d74575f..e947870d45 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -412,6 +412,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int bl_bit_depth_minus8 = get_ue_golomb_31(gb); int el_bit_depth_minus8 = get_ue_golomb_31(gb); int vdr_bit_depth_minus8 = get_ue_golomb_31(gb); + int reserved_zero_3bits; VALIDATE(bl_bit_depth_minus8, 0, 8); VALIDATE(el_bit_depth_minus8, 0, 8); VALIDATE(vdr_bit_depth_minus8, 0, 8); @@ -419,7 +420,8 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, hdr->el_bit_depth = el_bit_depth_minus8 + 8; hdr->vdr_bit_depth = vdr_bit_depth_minus8 + 8; hdr->spatial_resampling_filter_flag = get_bits1(gb); - skip_bits(gb, 3); /* reserved_zero_3bits */ + reserved_zero_3bits = get_bits(gb, 3); + VALIDATE(reserved_zero_3bits, 0, 0); hdr->el_spatial_resampling_filter_flag = get_bits1(gb); hdr->disable_residual_flag = get_bits1(gb); } From patchwork Sun Jun 9 15:05:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 49748 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp2052411vqo; Sun, 9 Jun 2024 08:07:01 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUQOuow4Tvuvu9y7bxxWXspCR1CNlgP4jYs6D19DH7PgSf70mEck2IOZUapZqqKQf2B4HKx8egiUpB4ZSAIBOHqlfwV1xogIuLiFw== X-Google-Smtp-Source: AGHT+IFNmgf/ArovNG+mBOYiyKgfCJ8yvNRcBnmM9V88dQc0JTDgFzn0jcNKq3SC8DfrDDJHH/jJ X-Received: by 2002:a2e:a9a8:0:b0:2e5:2aa1:a76a with SMTP id 38308e7fff4ca-2eadcebe531mr53284481fa.5.1717945620963; Sun, 09 Jun 2024 08:07:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717945620; cv=none; d=google.com; s=arc-20160816; b=XCk2UspnxfSsAN6Ml5ozgFiFvYrMv7VvoQwGFjaEmwtg6W5VYraWbFezecyv4gb1vZ tTDq9K/DsV/fXyFvW4k/pOQliCiLNUliLzPgwE0nVT0apNY/kJrajgKGcgzHqKxDL1eO 36cg5swJt/lSSqli8ux1wtpamJjqOAjan9Xk3sBKqEG0jFZcc0dmvIyngD8uy4Y6e7uH oyc7NMUIBcWwY/dU7zqdlcXcD1qDbOo8C64DUnWiv+SU7f9U3zVL0DDpdE3F09Fhdl4J p0JEJf5/8pxHRfde/roX/g3x1vZ3znCQBOf7VK+Q2r7upab0dQqfx7HoNycFIdILuB9b zngg== 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=57xv4Uoi7dDg1kz6dlijtH2v/vHlAmGScEbC37pVdVA=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=ZTQjqgL+3CKle0xBVHtQFiDMCnx2zfaGzvIfnckei49/6Hem/klTjUL/me9R91gCM6 V39S2jPCOWGEElat+WXYk4WTxNaf42KPw0urFLG4pRAMqo3csqf070gheFn/vv01voDZ QWVUhXulTGsJ2jARsMe7k8UnGGRGPmibE3I10eUyfJiww3MpBvbrODqnWYZ+CPaiigN/ ul+OYZb/GR/aBKrCZm3JHmufJw9GUGPjYFDgsqzeb424EjxkfGW8ykkcl4ESctQCQSeu eOljxLC6n3wYsYndfQvsNTUS9iE2Y4fYb1c7znwgeHLy6Fu9rYX7Rh/0kYqAwn1luXo2 zyLw==; 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=FKqZOGfi; 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 38308e7fff4ca-2ebe76e0bbasi1061601fa.26.2024.06.09.08.07.00; Sun, 09 Jun 2024 08:07:00 -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=FKqZOGfi; 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 940CA68D5C0; Sun, 9 Jun 2024 18:06:12 +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 E3FEB68D3AF for ; Sun, 9 Jun 2024 18:06:03 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1717945558; bh=xnivrQdoXUIvGi23B0bkOv/Mh/I3PBEEBX5DC1niKlM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FKqZOGfioja3NDYKTVSBc3VBq+Fsh/WZhorsSx2jxBoSucLHvIaAOBMbh/ypPV8eq CwKBtU2LBcTPZzuqyTcBJqDPH9wF2QA6E7S3Ras4x6dlBtulTAmOYSC/E3DwM5s1oF fOU9inmqyQPblppibGPuGb8kEbDxwBHdq2cXloxc= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 8B3E44418B; Sun, 9 Jun 2024 17:05:58 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jun 2024 17:05:53 +0200 Message-ID: <20240609150553.72865-8-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 8/8] avcodec/dovi_rpudec: handle errors consistently 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: VHa7xDqxk4Wx From: Niklas Haas Only flush state when we started parsing data, otherwise just error out. Remove the 'fail' label to make this a bit less confusing to read. --- libavcodec/dovi_rpudec.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index e947870d45..72e4add618 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -123,7 +123,8 @@ static inline unsigned get_variable_bits(GetBitContext *gb, int n) if (VAR < MIN || VAR > MAX) { \ av_log(s->logctx, AV_LOG_ERROR, "RPU validation failed: " \ #MIN" <= "#VAR" = %d <= "#MAX"\n", (int) VAR); \ - goto fail; \ + ff_dovi_ctx_unref(s); \ + return AVERROR_INVALIDDATA; \ } \ } while (0) @@ -306,7 +307,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, uint8_t profile; if (rpu_size < 5) - goto fail; + return AVERROR_INVALIDDATA; /* Container */ if (s->cfg.dv_profile == 10 /* dav1.10 */) { @@ -360,7 +361,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, } if (!rpu_size || rpu[rpu_size - 1] != 0x80) - goto fail; + return AVERROR_INVALIDDATA; if (err_recognition & AV_EF_CRCCHECK) { uint32_t crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), @@ -368,7 +369,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, if (crc) { av_log(s->logctx, AV_LOG_ERROR, "RPU CRC mismatch: %X\n", crc); if (err_recognition & AV_EF_EXPLODE) - goto fail; + return AVERROR_INVALIDDATA; } } @@ -439,7 +440,8 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, profile = s->cfg.dv_profile ? s->cfg.dv_profile : ff_dovi_guess_profile_hevc(hdr); if (profile == 5 && use_nlq) { av_log(s->logctx, AV_LOG_ERROR, "Profile 5 RPUs should not use NLQ\n"); - goto fail; + ff_dovi_ctx_unref(s); + return AVERROR_INVALIDDATA; } if (use_prev_vdr_rpu) { @@ -453,7 +455,8 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, * out as this corner case is not hit in practice */ av_log(s->logctx, AV_LOG_ERROR, "Unknown previous RPU ID: %u\n", prev_vdr_rpu_id); - goto fail; + ff_dovi_ctx_unref(s); + return AVERROR_INVALIDDATA; } s->mapping = s->vdr[prev_vdr_rpu_id]; } else { @@ -462,8 +465,10 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, VALIDATE(vdr_rpu_id, 0, DOVI_MAX_DM_ID); if (!s->vdr[vdr_rpu_id]) { s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(AVDOVIDataMapping)); - if (!s->vdr[vdr_rpu_id]) + if (!s->vdr[vdr_rpu_id]) { + ff_dovi_ctx_unref(s); return AVERROR(ENOMEM); + } } s->mapping = mapping = s->vdr[vdr_rpu_id]; @@ -635,8 +640,4 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, } return 0; - -fail: - ff_dovi_ctx_unref(s); /* don't leak potentially invalid state */ - return AVERROR_INVALIDDATA; }