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; }