From patchwork Mon Jun 24 17:20:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50134 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2155353vqz; Mon, 24 Jun 2024 10:20:59 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUj4bBSYgKAHxSq7r52IrZsc8qhmUIbIki8MpReylxShn/fnzDa5bGv1Y2C9cSJH9sfcErQPqZRJStZYzDiybXznQjvlRZZxzIHGw== X-Google-Smtp-Source: AGHT+IFKfdDlJQ0mU/t4xHTJU5cSigdPyN8Jgjq/D9QXioEC3FLiQOY91uHkxmwcWXjWTnGz+VCY X-Received: by 2002:a50:9b54:0:b0:57c:5f22:f9c1 with SMTP id 4fb4d7f45d1cf-57d4bd80f7emr3055319a12.21.1719249659508; Mon, 24 Jun 2024 10:20:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249659; cv=none; d=google.com; s=arc-20160816; b=h1BaDnM+CoWXB6M05K6mqbpkrYOn8zu5hO9OObP9Gx7Ps4QsTnHCui5kuutYCQjZlt 3LIkIbEIF9U3LlMNdOUdKQh0wF+hVQHlI08jh/te9ZhN5rj/QV6xjboupXZNaxLA4xbn ujJiwiHKOTMaEmgGLURQSA9Kt+8C3NO2TpRtDbbxgK857lppo8lTwwS3o7OJpsGi9XeP 2DEMqnfOwPDZJ1KFjKW+0m18rpWYWVKH/CvBnOCK7WYY+pWRbarprZP57s3TQ1yzGUa2 ObQa+GWob16QL9NFMqOAgnShJqgYMRO92aPhqjVVWb18nOLVtnAelSov2z0bfzKNAQRq LfSw== 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=/sWOP9PmFIGfVLefyoml+tVDMbt5Rdv2ynUY88KXyII=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=yrQ6oAkphXst23NB8M4Dn7n708+zNvygt2xuatPkpdy3Pu7UCzABQrD5o0etS33r+m 69ymwzzuXIeZz3nrCYmVWIw8aZNFEFFEU822bZFiFcp3qEM4HsM+UeIyRlkf+JdFGty0 c4/g6w7kRGYBcfWZqp87cJEXy8q9Ixi040r1pZedvyXgzfwwXbTZeJREBPNZtottrJDO U7QBUEeTzTMgyL7fGd1IHkjDVcJPJn8fZ1pUFi42DQ4SAM5bB8rPoXoy1SxHb6905c45 bKzs+hfZJbWZmkHgZtMSrY6aUrwaActoAcOP7EUwaT2ZQqDO85zKxAr3UrjjjHUJv2Ra CvQQ==; 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=aSWZZ6Ed; 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-57d306c6861si3757979a12.381.2024.06.24.10.20.59; Mon, 24 Jun 2024 10:20:59 -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=aSWZZ6Ed; 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 9C95068D4CF; Mon, 24 Jun 2024 20:20:56 +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 1F25868C0DC for ; Mon, 24 Jun 2024 20:20:48 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249647; bh=bjbKLqsS/OkOVZ2AIrHi6YPDKUQ/v37jWtrz/Npth5U=; h=From:To:Cc:Subject:Date:From; b=aSWZZ6EdCxZDISoPmwTNh3Af7QJNuIj1y4iudsyQfgkVkhuARTHv4XAZC5caJ/+a7 LTEhHvpDUJWK7KgrKXHKHuqjzZtZ0XXFeWAln1iHJ3wBwvrttZvMosXUMGBWALLiaH E4F5Q/THjO3QDLMgQW/Rr+Q4a/26fOuCmbwityJQ= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id D4D5240675; Mon, 24 Jun 2024 19:20:47 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:36 +0200 Message-ID: <20240624172044.101722-1-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/9] avcodec/dovi_rpudec: clarify semantics 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: uwJ6aEGBGrni From: Niklas Haas ff_dovi_rpu_parse() and ff_dovi_rpu_generate() are a bit inconsistent in that they expect different levels of encapsulation, due to the nature of how this is handled in the context of different APIs. Clarify the status quo. (And fix an incorrect reference to the RPU payload bytes as 'RBSP') --- libavcodec/dovi_rpu.h | 5 +++-- libavcodec/dovi_rpudec.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index bfb118d6b5..205d16ffbc 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -95,8 +95,9 @@ void ff_dovi_ctx_unref(DOVIContext *s); void ff_dovi_ctx_flush(DOVIContext *s); /** - * Parse the contents of a Dovi RPU NAL and update the parsed values in the - * DOVIContext struct. + * Parse the contents of a Dolby Vision RPU and update the parsed values in the + * DOVIContext struct. This function should receive the decoded unit payload, + * without any T.35 or NAL unit headers. * * Returns 0 or an error code. * diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index c025800206..375e6e560b 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -360,7 +360,7 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, emdf_protection = get_bits(gb, 5 + 12); VALIDATE(emdf_protection, 0x400, 0x400); } else { - /* NAL RBSP with prefix and trailing zeroes */ + /* NAL unit with prefix and trailing zeroes */ VALIDATE(rpu[0], 25, 25); /* NAL prefix */ rpu++; rpu_size--; From patchwork Mon Jun 24 17:20:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50135 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2155455vqz; Mon, 24 Jun 2024 10:21:10 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV0MJyr5HsDGQr8Tj091m+dRlKmeTuK4Fa2F2WappgXd3KbG41tsNXt88ZRJoO9SttYdvdVWjtaeHCRB0o0065+iaWjCxkyNHSN1Q== X-Google-Smtp-Source: AGHT+IEEy1u7iUmbXk9QB65b4mvHmHZzQMzGHlRbAQcaEQPTORr1g4Vco4eywfGNDvkJ7/E+8GeK X-Received: by 2002:a50:ab5c:0:b0:57d:12c3:eca6 with SMTP id 4fb4d7f45d1cf-57d457943bcmr3897865a12.18.1719249669802; Mon, 24 Jun 2024 10:21:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249669; cv=none; d=google.com; s=arc-20160816; b=QuMXUV7djEGLEbGGXIgR7bYyvFN0c+NYiwS3e2hswfS4+3Jw6EUF4udas5EJMhP5ol osqK+9zj9nvExW123qWzgOwlDWR4wE5UBO2e8NC8CZRsqx7OSLoS104dSR0ndp1HeClT zxizs4BtTLA5JszMoC2z0ain/noxfSQhqT/7JC9/IM3VUuALqPsb9RmVa2Y4HluBULQi ux8F0GajiGEJ4XKhcVGC+pILgG6YJXP41u2vJ8X32YtMup2Iexr4+rjW1sS68YH+V7A8 4LJcw299t2gWJGltwmvxkqZmSdqsCSHxfOvRemECB3aEnEVsUqgAmaDpmLnoJWUKDrHM UxQg== 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=ma5TfOA02yQ2nthuJgZKQ94Xc00dKUcffhx+8ekO+oY=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=uGERHbXBmBRX8rsNSWdFDno1rL/UE9ZOYiX2oGgfE2gpFwFK0ySazDKIOiY/TNCCyR blRRrCbajXtT9SdDXAWhHaI8/NxMJ+9gr6ONiNy2x4eJokTBKstAsrGaVPK4HrIRYRV0 LfedHeEWtgIJ5uRRcI+fj+srItDLytNeGNRMWkGNKc+tkO5LAUrkPqwgsHQGJ/Rtqnj2 C1vzIAdkmtiYNZyMirkJEDSwevWbvuH4T5q1YJo2TgR7UewcjgDydwUa27nJcKdsW1I5 OLjC9aMeoqtwNybg1D/T20p1Nm9WG9YtPrsSIvp8Sq198VZ4ht5qGcyEzBI6lUu+Ukw4 TzcQ==; 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=NFCr2NGb; 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-57d30643348si3857221a12.159.2024.06.24.10.21.09; Mon, 24 Jun 2024 10:21: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=NFCr2NGb; 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 C5F4B68D5B8; Mon, 24 Jun 2024 20:20:58 +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 54D1468D412 for ; Mon, 24 Jun 2024 20:20:48 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249648; bh=MrP/OLeSDGLdjQxHBAHE6GFE/+CEqyRTt3sMxb2Y2Ho=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NFCr2NGbCZWoDD91efS64lXHFGaXZ2bIXaMxqs1FDGhqZZC/kMaWbjiBscc/Q1zuW HJGZ07tcBMZHZNF8w0WYiuVSqCyj9Fo9XaJ50/d4pTUKtzZDoqcLleAyzm+IvSl9n1 mRob7Osq560KA/D5k9VgyBYu8WAlqPwS3h0kiwEY= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 1A9864079C; Mon, 24 Jun 2024 19:20:48 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:37 +0200 Message-ID: <20240624172044.101722-2-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/9] avcodec/dovi_rpuenc: also copy ext blocks to dovi ctx 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: YvUCrjx+MRcj From: Niklas Haas As the comment implies, DOVIContext.ext_blocks should also reflect the current state after ff_dovi_rpu_generate(). Fluff for now, but will be needed once we start implementing metadata compression for extension blocks as well. --- libavcodec/dovi_rpuenc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index a14c9cc181..f0cfecc91b 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -506,6 +506,12 @@ 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); + if (!s->ext_blocks) + return AVERROR(ENOMEM); + } + 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) @@ -636,6 +642,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } if (vdr_dm_metadata_present) { + size_t ext_sz; 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 */ @@ -673,6 +680,11 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, for (int i = 0; i < metadata->num_ext_blocks; i++) 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; } else { s->color = &ff_dovi_color_default; s->num_ext_blocks = 0; From patchwork Mon Jun 24 17:20:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50136 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2155557vqz; Mon, 24 Jun 2024 10:21:20 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCURwx1tEYNSpTZtnmxFBxSeya4a26dhBHWDOiKNO74fPAHaRbK0zA1jCGbses9ZC96PDNivMavpsKnPqRCiAmCasMKJ3qZNtL3ZjQ== X-Google-Smtp-Source: AGHT+IGIWFDbzenpdxebgIvu15GP4xY+ugWui3HLkuf7HANZiXj4iOfdhfPiKuLUCzhOXUj7oswZ X-Received: by 2002:a50:a417:0:b0:57a:4c22:c0 with SMTP id 4fb4d7f45d1cf-57d4bd6060amr3033508a12.10.1719249680301; Mon, 24 Jun 2024 10:21:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249680; cv=none; d=google.com; s=arc-20160816; b=dc1rCXs7ODsmFXKgS23O8NZvtqX/61SyXVYNOyS7Nd7bQNV+pI1aH3QxjB39VMwbox bch/qgbn9OOkN5mHe2al61kbI8QX2iT20D5ZYKAomTSPRmwuyqKNYAJOWwLLrE58QEb4 JmV+8mDWTmQD70oW+CR52k1+dRKqsY3C22jTohkECjIcabFw+cvM7lH7YkBirVCuLO2x rIkJ2odepvMjp78M14x5BTdP6BpXQC21ce/sc90e1ASjwfsXvPCFcqTZWliwx1D8Loyh Dax520NNVvbcae9+LaJeYDh3VzOQaG6p8o/La0tsTx/ANfT57RdzYS3lxN+f4gVxM5wM t3FA== 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=UtrHcARtGYyGHSXzgsMmMGuGsnYKug3RsSjONgcG/nU=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=KvlwsUzjUSQmGmBuJMnLMzQIa1MUVr9nAbXRuTF2YRA5mJ/4I0WIfYh5bvuWhuBdjC wmcUSY4xirdimJJcpNKw/hDAFrMInaE3LgLZBnvOY8eTOeL+otTFYITFk656yB+3cAkk KcZFhLyvw0L9FOXY8BFyS1iGJ9Uc+5vhLyssBT1kdsbwOKPV8XKMgJxvPF/byJrlbE0Z ZH+IL7phhI/7fxANKgI80hIyIYA0uvKk4q2S5v47mMXKfjeB+xtMwXtBrc2+fSXopgjN kXQc9LvHm+BFq2xUp8WheCslWVyHHRkuww8WkMZGOAyvgfgmrVvXTW4o8F96zbhf1PBX JeUA==; 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=Js47CUq+; 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-57d33f66a44si3525211a12.185.2024.06.24.10.21.20; Mon, 24 Jun 2024 10:21:20 -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=Js47CUq+; 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 40E8368D5FB; Mon, 24 Jun 2024 20:21:00 +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 8F71568D412 for ; Mon, 24 Jun 2024 20:20:48 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249648; bh=M+ZjfHnMd6l7bJLwWsj2IRsOb57xEgyhT3jo/yNz1W0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Js47CUq+vLN3clDfMDVvuTI4VBe4MKKXqBRK9+KowxhEWO0E0UHM0bBqVnOe1i6rA suomFln+Dy3IMwBY3fmOWZZTkzwXJbTLbDzRRAI02Vn9VQzvB370VIVl7MPolqJG2H k25tHvTPguqtJf217PFLzn1PISbezwWb47ZbE9ac= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 50FF6429DE; Mon, 24 Jun 2024 19:20:48 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:38 +0200 Message-ID: <20240624172044.101722-3-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/9] avcodec/dovi_rpuenc: try to re-use existing vdr_rpu_id 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: wnisntxDMqpx From: Niklas Haas And only override it if we either have an exact match, or if we still have unused metadata slots (to avoid an overwrite). --- libavcodec/dovi_rpuenc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index f0cfecc91b..30b6b09f1d 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -463,12 +463,12 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, return AVERROR_INVALIDDATA; } - vdr_rpu_id = -1; + vdr_rpu_id = mapping->vdr_rpu_id; for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { 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)) { + } else if (s->vdr[vdr_rpu_id] && !s->vdr[i]) { vdr_rpu_id = i; } } From patchwork Mon Jun 24 17:20:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50137 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2155654vqz; Mon, 24 Jun 2024 10:21:30 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXIml7x/B56eA7Z4y/7Ef8ElfWj/1rRMDxi0Ri3icQUxG0LVpznWK6sLqJrc+7E+5D6LZ2xE2S7oPcj/QT+IWwqDUuWBrx67iOR/A== X-Google-Smtp-Source: AGHT+IFfTb/cC8BlrrkfoWhnPSXSz8iH6yiZtSW31NDVngpg8G/a/7PLotfYoXuTJY1//dqK64Qr X-Received: by 2002:a17:906:c78c:b0:a6f:da1:d077 with SMTP id a640c23a62f3a-a7242c39b60mr411865966b.25.1719249689864; Mon, 24 Jun 2024 10:21:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249689; cv=none; d=google.com; s=arc-20160816; b=XSEcwtK3Ir/fX20fnMuk6lCDgGjni8SbH99G2IIQ2B51RH4lazx3bETzKbqyzFYM/E uRcnPrMamhNriE+qgsu09n91ccsBR63LQBP34YIxjjMt01L8RuPsEOq1eTwRPzITXVq8 IBz563ytpVeqN4B26v/hoin7iZhETpmbpwoPz2KArxGKnbwdrakl3f2j7HaqqUcBnd/8 dL5YzY77PU2Dqe6KZ0dp9afL/vkpiATkMcs7IB8fqCQQ5zDciy7qeZNwTZcCYv1GO6ie JMpaLFCoK0giw73TdvV53mVZGf69BmPwthgGQv3P5GGGqCBolLvrjLmhVRH1IlnIpqeO 8iYQ== 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=pUBgJCxYxdSk82Fdn1s4WRhav8x0ZTCLtQ64Rg68KnY=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=T3gfcke4KKZHGvHSfhdTsioNxCZIw3BDJflVpXaudXcMn1ACxz2HAtlNr/bJBwqvc8 PlXxW6/sskGYHsOFUmhTR+2EAA7QUvKKnDSAg8bwirSrDRT6cZ6nfw4quEB4OW38J5/j i/B+FTqYiDblP+avZngUdU693MpCSubYFqophTQhxKeGgeVCRbTEOM0cdvKbj6RTxwO/ EZwyx4LDefZMWwIY69/IXxIglGnfm5G+QdJ+YOeURAR5Nh6HW4sOpcQi45NyyDRRtq7G 5m016kEJUcwH7CZIEJsrc4ZppR/SZGenYcX54VByxllSfrVIy7FjruUVFRG02B4upzkh vTqw==; 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=M3W6pu2W; 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-a725fd1ff0bsi53669466b.718.2024.06.24.10.21.29; Mon, 24 Jun 2024 10:21:29 -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=M3W6pu2W; 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 502F268D621; Mon, 24 Jun 2024 20:21:01 +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 B418F68D4AF for ; Mon, 24 Jun 2024 20:20:48 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249648; bh=9eKmsvqOu88j3SccR45+kOgyYohtNs8pu4Kpmk0b12c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M3W6pu2W4fqfLcb0L54CT81p2w8gQtrgRpOq1jayzy0TP19vI0EYRWm06e4YL46hf TUlwUkmRTVupsAou43QWTFjaAHVkqlYuX4bwoSXAToJRtwLzazDsg8ckh25X6c8znL JV1cQnG1Bffhd4fqYrOrIUV02xtuvKp2peFgnrjM= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 867E343E93; Mon, 24 Jun 2024 19:20:48 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:39 +0200 Message-ID: <20240624172044.101722-4-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/9] avcodec/dovi_rpuenc: allow changing vdr_rpu_id 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: Fh7YLzvwlaQY From: Niklas Haas The version as written also compared the vdr_rpu_id field, which would defeat the purpose of trying to look for a matching slot in the first place. --- libavcodec/dovi_rpuenc.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 30b6b09f1d..f10e175350 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include "libavutil/avassert.h" #include "libavutil/crc.h" #include "libavutil/mem.h" @@ -201,6 +203,15 @@ skip: return 0; } +/* compares data mappings, excluding vdr_rpu_id */ +static int cmp_data_mapping(const AVDOVIDataMapping *m1, + const AVDOVIDataMapping *m2) +{ + static_assert(offsetof(AVDOVIDataMapping, vdr_rpu_id) == 0, "vdr_rpu_id is first field"); + const void *p1 = &m1->vdr_rpu_id + 1, *p2 = &m2->vdr_rpu_id + 1; + return memcmp(p1, p2, sizeof(AVDOVIDataMapping) - sizeof(m1->vdr_rpu_id)); +} + static inline void put_ue_coef(PutBitContext *pb, const AVDOVIRpuDataHeader *hdr, uint64_t coef) { @@ -465,7 +476,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, vdr_rpu_id = mapping->vdr_rpu_id; for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { - if (s->vdr[i] && !memcmp(s->vdr[i], mapping, sizeof(*mapping))) { + if (s->vdr[i] && !cmp_data_mapping(s->vdr[i], mapping)) { vdr_rpu_id = i; break; } else if (s->vdr[vdr_rpu_id] && !s->vdr[i]) { @@ -639,6 +650,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } memcpy(s->vdr[vdr_rpu_id], mapping, sizeof(*mapping)); + s->vdr[vdr_rpu_id]->vdr_rpu_id = vdr_rpu_id; } if (vdr_dm_metadata_present) { From patchwork Mon Jun 24 17:20:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50138 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2155741vqz; Mon, 24 Jun 2024 10:21:40 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVa1RcJoQOds9KzAjy+B37ZMCPGAvbbhaA8C9XiEltLVaWC6Zu2dW+Y4RLWuUWNTJ4IJ2HCNWyNZeIocN54SjXTwvJ7jeTK++Jyaw== X-Google-Smtp-Source: AGHT+IHcHvUUSlZvdQHSRKOmtu5UrS9zzjqZ3P7k7RkFwRFwBFtWV9qv2Y+OlE6LBsu1ZHr60xo5 X-Received: by 2002:a17:906:a2da:b0:a6f:61c7:dea7 with SMTP id a640c23a62f3a-a7245ccdab7mr320147266b.18.1719249700542; Mon, 24 Jun 2024 10:21:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249700; cv=none; d=google.com; s=arc-20160816; b=Oq7WUv/xgrPsV/YvFrrP2wlCjz7vIoKSoC/QmScR80r3+QUMcqZ3sL+m8ELqUIe1hO OZWRrj4T9sFHYrhs1cstH6qPe7OF/kFR6T7omOI0SeHIsYQOp8GAhwrWS5fBiHrLjWpx FQ9UMDqrWlq+XV9CMLhJUReIqUr4KxdgPuZMlPlio6/Wrx5+cx16ImxDtuf0Ng3gBmwT YbLoq0B2GoPPE0a/b56xd/iuVRRB5h2UZN3r13C5TqJkri77eFRHu0Xiqyi/KfDBnJ12 1TAcSL7rZXzOiUoFh85Ept6lgOq/nk+ftMkEJgy636nq8GwlMVD5VURYDSUN4JW4l12F pNJQ== 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=gX/28dveE2U8st7EdkFziZT64Wy7+b6JxCWGZGts8IQ=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=PQrt2O5u9VcKgSGbjxg+jKB61E9G/VDfhZ1ltKH9oKxCYReAjwDdWCUyKG+wgH7J4u tz+aK84UqLxYIsRVQWPcYhUuLd0Pfk/1Ce6qlwK6pai6EDQIlCvfghT1fUXxbgtCokos Kj6IuocfhXcgbkYYU9T6wF7sNjv5OOohVj5DINBhAtpShSuOK9nUp6mfO3GipgEyganj J/9zKg1aAU5eYKoyanIoVFyTP0IFoEA4adG8sV9k7XvQRkqAlcN0imkAkHrE0qyrCpN3 rcjGrazQXifX08JNf8MIqurU4J7Ptk1m0nWnYbfE2Hx7FDn4oTMEr5yJNu9y5xdTjBs2 9jxA==; 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=txodpCLq; 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-a6fe0ca3898si298649466b.1042.2024.06.24.10.21.39; Mon, 24 Jun 2024 10:21:40 -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=txodpCLq; 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 B9EB668D62B; Mon, 24 Jun 2024 20:21:02 +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 0587E68D4AF for ; Mon, 24 Jun 2024 20:20:49 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249648; bh=n4jwPX0blDZon0Hhwl4R9SIUyrJ8KAzEZzVYUr8Zt9g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=txodpCLqp9z/nPmzWvCbshqfOw192Pw4+TIkaxatV2Wfu5bqTWjR5f7UaSYBy8pRU afewJhPLuJ8MhVy/8N/AJ1aJzz5gsrYAdlJbXThXlHDjlHT8yp0snokhMGZfZ+6Cq1 wsL3g3OgQZlr4lohXxNOdQZlLaGuiFxiEqAuhGLU= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id C147946D5F; Mon, 24 Jun 2024 19:20:48 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:40 +0200 Message-ID: <20240624172044.101722-5-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/9] avcodec/dovi_rpuenc: add `flags` to ff_dovi_rpu_generate() 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: VMk+2Zy0ExeN From: Niklas Haas Will be used to control compression, encapsulation etc. --- libavcodec/dovi_rpu.h | 2 +- libavcodec/dovi_rpuenc.c | 2 +- libavcodec/libaomenc.c | 2 +- libavcodec/libsvtav1.c | 2 +- libavcodec/libx265.c | 3 ++- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 205d16ffbc..65a4529106 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -135,7 +135,7 @@ int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx); * including the EMDF header (profile 10) or NAL encapsulation (otherwise). */ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, - uint8_t **out_rpu, int *out_size); + int flags, uint8_t **out_rpu, int *out_size); /*************************************************** diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index f10e175350..6bfb39a7ea 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -446,7 +446,7 @@ static void generate_ext_v2(PutBitContext *pb, const AVDOVIDmData *dm) } int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, - uint8_t **out_rpu, int *out_size) + int flags, uint8_t **out_rpu, int *out_size) { PutBitContext *pb = &(PutBitContext){0}; const AVDOVIRpuDataHeader *hdr; diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c index dec74ebecd..aa51c89e29 100644 --- a/libavcodec/libaomenc.c +++ b/libavcodec/libaomenc.c @@ -1294,7 +1294,7 @@ FF_ENABLE_DEPRECATION_WARNINGS const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; uint8_t *t35; int size; - if ((res = ff_dovi_rpu_generate(&ctx->dovi, metadata, &t35, &size)) < 0) + if ((res = ff_dovi_rpu_generate(&ctx->dovi, metadata, 0, &t35, &size)) < 0) return res; res = aom_img_add_metadata(rawimg, OBU_METADATA_TYPE_ITUT_T35, t35, size, AOM_MIF_ANY_FRAME); diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c index 2fef8c8971..b6db63fd7a 100644 --- a/libavcodec/libsvtav1.c +++ b/libavcodec/libsvtav1.c @@ -541,7 +541,7 @@ static int eb_send_frame(AVCodecContext *avctx, const AVFrame *frame) const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; uint8_t *t35; int size; - if ((ret = ff_dovi_rpu_generate(&svt_enc->dovi, metadata, &t35, &size)) < 0) + if ((ret = ff_dovi_rpu_generate(&svt_enc->dovi, metadata, 0, &t35, &size)) < 0) return ret; ret = svt_add_metadata(headerPtr, EB_AV1_METADATA_TYPE_ITUT_T35, t35, size); av_free(t35); diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index 0dc7ab6eeb..4302c3d587 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -783,7 +783,8 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, sd = av_frame_get_side_data(pic, AV_FRAME_DATA_DOVI_METADATA); if (ctx->dovi.cfg.dv_profile && sd) { const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; - ret = ff_dovi_rpu_generate(&ctx->dovi, metadata, &x265pic.rpu.payload, + ret = ff_dovi_rpu_generate(&ctx->dovi, metadata, 0, + &x265pic.rpu.payload, &x265pic.rpu.payloadSize); if (ret < 0) { free_picture(ctx, &x265pic); From patchwork Mon Jun 24 17:20:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50139 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2155819vqz; Mon, 24 Jun 2024 10:21:51 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVu2BC1xRcAEF+GF84b/KAl80J/pICiKKV5cBRjPe8TH6VXVe8w3+6AGEUqGomnOQL41W55a3IFrUS/Cqfrc5OwM26TWKY1Jwe20A== X-Google-Smtp-Source: AGHT+IHwLu+dnMJ54pffTSroxogb2VadXvIgNcoYRx93txeYSGmA1hcBd5uJdzTtgla8sceLV60A X-Received: by 2002:a05:6512:688:b0:52c:8837:718a with SMTP id 2adb3069b0e04-52ce185cffdmr3431716e87.43.1719249711061; Mon, 24 Jun 2024 10:21:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249711; cv=none; d=google.com; s=arc-20160816; b=I4dUhj/3BYHLvjFpjYStPdSw5cKo/kjip9cjO19b4Ci01mdw5b9lj6qgMPb3r1eKPr 7bBNszwcNAjdxKhKrPdQoahqABuWf548lq0nt3WDcWqEPb4vZzL4dB5FHrGanSvs6lSE o4t4uQ/bVVnEP37c1pqxajZ7esppnLAnw7nZ/iuIrFutVNLTLJqr6G7hIguX2IPMDkDc Mps9vRwsrZBff/F0P2C+4hPQCa230TSVQydz5cxdPBPwFnWhYhXcIYq6zKpazWQM+ACw NRp7c6Qu67r/VsMK7KXiBbdWL27HFA+1o1OK5t57TQGFBkr3EY/kq2J2EA38/eYtzEaA Tlsw== 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=PBVOOUBJ9ywx3nn72znPQqMYmnUymyEmn3OjZ8gCSJE=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=bF14b526WjCeYRbyTomUKGR11y1BJ178xy2SNmgpKUuaWdwyHKdBCBVG3pC93m4sbZ adA2OaZmovWXrQ8vQH4a0JsIC9OWtofeR1z8mcAKSmngolhYlcJ439uaTl8ONMFovHVy XzES+enYGATuuP2aP5pBRDxKGsk5KHvXwZxuAVPKcXuDmEIRpAuWpLvV+DviYwcweMnH wa3PHJMvW4ph6t4bGZ2tnI93g3GOHdrk3bhS3gbZFLrKE/2q0L0lvFW2QuMtTW3Papw6 jrLni+sMB5UffKkpfK3MaYLoXQMW7tEGp/D+5p1vKfcV2C2tjCIzWAwNC+4th+OOirwG AXKA==; 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=KWvzN6qo; 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-a72426cd19dsi223458666b.410.2024.06.24.10.21.50; Mon, 24 Jun 2024 10:21: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=KWvzN6qo; 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 38B1368D631; Mon, 24 Jun 2024 20:21:04 +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 55D0368D5B7 for ; Mon, 24 Jun 2024 20:20:53 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249649; bh=YAcnA+oTATFKiTMkOIp9TpyK5UJhfJuwPiPvXYzinQY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KWvzN6qoMDrOGQ9HoU6S3Ob5YcvqTJU6bogyikVkysq0Jl2FqyccpXzDXt8c/AZeT Xd8HWx/2gH9+DNn4X/x3SsBM9oh+RLN1LGctuu17X0cOdfRQW9SZwfl5EZZhFiMJsa rh41wctNaz+DdXov6kmfXDQT8MDH/l57pyq5CDmc= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 0645246DE9; Mon, 24 Jun 2024 19:20:49 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:41 +0200 Message-ID: <20240624172044.101722-6-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/9] avcodec/dovi_rpuenc: make encapsulation optional 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: L0bpQ/ZefN5n From: Niklas Haas And move the choice of desired container to `flags`. This is needed to handle differing API requirements (e.g. libx265 requires the NAL RBSP, but CBS BSF requires the unescaped bytes). --- libavcodec/dovi_rpu.h | 16 ++++++++++------ libavcodec/dovi_rpuenc.c | 22 ++++++++++------------ libavcodec/libaomenc.c | 3 ++- libavcodec/libsvtav1.c | 3 ++- libavcodec/libx265.c | 2 +- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 65a4529106..226a769bff 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -123,16 +123,20 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame); */ int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx); +enum { + FF_DOVI_WRAP_NAL = 1 << 0, ///< wrap inside NAL RBSP + FF_DOVI_WRAP_T35 = 1 << 1, ///< wrap inside T.35+EMDF +}; + /** - * Synthesize a Dolby Vision RPU reflecting the current state. Note that this - * assumes all previous calls to `ff_dovi_rpu_generate` have been appropriately - * signalled, i.e. it will not re-send already transmitted redundant data. + * Synthesize a Dolby Vision RPU reflecting the current state. By default, the + * RPU is not encapsulated (see `flags` for more options). Note that this + * assumes all previous calls to `ff_dovi_rpu_generate` have been + * appropriately signalled, i.e. it will not re-send already transmitted + * redundant data. * * Mutates the internal state of DOVIContext to reflect the change. * Returns 0 or a negative error code. - * - * This generates a fully formed RPU ready for inclusion in the bitstream, - * including the EMDF header (profile 10) or NAL encapsulation (otherwise). */ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, int flags, uint8_t **out_rpu, int *out_size); diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 6bfb39a7ea..41080521e1 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -710,9 +710,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, flush_put_bits(pb); rpu_size = put_bytes_output(pb); - switch (s->cfg.dv_profile) { - case 10: - /* AV1 uses T.35 OBU with EMDF header */ + if (flags & FF_DOVI_WRAP_T35) { *out_rpu = av_malloc(rpu_size + 15); if (!*out_rpu) return AVERROR(ENOMEM); @@ -739,10 +737,8 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, flush_put_bits(pb); *out_size = put_bytes_output(pb); return 0; - - case 5: - case 8: - *out_rpu = dst = av_malloc(1 + rpu_size * 3 / 2); /* worst case */ + } else if (flags & FF_DOVI_WRAP_NAL) { + *out_rpu = dst = av_malloc(4 + rpu_size * 3 / 2); /* worst case */ if (!*out_rpu) return AVERROR(ENOMEM); *dst++ = 25; /* NAL prefix */ @@ -765,10 +761,12 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } *out_size = dst - *out_rpu; return 0; - - default: - /* Should be unreachable */ - av_assert0(0); - return AVERROR_BUG; + } else { + /* Return intermediate buffer directly */ + *out_rpu = s->rpu_buf; + *out_size = rpu_size; + s->rpu_buf = NULL; + s->rpu_buf_sz = 0; + return 0; } } diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c index aa51c89e29..fd9bea2505 100644 --- a/libavcodec/libaomenc.c +++ b/libavcodec/libaomenc.c @@ -1294,7 +1294,8 @@ FF_ENABLE_DEPRECATION_WARNINGS const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; uint8_t *t35; int size; - if ((res = ff_dovi_rpu_generate(&ctx->dovi, metadata, 0, &t35, &size)) < 0) + if ((res = ff_dovi_rpu_generate(&ctx->dovi, metadata, FF_DOVI_WRAP_T35, + &t35, &size)) < 0) return res; res = aom_img_add_metadata(rawimg, OBU_METADATA_TYPE_ITUT_T35, t35, size, AOM_MIF_ANY_FRAME); diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c index b6db63fd7a..e7b12fb488 100644 --- a/libavcodec/libsvtav1.c +++ b/libavcodec/libsvtav1.c @@ -541,7 +541,8 @@ static int eb_send_frame(AVCodecContext *avctx, const AVFrame *frame) const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; uint8_t *t35; int size; - if ((ret = ff_dovi_rpu_generate(&svt_enc->dovi, metadata, 0, &t35, &size)) < 0) + if ((ret = ff_dovi_rpu_generate(&svt_enc->dovi, metadata, FF_DOVI_WRAP_T35, + &t35, &size)) < 0) return ret; ret = svt_add_metadata(headerPtr, EB_AV1_METADATA_TYPE_ITUT_T35, t35, size); av_free(t35); diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index 4302c3d587..718bd21b20 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -783,7 +783,7 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, sd = av_frame_get_side_data(pic, AV_FRAME_DATA_DOVI_METADATA); if (ctx->dovi.cfg.dv_profile && sd) { const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data; - ret = ff_dovi_rpu_generate(&ctx->dovi, metadata, 0, + ret = ff_dovi_rpu_generate(&ctx->dovi, metadata, FF_DOVI_WRAP_NAL, &x265pic.rpu.payload, &x265pic.rpu.payloadSize); if (ret < 0) { From patchwork Mon Jun 24 17:20:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50133 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2158753vqz; Mon, 24 Jun 2024 10:27:49 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXkSX4du8SRfOMZrFVdlV5EJ2rzH5jZdeX/tGYJQcCTpyi0t/Vn0qehTPexoddntHYoDSXIE43mwESHZi2ZpAh2kIPj8btKOsqX1w== X-Google-Smtp-Source: AGHT+IEpe8oKFkJfGXT68MxZCMcsZY1+rZRz0F/xr94oAnERnmTgbDmEl6VrbI3iQhkoXjwDhh64 X-Received: by 2002:a17:906:4acb:b0:a6f:1fd6:61b6 with SMTP id a640c23a62f3a-a7245baca18mr324659666b.35.1719250068752; Mon, 24 Jun 2024 10:27:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719250068; cv=none; d=google.com; s=arc-20160816; b=aEuFHqd2Bn0NhJWNdC/9WqL4x2A+ITYX/UJaaL8AVCpqd4xcN6R3fu+/K4kN4DzfIZ cL3IHbZSggbwhjXS3vcxnNi5P7H2iCWQiYA5iHydouLMhcfh2f3YPDOdMtCsF2DHQf9b BKx4S0Mds+ZI+xcigos+aiQ/10sGHtdiKMPrHvTMkmZF/6rn3fuuCyOjZlU/5K+85TfF Ke2tHLh5su0ixAqIbsmqA52ObvTg1yfWgSrpcKsZz0izl+qMfCqryyC63S07L03GM3uC 8Iu7cW74uxtQpl3gOTwrqEZxnjJc04sJV/6r7WpL81jaNrEQacgDiFJwcMw+vEhfpwSz wGCw== 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=l7Kgn92PVWnR5da8dHksoZ03wrE4CldG44Gw2VXvIyE=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=X+ozAmEj5hmAxhbvNNowQ7Paf6Q6ZrPCWLANyWE2W9+fdUk5UEygSSWPS8dSYAFG/0 I3L5POgcnxpMCMuBEXaKThEq8YUMslx8Ri1ASSL1Q0TtduQuUSuhL3b31BnTXfPRDPBC KIAkYY6fa8SPuBlpy1jjEDpAeFuIG/wrR4TF3RNrTnhwW7zJ08eVw9QctKvP77sTrYej YXpuSqmhHWh1KJVO//L4f8wnRZgcLZMIqRY3d1ROCJ3+Yd303Xl38C1g8EIUG4d2sCjl qW0E0Ho1JZMEy742/30cPNNOC4wqXPMSHsBua8+Gw07aqt3cn5mCbCxLtB1529GSz3cD 9aVg==; 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=eYbIo3Wi; 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-a725ee8c150si64902866b.249.2024.06.24.10.27.48; Mon, 24 Jun 2024 10:27:48 -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=eYbIo3Wi; 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 4AA3C68D641; Mon, 24 Jun 2024 20:21: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 5E38C68D5B8 for ; Mon, 24 Jun 2024 20:20:53 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249649; bh=X61jJi+O6kosuevQKEbSH7bNCI9lMjGlFknPvPTkzQo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eYbIo3Wihqt1TMFGutd/XS9SQUIxwZmQ+BEcfwtpTEOy/wq9cLT2RTsbpvdeJnF+r gGCcSWUPG4E8Pre5r1/KZlua6zLcDYJtC/sbw147rsP7/yb0l31DA/rsOaveOHOjZx neF2f0nmos90fN4D6jk5e8/Z1NVQX/3L/CVWJiGg= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 3C2F846FFE; Mon, 24 Jun 2024 19:20:49 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:42 +0200 Message-ID: <20240624172044.101722-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/9] avcodec/dovi_rpuenc: disable metadata compression by default 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: +ukYIiUEXB2m From: Niklas Haas Keyframes must reset the metadata compression state, so we cannot enable metadata compression inside the encoders. Solve this by adding a new flag, rather than removing it entirely, because I plan on adding a bitstream filter for metadata compression. --- libavcodec/dovi_rpu.h | 3 +++ libavcodec/dovi_rpuenc.c | 26 ++++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 226a769bff..f0d9c24379 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -126,6 +126,9 @@ int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx); enum { FF_DOVI_WRAP_NAL = 1 << 0, ///< wrap inside NAL RBSP FF_DOVI_WRAP_T35 = 1 << 1, ///< wrap inside T.35+EMDF + + FF_DOVI_COMPRESS_VDR = 1 << 2, ///< enable VDR RPU compression + FF_DOVI_COMPRESS_ALL = FF_DOVI_COMPRESS_VDR, }; /** diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c index 41080521e1..08170a9e84 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -21,6 +21,7 @@ */ #include +#include #include "libavutil/avassert.h" #include "libavutil/crc.h" @@ -452,9 +453,10 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, const AVDOVIRpuDataHeader *hdr; const AVDOVIDataMapping *mapping; const AVDOVIColorMetadata *color; - int vdr_dm_metadata_present, vdr_rpu_id, use_prev_vdr_rpu, profile, + int vdr_dm_metadata_present, vdr_rpu_id, profile, buffer_size, rpu_size, pad, zero_run; int num_ext_blocks_v1, num_ext_blocks_v2; + int use_prev_vdr_rpu = false; uint32_t crc; uint8_t *dst; if (!metadata) { @@ -475,12 +477,21 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, } vdr_rpu_id = mapping->vdr_rpu_id; - for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { - if (s->vdr[i] && !cmp_data_mapping(s->vdr[i], mapping)) { - vdr_rpu_id = i; - break; - } else if (s->vdr[vdr_rpu_id] && !s->vdr[i]) { - vdr_rpu_id = i; + if (flags & FF_DOVI_COMPRESS_VDR) { + for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { + if (s->vdr[i] && !cmp_data_mapping(s->vdr[i], mapping)) { + use_prev_vdr_rpu = true; + vdr_rpu_id = i; + break; + } else if (s->vdr[vdr_rpu_id] && !s->vdr[i]) { + vdr_rpu_id = i; + } + } + } else { + /* Flush VDRs to avoid leaking old state after keyframe */ + for (int i = 0; i <= DOVI_MAX_DM_ID; i++) { + if (i != vdr_rpu_id) + ff_refstruct_unref(&s->vdr[i]); } } @@ -524,7 +535,6 @@ 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; From patchwork Mon Jun 24 17:20:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50140 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2156008vqz; Mon, 24 Jun 2024 10:22:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUeAVUgEeqAP7xk7oyRKBXYEdxusvLX1z+usJq0Y5BVxSdQ3XTchREDJqxDGmTPdCWmHEISzcpPySMcU+VPumcXnXPj9R81tvPSJg== X-Google-Smtp-Source: AGHT+IE0Z1LHoJFtd4VAhbaNARzUCFMcGGXRZBNKe+0Uqfg/bRcJtkelCqzdHmhThJuQGQvPWgJC X-Received: by 2002:ac2:5490:0:b0:52c:9e82:a971 with SMTP id 2adb3069b0e04-52ce1832c44mr3214383e87.7.1719249731460; Mon, 24 Jun 2024 10:22:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249731; cv=none; d=google.com; s=arc-20160816; b=N4k9lx8WHl0E2dvnhviALt13AFZNrZHs6XIozeWEDz2/YezBx4L7k3lZQNXV9pnCMr 6HFJpfec63giGFmf1Zzob2Uman4XG0RB7ToEmAqtbxz14Z8VsaZnvgfzt6cGbT873UBL k1tqIm4lkMxUcD8FrMSgQw2EDiFH5QLaYh9J64eyZsIOYLkgeTMcrhHDx3m10eSa1zTK TLv4tQNq+zbfp4DpEDGJZpIYQ3yBy7uMVy134M4T+69xrStOGN+IxIrliTysB7S2pdRU inNQaStLlS3+9RvigDvdafQA4v+BgVIbxWAOhxC0+sFwEDZZxt3tYdmqH+PfiT9lpxQd zL1A== 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=Zp92hMtXxVzULZk6A0+Wa57MmJaQkhOW35rUdyd6JzM=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=CgGMcm8GS37iW/+yFTKcGcLfQIpKxsiAEzqzJrXlqUTAS0bmr4Mi79/8KNfKsSp/Ko ld7bMpb1rTbdG1PIAa34hxqGxooY/p1nTvSz3F0cfyGQEYE3ZqDwi1/5bTZAoqKhmx2Q Izk6H0oHsRj8RQVSF7OyRaZjdBQWq7MXzBdX9HUuVc9+QKYdE8o4gD4/n0EbuUbsO2NS o5wwT6o5gbflgVJ4htf/FI8W4iGkOCuq3YDFWCK/I8iNSyH4MR+Da/unmCq2AYV53j4i 2XYPoznT63cGzqlOP4v6TEFEWuGZ2Q1g9ZvOTn7cC4IQgGb+f6ozstx/7sqvGhiby+S4 oRpA==; 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=ub9NVlmk; 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-52cd63b3a05si2287160e87.36.2024.06.24.10.22.11; Mon, 24 Jun 2024 10:22:11 -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=ub9NVlmk; 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 44ABA68D64B; Mon, 24 Jun 2024 20:21: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 7FCC268D5B7 for ; Mon, 24 Jun 2024 20:20:53 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249649; bh=EvGnRNivURDPf6xnNeT2M3BwpfE3+5ZAdoa1JGbS9W0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ub9NVlmk2v5chQ3lx6ByweRxc/8D4dQWHhlfqlT9RsXJ+AkxdVp7SLQUTZ3JT32lc QrT3rBEndJz9HgOPhVDCXGEClQuafjVMsLcLEVY3IKCu+1G7tQqwOrkXVIZaz1crn7 a5YQRdONQCdfgOOe9qqqs3S9694O+6vt8NwU41og= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 747EC471DB; Mon, 24 Jun 2024 19:20:49 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:43 +0200 Message-ID: <20240624172044.101722-8-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 8/9] avcodec/dovi_rpu: add ff_dovi_get_metadata() 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: sd3PReexf2ql From: Niklas Haas Provides direct access to the AVDOVIMetadata without having to attach it to a frame. --- libavcodec/dovi_rpu.h | 9 +++++++++ libavcodec/dovi_rpudec.c | 40 +++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index f0d9c24379..10d5c7f566 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -108,8 +108,17 @@ void ff_dovi_ctx_flush(DOVIContext *s); int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int err_recognition); +/** + * Get the decoded AVDOVIMetadata. Ownership passes to the caller. + * + * Returns the size of *out_metadata, a negative error code, or 0 if no + * metadata is available to return. + */ +int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata); + /** * Attach the decoded AVDOVIMetadata as side data to an AVFrame. + * Returns 0 or a negative error code. */ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame); diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c index 375e6e560b..e8c25e9f3b 100644 --- a/libavcodec/dovi_rpudec.c +++ b/libavcodec/dovi_rpudec.c @@ -30,10 +30,8 @@ #include "get_bits.h" #include "refstruct.h" -int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) +int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata) { - AVFrameSideData *sd; - AVBufferRef *buf; AVDOVIMetadata *dovi; size_t dovi_size, ext_sz; @@ -44,7 +42,32 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) if (!dovi) return AVERROR(ENOMEM); - buf = av_buffer_create((uint8_t *) dovi, dovi_size, NULL, NULL, 0); + /* Copy only the parts of these structs known to us at compiler-time. */ +#define COPY(t, a, b, last) memcpy(a, b, offsetof(t, last) + sizeof((b)->last)) + 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; + + *out_metadata = dovi; + return dovi_size; +} + +int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) +{ + AVFrameSideData *sd; + AVDOVIMetadata *dovi; + AVBufferRef *buf; + int size; + + size = ff_dovi_get_metadata(s, &dovi); + if (size <= 0) + return size; + + buf = av_buffer_create((uint8_t *) dovi, size, NULL, NULL, 0); if (!buf) { av_free(dovi); return AVERROR(ENOMEM); @@ -56,15 +79,6 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) return AVERROR(ENOMEM); } - /* Copy only the parts of these structs known to us at compiler-time. */ -#define COPY(t, a, b, last) memcpy(a, b, offsetof(t, last) + sizeof((b)->last)) - 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; return 0; } From patchwork Mon Jun 24 17:20:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50141 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp2156096vqz; Mon, 24 Jun 2024 10:22:22 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWsvo3IY37AOmG41K9znFv8W2LVio0BU4ajQdYNEuY7EXwb3iPuMIicCnv4H6QoEhA7N5r/Fk08E98gpbSU373hbSF0vQhSB6FFVg== X-Google-Smtp-Source: AGHT+IH5triTkkhiiRCOjOJS4Qhu0nrSSm6iDEwR9CSA//w41jtSOHpvXnMOIu2CPxcHfGmT9cku X-Received: by 2002:a05:651c:1a1e:b0:2ec:59b6:ad71 with SMTP id 38308e7fff4ca-2ec59b6ae47mr43349321fa.40.1719249742385; Mon, 24 Jun 2024 10:22:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719249741; cv=none; d=google.com; s=arc-20160816; b=aWr+Beo1Etnp/sdcuuY+Q5SChpe1vuNXlnprzDzMIlY20ALzcW2GoO1qB8YRsTH7Cy F8Z98dj99LMVQ8QGvUL6Qw9pKPTWJE/jTEesMJCVJmMuaAhXe5BGrv4PpXzSfQFKvBLx 9bm5vrkidDBEqloxDsQhi2mz5zA9VXOZgd6amEs0tzfQs2p3Yd01L7CyaSiBJXFpWCKU DzyGBrAEZUxzyJCkYuy3ahKCZd6O7YAK7duFr9D51nIn7v/gt60VIY0JzwzUucWzgp5d PowKNjjheEljEgJ2yNFP6E13UileAAMaO5P39AF1VYxpR/T4T9DwlOQKHdcXxZ+vXdke h4gg== 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=MXh6LOZxOXtkSUnOOr8nYjnCtSF/7NJ/YqvLGzA/bxI=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=frubZW7jaHR6Mxy+Bs1QhplEj3/0DuR6Vz0/2ReZhAftHleeMxYZFQo+Ej1g7WN6si 8iOq85nhKBt/MqEOakFdrpegA/aHfKQZL5cY7s6jwMAsXPu7kg/IuUfXvIKMcZrxNu4l sFmUbO60rXJJEFO6dG6bgk0NzHULfcbE77CsL89XWeHY9871X6Imfh+ufrmeTwhk1c+K NCL8AoImLSU5SKuZoI5aCZRy2ztl4fTCRsngRDIYpFgRupRSj2ACGXsM/16JSMfO5rH7 DeZDPc4bUBFVG/3NYX2ng/mqL/sr59wqCcCdBkvt9GKwFCaxz3pZ3R9XOpKPSkL3p7Q1 /slg==; 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=nm5fH8Zf; 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-2ec54eaa30csi16203851fa.295.2024.06.24.10.22.21; Mon, 24 Jun 2024 10:22:21 -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=nm5fH8Zf; 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 4CF0768D66D; Mon, 24 Jun 2024 20:21: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 8DDA968D5B8 for ; Mon, 24 Jun 2024 20:20:53 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1719249649; bh=FJ1htA5PyQ7zqtlpVOWaxpoqRNRDoVaeiUNmcsuC4zU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nm5fH8ZfSu9cOdKV0lNENyKpPiJXHWthrP7m6+OMW7DuoOwrl0Dpm9z2npAliDwfB K2inloytcG4jI/tqetjOCWegTqNIlrZ/JJf8j4jy5Fw7jBZNpyDFdCu3mporUS2POO pyrAKJcSPN3tSj7B70QmS9kOFfFE3Z+aQCDNLQP8= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id AE703478C2; Mon, 24 Jun 2024 19:20:49 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Jun 2024 19:20:44 +0200 Message-ID: <20240624172044.101722-9-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240624172044.101722-1-ffmpeg@haasn.xyz> References: <20240624172044.101722-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 9/9] avcodec/bsf/dovi_rpu: add new bitstream filter 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: PfxoaJFSd7td From: Niklas Haas This can be used to strip dovi metadata, or enable/disable dovi metadata compression. Possibly more use cases in the future. --- configure | 1 + doc/bitstream_filters.texi | 21 +++ libavcodec/bitstream_filters.c | 1 + libavcodec/bsf/Makefile | 1 + libavcodec/bsf/dovi_rpu.c | 258 +++++++++++++++++++++++++++++++++ 5 files changed, 282 insertions(+) create mode 100644 libavcodec/bsf/dovi_rpu.c diff --git a/configure b/configure index 3bca638459..32076079e7 100755 --- a/configure +++ b/configure @@ -3437,6 +3437,7 @@ aac_adtstoasc_bsf_select="adts_header mpeg4audio" av1_frame_merge_bsf_select="cbs_av1" av1_frame_split_bsf_select="cbs_av1" av1_metadata_bsf_select="cbs_av1" +dovi_rpu_bsf_select="cbs_h265 cbs_av1 dovi_rpudec dovi_rpuenc" dts2pts_bsf_select="cbs_h264 h264parse" eac3_core_bsf_select="ac3_parser" evc_frame_merge_bsf_select="evcparse" diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index c03f04f858..918735e8c5 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -101,6 +101,27 @@ Remove zero padding at the end of a packet. Extract the core from a DCA/DTS stream, dropping extensions such as DTS-HD. +@section dovi_rpu + +Manipulate Dolby Vision metadata in a HEVC/AV1 bitstream, optionally enabling +metadata compression. + +@table @option +@item strip +If enabled, strip all Dolby Vision metadata (configuration record + RPU data +blocks) from the stream. +@item compression +A bit mask of compression methods to enable. +@table @samp +@item none +No compression. Selected automatically for keyframes. +@item vdr +Compress VDR metadata (color reshaping / data mapping parameters). +@item all +Enable all implemented compression methods. This is the default. +@end table +@end table + @section dump_extra Add extradata to the beginning of the filtered packets except when diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c index 138246c50e..f923411bee 100644 --- a/libavcodec/bitstream_filters.c +++ b/libavcodec/bitstream_filters.c @@ -31,6 +31,7 @@ extern const FFBitStreamFilter ff_av1_metadata_bsf; extern const FFBitStreamFilter ff_chomp_bsf; extern const FFBitStreamFilter ff_dump_extradata_bsf; extern const FFBitStreamFilter ff_dca_core_bsf; +extern const FFBitStreamFilter ff_dovi_rpu_bsf; extern const FFBitStreamFilter ff_dts2pts_bsf; extern const FFBitStreamFilter ff_dv_error_marker_bsf; extern const FFBitStreamFilter ff_eac3_core_bsf; diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile index fb70ad0c21..40b7fc6e9b 100644 --- a/libavcodec/bsf/Makefile +++ b/libavcodec/bsf/Makefile @@ -19,6 +19,7 @@ OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF) += bsf/h264_mp4toannexb.o OBJS-$(CONFIG_H264_REDUNDANT_PPS_BSF) += bsf/h264_redundant_pps.o OBJS-$(CONFIG_HAPQA_EXTRACT_BSF) += bsf/hapqa_extract.o OBJS-$(CONFIG_HEVC_METADATA_BSF) += bsf/h265_metadata.o +OBJS-$(CONFIG_DOVI_RPU_BSF) += bsf/dovi_rpu.o OBJS-$(CONFIG_HEVC_MP4TOANNEXB_BSF) += bsf/hevc_mp4toannexb.o OBJS-$(CONFIG_IMX_DUMP_HEADER_BSF) += bsf/imx_dump_header.o OBJS-$(CONFIG_MEDIA100_TO_MJPEGB_BSF) += bsf/media100_to_mjpegb.o diff --git a/libavcodec/bsf/dovi_rpu.c b/libavcodec/bsf/dovi_rpu.c new file mode 100644 index 0000000000..c57c3d87dd --- /dev/null +++ b/libavcodec/bsf/dovi_rpu.c @@ -0,0 +1,258 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/common.h" +#include "libavutil/mem.h" +#include "libavutil/opt.h" + +#include "bsf.h" +#include "bsf_internal.h" +#include "cbs.h" +#include "cbs_bsf.h" +#include "cbs_av1.h" +#include "cbs_h265.h" +#include "dovi_rpu.h" +#include "h2645data.h" +#include "h265_profile_level.h" +#include "itut35.h" + +#include "hevc/hevc.h" + +typedef struct DoviRpuContext { + CBSBSFContext common; + DOVIContext dec; + DOVIContext enc; + + int strip; + int compression; +} DoviRpuContext; + +static int update_rpu(AVBSFContext *bsf, const AVPacket *pkt, int flags, + const uint8_t *rpu, size_t rpu_size, + uint8_t **out_rpu, int *out_size) +{ + DoviRpuContext *s = bsf->priv_data; + AVDOVIMetadata *metadata = NULL; + int ret; + + ret = ff_dovi_rpu_parse(&s->dec, rpu, rpu_size, 0); + if (ret < 0) { + ff_dovi_ctx_flush(&s->dec); + return ret; + } + + ret = ff_dovi_get_metadata(&s->dec, &metadata); + if (ret == 0 /* no metadata */) { + *out_rpu = NULL; + *out_size = 0; + return 0; + } else if (ret < 0) { + ff_dovi_ctx_flush(&s->dec); + return ret; + } + + if (pkt && !(pkt->flags & AV_PKT_FLAG_KEY)) + flags |= s->compression; + ret = ff_dovi_rpu_generate(&s->enc, metadata, flags, out_rpu, out_size); + av_free(metadata); + if (ret < 0) + ff_dovi_ctx_flush(&s->enc); + + return ret; +} + +static int dovi_rpu_update_fragment_hevc(AVBSFContext *bsf, AVPacket *pkt, + CodedBitstreamFragment *au) +{ + DoviRpuContext *s = bsf->priv_data; + CodedBitstreamUnit *nal = au->nb_units ? &au->units[au->nb_units - 1] : NULL; + uint8_t *rpu = NULL; + int rpu_size, ret; + + if (!nal || nal->type != HEVC_NAL_UNSPEC62) + return 0; + + if (s->strip) { + ff_cbs_delete_unit(au, au->nb_units - 1); + return 0; + } + + ret = update_rpu(bsf, pkt, 0, nal->data + 2, nal->data_size - 2, &rpu, &rpu_size); + if (ret < 0) + return ret; + + /* NAL unit header + NAL prefix */ + if (rpu_size + 3 <= nal->data_size && av_buffer_is_writable(nal->data_ref)) { + memcpy(nal->data + 3, rpu, rpu_size); + av_free(rpu); + nal->data_size = rpu_size + 3; + } else { + AVBufferRef *ref = av_buffer_alloc(rpu_size + 3); + if (!ref) { + av_free(rpu); + return AVERROR(ENOMEM); + } + + memcpy(ref->data, nal->data, 3); + memcpy(ref->data + 3, rpu, rpu_size); + av_buffer_unref(&nal->data_ref); + av_free(rpu); + nal->data = ref->data; + nal->data_size = rpu_size + 3; + nal->data_ref = ref; + nal->data_bit_padding = 0; + } + + return 0; +} + +static int dovi_rpu_update_fragment_av1(AVBSFContext *bsf, AVPacket *pkt, + CodedBitstreamFragment *frag) +{ + DoviRpuContext *s = bsf->priv_data; + int provider_code, provider_oriented_code, rpu_size, ret; + AVBufferRef *ref; + uint8_t *rpu; + + for (int i = 0; i < frag->nb_units; i++) { + AV1RawOBU *obu = frag->units[i].content; + AV1RawMetadataITUTT35 *t35 = &obu->obu.metadata.metadata.itut_t35; + if (frag->units[i].type != AV1_OBU_METADATA || + obu->obu.metadata.metadata_type != AV1_METADATA_TYPE_ITUT_T35 || + t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US || + t35->payload_size < 6) + continue; + + provider_code = AV_RB16(t35->payload); + provider_oriented_code = AV_RB32(t35->payload + 2); + if (provider_code != ITU_T_T35_PROVIDER_CODE_DOLBY || + provider_oriented_code != 0x800) + continue; + + if (s->strip) { + ff_cbs_delete_unit(frag, i); + return 0; + } + + ret = update_rpu(bsf, pkt, FF_DOVI_WRAP_T35, + t35->payload + 6, t35->payload_size - 6, + &rpu, &rpu_size); + if (ret < 0) + return ret; + + ref = av_buffer_create(rpu, rpu_size, av_buffer_default_free, NULL, 0); + if (!ref) { + av_free(rpu); + return AVERROR(ENOMEM); + } + + av_buffer_unref(&t35->payload_ref); + t35->payload_ref = ref; + t35->payload = rpu + 1; /* skip country code */ + t35->payload_size = rpu_size - 1; + break; /* should be only one RPU per packet */ + } + + return 0; +} + +static const CBSBSFType dovi_rpu_hevc_type = { + .codec_id = AV_CODEC_ID_HEVC, + .fragment_name = "access unit", + .unit_name = "NAL unit", + .update_fragment = &dovi_rpu_update_fragment_hevc, +}; + +static const CBSBSFType dovi_rpu_av1_type = { + .codec_id = AV_CODEC_ID_AV1, + .fragment_name = "temporal unit", + .unit_name = "OBU", + .update_fragment = &dovi_rpu_update_fragment_av1, +}; + +static int dovi_rpu_init(AVBSFContext *bsf) +{ + DoviRpuContext *s = bsf->priv_data; + + if (s->strip) { + av_packet_side_data_remove(bsf->par_out->coded_side_data, + &bsf->par_out->nb_coded_side_data, + AV_PKT_DATA_DOVI_CONF); + } else { + const AVPacketSideData *sd; + sd = av_packet_side_data_get(bsf->par_in->coded_side_data, + bsf->par_in->nb_coded_side_data, + AV_PKT_DATA_DOVI_CONF); + if (!sd) { + av_log(bsf, AV_LOG_ERROR, "No Dolby Vision configuration record found?\n"); + return AVERROR(EINVAL); + } + + s->dec.logctx = s->enc.logctx = bsf; + s->dec.cfg = s->enc.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data; + } + + switch (bsf->par_in->codec_id) { + case AV_CODEC_ID_HEVC: + return ff_cbs_bsf_generic_init(bsf, &dovi_rpu_hevc_type); + case AV_CODEC_ID_AV1: + return ff_cbs_bsf_generic_init(bsf, &dovi_rpu_av1_type); + default: + return AVERROR_BUG; + } +} + +static void dovi_rpu_close(AVBSFContext *bsf) +{ + DoviRpuContext *s = bsf->priv_data; + ff_dovi_ctx_unref(&s->dec); + ff_dovi_ctx_unref(&s->enc); + ff_cbs_bsf_generic_close(bsf); +} + +#define OFFSET(x) offsetof(DoviRpuContext, x) +#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM) +static const AVOption dovi_rpu_options[] = { + { "strip", "Strip Dolby Vision metadata", OFFSET(strip), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, + { "compression", "DV metadata compression mode", OFFSET(compression), AV_OPT_TYPE_FLAGS, { .i64 = FF_DOVI_COMPRESS_ALL }, 0, FF_DOVI_COMPRESS_ALL, FLAGS, .unit = "compression" }, + { "none", "Don't compress metadata", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, FLAGS, .unit = "compression" }, + { "vdr", "Compress VDR metadata", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DOVI_COMPRESS_VDR}, 0, 0, FLAGS, .unit = "compression" }, + { "all", "Compress all metadata", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DOVI_COMPRESS_ALL}, 0, 0, FLAGS, .unit = "compression" }, + { NULL } +}; + +static const AVClass dovi_rpu_class = { + .class_name = "dovi_rpu_bsf", + .item_name = av_default_item_name, + .option = dovi_rpu_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +static const enum AVCodecID dovi_rpu_codec_ids[] = { + AV_CODEC_ID_HEVC, AV_CODEC_ID_AV1, AV_CODEC_ID_NONE, +}; + +const FFBitStreamFilter ff_dovi_rpu_bsf = { + .p.name = "dovi_rpu", + .p.codec_ids = dovi_rpu_codec_ids, + .p.priv_class = &dovi_rpu_class, + .priv_data_size = sizeof(DoviRpuContext), + .init = &dovi_rpu_init, + .close = &dovi_rpu_close, + .filter = &ff_cbs_bsf_generic_filter, +};