From patchwork Tue Mar 21 15:01:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Siedel X-Patchwork-Id: 40756 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2660810pzb; Tue, 21 Mar 2023 08:02:43 -0700 (PDT) X-Google-Smtp-Source: AK7set/KlA+3aEGi0MxATDs2j6A6IN9krI4HUw0elgSFIAE7NGdf/gSqj9jBLKNshuQg5rCf7+Dh X-Received: by 2002:aa7:c9ce:0:b0:4af:81fb:4c72 with SMTP id i14-20020aa7c9ce000000b004af81fb4c72mr3321193edt.34.1679410963287; Tue, 21 Mar 2023 08:02:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679410963; cv=none; d=google.com; s=arc-20160816; b=LQqnEAPEpMHdh0Dk3JdkB86yt37MBACdbEV8BYUkUszYWAUllXEHX5THZn8Ie4YZ08 7zvQKTmWNQqXlgfcC7cKCAvx4Egybjyp3Q86hgGRRSxP53PQfw947smXw0gC8hIe1WIT G86bMxbrd+nglv4ZjNZa5iFXA5do6bdL2G3nytKgWLeHy+L0iIoZPqL/syr0cp31oTxb CumVDqBcXflJcf6Yscr1c62WBCD2txlW8k7oM4PVDjRAXv3kzrwwGYMeT8Hp+7O9tavT pqRcpCU++wgGFLPFyKse7/CxZ95OwQSsVdNcSAVUHTOEzc69q5qzH1pgkNJfcJKTOVO6 TUAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=8cJlV4mJhiqDfA5GD54zl5mCPYO9QKFR2ky+nQETb6A=; b=isnulV7K4u7YQdajf/OAipWLzHAEx8e0v5lH1os8oMInzNszahqbHhuLy1PW6rZhxH ylI6aA+y/I0f5X1zd3Vfqlv2yUaVjDtyKRSVufN+GjWI9nv5l/yPjnRuM0GOxTvSH+zZ SyJsx/uc2GP4awtvozaiMfNSOo7MerdFRuNdPGBYRzlGaGeuNGL4dHc0bZw0vgzQakPL wYiuyskkFc4UpKqVTAyo7UWzNMXn6Pk1FUhWoA8Aoo9RNuutgGxHm0usGAdE/r8gEhKy uRq1mzm9sInJ6gNbAaklpyWNL9GjnS01lHNOW/FhOI3iPEOschsBA+YSUS6OtJIMZ6Eu Psqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@spin-digital-com.20210112.gappssmtp.com header.s=20210112 header.b=BX4FRwNp; 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 l18-20020aa7c3d2000000b004fd9bd49a46si12476039edr.540.2023.03.21.08.02.42; Tue, 21 Mar 2023 08:02:43 -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=@spin-digital-com.20210112.gappssmtp.com header.s=20210112 header.b=BX4FRwNp; 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 36F2168C677; Tue, 21 Mar 2023 17:01:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9323E68C599 for ; Tue, 21 Mar 2023 17:01:41 +0200 (EET) Received: by mail-ed1-f51.google.com with SMTP id ek18so60879168edb.6 for ; Tue, 21 Mar 2023 08:01:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spin-digital-com.20210112.gappssmtp.com; s=20210112; t=1679410900; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=KhxMAjJFpuzI/j3lmHDXhCMxd0PiWagqxz7VvOviEPs=; b=BX4FRwNpopeSabhDvd2fj3gFVocDqz+6BwnEoWuJV2+NVIrbeUp4eMZU17B8nCUBd7 BhtfzAGBUilTGOYp4nbG3EtkXLYTvILr4+h+MppJmmwWc5bP6O48i2NgCGmDEsF2CU+n 0iIdVoe8X9jknhI0SuWCM0HgcodpOnFU+7R0kgUB2x1fUpV3nvv5kbDj3O76Q6NE/zl/ mb9nj8L5HFB+7p+zaVan6+aaZpLtsSbiyuuKEuy0LlRG2Exb3+5nBgxQ5MLErjZYqbXU YJIPB/V/V2Fv3epK29BgAdNqYSCliqLjJIaHu+NAwJcduMcGzZwKPFwloUx3TXDh9Q/Q 53dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679410900; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KhxMAjJFpuzI/j3lmHDXhCMxd0PiWagqxz7VvOviEPs=; b=4b17UNS6b1cpxdpbNuV8zb0EVD/jULcCr0puBq8GO3BuvvPZpP5bQ7N4ILTCzOeSXI c++5kUXYa/y+EOO9iZVWpcr1eeAz0TxQyNjKgjo9TMMxp5twIkkDCMWz9aG6cFMuJmU/ pB0mEJtVyDncs1EiiNNbpsHNVkWKCKDWswjHbB53KqZP9Qg3z1i1kjHkP24ikEfyM4tT iRjucdi1R5mcZrZDBsbJyMazyEuaonipafPN5WBMxw4kFHS8FBKpXM+Wx8eRDp6EaYum FhawKl3maMN6Fr3fYqS6JQMuu/GsjItwNYE5guiXM9g4EYpBqk3H1gK272XyrHHLwl4T s2jA== X-Gm-Message-State: AO0yUKVAL3w8xr5lH40vfcWJK72w3ok4dfCHE1uQKUHSqP6XruPI9iYQ q5/Ne4ojsmI3PDAXqwu4SOTBM3IhMUtFCnsuIso= X-Received: by 2002:aa7:da0a:0:b0:501:cced:9c6c with SMTP id r10-20020aa7da0a000000b00501cced9c6cmr3299628eds.7.1679410900333; Tue, 21 Mar 2023 08:01:40 -0700 (PDT) Received: from thomas-win.localdomain ([213.138.44.237]) by smtp.gmail.com with ESMTPSA id x93-20020a50bae6000000b004fbf6b35a56sm6405817ede.76.2023.03.21.08.01.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 08:01:39 -0700 (PDT) From: Thomas Siedel To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Mar 2023 16:01:17 +0100 Message-Id: <20230321150124.21999-5-thomas.ff@spin-digital.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230321150124.21999-1-thomas.ff@spin-digital.com> References: <20230321150124.21999-1-thomas.ff@spin-digital.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v7 04/11] avcodec: add h266_metadata_bsf support for H266/VVC 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VIX/4bO99zI5 From: Nuo Mi Add H.266/VVC metadata bsf. --- configure | 1 + libavcodec/Makefile | 1 + libavcodec/bitstream_filters.c | 1 + libavcodec/h266_metadata_bsf.c | 147 +++++++++++++++++++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 libavcodec/h266_metadata_bsf.c diff --git a/configure b/configure index 2fb167c7c3..297ce6e27f 100755 --- a/configure +++ b/configure @@ -3283,6 +3283,7 @@ filter_units_bsf_select="cbs" h264_metadata_bsf_deps="const_nan" h264_metadata_bsf_select="cbs_h264" h264_redundant_pps_bsf_select="cbs_h264" +h266_metadata_bsf_select="cbs_h266" hevc_metadata_bsf_select="cbs_h265" mjpeg2jpeg_bsf_select="jpegtables" mpeg2_metadata_bsf_select="cbs_mpeg2" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 79c4363f3d..c3989df358 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1219,6 +1219,7 @@ OBJS-$(CONFIG_H264_METADATA_BSF) += h264_metadata_bsf.o h264_levels.o \ h2645data.o OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF) += h264_mp4toannexb_bsf.o OBJS-$(CONFIG_H264_REDUNDANT_PPS_BSF) += h264_redundant_pps_bsf.o +OBJS-$(CONFIG_H266_METADATA_BSF) += h266_metadata_bsf.o OBJS-$(CONFIG_HAPQA_EXTRACT_BSF) += hapqa_extract_bsf.o hap.o OBJS-$(CONFIG_HEVC_METADATA_BSF) += h265_metadata_bsf.o h265_profile_level.o \ h2645data.o diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c index e8216819ca..848f430014 100644 --- a/libavcodec/bitstream_filters.c +++ b/libavcodec/bitstream_filters.c @@ -39,6 +39,7 @@ extern const FFBitStreamFilter ff_filter_units_bsf; extern const FFBitStreamFilter ff_h264_metadata_bsf; extern const FFBitStreamFilter ff_h264_mp4toannexb_bsf; extern const FFBitStreamFilter ff_h264_redundant_pps_bsf; +extern const FFBitStreamFilter ff_h266_metadata_bsf; extern const FFBitStreamFilter ff_hapqa_extract_bsf; extern const FFBitStreamFilter ff_hevc_metadata_bsf; extern const FFBitStreamFilter ff_hevc_mp4toannexb_bsf; diff --git a/libavcodec/h266_metadata_bsf.c b/libavcodec/h266_metadata_bsf.c new file mode 100644 index 0000000000..05e476071f --- /dev/null +++ b/libavcodec/h266_metadata_bsf.c @@ -0,0 +1,147 @@ +/* + * 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/opt.h" + +#include "bsf.h" +#include "bsf_internal.h" +#include "cbs.h" +#include "cbs_bsf.h" +#include "cbs_h266.h" +#include "h266.h" + +typedef struct H266MetadataContext { + CBSBSFContext common; + + H266RawAUD aud_nal; + + int aud; +} H266MetadataContext; + +static int h266_metadata_update_fragment(AVBSFContext *bsf, AVPacket *pkt, + CodedBitstreamFragment *pu) +{ + H266MetadataContext *ctx = bsf->priv_data; + int err, i; + + // If an AUD is present, it must be the first NAL unit. + if (pu->units[0].type == VVC_AUD_NUT) { + if (ctx->aud == BSF_ELEMENT_REMOVE) + ff_cbs_delete_unit(pu, 0); + } else if ( pkt && ctx->aud == BSF_ELEMENT_INSERT) { + const H266RawSlice *first_slice = NULL; + const H266RawPH *ph = NULL; + H266RawAUD *aud = &ctx->aud_nal; + int pic_type = 0, temporal_id = 8, layer_id = 0; + for (i = 0; i < pu->nb_units; i++) { + const H266RawNALUnitHeader *nal = pu->units[i].content; + if (!nal) + continue; + if (nal->nuh_temporal_id_plus1 < temporal_id + 1) + temporal_id = nal->nuh_temporal_id_plus1 - 1; + if ( nal->nal_unit_type == VVC_PH_NUT ) { + ph = pu->units[i].content; + } else if (IS_H266_SLICE(nal->nal_unit_type)) { + const H266RawSlice *slice = pu->units[i].content; + layer_id = nal->nuh_layer_id; + if (slice->header.sh_slice_type == VVC_SLICE_TYPE_B && + pic_type < 2) + pic_type = 2; + if (slice->header.sh_slice_type == VVC_SLICE_TYPE_P && + pic_type < 1) + pic_type = 1; + if (!first_slice) { + first_slice = slice; + if (first_slice->header. + sh_picture_header_in_slice_header_flag) + ph = &first_slice->header.sh_picture_header; + else if (!ph) + break; + } + } + } + if (!ph) { + av_log(bsf, AV_LOG_ERROR, "no avaliable picture header"); + return AVERROR_INVALIDDATA; + } + + aud->nal_unit_header = (H266RawNALUnitHeader) { + .nal_unit_type = VVC_AUD_NUT, + .nuh_layer_id = layer_id, + .nuh_temporal_id_plus1 = temporal_id + 1, + }; + aud->aud_pic_type = pic_type; + aud->aud_irap_or_gdr_flag = ph->ph_gdr_or_irap_pic_flag; + + err = ff_cbs_insert_unit_content(pu, 0, VVC_AUD_NUT, aud, NULL); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n"); + return err; + } + } + + /* TODO: implement more metadata parsing, like VUI, Levels etc. */ + //for (i = 0; i < pu->nb_units; i++) { + // if (pu->units[i].type == VVC_SPS_NUT) { + // } + //} + return 0; +} + +static const CBSBSFType h266_metadata_type = { + .codec_id = AV_CODEC_ID_VVC, + .fragment_name = "access unit", + .unit_name = "NAL unit", + .update_fragment = &h266_metadata_update_fragment, +}; + +static int h266_metadata_init(AVBSFContext *bsf) +{ + return ff_cbs_bsf_generic_init(bsf, &h266_metadata_type); +} + +#define OFFSET(x) offsetof(H266MetadataContext, x) +#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM) +static const AVOption h266_metadata_options[] = { + BSF_ELEMENT_OPTIONS_PIR("aud", "Access Unit Delimiter NAL units", + aud, FLAGS), + + { NULL } +}; + +static const AVClass h266_metadata_class = { + .class_name = "h266_metadata_bsf", + .item_name = av_default_item_name, + .option = h266_metadata_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +static const enum AVCodecID h266_metadata_codec_ids[] = { + AV_CODEC_ID_VVC, AV_CODEC_ID_NONE, +}; + +const FFBitStreamFilter ff_h266_metadata_bsf = { + .p.name = "h266_metadata", + .p.codec_ids = h266_metadata_codec_ids, + .p.priv_class = &h266_metadata_class, + .priv_data_size = sizeof(H266MetadataContext), + .init = &h266_metadata_init, + .close = &ff_cbs_bsf_generic_close, + .filter = &ff_cbs_bsf_generic_filter, +};