From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 1E07B4A2DC for ; Tue, 26 Mar 2024 05:28:08 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 98B1968D505; Tue, 26 Mar 2024 07:28:07 +0200 (EET) Received: from EUR02-VI1-obe.outbound.protection.outlook.com (mail-vi1eur02olkn2036.outbound.protection.outlook.com [40.92.48.36]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C263068D35C for ; Tue, 26 Mar 2024 07:28:01 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UWljeOFy5OvX3Qm/c+aAn7UqCAymQNsLTe4XmupcfLp8l6hwlkim1L7w1BOb01iT1Vg5YonvVPvri4+/8I7edrgu28CUr9mIrxGL3TdwVm7udaQw8qEnBpNH+zBfTsef5sQoVBNZ/wJcFQT0LfQ3F8Ts6LpgkC84TPqL3kSNju4e/zp7re+2MwzwEdfDC1TwW9VyETfmrH9WsH6jjAa2qachehdbD11Uwib+GMBgnCZirUUE7NecbU4NqzQHjJY8G5q+meCIbRMizDjt6KiglX31q5aKhJ8XPrVBHgNboR8tQxC/B23B1uw9n3mKUB1dXIVPOMt4fAPEqk43JkYTLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=f2HxnoxJ18tWfllSGrJ9aX/5W/Tp/GWK7XhiqaW54eM=; b=NByeFAoeZxx06xsQUNaOxO0mEFbELOOKXqXsIgA6QQnq9LcCnWKYOuyO4AJdX7DzkKucazC+99TQoQmClmYItDaDX5LmRBhOLz7S4Ms/MjEiCWqvsE06X1/odfpKscKXZ2ChzELAn0tnTLuyudJAt7yoeyqyZ3h0ryFc+Qi13+HCP1ZUprHOukmgeoC8AimTq/1IwoAi3gBXHV/M54rbCA4GPGdhkpASWzfqAFe1bp40v73C4v/WcL4scFR8LW2XbNb2qqFf+6tZrcF5Kreb2RN2UYIQuk8/jmOteRH9/pOxG8+Ro1fAC1AL6mklcLWMTRIvJ8Mxm7k3V0k0QaFslw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=f2HxnoxJ18tWfllSGrJ9aX/5W/Tp/GWK7XhiqaW54eM=; b=h5cAHFrPtdWDc5lwi4vqURi8BMnO4C1BDbxJOaO/GuaFPoNupjYXr7yRzwvcmzWsgQd+X30QsCObDjivRVH/XQOIEpB0GypiPqy4X6vo0hNrvpRdXcmyvUzfEOoblJJV2FdCFN56bvgGneAkwETp/eHFWtajKrWW2+1lEpzCShrfgjdi2DGCGihIZM0SYAlhLOSYbRGFho+3yAiLXK5lrk141MpGXSAf4iceWnVZFYe8BG7KFgnx54PXIyOaSAvnITuUG8FdKJci9bq6C5ZKbutrDeYknohSvdbWP5Zgzr+r2mYpT1ubjsJdNr0dytdT7GCdITNgPO+OL8d7BBlpkg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DB9P250MB0498.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:33c::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.31; Tue, 26 Mar 2024 05:27:59 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d%4]) with mapi id 15.20.7409.028; Tue, 26 Mar 2024 05:27:59 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 26 Mar 2024 06:27:50 +0100 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [2ZgAo3qQtXyn6MvIUg8lWqMlETadG1FYASih4/FGPVs=] X-ClientProxiedBy: ZR0P278CA0216.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:6a::7) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240326052751.3580990-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DB9P250MB0498:EE_ X-MS-Office365-Filtering-Correlation-Id: 6868ea1e-1a48-4354-1e26-08dc4d557fae X-MS-Exchange-SLBlob-MailProps: Cq7lScuPrnqkjmXb1vlddM5aSa/Epk3AArdmWI5X3QWteVycijLKueqEGMJteb0AoGKvzs5uEM0U5ENe2qpGWUlin6qB9GVKRFBC9DUTM5EQp3psP11pvimTkPHx1jvdAtNGKX32PtVUcAVS2jUXKA0kQ4cqTDsmX/XF6VNN3KCTmiWFn3lxpHTy3Wn7aIlIFhNXr6yxUFj+BydYAejyUcL34/46THTNr4ljN828rZO/FUPUPyYFPC0JBcqH+r7G6pcippKMp4+TTrcy+c1vv5gnV0/BEIzJLDQ1ttWG1rI5CcYbhSy7ycyPoCdKdifx6aPjzbXgA6BNmORrtH6EHHAcIavaGIdORKBV+yyRTmLqVftA4XCa62/WPGdcd4fMKhp50siP4yrU5vg8QGnymTACNs/zOfbnNaTJa/ATc1sTPTnvfEjefb56/CVILFKswJQA9pOOHXz3OWEVkBDcSyxxJ61T7Dc2dM/mfEYlpAmF0VtyPU5p45f3oS/XEFYd02eAEtQ7lGxtEVDWMEBIVzQtt/LljkC8ONL7vk0uvKq3LIiB+J1qdjtaO5Hatt1r1bxFSd+vpmfl2lFmcAANFfdGsXvhx7+Wqdh1Moxu7Q4MJBcFYswiPDWkmQcUH38/Hp7oLv1g1NprC0Y78ducCxEix0ryuh9/WyYaiPfHtO3XXVAE5eHPPhUWxublWUOYCKkePpAc1PluuFiXBRbHHHpm+KtU9Jh4cW9C3Xw7y/1JT50TUPO8ED2RMLC5BXWjzXamYLlRKZU= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Yyj3pfN8PjfRQUMi//fAacq7UWIhSZD9bBPpAj2P7el0HY7vAkM5pDYTWSHdkG2+NELduLe5mTEmFKOEUSaVYtZiR9Ol5krFIN/fa4iJId/IBCCllKr1YnTE8yCL8XZPlkr7I8bwJMQGhdbBpIZd/NVzJOh1866gqdi99uraBk4K0UltwDRt5zSbmOlfS5cd3lPiGSwdwipiqtq1uFnKURhA/zMwhCQBeyvdGOAy8hFq8YqHKG/zn8ac5TjwZbTga6A3B3Irutvfpht92C0CqCKyrt4ScmIDbxNH++G8Md/VwsW3dLBicAzo3lXRMUcMaAFTFay/4CZ1q8nTfh9IsPjvt5aikoAJjbzQy10NccZgKlSjC3D2AsTKUy0WO6dy0Oxn8yAgian5miT63KQD84A8YmDLRROtJGT0RNrT4bYNqG07xJJ1vts44A40aUEaOgOdkFuSMn1TZXBZyxH9NSqC8nJywR+N509mzvyYoFuqILEWDeryfwYiDokLNqUwGXmb1IdKdP9jMlBjCA96FUy6zEb7HKwGQ7VjNMLhxKb7Ez8BaSgrCrTCho6jQSZ0UxiOMTjEIWdgKP9rNISBBQ5ov8A69Gy5tW1WTrP93C/59yxMjOh/VX4j46WuJq1s X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?cWcIq7cbzHJVkirBfcHCKM7khHnhBgpGleqO57clh1JkzV3LIVLwRNHxsWkO?= =?us-ascii?Q?gdAlJrF5QJakCaRuLdyIDpr8eBqtI+hi3Ll9v/S1c+r6dh0uD3wYmMXnIsak?= =?us-ascii?Q?JU1Y/dkjSz/k45xaEBV/pqivqyUXl43Gs3ivICmM7qG2vYIHCMmWd7NBBqlU?= =?us-ascii?Q?2KQ4u71So8QPz+WI/FsqxuiC256z5jFlXAT+jOtVDrZQ9hyqb2tQfbVIcuhL?= =?us-ascii?Q?igZ9z4zPqHFf04qEHoRBti4H/dVfV/NVgeRIO1PKzBeYI8JiaELiPZfEtIcS?= =?us-ascii?Q?+dnlbg9EL6ZE7bhftLoVUkM/KVI41ROgIL00IK5c5TNSeT54yt99hBze5wL7?= =?us-ascii?Q?CYVNlq8L8fw/+4PI/CbVAmK6IMmJ2U44hkmLiS0QrfXpiieLtfUuoPEEUh//?= =?us-ascii?Q?iaJybeKXjpYI/YN9rwc9+l3Pc63EBxUhbKgS78Iu443RtalJ1aKx6IPL70st?= =?us-ascii?Q?tKzUXWuSMI6ohzjjQnSaWxQPNIeLArVEW6EZrtr1PE/nOseq3gavi+Jvnut6?= =?us-ascii?Q?wCi1OPw5WYun01Ng3BYYgu7T9VMnLX7jDFF0vCJ+GBQEkOs5OlRraShPdp6p?= =?us-ascii?Q?fR1C7KP4ow3fRlrH8GDgbw8D3LnvqkywhluR5G6GRX4v6IJJYjHMtogID6RO?= =?us-ascii?Q?GpfEz+uWu9WNkUXwKa4lx1xaalusKdD4jGSEJWIFiEyiIo1hBkeMHwInuhI6?= =?us-ascii?Q?ViCW2P5J2do9QEgqefY6QtodRy+p1bPJMMLoaQt4Y3bSLuX5MjF0NrXY+vR1?= =?us-ascii?Q?B169zOydxxAKOVngS7l0+4OITvN3VwdvyhHh7tat3Y8sHPGE8AaLQcdMVCHB?= =?us-ascii?Q?I1GIk3tyzIqPPC6KCy4wr1C6fGz08FFie5yEQYMke8y7GOVV3mm07NukonaF?= =?us-ascii?Q?12Jv1xFEaFVfxq4KdWeaSqJfzFsmqib8VSTNmFAs+UMOh53ZN0P6Oa7Yplk1?= =?us-ascii?Q?idQUVE1ub9qlaSkwOwXRB4FHGlJHA44pMb2QbndK2FLl8O9DCCNTBCCRCz7M?= =?us-ascii?Q?FnZNZpIdVl9ZvmmGVGg7uJdKlBL4mM4Ip7KF2sicGjdedQX56xZVonYb4s5z?= =?us-ascii?Q?DVfGmfVsOkM5ZQiLJiuzCeDhZXZavYo6Gph0QN66ZXHG288hEVnUkX448J64?= =?us-ascii?Q?7okPWHiBb7FfHG2yi3ijZqyCMiI3WxLeLSZHpow9HrxRzQqTqQjWpbA1FKlN?= =?us-ascii?Q?wuzevg+SsUQh70rMKk/IvQrkXADpcffXX29myx04ZmApFjdGKpd1WCluGEHc?= =?us-ascii?Q?ncDOTrAKNWd+WSulYBIlplDul5mC77IG+hini6opjQ=3D=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6868ea1e-1a48-4354-1e26-08dc4d557fae X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Mar 2024 05:27:59.1278 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9P250MB0498 Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/qsvenc_hevc: Switch to cbs_h265 to create missing VPS 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: Andreas Rheinhardt Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Old MXF runtime versions did not support writing VPS and therefore one derived from the SPS has been generated via ad-hoc code in lavc/hevc_ps_enc.c that is only used for this purpose. Yet this duplicates the functionality from cbs_h265, so replace it with the latter. This patch has been tested by generating VPS from the SPS and PPS from hevc-conformance files from the FATE-suite. There were some minor differences, mostly due to hevc_ps_enc.c not handling the profile constraint flags like general_max_12bit_constraint_flag. Signed-off-by: Andreas Rheinhardt --- Would be nice if someone could actually check this with a QSV version that needs this hack. (Do people really need this any more?) configure | 2 +- libavcodec/Makefile | 2 +- libavcodec/hevc_ps_enc.c | 121 ---------------------------- libavcodec/qsvenc_hevc.c | 168 +++++++++++++++++---------------------- 4 files changed, 77 insertions(+), 216 deletions(-) delete mode 100644 libavcodec/hevc_ps_enc.c diff --git a/configure b/configure index 9fa639fca6..6c181197b4 100755 --- a/configure +++ b/configure @@ -3341,7 +3341,7 @@ hevc_mf_encoder_deps="mediafoundation" hevc_nvenc_encoder_deps="nvenc" hevc_nvenc_encoder_select="atsc_a53" hevc_qsv_decoder_select="hevc_mp4toannexb_bsf qsvdec" -hevc_qsv_encoder_select="hevcparse qsvenc" +hevc_qsv_encoder_select="cbs_h265 qsvenc" hevc_rkmpp_decoder_deps="rkmpp" hevc_rkmpp_decoder_select="hevc_mp4toannexb_bsf" hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 6eefeeae6e..d06b837c60 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -440,7 +440,7 @@ OBJS-$(CONFIG_HEVC_MEDIACODEC_ENCODER) += mediacodecenc.o OBJS-$(CONFIG_HEVC_MF_ENCODER) += mfenc.o mf_utils.o OBJS-$(CONFIG_HEVC_NVENC_ENCODER) += nvenc_hevc.o nvenc.o OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec.o -OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o +OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_HEVC_VAAPI_ENCODER) += vaapi_encode_h265.o h265_profile_level.o \ h2645data.o diff --git a/libavcodec/hevc_ps_enc.c b/libavcodec/hevc_ps_enc.c deleted file mode 100644 index 72641b2ffb..0000000000 --- a/libavcodec/hevc_ps_enc.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * HEVC Parameter Set encoding - * - * 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 "put_golomb.h" -#include "hevc_ps.h" -#include "put_bits.h" - -static void write_ptl_layer(PutBitContext *pb, PTLCommon *ptl) -{ - int i; - - put_bits(pb, 2, ptl->profile_space); - put_bits(pb, 1, ptl->tier_flag); - put_bits(pb, 5, ptl->profile_idc); - for (i = 0; i < 32; i++) - put_bits(pb, 1, ptl->profile_compatibility_flag[i]); - put_bits(pb, 1, ptl->progressive_source_flag); - put_bits(pb, 1, ptl->interlaced_source_flag); - put_bits(pb, 1, ptl->non_packed_constraint_flag); - put_bits(pb, 1, ptl->frame_only_constraint_flag); - put_bits32(pb, 0); // reserved - put_bits(pb, 12, 0); // reserved -} - -static void write_ptl(PutBitContext *pb, PTL *ptl, int max_num_sub_layers) -{ - int i; - - write_ptl_layer(pb, &ptl->general_ptl); - put_bits(pb, 8, ptl->general_ptl.level_idc); - - for (i = 0; i < max_num_sub_layers - 1; i++) { - put_bits(pb, 1, ptl->sub_layer_profile_present_flag[i]); - put_bits(pb, 1, ptl->sub_layer_level_present_flag[i]); - } - - if (max_num_sub_layers > 1) - for (i = max_num_sub_layers - 1; i < 8; i++) - put_bits(pb, 2, 0); // reserved - - for (i = 0; i < max_num_sub_layers - 1; i++) { - if (ptl->sub_layer_profile_present_flag[i]) - write_ptl_layer(pb, &ptl->sub_layer_ptl[i]); - if (ptl->sub_layer_level_present_flag[i]) - put_bits(pb, 8, ptl->sub_layer_ptl[i].level_idc); - } -} - -int ff_hevc_encode_nal_vps(HEVCVPS *vps, unsigned int id, - uint8_t *buf, int buf_size) -{ - PutBitContext pb; - int i, data_size; - - init_put_bits(&pb, buf, buf_size); - put_bits(&pb, 4, id); - put_bits(&pb, 2, 3); // reserved - put_bits(&pb, 6, vps->vps_max_layers - 1); - put_bits(&pb, 3, vps->vps_max_sub_layers - 1); - put_bits(&pb, 1, vps->vps_temporal_id_nesting_flag); - put_bits(&pb, 16, 0xffff); // reserved - - write_ptl(&pb, &vps->ptl, vps->vps_max_sub_layers); - - put_bits(&pb, 1, vps->vps_sub_layer_ordering_info_present_flag); - for (i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_layers - 1; - i < vps->vps_max_sub_layers; i++) { - set_ue_golomb(&pb, vps->vps_max_dec_pic_buffering[i] - 1); - set_ue_golomb(&pb, vps->vps_num_reorder_pics[i]); - set_ue_golomb(&pb, vps->vps_max_latency_increase[i] + 1); - } - - put_bits(&pb, 6, vps->vps_max_layer_id); - set_ue_golomb(&pb, vps->vps_num_layer_sets - 1); - - if (vps->vps_num_layer_sets > 1) { - avpriv_report_missing_feature(NULL, "Writing layer_id_included_flag"); - return AVERROR_PATCHWELCOME; - } - - put_bits(&pb, 1, vps->vps_timing_info_present_flag); - if (vps->vps_timing_info_present_flag) { - put_bits32(&pb, vps->vps_num_units_in_tick); - put_bits32(&pb, vps->vps_time_scale); - put_bits(&pb, 1, vps->vps_poc_proportional_to_timing_flag); - if (vps->vps_poc_proportional_to_timing_flag) - set_ue_golomb(&pb, vps->vps_num_ticks_poc_diff_one - 1); - - set_ue_golomb(&pb, vps->vps_num_hrd_parameters); - if (vps->vps_num_hrd_parameters) { - avpriv_report_missing_feature(NULL, "Writing HRD parameters"); - return AVERROR_PATCHWELCOME; - } - } - - put_bits(&pb, 1, 0); // extension flag - - put_bits(&pb, 1, 1); // stop bit - flush_put_bits(&pb); - - data_size = put_bytes_output(&pb); - - return data_size; -} diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c index 4920b0bca4..55f4b87718 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c @@ -24,18 +24,15 @@ #include -#include "libavutil/common.h" +#include "libavutil/mem.h" #include "libavutil/opt.h" #include "libavutil/mastering_display_metadata.h" #include "avcodec.h" -#include "bytestream.h" +#include "cbs.h" +#include "cbs_h265.h" #include "codec_internal.h" -#include "get_bits.h" #include "hevc.h" -#include "hevcdec.h" -#include "h2645_parse.h" -#include "qsv.h" #include "qsvenc.h" enum LoadPlugin { @@ -50,115 +47,100 @@ typedef struct QSVHEVCEncContext { int load_plugin; } QSVHEVCEncContext; -static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx) +static int generate_fake_vps(AVCodecContext *avctx) { - GetByteContext gbc; - PutByteContext pbc; - - GetBitContext gb; - H2645RBSP sps_rbsp = { NULL }; - H2645NAL sps_nal = { NULL }; - HEVCSPS sps = { 0 }; - HEVCVPS vps = { 0 }; - uint8_t vps_buf[128], vps_rbsp_buf[128]; + CodedBitstreamContext *cbc; + CodedBitstreamFragment frag = { NULL }; + H265RawVPS *vps = NULL; + const H265RawSPS *sps; + uint8_t *new_extradata; - unsigned int sps_id; - int ret, i, type, vps_size; + int ret; if (!avctx->extradata_size) { av_log(avctx, AV_LOG_ERROR, "No extradata returned from libmfx\n"); return AVERROR_UNKNOWN; } - av_fast_padded_malloc(&sps_rbsp.rbsp_buffer, &sps_rbsp.rbsp_buffer_alloc_size, avctx->extradata_size); - if (!sps_rbsp.rbsp_buffer) - return AVERROR(ENOMEM); - - /* parse the SPS */ - ret = ff_h2645_extract_rbsp(avctx->extradata + 4, avctx->extradata_size - 4, &sps_rbsp, &sps_nal, 1); - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "Error unescaping the SPS buffer\n"); + ret = ff_cbs_init(&cbc, AV_CODEC_ID_HEVC, avctx); + if (ret < 0) return ret; - } - ret = init_get_bits8(&gb, sps_nal.data, sps_nal.size); - if (ret < 0) { - av_freep(&sps_rbsp.rbsp_buffer); - return ret; - } + ret = ff_cbs_read_extradata_from_codec(cbc, &frag, avctx); + if (ret < 0) + goto fail; - get_bits(&gb, 1); - type = get_bits(&gb, 6); - if (type != HEVC_NAL_SPS) { - av_log(avctx, AV_LOG_ERROR, "Unexpected NAL type in the extradata: %d\n", - type); - av_freep(&sps_rbsp.rbsp_buffer); - return AVERROR_INVALIDDATA; + if (frag.nb_units == 0) { + ret = AVERROR_EXTERNAL; + goto fail; } - get_bits(&gb, 9); - - ret = ff_hevc_parse_sps(&sps, &gb, &sps_id, 0, NULL, avctx); - av_freep(&sps_rbsp.rbsp_buffer); - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "Error parsing the SPS\n"); - return ret; + if (frag.units[0].type != HEVC_NAL_SPS) { + av_log(avctx, AV_LOG_ERROR, "Unexpected NALU type in extradata: %u\n", + (unsigned)frag.units[0].type); + ret = AVERROR_EXTERNAL; + goto fail; } + vps = av_mallocz(sizeof(*vps)); + if (!vps) { + ret = AVERROR(ENOMEM); + goto fail; + } + sps = frag.units[0].content; /* generate the VPS */ - vps.vps_max_layers = 1; - vps.vps_max_sub_layers = sps.max_sub_layers; - vps.vps_temporal_id_nesting_flag = sps.temporal_id_nesting_flag; - memcpy(&vps.ptl, &sps.ptl, sizeof(vps.ptl)); - vps.vps_sub_layer_ordering_info_present_flag = 1; - for (i = 0; i < HEVC_MAX_SUB_LAYERS; i++) { - vps.vps_max_dec_pic_buffering[i] = sps.temporal_layer[i].max_dec_pic_buffering; - vps.vps_num_reorder_pics[i] = sps.temporal_layer[i].num_reorder_pics; - vps.vps_max_latency_increase[i] = sps.temporal_layer[i].max_latency_increase; + vps->nal_unit_header = (H265RawNALUnitHeader){ + .nal_unit_type = HEVC_NAL_VPS, + .nuh_layer_id = 0, + .nuh_temporal_id_plus1 = 1, + }; + vps->vps_video_parameter_set_id = sps->sps_video_parameter_set_id; + vps->vps_base_layer_available_flag = 1; + vps->vps_base_layer_internal_flag = 1; + vps->vps_max_layers_minus1 = 0; + vps->vps_max_sub_layers_minus1 = sps->sps_max_sub_layers_minus1; + vps->layer_id_included_flag[0][0] = 1; + vps->vps_temporal_id_nesting_flag = sps->sps_temporal_id_nesting_flag; + memcpy(&vps->profile_tier_level, &sps->profile_tier_level, sizeof(vps->profile_tier_level)); + vps->vps_sub_layer_ordering_info_present_flag = 1; + for (int i = 0; i < HEVC_MAX_SUB_LAYERS; i++) { + vps->vps_max_dec_pic_buffering_minus1[i] = sps->sps_max_dec_pic_buffering_minus1[i]; + vps->vps_max_num_reorder_pics[i] = sps->sps_max_num_reorder_pics[i]; + vps->vps_max_latency_increase_plus1[i] = sps->sps_max_latency_increase_plus1[i]; } - vps.vps_num_layer_sets = 1; - vps.vps_timing_info_present_flag = sps.vui.vui_timing_info_present_flag; - vps.vps_num_units_in_tick = sps.vui.vui_num_units_in_tick; - vps.vps_time_scale = sps.vui.vui_time_scale; - vps.vps_poc_proportional_to_timing_flag = sps.vui.vui_poc_proportional_to_timing_flag; - vps.vps_num_ticks_poc_diff_one = sps.vui.vui_num_ticks_poc_diff_one_minus1 + 1; - vps.vps_num_hrd_parameters = 0; - - /* generate the encoded RBSP form of the VPS */ - ret = ff_hevc_encode_nal_vps(&vps, sps.vps_id, vps_rbsp_buf, sizeof(vps_rbsp_buf)); - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "Error writing the VPS\n"); - return ret; - } + vps->vps_num_layer_sets_minus1 = 0; + vps->vps_timing_info_present_flag = sps->vui.vui_timing_info_present_flag; + vps->vps_num_units_in_tick = sps->vui.vui_num_units_in_tick; + vps->vps_time_scale = sps->vui.vui_time_scale; + vps->vps_poc_proportional_to_timing_flag = sps->vui.vui_poc_proportional_to_timing_flag; + vps->vps_num_ticks_poc_diff_one_minus1 = sps->vui.vui_num_ticks_poc_diff_one_minus1; + vps->vps_num_hrd_parameters = 0; - /* escape and add the startcode */ - bytestream2_init(&gbc, vps_rbsp_buf, ret); - bytestream2_init_writer(&pbc, vps_buf, sizeof(vps_buf)); + ret = ff_cbs_insert_unit_content(&frag, 0, HEVC_NAL_VPS, vps, NULL); + if (ret < 0) + goto fail; - bytestream2_put_be32(&pbc, 1); // startcode - bytestream2_put_byte(&pbc, HEVC_NAL_VPS << 1); // NAL - bytestream2_put_byte(&pbc, 1); // header + ret = ff_cbs_write_fragment_data(cbc, &frag); + if (ret < 0) + goto fail; - while (bytestream2_get_bytes_left(&gbc)) { - if (bytestream2_get_bytes_left(&gbc) >= 3 && bytestream2_peek_be24(&gbc) <= 3) { - bytestream2_put_be24(&pbc, 3); - bytestream2_skip(&gbc, 2); - } else - bytestream2_put_byte(&pbc, bytestream2_get_byte(&gbc)); + /* Fragment's data is already padded, so we can copy data + padding */ + new_extradata = av_memdup(frag.data, frag.data_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!new_extradata) { + ret = AVERROR(ENOMEM); + goto fail; } - - vps_size = bytestream2_tell_p(&pbc); - new_extradata = av_mallocz(vps_size + avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); - if (!new_extradata) - return AVERROR(ENOMEM); - memcpy(new_extradata, vps_buf, vps_size); - memcpy(new_extradata + vps_size, avctx->extradata, avctx->extradata_size); - av_freep(&avctx->extradata); - avctx->extradata = new_extradata; - avctx->extradata_size += vps_size; + avctx->extradata = new_extradata; + avctx->extradata_size = frag.data_size; - return 0; + ret = 0; +fail: + av_free(vps); + ff_cbs_fragment_free(&frag); + ff_cbs_close(&cbc); + + return ret; } static int qsv_hevc_set_encode_ctrl(AVCodecContext *avctx, @@ -274,7 +256,7 @@ static av_cold int qsv_enc_init(AVCodecContext *avctx) return ret; if (!q->qsv.hevc_vps) { - ret = generate_fake_vps(&q->qsv, avctx); + ret = generate_fake_vps(avctx); if (ret < 0) { ff_qsv_enc_close(avctx, &q->qsv); return ret; -- 2.40.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".