From patchwork Sun Feb 21 19:51:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 25875 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 01683449DB5 for ; Sun, 21 Feb 2021 21:53:51 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E5DAA68A996; Sun, 21 Feb 2021 21:53:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 549CE68A72F for ; Sun, 21 Feb 2021 21:53:37 +0200 (EET) Received: by mail-wr1-f42.google.com with SMTP id r3so5259144wro.9 for ; Sun, 21 Feb 2021 11:53:37 -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=kILhC3CjQHSrXJEnhX7QUWeqkpRgH2f5lci5SGSBSIk=; b=iKf9OT7t3RVlbn1OWyiCS83EpAIkPg7vmDLpEyCn+OalWA92Ue3do1KOE/VsM6+9jy A8ZdryKRQLiX+KgEp3nobqh/K42raqxmN64qg+lWEA1ZQWwz7wQmbvr4ijxtfzZTfdYM a0SG/NhRg9z5kjoB5YEqXzjQDIMFAtPoGTFxxka5dSPDs2rnkR5fYceZ60RkwlAYeuKi EC4/9uJBoEBOocHAr45xbjyQc3yrSMQ2S3lgDwdsc+jkeEtP3Vg7MIzUHzr2laGTuON/ RYpOzh+QxI8pqqt4NtLR7WnXT+NLKGfiRm0e2i95GxfykhPyfAVWQwg4qWSl10nFwuY0 GsKg== 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=kILhC3CjQHSrXJEnhX7QUWeqkpRgH2f5lci5SGSBSIk=; b=oCdgcYS1bF2fkk4xULnVXGbNarRkQLhheAaNqcuKEgsSTwHpROCGcwBUNa5hDspcJv +1g33VdrmmD9C83ogVrv9udkc9D8gUdIgRZaXPt+TUFMWo/t1+XHJg3BmdJRUGx7mAwU 5CoIbmjjUGUSubcpDnskryuoGonXCjDUnJ3vVxWBOwrs9HxrHo/yNahw53Mf8s57PNVC knHsnDBsBNRWLdUZxRqFNEetsx6FMNkYGahDGFnGrRTWHfflyQkSxmjyFu8mj0aMsNBd Yyvo6LCf8AGfoeqrAyOnAVlsGa0RIDJTdOZlE7OnIhx3A/d67ZZwyTzRCidjr2O8gdVW xu3A== X-Gm-Message-State: AOAM531orRIFe2WKcsk+cNtavjKD00STTreWNVCq0wyuvuL2u7IXzLnK W/UtFDdVK5ZoOiB7rricVVqHz5Ra6LASKA== X-Google-Smtp-Source: ABdhPJzBcG3LYAC96xCaKUIWyTSI2gnRf0UxxdrdpL8dHKLHAuds0hP92ZpXYHME2U9xeP5pC/N6YA== X-Received: by 2002:adf:f890:: with SMTP id u16mr4621605wrp.67.1613937216834; Sun, 21 Feb 2021 11:53:36 -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 z18sm1780372wrs.19.2021.02.21.11.53.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Feb 2021 11:53:36 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 Feb 2021 19:51:17 +0000 Message-Id: <20210221195125.1901683-10-sw@jkqxz.net> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210221195125.1901683-1-sw@jkqxz.net> References: <20210221195125.1901683-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 10/18] 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 9b521cf111..4f8f7f499d 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 cbs_bsf_update_side_data(AVBSFContext *bsf, AVPacket *pkt) { @@ -157,3 +158,75 @@ void ff_cbs_bsf_generic_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 6be95abc3f..7027c20746 100644 --- a/libavcodec/cbs_bsf.h +++ b/libavcodec/cbs_bsf.h @@ -86,6 +86,12 @@ void ff_cbs_bsf_generic_close(AVBSFContext *bsf); */ int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt); +enum CBSMetadataType; + +int ff_cbs_bsf_apply_metadata(AVBSFContext *bsf, + AVPacket *pkt, + CodedBitstreamFragment *frag, + enum CBSMetadataType type, int action); // Options for element manipulation. enum {