From patchwork Sun Feb 21 19:51:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 25872 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 80F73449DB5 for ; Sun, 21 Feb 2021 21:53:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6B77568A943; Sun, 21 Feb 2021 21:53:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A84D68A7D8 for ; Sun, 21 Feb 2021 21:53:36 +0200 (EET) Received: by mail-wr1-f43.google.com with SMTP id c7so147304wru.8 for ; Sun, 21 Feb 2021 11:53:36 -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=Ny90rHshpebG9RGSsS0q3RoLqrZDau5o5xeJK+AfEBs=; b=CKs8IqQ/q2xkN/98pukA6oZZCVOKaW8k8hKp/HFdMXRycTJx7dNqjWCszSMBzV+JMk 0Z2Tg2LQq9jm2ng/k9g0hgyXtfL6DUiMO4GOdsU6fpii0wypZtxjgKnRyPKeRc846wmI BJ4WyLg3ivlZCJEhd1GlhfgS8NjE9eGNXjz/UV+kYhVdm7SyaBc6aDrt/r2cG7dzt1Od Faa1xqjCl8WfI3HLXMw2gfCyDpj4Rma3d4KFJI7rZ80mDJhg7LomBVfcmpaaly729BP0 eWfb1lrLj7EIzKb/Rwc2B2GUHfu3+Z2PMksq2KTF2mo3PcoKOImeH/aiDAVGhDnOJRIy cXmg== 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=Ny90rHshpebG9RGSsS0q3RoLqrZDau5o5xeJK+AfEBs=; b=VTKLbes88EYt8TJag5JP+kjNpFLYOYQ8OY+25tFeVjmvP8EMLhZ4tLuz4PlWYC9dW3 4zT4ISQX0bwvdMaDPcfkmA/xyiuwncy29Ld6AkoIjGw8LXoBe75UCx924SIyzTprpG2h RGZUXmsebjBy/Z/5dWPH9WC1COgmjG1ljJNx3ZPS5SeUDkGM5VZ+Ruf6Dbk4HVGoWVk1 U43XKn0/NlWWBY+/nR40QQJQVrE3i/anL1HFztsRc6Z1FO2szOVzm7ZGZhhoippm/tk+ Vx4t8YXiQZXeD+NTOXMm9TjqCkvV+gveC961+6hVWP4MElxkne5pdStGv6WLLsZagFrX JwXQ== X-Gm-Message-State: AOAM531P6NPV+t47T7JvtS5xH7AE0Oj2RMsuu0WUMNoy8sVei5EZ5OWI 6BSobqcwdFSYmzJYeOsJxhJZPEXvhOtBqw== X-Google-Smtp-Source: ABdhPJwVYIAIQtiml+T+dPMJ/brZmhFdNwVuG1Bw91f+SsatqRhXh88mXwioJXQYgl2Q1OngOOsudg== X-Received: by 2002:adf:f608:: with SMTP id t8mr16851913wrp.196.1613937215443; Sun, 21 Feb 2021 11:53:35 -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.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Feb 2021 11:53:35 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 Feb 2021 19:51:15 +0000 Message-Id: <20210221195125.1901683-8-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 08/18] cbs_av1: Implement 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_av1.c | 142 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index 302e1f38f5..0c958c81c2 100644 --- a/libavcodec/cbs_av1.c +++ b/libavcodec/cbs_av1.c @@ -22,6 +22,7 @@ #include "cbs.h" #include "cbs_internal.h" +#include "cbs_metadata.h" #include "cbs_av1.h" #include "internal.h" @@ -1267,6 +1268,143 @@ static void cbs_av1_close(CodedBitstreamContext *ctx) av_buffer_unref(&priv->frame_header_ref); } +static int cbs_av1_find_metadata_unit(CodedBitstreamFragment *tu, + uint64_t metadata_type, + CodedBitstreamUnit **iter) +{ + int i, found; + + found = 0; + for (i = 0; i < tu->nb_units; i++) { + CodedBitstreamUnit *unit = &tu->units[i]; + AV1RawOBU *obu = unit->content; + + if (!obu) + continue; + + if (obu->header.obu_type == AV1_OBU_METADATA) { + if (!*iter || found) { + *iter = unit; + return 0; + } + if (unit == *iter) + found = 1; + } + } + + return AVERROR(ENOENT); +} + +static uint64_t cbs_av1_find_metadata_type(enum CBSMetadataType type) +{ + struct { + enum CBSMetadataType cbs_type; + uint64_t av1_type; + } map[] = { + }; + + for (int i = 0; i < FF_ARRAY_ELEMS(map); i++) { + if (map[i].cbs_type == type) + return map[i].av1_type; + } + return 0; +} + +static void cbs_av1_delete_metadata_type(CodedBitstreamFragment *tu, + uint64_t metadata_type) +{ + int err; + while (1) { + CodedBitstreamUnit *unit = NULL; + err = cbs_av1_find_metadata_unit(tu, metadata_type, &unit); + if (err < 0) + break; + ff_cbs_delete_unit(tu, unit - tu->units); + } +} + +static int cbs_av1_remove_metadata(CodedBitstreamContext *ctx, + CodedBitstreamFragment *tu, + enum CBSMetadataType type) +{ + uint64_t metadata_type; + + metadata_type = cbs_av1_find_metadata_type(type); + if (metadata_type == 0) + return AVERROR(EINVAL); + + cbs_av1_delete_metadata_type(tu, metadata_type); + return 0; +} + +static int cbs_av1_insert_metadata(CodedBitstreamContext *ctx, + CodedBitstreamFragment *tu, + enum CBSMetadataType type, + const void *data) +{ + AVBufferRef *md_buf; + AV1RawOBU *obu; + uint64_t metadata_type; + int err; + + metadata_type = cbs_av1_find_metadata_type(type); + if (metadata_type == 0) + return AVERROR(EINVAL); + + md_buf = av_buffer_allocz(sizeof(AV1RawOBU)); + if (!md_buf) + return AVERROR(ENOMEM); + + obu = (AV1RawOBU*)md_buf->data; + + obu->header = (AV1RawOBUHeader) { + .obu_type = AV1_OBU_METADATA, + }; + obu->obu.metadata.metadata_type = metadata_type; + + switch (metadata_type) { + default: + av_assert0(0); + } + + cbs_av1_delete_metadata_type(tu, metadata_type); + + err = ff_cbs_insert_unit_content(tu, -1, AV1_OBU_METADATA, + obu, md_buf); + av_buffer_unref(&md_buf); + return err; +} + +static int cbs_av1_extract_metadata(CodedBitstreamContext *ctx, + CodedBitstreamFragment *tu, + enum CBSMetadataType type, + void *data) +{ + CodedBitstreamUnit *unit; + AV1RawOBU *obu; + uint64_t metadata_type; + int err; + + metadata_type = cbs_av1_find_metadata_type(type); + if (metadata_type == 0) + return AVERROR(EINVAL); + + unit = NULL; + err = cbs_av1_find_metadata_unit(tu, metadata_type, &unit); + if (err < 0) { + // No metadata with that type found. + return err; + } + obu = unit->content; + + switch (metadata_type) { + default: + av_assert0(0); + } + + return 0; +} + static void cbs_av1_free_metadata(void *unit, uint8_t *content) { AV1RawOBU *obu = (AV1RawOBU*)content; @@ -1333,4 +1471,8 @@ const CodedBitstreamType ff_cbs_type_av1 = { .flush = &cbs_av1_flush, .close = &cbs_av1_close, + + .insert_metadata = &cbs_av1_insert_metadata, + .remove_metadata = &cbs_av1_remove_metadata, + .extract_metadata = &cbs_av1_extract_metadata, };