From patchwork Fri Jan 1 21:35:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 24739 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6FE3B44BCD1 for ; Fri, 1 Jan 2021 23:38:13 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 513F168A956; Fri, 1 Jan 2021 23:38:13 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E0A8F68A8A6 for ; Fri, 1 Jan 2021 23:38:09 +0200 (EET) Received: by mail-wm1-f53.google.com with SMTP id c124so9848010wma.5 for ; Fri, 01 Jan 2021 13:38:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=HTTjs6eatYu+1ErDkw+foWwnVx/AXP8L3NH63iKv0DQ=; b=FnsZRgppq3hcTDOXgP7vGiZekBz+r3LraAXtsvYE+RxWZESsJkhcSsLaXVlkoQ2V/u QGTrhNjRFk1R+xy+4KVbapngJ01KpI35agkvq6xaLTzf8ACbT/gOo7r9qlcX2JwHRdG7 Kjvh0XzysxWuK2xHlQ5N3vRR5NRuY1WUcTkw4clLYOWDqkbovVlwJwwX4g6q26Ags54D 5+k+N9DmodyM0cFNvn79QSjV18n+R44824GX1pMXDCGRMRr+3EX6KkQNCanKL0toroz7 5hzIRrxL0S/Sz0WsmG8qiC8KT5WX/MS4FlCATfIflukpDKkymKMZvZM/KdtvbGPHZEdc MTYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HTTjs6eatYu+1ErDkw+foWwnVx/AXP8L3NH63iKv0DQ=; b=oTtOiaE959rtjuzXjW61VqrFNzdoLImAs4mobLKZr88IY5rthgQGKTiMVVpii0wSzR t0Xfbzq8PpieAVfRuvo+oWns9SFZBEEKF4WqZDFW7PWzQbPtUMD0xIoQvU51tJ6siO8/ qqJdOT75MC1yiWv3T4TriLNrVD1cWmGFelrwCDvLuKILz5RfCnm+ver9Lccvkv6HTcii AUV1p0R0HfMFbh4JN3dhiOCa5FHlg3iODMMglAEazCSb3cFkjkS88Pk7EVIrsTDxJzce Aw9lS+Gez3kBDxp9XKGCgQLNyKOdXj2qapIdcLaTY95CnKJAM3ZViXdBqVK0Pgriq4vc ONCw== X-Gm-Message-State: AOAM532xNXjo9/nlV//hcLBvPaVbBRi57NKkgqspy+wZXe6TD2AFgaea 0/lcGtyr7EEAVq3pUP1wiTMD98Ukf3E/4A== X-Google-Smtp-Source: ABdhPJwaOyTh48dXfi2XgNfwpXvuUYYlxDWTlRq1ocXJS+WQqVeqAMbKK5kkJMXrGWx0kEwXE9n2dQ== X-Received: by 2002:a7b:c7d3:: with SMTP id z19mr17298291wmk.31.1609537089197; Fri, 01 Jan 2021 13:38:09 -0800 (PST) Received: from localhost.localdomain (cpc91226-cmbg18-2-0-cust7.5-4.cable.virginm.net. [82.0.29.8]) by smtp.gmail.com with ESMTPSA id v20sm18784595wml.34.2021.01.01.13.38.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 Jan 2021 13:38:08 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Fri, 1 Jan 2021 21:35:30 +0000 Message-Id: <20210101213537.169546-21-sw@jkqxz.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210101213537.169546-1-sw@jkqxz.net> References: <20210101213537.169546-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 20/27] cbs: Add interface to allow BSFs easy access to metadata manipulation X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/cbs_bsf.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ libavcodec/cbs_bsf.h | 6 ++++ 2 files changed, 79 insertions(+) diff --git a/libavcodec/cbs_bsf.c b/libavcodec/cbs_bsf.c index 429f360014..fe6304a0d4 100644 --- a/libavcodec/cbs_bsf.c +++ b/libavcodec/cbs_bsf.c @@ -18,6 +18,7 @@ #include "bsf_internal.h" #include "cbs_bsf.h" +#include "cbs_metadata.h" static int ff_cbs_bsf_update_side_data(AVBSFContext *bsf, AVPacket *pkt) { @@ -159,3 +160,75 @@ void ff_cbs_bsf_close(AVBSFContext *bsf) ff_cbs_close(&ctx->input); ff_cbs_close(&ctx->output); } + +int ff_cbs_bsf_apply_metadata(AVBSFContext *bsf, + AVPacket *pkt, + CodedBitstreamFragment *frag, + enum CBSMetadataType type, int action) +{ + CBSBSFContext *ctx = bsf->priv_data; + const CBSMetadataTypeDescriptor *desc; + uint8_t *side_data; + size_t size; + int err, ignored; + + desc = ff_cbs_metadata_find_type(type); + if (!desc) + return AVERROR(EINVAL); + if (!desc->has_packet_side_data) + return AVERROR(EINVAL); + + switch (action) { + case BSF_ELEMENT_PASS: + // Nothing to do. + return 0; + + case BSF_ELEMENT_REMOVE: + // Remove all existing instances of the metadata. + err = ff_cbs_remove_metadata(ctx->output, frag, type); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to remove %s metadata " + "from %s.\n", desc->name, ctx->type->fragment_name); + } + return err; + + case BSF_ELEMENT_INSERT: + // Insert matching side-data to replace existing metadata. + side_data = av_packet_get_side_data(pkt, + desc->packet_side_data_type, + &ignored); + if (!side_data) { + // No side data of this type. + return 0; + } + err = ff_cbs_insert_metadata(ctx->output, frag, type, side_data); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to insert %s metadata " + "into %s.\n", desc->name, ctx->type->fragment_name); + } + + case BSF_ELEMENT_EXTRACT: + // Extract the metadata and attach it to the packet as side-data. + side_data = ff_cbs_alloc_metadata(type, &size); + if (!side_data) + return AVERROR(ENOMEM); + err = ff_cbs_extract_metadata(ctx->output, frag, type, side_data); + if (err == AVERROR(ENOENT)) { + // No metadata of that type. + return 0; + } + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to extract %s metadata " + "from %s.\n", desc->name, ctx->type->fragment_name); + return err; + } + err = av_packet_add_side_data(pkt, desc->packet_side_data_type, + side_data, size); + if (err < 0) + av_free(side_data); + return err; + + default: + return AVERROR(EINVAL); + } +} diff --git a/libavcodec/cbs_bsf.h b/libavcodec/cbs_bsf.h index 8cab3f144c..95cae316b2 100644 --- a/libavcodec/cbs_bsf.h +++ b/libavcodec/cbs_bsf.h @@ -55,6 +55,12 @@ int ff_cbs_bsf_filter(AVBSFContext *bsf, AVPacket *pkt); int ff_cbs_bsf_init(AVBSFContext *bsf, const CBSBSFType *type); void ff_cbs_bsf_close(AVBSFContext *bsf); +enum CBSMetadataType; + +int ff_cbs_bsf_apply_metadata(AVBSFContext *bsf, + AVPacket *pkt, + CodedBitstreamFragment *frag, + enum CBSMetadataType type, int action); // Options for element manipulation. enum {