From patchwork Sun Jul 28 10:25:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50796 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:16f:b0:489:2eb3:e4c4 with SMTP id h47csp599141vqi; Sun, 28 Jul 2024 04:21:55 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVACSiVXZTgdVDHxMr9LS/1ewgbQtj9VgAX0rHxrSUZJE4fDGctj+MnL/xwEVmMrO/7ZwlQvA/adXVIWYfgGXGSfGW5Sqqpts+DLg== X-Google-Smtp-Source: AGHT+IFfJlYzymwMBUF9vN7Xs7L2ExtEliGoGZspfIJltlKhoE4VWWPiZutQgpOJaCLYvHidsgL9 X-Received: by 2002:a17:907:3f1f:b0:a7a:a33e:47bf with SMTP id a640c23a62f3a-a7d3f89a1bbmr476459566b.18.1722165715219; Sun, 28 Jul 2024 04:21:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1722165715; cv=none; d=google.com; s=arc-20160816; b=M+cUAyLvVEp5mXcrgJS3d566QFpQSd86mT+rByt2q1/aFBoNnGkTG6IokM9T3kGJ58 51D1s+t7wxksz7adgIc4/9zDJ+tmTnRHVn8TFx3f3qrQlNNXj9s1McsyiUosqkoDru65 ZqnfDNHzJKlBaS4KUxicXqLkNNnOeLKylPyjNbxLN6hW+K7TTFvLA94Kt8qVEnNdzIz9 ZwQYoD/u5mGjyPoKBNGRoIngdP3yF5oU0djd6/CYqkT8DrI/v+qOUSyU4rZaofsq6c/l TRogxvsIRXAwm/sQisQU1hpFjxcE8B7/ZlXJXvyXlcU4WSxXG4QwoQEYYeZ5FUNUVgy7 yjyQ== 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=SUrUe8AHp0jcuzhx0ZJnIx2ZTaRJjooy8n9wDKIMZ/k=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=Kv9SqttWshXYmtREvyTenn6I2gBbxz9YCe2fo5dz88kq/SuTpuGkGoUsmE2xLhgqkD Q1mr93rU+8t7oTgWKkJTq+vQxpJtb4lF29JmaSsXN2euvLACDuJ+kCDG5Thuy6h44qtH AyC3t9XkXugHgGL/792CRigPwQN/WUQ9zNnd0swqwrTsaAlmgPnCfAMbuv47GkKEcUEY kIrzIPJIzPdSP/2wAHBHzIzNofI907QkNI/Gf7ayEnotDaQkSz6IKMvkdLVO75DMRwiH kc+831po2VGvweTeOy8256IbLxIYB0oSeoX/4PiSbyerVGu01ueyRFs7lXXQE+ASJA1f /tIQ==; 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=s6qcNG9g; 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-a7acac60252si503248866b.562.2024.07.28.04.21.54; Sun, 28 Jul 2024 04:21:55 -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=s6qcNG9g; 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 520D068D992; Sun, 28 Jul 2024 13:26:06 +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 8B63E68D911 for ; Sun, 28 Jul 2024 13:25:41 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1722162338; bh=fIGbvp1jm4NauSbnM3jq9A/sVC8tAfmOiYUKYdNFcm0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=s6qcNG9gYbh9MSA/ISzn6T0luXKiGNAelz5SnvsiziRPkic525vEVSH2JrrrHK0b9 IxfsfspAisDq7zD9jI7+0OhMuwSwa8Y462/2CbE6a6aDE7sGYxkulxkl4GmUYqzoC9 kMt/upR2+0vyd9qfUD/AsW4RX1LpFe7NXycPhgMM= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 0393D42FF8; Sun, 28 Jul 2024 12:25:37 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Jul 2024 12:25:18 +0200 Message-ID: <20240728102527.17991-13-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240728102527.17991-1-ffmpeg@haasn.xyz> References: <20240728102527.17991-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/22] avcodec/dovi_rpu: move ext blocks into dedicated struct 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: E6p9f3Ys15CL From: Niklas Haas Slightly re-organize the logic around extension blocks in order to allow expanding the state tracking in a following commit. --- libavcodec/dovi_rpu.c | 1 - libavcodec/dovi_rpu.h | 9 +++++++-- libavcodec/dovi_rpudec.c | 35 ++++++++++++++++++++++------------- libavcodec/dovi_rpuenc.c | 16 +++++++++------- 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index b67978403f..5130a9598d 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -66,7 +66,6 @@ void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0) 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); - s->num_ext_blocks = s0->num_ext_blocks; } int ff_dovi_guess_profile_hevc(const AVDOVIRpuDataHeader *hdr) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 24a8353bdc..ed5bfa7b26 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -31,6 +31,12 @@ #include "codec_par.h" #define DOVI_MAX_DM_ID 15 + +typedef struct DOVIExt { + AVDOVIDmData dm[AV_DOVI_MAX_EXT_BLOCKS]; + int num_dm; +} DOVIExt; + typedef struct DOVIContext { void *logctx; @@ -70,8 +76,7 @@ typedef struct DOVIContext { * Currently active extension blocks, updates on every ff_dovi_rpu_parse() * or ff_dovi_rpu_generate(). */ - AVDOVIDmData *ext_blocks; - int num_ext_blocks; + DOVIExt *ext_blocks; ///< RefStruct, or NULL if no extension blocks /** * Private fields internal to dovi_rpu.c diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 0ddc923539..1650547c80 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -33,7 +33,7 @@ int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata) { AVDOVIMetadata *dovi; - size_t dovi_size, ext_sz; + size_t dovi_size; if (!s->mapping || !s->color) return 0; /* incomplete dovi metadata */ @@ -47,10 +47,14 @@ int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata) COPY(AVDOVIRpuDataHeader, av_dovi_get_header(dovi), &s->header, ext_mapping_idc_5_7); COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq_pivots); COPY(AVDOVIColorMetadata, av_dovi_get_color(dovi), s->color, source_diagonal); - ext_sz = FFMIN(sizeof(AVDOVIDmData), dovi->ext_block_size); - for (int i = 0; i < s->num_ext_blocks; i++) - memcpy(av_dovi_get_ext(dovi, i), &s->ext_blocks[i], ext_sz); - dovi->num_ext_blocks = s->num_ext_blocks; + + if (s->ext_blocks) { + const DOVIExt *ext = s->ext_blocks; + size_t ext_sz = FFMIN(sizeof(AVDOVIDmData), dovi->ext_block_size); + for (int i = 0; i < ext->num_dm; i++) + memcpy(av_dovi_get_ext(dovi, i), &ext->dm[i], ext_sz); + dovi->num_ext_blocks = ext->num_dm; + } *out_metadata = dovi; return dovi_size; @@ -279,20 +283,24 @@ static int parse_ext_v2(DOVIContext *s, GetBitContext *gb, AVDOVIDmData *dm, static int parse_ext_blocks(DOVIContext *s, GetBitContext *gb, int ver) { int num_ext_blocks, ext_block_length, start_pos, parsed_bits, ret; + DOVIExt *ext = s->ext_blocks; num_ext_blocks = get_ue_golomb_31(gb); align_get_bits(gb); - if (s->num_ext_blocks + num_ext_blocks > AV_DOVI_MAX_EXT_BLOCKS) - return AVERROR_INVALIDDATA; - if (!s->ext_blocks) { - s->ext_blocks = ff_refstruct_allocz(sizeof(AVDOVIDmData) * AV_DOVI_MAX_EXT_BLOCKS); - if (!s->ext_blocks) + if (!ext) { + ext = s->ext_blocks = ff_refstruct_allocz(sizeof(*s->ext_blocks)); + if (!ext) return AVERROR(ENOMEM); } while (num_ext_blocks--) { - AVDOVIDmData *dm = &s->ext_blocks[s->num_ext_blocks++]; + AVDOVIDmData *dm; + + if (ext->num_dm >= FF_ARRAY_ELEMS(ext->dm)) + return AVERROR_INVALIDDATA; + dm = &ext->dm[ext->num_dm++]; + ext_block_length = get_ue_golomb_31(gb); dm->level = get_bits(gb, 8); start_pos = get_bits_count(gb); @@ -666,7 +674,8 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, color->source_diagonal = get_bits(gb, 10); /* Parse extension blocks */ - s->num_ext_blocks = 0; + if (s->ext_blocks) + s->ext_blocks->num_dm = 0; if ((ret = parse_ext_blocks(s, gb, 1)) < 0) { ff_dovi_ctx_unref(s); return ret; @@ -680,7 +689,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, } } else { s->color = &ff_dovi_color_default; - s->num_ext_blocks = 0; + ff_refstruct_unref(&s->ext_blocks); } return 0; diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 25e520dd92..667d681c25 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -583,7 +583,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } if (metadata->num_ext_blocks && !s->ext_blocks) { - s->ext_blocks = ff_refstruct_allocz(sizeof(AVDOVIDmData) * AV_DOVI_MAX_EXT_BLOCKS); + s->ext_blocks = ff_refstruct_allocz(sizeof(*s->ext_blocks)); if (!s->ext_blocks) return AVERROR(ENOMEM); } @@ -717,7 +717,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } if (vdr_dm_metadata_present) { - size_t ext_sz; + DOVIExt *ext = s->ext_blocks; 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 */ @@ -756,13 +756,15 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, generate_ext_v2(pb, av_dovi_get_ext(metadata, i)); } - ext_sz = FFMIN(sizeof(AVDOVIDmData), metadata->ext_block_size); - for (int i = 0; i < metadata->num_ext_blocks; i++) - memcpy(&s->ext_blocks[i], av_dovi_get_ext(metadata, i), ext_sz); - s->num_ext_blocks = metadata->num_ext_blocks; + if (ext) { + size_t ext_sz = FFMIN(sizeof(AVDOVIDmData), metadata->ext_block_size); + for (int i = 0; i < metadata->num_ext_blocks; i++) + memcpy(&ext->dm[i], av_dovi_get_ext(metadata, i), ext_sz); + ext->num_dm = metadata->num_ext_blocks; + } } else { s->color = &ff_dovi_color_default; - s->num_ext_blocks = 0; + ff_refstruct_unref(&s->ext_blocks); } flush_put_bits(pb);