From patchwork Tue Jun 18 19:35:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50004 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780035vqg; Tue, 18 Jun 2024 12:42:46 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU6xayfuWz1a9V75mmnpGS49Y24+p/9/Bgh/MNwYy1EpmTtg7Yca9wn40yUTrp3xhPEydj7iZbCwbRJ+8/t8669WSe4RcLr3ARWng== X-Google-Smtp-Source: AGHT+IEEg78oua+on3Y1Yo8grO6DtrB0hJM1+gFsCbYpBXSi7wb4nGqJJB32CfKQbtr5undj6WgX X-Received: by 2002:a50:c318:0:b0:57c:fd20:3531 with SMTP id 4fb4d7f45d1cf-57d07ed45e8mr252011a12.31.1718739765791; Tue, 18 Jun 2024 12:42:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739765; cv=none; d=google.com; s=arc-20160816; b=pRtjTpwFwEq0dSiyZvZJeGyHajVp/0JjMToGw/beQkIWjx91Ch+qcRR1wKIilqWxce YCsTCQiFdz4oje6ZysFs6yCaP9/pfPGRfs+L7T7Um6xHRpXAbFVOfQNTnOPnouUOhYlW fjZvxg5X7JFNLYn2h0W/J7bI9Fc3MMPFQxgAZrqhuNcbG2ZygfasUo8aUwX3ZlU+MQef 15OWjf3muHSVwBo/fk+UeWBRPywFzJayXVAR9KKuvRtTBB8G7U5LoquEBtaL93JLAcGD zxxyyM/93Tz3Q+F54lsTPtGKlfOa5WAAx65IPDdaEwqxzKxU4tMZRSDhFkesWwZtfAgz d1rw== 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=gVGpbJMiM7y1Pfda3CrD22e4d4ZoPIPgfPA6pKzxcUc=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=DiUThvymUknhnzHBxi/8SOsofAHbGVCQvVuhs3mfknGJcch1SJU/WR/8PrSbWMVmTh 28GBWzGY/XoTEqTTX1yD0ele8R5ZPjwy9wYKjpbDSGU/iP0g6gTHaiOteCxCTvIsMd8a GminkgXJUdKyH/H6oRMk0eV7/an9Bq3t0LWPL06lk2c4B456UApkLhFIrMN+Zlxe0kx6 qW6CcrLgz3eXFkLhntxLhWE0u6MDIVsMSnM/028LSfFnnkHK+ZD8wxQKzmF5K1upiuXW N4aFCFteNb+xUs/IhdEq+0jpz/IarxqlPijsK1qsqzYd3qEdyop3MGojkJd7LGw/UkGS j/+w==; 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=gJbe5piV; 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-57cb72d622dsi5826615a12.30.2024.06.18.12.42.45; Tue, 18 Jun 2024 12:42:45 -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=gJbe5piV; 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 832A768D70E; Tue, 18 Jun 2024 22:42:33 +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 D185668D42E for ; Tue, 18 Jun 2024 22:42:23 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739743; bh=U1of1TbLrtAR2Iuzi1lIdodfRtko6M29SjYyNwZdp9k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gJbe5piVXS8Nk2ssmOdDozRyJTZ4OfAa0mfeAFLVXdZSSesYZMDxYeMRvxbyA/Yfp v1ZhSUqgS7sNvnBBUb8rdQt4coaqN2oIcluvm4H5t0ZVApBkVI1y4ysgWxQ5bVJmWS fqo2mdEBjiP/oc6zgj1y7GNiamVAxCXYDo3f9pC8= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 8A4E44197E; Tue, 18 Jun 2024 21:42:23 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:31 +0200 Message-ID: <20240618194221.26073-2-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/8] 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: 9X4jtkGcmquH 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 cae4dc4c3c..b34c3116b7 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 Tue Jun 18 19:35:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50005 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780081vqg; Tue, 18 Jun 2024 12:42:55 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU5O6U2nP+5BNDPJSgIYlP1YYXk3w1e1zZ2bdeofZ76dImuqAJdRIdVkMqMT7gsxtoYTVIbCfB/xv+UO7ifuYGXIIQeASZ57OXZBA== X-Google-Smtp-Source: AGHT+IGaUQHdzyRYBkm2TkTj4ZwEghSlHCqZ3LxYCnQ7ho6Uc9eajh0mXVCqjpNGs1EdWs7lorFP X-Received: by 2002:a50:a6da:0:b0:57c:612e:6ded with SMTP id 4fb4d7f45d1cf-57d07c55b1dmr230883a12.0.1718739774758; Tue, 18 Jun 2024 12:42:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739774; cv=none; d=google.com; s=arc-20160816; b=SAM9jFVJePL1KM6lF/SjXIdbX+EaT8oq9ytghiiDZeBncrzWDe+xN2RDEzrGqBCNny B0EkdlnqNy2DJPK9xunxAEryeCKarZHAeJig4BnZXpDCJ1emZa2C4gBolfBCYVON1D// i9B0H2C+VIA/lLY69DaGNRvSpsGk6SDI+Ky0SQJLHgyDZ6jzdXi6N5d9Cpi1SmFs+Ff6 81AnFBjNd8ThoyE539XGxQJaZ+G2avputNwX2jq6dg1+XLbvF/BjbzJq2jA8FRYuAiCn 0CDgPpbNfkwrx3O6YC/PA9LiPFcVFxFnTmSzT7etDdsgcXruk3QKmTtY+R4JHCF58k6b V45A== 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=286DPrEYJvLAglvjKFQcwo/SOqdij5vyWYw2pGeimpg=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=k6QWiJeSEpEAuby8zU1u6PH805KDHRi3eQASQyZgtHug6TGfqnR7K1s0FDY2eFYvdY E49xnQDIKt4CWVEpHPKMuphw5JekpY6GSbXyOATz8AO/i/gSaBEnVLo435tujEs5mO5h IetpodUmSW3iSf/OO3grcyVkx/7PK4j75+cbXynqxGfkBZIFWv8UydUSh0imB22cHBM0 2zupuf7Hx+95CfLoceORD2MKfTKNIHitJtrmykLlWcbCVgBqBpIObAVs5Y7crDj9aKuN y+5JaNH2anV5JISjLlMRmg9uMAnIlAH7jkTBUeWN65ImlJ9/ZOtkJ46ZAuYOUkyJtp5/ q/jg==; 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=vFOso6FU; 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-57cb7461e2asi5864272a12.613.2024.06.18.12.42.54; Tue, 18 Jun 2024 12:42:54 -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=vFOso6FU; 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 D46E068D768; Tue, 18 Jun 2024 22:42:34 +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 0785668D5B5 for ; Tue, 18 Jun 2024 22:42:24 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739743; bh=kbE+IycUhgSjPjB4uqlciLk4w/rfi3r/RlpphK/GmTg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vFOso6FUHW7a8BymbG2LZZ4S63SWM9rg8ixl2h8ug3cTcU3wZV+Owv2uJeX/NJglU U1tBMtEgqXVGIVwof2diuj/f9UQKMyp+SKxvl1UNm/IET82LMqzPAFak2ccVZ/ihuv Cw1lXOuBuXmZqqm40S7P+zXO+sDSQ3QeemqySrzs= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id C6F7641C1E; Tue, 18 Jun 2024 21:42:23 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:32 +0200 Message-ID: <20240618194221.26073-3-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/8] 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: ajl1n0qjnTF+ 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 a6262844d4..45fcd9a86c 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) @@ -635,6 +641,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 */ @@ -672,6 +679,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 Tue Jun 18 19:35:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50006 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780128vqg; Tue, 18 Jun 2024 12:43:03 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX7qeS0OKt+IQFTMoZk8sf6paz4KOn7auQniCHQNFz8+NNMpMmZDrFuOwVJFdfsHlQCuNchUvuznPPuydaO5J/L6GXqSEIMnQPINw== X-Google-Smtp-Source: AGHT+IFbBEdMh02VTaJWVVVU4plI6YRv/NbDSM4jNgOYdbOY9HxyBSc4AxeB8e6chAYjVvoTn1q8 X-Received: by 2002:a17:907:3d6:b0:a6f:1e97:b177 with SMTP id a640c23a62f3a-a6fab7d1276mr21114766b.64.1718739783727; Tue, 18 Jun 2024 12:43:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739783; cv=none; d=google.com; s=arc-20160816; b=k7/OqYzZT/lWnct3hKSWXStlimvxu+Vi9mXo/rYW8ZML5o553zbzG3xC19FWh1rCbJ 4o9Oj/Ezb7EFwJkZD4bH5TN/04olLu6scEvgahOhBrAovRocIrylougUPpbjLwR2x6TJ R54yheNK8VDuE6A1kLeZMzJTmGsARCkQPYOdwn40EyYD2cmLU5rezODScah+JMFlmNHW eoWpl+ZQ6198rezHtc6SpU/ebOh8NXAJtEEkYI6sgVGgzIWUaIw6aHmaRdXFmEgZzbJz V5pRXDoC9DwT8lZsPporCrTKT8M6h1w81wI8bI+hmOoFRf2f5iZhHyT8ZIcpseb0VV/I sd3Q== 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=RMKsfoQW/pIjzWlMalnPDicKtKzCjyc7O/BeQ9BX0I0=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=bKCiwMIl4+5G05JGi7d3RdPsaPWTNs56sCtLRZ6Wsf+0tTxyvxCXuoktijw+kKlSkQ ZsAjFZZx7EwhgJVPwXbgXa3M7eT9Clf8GIjsfFjnZu5SOH9aA7HGNsCab5ed+1zWKJv+ 8fN7+4EgY6BWjTsIIlDj1DHgwKD64AQm01HnQ6AIBJShnCrj/qkjYpgh9xbvMlH8S/PQ NiN7Cv9oxFWRYv5lFEQ5Gj4lZJGxQXIs3TJTeDSsIApbSYwpEWpA3fnZGNPrIELYxc0s /7cOwd6FjxNK3x1ghXIMTwW+47rWv+2t02nKlLyTxoCXwHW+OSYVwncyxpJ4YyY3JmjO 8AEg==; 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=YmdbSsM4; 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-a6f56dd6e07si573976966b.326.2024.06.18.12.43.03; Tue, 18 Jun 2024 12:43:03 -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=YmdbSsM4; 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 1931B68D779; Tue, 18 Jun 2024 22:42:36 +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 4A76168D5B5 for ; Tue, 18 Jun 2024 22:42:24 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739744; bh=YE49y59sPE9rVpxdT4D5GYWLVZIyF68syustNeNA/Uc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YmdbSsM4pmWg+iP0sefOdeA77iZV80ReABDyIPZFIwOIO6oy9T6IRBpxEyuNhBZWv TzXaNQ2v/p0/6POT5x/nbgqNkRq+zFZu5r34DxGRkZuwY0ERWUF1AA0SPaqblzVN6r SWVhL8XZY4pg2t7hj62tO0hlhvDhHLfKIjewtMmc= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 09B6D42835; Tue, 18 Jun 2024 21:42:24 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:33 +0200 Message-ID: <20240618194221.26073-4-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/8] 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: PE6ZJQOl9FYi 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 45fcd9a86c..0d49a128fd 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 Tue Jun 18 19:35:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50007 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780188vqg; Tue, 18 Jun 2024 12:43:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVIvBkoQOSq80QveVMxmeTUxfEc4aF9NnLE+Xx6e+nnyddnKVBvSKqKpleTDwEPOUVHuqHEBocz4a3GUNLXwFLLMySLA738wImgVw== X-Google-Smtp-Source: AGHT+IF4TurCT/OexGlPa5WsAIzKF3P+M3MfVBMuxRWdW/gprWSrs2/2idphHM/Y7EBh0PijhPxW X-Received: by 2002:a17:907:c283:b0:a6f:506d:2cf6 with SMTP id a640c23a62f3a-a6fa438e013mr46539166b.26.1718739792909; Tue, 18 Jun 2024 12:43:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739792; cv=none; d=google.com; s=arc-20160816; b=0orXjexHBWdDFCgwAvsr36/0h+vZbmpBfPohvT6DFXSuetGb1aP65k2i1oeo+kPg6R 4sTvR3er+/HtcgAafBQ5BYwLD7XToswv9s83hJs1DkO0SDYfY8bxcOixQJ8vbzQ0d1Sx 9jIqGQ//Xl4Zh67aSFrLO+0OneAMn0L3sx8xEevt2q0f9fFnvysVU+AaBXss0jjD9ATI ptBbsfg3EklWajyWOwguiyfjfcIvbNs7vytFvM7PsRcjXHt8QdscIyiXCj5juqFtZ+aw e2a7/O6wLYlocmcp1/++yTwlIZnaH2f6r94YpMM3dZuUtO6HfYSvwjvoS47nq5SDowNe d7jw== 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=5avdmLf2wRpFMgkpT6xf4r72fQ7gMat58dtWEljSpko=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=ZgXrB3jIs68YwlNAxZqX4z/B2fQCMhz66umQfF3cIl81gEVHGpHpJcGJSlrLCjS97r RrM1c84Yr0GqUAgTJVkWETs+xAA5bmQURXqNg7aVC7XGKQrxX5OigTlGT5cvGGuTlhoB vJnNigF7/wP6Ss1Q/ixpquNAh8ZO80lIoBiw7UHaBn5gdO7XkTNu3RnJ6Q4s5Hy+V98H 7NaCujj5HGXbPDUFNfSmQkX1FjhUsow0L34BK8QsEfiWgPAJqx+cjC5PoMk14oUADtMt 61iJEpdR7qBNLxHJHHqxGHeWrXAW7JSZPXQXs3x8u30vji3s4AVzlwkhSCbRNuCfnwoD Rvgw==; 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=I9yl1lnb; 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-a6f56df6a0bsi561753466b.571.2024.06.18.12.43.12; Tue, 18 Jun 2024 12:43:12 -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=I9yl1lnb; 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 5588268D7B4; Tue, 18 Jun 2024 22:42:37 +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 781EB68D5AF for ; Tue, 18 Jun 2024 22:42:24 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739744; bh=dweuLdeC3dc7ug7ilZlWCxkMthYTdFnFynXTWyErpt8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=I9yl1lnbxLZC28v+H9fgR12alaMOHMxZQYZyx/VrQG908Dy74GeieayIl2JeRp9Ap +j2Vy59dIDRd9Qr3q8FI5jSfwFQjMX0CRFxd3DOvusftXZQtE9Ea5Znf6RB6k//39Z yOUduiVMqFCoMqXqzCffLhhbI3jiyGlglR4FmJYY= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 400534327A; Tue, 18 Jun 2024 21:42:24 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:34 +0200 Message-ID: <20240618194221.26073-5-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/8] 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: lVEv2A4XZhSq 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 0d49a128fd..d8f113c5c4 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -435,7 +435,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 Tue Jun 18 19:35:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 50008 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780239vqg; Tue, 18 Jun 2024 12:43:22 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWRtTfZXjGbS1/x+XrV2ryTa5P/67AXNYriptIga+BMhXaFs1YR1fJ5MAji5mepUq4ogmgxxXBgifnhwR41VFVk8HRCwD7XyOa+Yg== X-Google-Smtp-Source: AGHT+IFoJ4E9e7Qqf1DlDlduCMTVuHn75J3x9Hw/PDnybBuzMWX0nN52g96rZY44fUpt2rkTxmlX X-Received: by 2002:a05:6000:2c8:b0:360:83d6:e2f0 with SMTP id ffacd0b85a97d-36319a856d8mr353706f8f.6.1718739802122; Tue, 18 Jun 2024 12:43:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739802; cv=none; d=google.com; s=arc-20160816; b=NnQJhI2VovY5Yeju7V6ber7V2GAeSjgtJZdDoIBCy1TEGgAu1Shx9E/tujif6LxuoQ DkD2eRAOMZQLnk2eao6s3g5aWzxOJ/UJmaShQ/K/sndd36nkr7DURNNFOCnB+o+ChfTB V9pQ3z6kUJuXxNjpitzSuHiujj3OFg7gTiaghPPbbEu1h1sSeYE7rpxN6iiQxNePaehL sR6HAY1B45SxIRM9N25jU1IyC6wlXj2wAVYMGpN9kzwggNwHkeznZWqb7+FNwqEDzQnr kNv4LPaoJS8Ib9yLYETk95IZu5gpM/av19KQVeFQvjnaZES5d/AhI8l84wiDWyCa7O/K JD3w== 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=4wyVxv89nfbGksDqmWcQj4qYhATvubKodaRzXud9g4o=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=ltP4vrNk+3tzSMiR3ndORsqM7Yvl+KJB2q8HG4sy/CQD/lTVBqUTm+RhXOauoiO1Ma UDwOYpgW/l0IVzT5A2qu0YJ8ziOftU7CpTvwr7cS7O8cgQq+5q/TXI+z2L0b4Whn8gHL eQHF8NDfq6Ca94qy4hW8RffIfBufV+Zb8hxFu7z5ODiOqZsvVGPGqYj/reja50tp3fpH QlreDoBeox6tL/XWi4IkdSQJ6Og/t5nUtyHrsFSr8RqCR571Wea6tBlnG4pWQ3+8iFuN KVgqRBBXrf+AhlrQhn+FA6RyO1lNLP3RPP2XvM49W/o+4GyM7s0XSKJKoLDR0sdZltmN e0KQ==; 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=lAyKTxvV; 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-57d039881c2si476990a12.216.2024.06.18.12.43.21; Tue, 18 Jun 2024 12:43:22 -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=lAyKTxvV; 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 4A9EA68D7BB; Tue, 18 Jun 2024 22:42:38 +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 CE5BD68D74A for ; Tue, 18 Jun 2024 22:42:28 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739744; bh=Jn+NBhd1MOHJyrtBkMSijrBbQYMMSWSa2jD4amswplU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lAyKTxvVyPhnUCrkmGUgU0ngO9toxprpsXlrBGm7WjF7lTDv4ejtwAUd7zmMjG3TN JJWemuyH0CXCdaWOAk7qiZpxy6biyQZrTFwGJUZLf91XWaX0+j5jIQio8Ianpv2XEr QZrIy48lngCu7WHus512xsntghfPbaY9GA4W5zWo= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 7EB774371F; Tue, 18 Jun 2024 21:42:24 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:35 +0200 Message-ID: <20240618194221.26073-6-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/8] 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: 2bn7t6FSDXR/ 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 d8f113c5c4..65c36ed0ae 100644 --- a/libavcodec/dovi_rpuenc.c +++ b/libavcodec/dovi_rpuenc.c @@ -697,9 +697,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); @@ -726,10 +724,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 */ @@ -752,10 +748,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 Tue Jun 18 19:35: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: 50009 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780283vqg; Tue, 18 Jun 2024 12:43:31 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXzeBtIaKEv73c6rmI8M/hRnXTAi3bqSLF0zEy6PrNe650HNAekCHZxgTLIIvYdCPQ6x6RYcADpf/HrdEWH1o1W5vs2nwihm6EH4g== X-Google-Smtp-Source: AGHT+IEsxtNPOchbtW9stk87mAkCRjZu0nR9fWOkfSJrVEo3A//giRKiqqIn2U5VclvCLU28rFPt X-Received: by 2002:a50:8e09:0:b0:57c:74ea:8d24 with SMTP id 4fb4d7f45d1cf-57d07e7b20fmr253760a12.18.1718739811225; Tue, 18 Jun 2024 12:43:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739811; cv=none; d=google.com; s=arc-20160816; b=AoLIx9pmZx3N8lPbXX5zHnz9f1LTnJlh+rfj0usVJU/Ig/FyAgB7AIhfuP8+7m9jIj vb4wGyBoObyZBK0yWnkjhpu2AIqg3b8a/EvobdWTvzsTgXwAaVHw1Ax/2YB6lsfpB82N VR8SGQIgXQ1nWK1OL2A+s7MzlqLPcoZO9N3t6iTEvPaaJn17szeFPreyR0lviCmIxjm3 nrbv6JP1Xj6bDz2RJ1P0JNaBbJk2daXuf+IGh8m+HGwuof+oOWp3Zn4opF0Ldxm46g8o AvwbhPV6p8YCi3VjjnzwEBR+zy4FcqnZ883YCpXsLRpo22Khmy7RJFyp6BCOKc52cqah lFsA== 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=an3Ps+rLugRlIXlfytp4sUTKxnRPPhj1WKOhQcMPmQk=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=EPGSBeGUYKxAmn3w0B8plKsAqSla6WBKfZqKzDZ3yBC0mWt2LdhNssyO1VT3izVg0u LCGAku42VXAJwh0HUR9iNprRWzh/j4O2Oy+RK/y1bcJTFVpUyQnYMaMLh3kV0tq9Sp4r UEvi2t32jaW3Sp5jbRX/bbey69a2NGZKvFhrpjHQFvdrqOMiq+Z+4E+0y2YZjXAk6s1w hlqBZ97WPBvmSV5OGYbhO6VbuGIE2OCbrqsCRpmpa1aR5Z1AwNCsVbXgZpdVkvJw8CVU YdIWj4N5fQKjbNoGqH7KFIR4HI1wmyHetw6JqKtjSA1MYEpO50AREJa61caRfCHBvpqE x/Xg==; 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="MPWw/gC8"; 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-57d0a1f475fsi97896a12.83.2024.06.18.12.43.30; Tue, 18 Jun 2024 12:43: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="MPWw/gC8"; 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 AB01568D7C5; Tue, 18 Jun 2024 22:42:39 +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 D4C6168D74C for ; Tue, 18 Jun 2024 22:42:28 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739744; bh=TK/lCaffdmXZ6OjGBISLpJxdKB3yEQtRVp03UMG0MBE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MPWw/gC8Wm7XTdEYN60b+BIVecbDOF1GDeJTSXirpP6WIQQiZTsPhKOT7Itx9W0Ro CIPhVZc5+o/zzaOgn6Q0uHoaqzKzZKmy8om9n4uH2/cCf4GjbSojcx1K1F+nHwWH37 dINXHTjnUodUkmOJnXH0VtT6v0njpGZVntf0w5Mc= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id BBF6043C7A; Tue, 18 Jun 2024 21:42:24 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:36 +0200 Message-ID: <20240618194221.26073-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/8] 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: RhKIespiFDZ0 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 | 27 +++++++++++++++++++-------- 2 files changed, 22 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 65c36ed0ae..631733c620 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" @@ -441,9 +443,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) { @@ -464,12 +467,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] && !memcmp(s->vdr[i], mapping, sizeof(*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] && !memcmp(s->vdr[i], mapping, sizeof(*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]); } } @@ -513,7 +525,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 Tue Jun 18 19:35: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: 50010 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780352vqg; Tue, 18 Jun 2024 12:43:41 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWYA6xm/GKh3JWgBZ6o29Sc2xxcBpWP6DRMuQlk6zYPMNpCKTlUwJRQ4lJL5CivRHsDBy/rGR1f0VX50qNSEQfaJgBxAIVhYXKPpg== X-Google-Smtp-Source: AGHT+IG7sKD0b40oYpp4WJFFRNn0Lm+Y8sxUNtI49vrk4KhOLNgQjfazduoYEr9gDglBN4Xe5gS/ X-Received: by 2002:a50:8747:0:b0:57c:db99:a131 with SMTP id 4fb4d7f45d1cf-57d07ed3a27mr257828a12.29.1718739821498; Tue, 18 Jun 2024 12:43:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739821; cv=none; d=google.com; s=arc-20160816; b=oprZz+0k/8JD7W9IEunuvcYhaJVO9vctmVfr8goR8dmyIfT8M3aWll4wn8VXLKrb9Z jerTUOye0a5xBOHj0wzPXAzsQ1NhbbrawmdvScXTLc/O6Ra9UglytmMPIC+1coli8Mqc tmFedNG6aUSB5uCw57h0V3T3pc3GtlhL3yIzaTvDesYNtl6bdFKPCKpHITILKXDK7D1H s0x+yt+Bak0dV8iiSLC6zrAnw1XKSm73DM4F0zfw2k+WPJgzzYz8sKw8r5HjQ6EJW2Uk u1qAaurvbFkL/+Ph2ZPtENY6yHiBJfBMqL7hJTGI+2Lp/RfP+es7en2U3rN4guSgXJdD 9l+Q== 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=41HZVri/iKr3ho0wJTWa1bGobgHGxAXZR60xmjOjsgI=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=Khb3ixHaR6e6r1aKP+w4d50gL5RrNYbOCYvjqxC1kypLLa3AzRkJPXxltInvkPIEQh FZQZ3addJ2gEi8ifS3wI2PU3WetIVv5AC3PVmg93YG0A5z26w4ZwU8xEvZyC80Y5Y5Nv sXyfDfp7UXwU9hTIKxoD5qQfN+AA5Z995Uucel77IJSemwBpUb8D5OjdxheV0K86KLls hzpkSggop53Ad+uWj/9E3M5twZwv6BYqPafYje3Uucvk3zyjC/p+/nxY72OVuRhJaU6Z w8IjgHyQGfOyNNbiMh4ucGrYzqHLzsngDH3KRgfAxc5HRlb/iRu7SFTAI65c1QQ98RN4 7wCg==; 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=BoZSE2OE; 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-57cb745d999si5567841a12.508.2024.06.18.12.43.40; Tue, 18 Jun 2024 12:43:41 -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=BoZSE2OE; 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 0CDCA68D7CA; Tue, 18 Jun 2024 22:42:42 +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 10D1268D74A for ; Tue, 18 Jun 2024 22:42:29 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739745; bh=hG2jtCAke188aBhpt3uLoBch24zeZnFMXt8qG0vwutw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BoZSE2OEEXADrgKpYteUcxBxWz3tvtscquuWbQy5s4WLZPp9FvBzigQo01+y6RXtC pGQE2vfYS4qN5VvthfIgY+pJ8c/+t9wM6qe7mRsov+cW61ONEkPN8/V8dEJXC2+wLo Y3KmVMmpyEjqUXuZCChJW8aOO2WHcDGqHbrT6xoI= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 01EE743E93; Tue, 18 Jun 2024 21:42:24 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:37 +0200 Message-ID: <20240618194221.26073-8-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/8] 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: GT4lCESS8p4Y 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 b34c3116b7..1e2ad4fd3d 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, disable_residual_flag); + 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, disable_residual_flag); - 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 Tue Jun 18 19:35: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: 50011 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp2780415vqg; Tue, 18 Jun 2024 12:43:50 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXj2k8/WWLXPpi930IuHbbiGWn4DRPTWnd2E+SqJWS6SgMfuYrigEaZiyFP41wSmmWzKNCyUJncToFOGmtHOcFxU6ok2sofezmfKw== X-Google-Smtp-Source: AGHT+IGBF5s0Pen4wzUlEHAHZQwgDTDtnrs/h29UKWcWAf09O1EAkr2KHsIAj8z8OkytpvyAjDeD X-Received: by 2002:a50:aa96:0:b0:57d:788:aaae with SMTP id 4fb4d7f45d1cf-57d07ebcb32mr250304a12.35.1718739830275; Tue, 18 Jun 2024 12:43:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718739830; cv=none; d=google.com; s=arc-20160816; b=k+RqNJ4r/fgLrc7QKxjBl0CiaCKOclEsU8xTqkj/FvhHHPLXNUe1/cJpTn2bo41LvS NB4XsZt0p/TGWRz58yIstU0xHYaxCo6Hh9+rxSZynHglJxctOKs7jSxMvJzGfUEFxtXj 3ECdsZVhW5rY7GnbTMO3tqinVXCaLnNKhofYc/0EMKHuDHi7Dk9MxuDMvIcSkIffTzS1 FIJ/l4irvuIyVjQ6b1LMJfDf5GFZ1rXJ6KYE373yce+CAO64H+rfzesh4SmcanUppuxW lF2e6ZuRaI4H86u1Rg2eYQJFyc08ShrnjdRhHjMiuf5MPWVRa77qPpVLPffRSVfiuzFx dgFg== 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=U2/yQQfMYpmss4sYZs5c11qZ9E7BiadrtW21w6u0V4M=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=pmfA7XD3RCZPgvdiEaxAKUG1R2vyxhmD5T0kZUm/SUavppNtwxr2TgMdpJ5LAkstCH eCX2of0oyGUccD+57rUymJkM9+Lhku0FIKz0YS4AdRliXJt1uvxX1hl4n0lYoateRn2p sFsoffr7kMDZssnMB2twdCu3hRcprsDc3vf0UOmz3o3Ju6PlaRN/Z6LuyKoI7Iz6nFng 7IKlHYi00QVwDPoUzrGu41a58gK22irQb2wn5u6Gf5lIjAbmaA9h+fZKqEDWlaEjvP2a ozZRKs6ZBLDUVO+muaQvSkCzMhT52Lu9JymSKGpDRJO4aZB74zAShS1ejgjo74erWaFX RKUw==; 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=SYzhJVZz; 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-57cb82d14f7si5698109a12.686.2024.06.18.12.43.48; Tue, 18 Jun 2024 12:43:50 -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=SYzhJVZz; 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 136D768D7D2; Tue, 18 Jun 2024 22:42:43 +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 1ABD168D74C for ; Tue, 18 Jun 2024 22:42:29 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1718739745; bh=LWfKxTHkrtH+z8nkGP4d7tBDoOw7UrO4EZ4qZP0u5Js=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SYzhJVZzQjDq+osi/G+as6EzPLQc58mCBJ3BkiKJMG5c9OgsXyo8Fv6N2Z8AntDyM IjVv3uol8KbvlCmAEk92rz1qBjJ9g6A/NkodMUMvu5IRQeg0EPJLU2sdSQhAtw0nYC SaiW2C+vu4LM5xnGf/JHjw6LlKw+7nDUl/BRD8lo= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 4034D46D5F; Tue, 18 Jun 2024 21:42:25 +0200 (CEST) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Jun 2024 21:35:38 +0200 Message-ID: <20240618194221.26073-9-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240618194221.26073-1-ffmpeg@haasn.xyz> References: <20240618194221.26073-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 8/8] 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: +ot8Cv8vDQhK 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 95565994fe..b432a1c11c 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, +};