From patchwork Wed Jun 5 11:40:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 49576 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d792:0:b0:460:55fa:d5ed with SMTP id db18csp320284vqb; Wed, 5 Jun 2024 04:41:06 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUCTwi2st1YNUJb2lyi/1EVxlF26xnBLbICmuckBt3ooqJupPstyQ+9UdFpa5OwQAJ1ajt1LkEIE+QvnoxyFXuyfBuxcOBvNgxymg== X-Google-Smtp-Source: AGHT+IE7wfa8uk5jbOqipTCPxlg0KVRcSWyfNnyRAaLQWR6RVrrqBoXI9kgK9v+1uapaF5C9xCQa X-Received: by 2002:a2e:a58a:0:b0:2e0:5d7:a3a6 with SMTP id 38308e7fff4ca-2eac797f35emr19108791fa.9.1717587665808; Wed, 05 Jun 2024 04:41:05 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 38308e7fff4ca-2eaa7ed85b9si23301931fa.324.2024.06.05.04.41.05; Wed, 05 Jun 2024 04:41:05 -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=@outlook.com header.s=selector1 header.b=DhBx1dmz; arc=fail (body hash mismatch); 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7525068D6FF; Wed, 5 Jun 2024 14:40:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02olkn2092.outbound.protection.outlook.com [40.92.50.92]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7257568D6C3 for ; Wed, 5 Jun 2024 14:40:42 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hIY7FNBziLnkHJP7gjPLzTgJIRqanaHbdN69oBtkOS9h3BEjn82uGV+VOqBOdw1GaDmcV1ElLtsuaefKS4WMaK6KNQviQtP9oVlm/P2/jCU4TnGuwPywAnUpLb4SXTjfogYJNa8Pea4EMT3fIrl0TLKxNKUwo9fmzDi7UWChw7XPwVp/4cK/DEUxxMi2uE3exZH34IPt71FsYLiBKXZflrdi9sFKSk07YTwiByr8jg+LNqL3eN+gcoSkBZ8S0QGJ6glCUazxPznCDgXPXUgaYLdOrW/cBgyk2zXsBvMpTUbBFDulh9dX/3SNoW9LXjbMuAp1ablIGtplWkaoENO/CQ== 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=t223tM6ItNetostR66OKg8qpLPyjGc2Wof5HAGLRdNE=; b=dD6uvVmpp1GXAdl9dXpTVfTen83rYAZ4Fwl72ldn38PDrp4kksAV08HMNoQEMlL0jdIAaOAw6Jx+COb9XmqDsVzqEYzPc5XaRG6TaXlNKH2zbmBoxSaj9YQVNUMPVZPaAPFDepGTbNRWvQDpA2mxqzZVL+E5AehepnncibpLinFuiapEA3UXtT9Kxbg1W1g9CqNe6l9Bwo89VatJNBPYDBWgbxf/PFR7ul87vQSAyPhTf1dnlTpV8CZdDkRS4zwN9ywaINlMEQTsy4mx9c9ngkhwuRhYGSHbqBcUP3KK1avRld3HkcmwVwbri3GxTfjNQlcint1vV+Pfx3r7Ti6XUQ== 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=t223tM6ItNetostR66OKg8qpLPyjGc2Wof5HAGLRdNE=; b=DhBx1dmzTBuBUk9STGxSzhTV/w/IC70l3eHMv0IOQ7e8uu879TdVqbh41u8CtOwUe1oA7rP80fyL8KM1Ibeq2b8UgCEna6tUonrdaEFUcsKIKxzmaPj34SVCEUlae0vtABhf0flni6zOASUPxEiwY7UXKHKnUjSnsoesjYSSrqn9XNLt69uIT5xvbyiG/9MAT+E0VAQJ+RYJPGnPAoP7lFRYJYK4dxRkcfrgwuORW3mTs7w17356+j+yHukt37wJ95RAVg4kksjVGOGjAaPPHVAxT/gXxZxMZEDjKNeKIXizq+xAmsuRHp1f9Kzq/UpTEX4PLhXyphRxxwQ0kPgfcQ== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by PR3P250MB0243.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:17e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.31; Wed, 5 Jun 2024 11:40:36 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%4]) with mapi id 15.20.7633.021; Wed, 5 Jun 2024 11:40:36 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 5 Jun 2024 13:40:24 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [d3N2PocU8ij2Yegw/uEURQcKWm/DnkAYS1M3HsLzpFk=] X-ClientProxiedBy: FR4P281CA0420.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:d0::17) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240605114027.1701387-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|PR3P250MB0243:EE_ X-MS-Office365-Filtering-Correlation-Id: 741f4f67-be85-42af-ebc1-08dc855450eb X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: 6w3efz4yJkcKQtVj9iV3Vq9UshCv1h8e7se6IxNFf8Nrv8qBmgtDHmGPJu+OuHlxil+hZA6v/psDMfA1+PWfX4t+4aE/tos9xtLKhw7g0MUY2lWbztjQ2z1c9gYuJb97ExnVLGE/HZSZCITr76ZOc/AJ4v4p0bNO1T/uUi18uY69bx4VuelMw6x5Tmip+5UgIo9ncEazCoP7e4gGGkV80F7uAxmwWUQdFM+VcC+IkgHH3ZdNpHIOv7Df9CGm02tC92IfZU+PCpsPcfXGRF5y9cszxxsU+VylV0UamcOVVTebCrj8ic4PQcoqXgNXuoevIhCS1g2VzySaK4oVjDPfuCVyiNTSRgq3xvEn32aTkZmhvJrp85n6WuAZxeFgOXTBXHTE1WdF1pH6aP+K28zXp/u9lRjeGE9x/9K7m69jT7VBpClSjAFeU5d5bRvYKo9+PkAk3QcxFMu8pq9j57/Igx8RmFm6f/HM4uZBmg8U0TLJti0yOe8OcBCbh52Kj4q/Cmum8NKrvJiVBDcyZBwCi8z/c9NLaKSAZGN14cICJrh35ZqiF8W3HRa2zNoSJgVv5H+t8Y66HfuUhcsjRlTgHo4mwuXwz3B4JJptOv9/Kj9U+XgeSeRl7QMVcHooqmiy X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 45dW1Stj0muiLkUAR3pnoXfD6Bv+Y2H261lIBOCiibNgoDn6VLO0+FEQ4Z7tcuT4njUib//D55ni7Ku6p6kQ9LQN1GXekSLZhlAa7zgDjp8vNb7zGLIPCaDNPj5CMGhMZov6CzVBzQ33XWnuYDpeF/x4DF/8jAYYvBGqIQnGOnbeQzqOrekaTfbSG4/pm05t/3OOO7+aHRlI0pYsOoCMGaloLEN0Jb9HMVaUO4Zvbq2iHhPfbpudFRV4Qh3LJHj80/h2HvvSewctYXWL2Fl5aXjEp3qPq6dyny3GZ8SEedTExx3SlXqmfbX388A7yHkyEhDIbsODiIGCQTjiL731JhcE9BhY9DQA9CBBZDGLlmythybq6AKIRwwcbUmGiP3gcEyTOje/6Lm+jCbGnFMyDl/MZZPbsA4w/U7MqYmEFhx19Kv6Wplq/cIad0hOc2R+O9oO7a4NEQ9wVCYovclbHPFe3epVMyArOPnk0defMqs5u6YkmWWxTuGX6KOEw5uNSR77Fo2NXv7k/8evel3mF7lR8i8VriVWVOeIcMXlx2MlPcRaxqHXHsvlNkg7t9KMOmwEv68JkwKtf5z+Bv1S0up0GPQUq3ooCcZsW389jEe45jouetIeQzbaBr6wGjn2iafloTg/0eOhexMNIcX8UlyyXDsy+J8nHR9jJ7bbaHWWYoK5ZIfng8p6qHmOvm75M202plxMu1Mmm/42V+Hlr7aGKCevfBbR4ToMAyG2WTqh0p+CWBEIJOpf5lwfwEjmiP0D+aNk2vhnWluzr51Fxd5rz63rjvm/CFE0QRhGLb9Y87fnoItQroUI0cVan18Unz6k6OrDkq2ZpdXgkNxGxXM7LSCdRwdN5q1cdEdkzrkt/Fs3qjsrK3fq+YwtrU2LeYdvujcxx+20gLqptybuIOIPge30bBbKT9Kk6rOrmd4K3DLO/IDLmuNTxKZUa805p7C8sfllIu2fP7oXOwzixRgMq1kZbfTfAhMZqS86ZD+ZcArNEQKl02I1NKTw/a0OscVWOvuV/9MAoXrJx5FhmUYPXJ0ojVH/7K6RtkKVSQQpXJ1hHVZixH0hkug5PTE2Q713yhwpNttyn5HYviR1BvzJpkI09ud3iHfXYZ9UEcazvRSra6un4iunNmScKt8eZbHV9mLce5MiHWivfYWfn30WmAjIKJLNg7pUsNVqH5Y8BYX+eOOZBfD9UTTvnypgJaMo8bBfWYX9W2ICnjySL/tKO8AbyoqTEV7uuZuEXTw77vLqeHEdGAxt0sQyRUWZ3CtjKrasxOhPc+jewZl8yQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 741f4f67-be85-42af-ebc1-08dc855450eb X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jun 2024 11:40:36.2965 (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: PR3P250MB0243 Subject: [FFmpeg-devel] [PATCH 4/7] avformat/vvc: Fix crash on allocation failure, avoid allocations 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MAUX4QOZoN/d This is the VVC version of 8b5d15530127fea54e934043a64653859de07353. (Hint: This ensures that the order of NALU arrays is OPI-VPS-SPS-PPS- Prefix-SEI-Suffix-SEI, regardless of the order in the original extradata. I hope this is right.) Signed-off-by: Andreas Rheinhardt --- libavformat/vvc.c | 169 ++++++++++++++++++++-------------------------- 1 file changed, 73 insertions(+), 96 deletions(-) diff --git a/libavformat/vvc.c b/libavformat/vvc.c index 679bb07a4d..819ee02e2c 100644 --- a/libavformat/vvc.c +++ b/libavformat/vvc.c @@ -32,6 +32,16 @@ #include "avio_internal.h" #include "vvc.h" +enum { + OPI_INDEX, + VPS_INDEX, + SPS_INDEX, + PPS_INDEX, + SEI_PREFIX_INDEX, + SEI_SUFFIX_INDEX, + NB_ARRAYS +}; + typedef struct VVCCNALUnitArray { uint8_t array_completeness; uint8_t NAL_unit_type; @@ -67,7 +77,7 @@ typedef struct VVCDecoderConfigurationRecord { uint16_t max_picture_height; uint16_t avg_frame_rate; uint8_t num_of_arrays; - VVCCNALUnitArray *array; + VVCCNALUnitArray arrays[NB_ARRAYS]; } VVCDecoderConfigurationRecord; static void vvcc_update_ptl(VVCDecoderConfigurationRecord *vvcc, @@ -432,32 +442,11 @@ static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type) static int vvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, uint8_t nal_type, int ps_array_completeness, - VVCDecoderConfigurationRecord *vvcc) + VVCCNALUnitArray *array) { int ret; - uint8_t index; uint16_t num_nalus; - VVCCNALUnitArray *array; - - for (index = 0; index < vvcc->num_of_arrays; index++) - if (vvcc->array[index].NAL_unit_type == nal_type) - break; - - if (index >= vvcc->num_of_arrays) { - uint8_t i; - - ret = - av_reallocp_array(&vvcc->array, index + 1, - sizeof(VVCCNALUnitArray)); - if (ret < 0) - return ret; - - for (i = vvcc->num_of_arrays; i <= index; i++) - memset(&vvcc->array[i], 0, sizeof(VVCCNALUnitArray)); - vvcc->num_of_arrays = index + 1; - } - array = &vvcc->array[index]; num_nalus = array->num_nalus; ret = av_reallocp_array(&array->nal_unit, num_nalus + 1, sizeof(uint8_t *)); @@ -504,7 +493,8 @@ static int vvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, static int vvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, int ps_array_completeness, - VVCDecoderConfigurationRecord *vvcc) + VVCDecoderConfigurationRecord *vvcc, + unsigned array_idx) { int ret = 0; GetBitContext gbc; @@ -529,18 +519,15 @@ static int vvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, * vvcc. Perhaps the SEI playload type should be checked * and non-declarative SEI messages discarded? */ - switch (nal_type) { - case VVC_OPI_NUT: - case VVC_VPS_NUT: - case VVC_SPS_NUT: - case VVC_PPS_NUT: - case VVC_PREFIX_SEI_NUT: - case VVC_SUFFIX_SEI_NUT: - ret = vvcc_array_add_nal_unit(nal_buf, nal_size, nal_type, - ps_array_completeness, vvcc); - if (ret < 0) - goto end; - else if (nal_type == VVC_VPS_NUT) + ret = vvcc_array_add_nal_unit(nal_buf, nal_size, nal_type, + ps_array_completeness, + &vvcc->arrays[array_idx]); + if (ret < 0) + goto end; + if (vvcc->arrays[array_idx].num_nalus == 1) + vvcc->num_of_arrays++; + + if (nal_type == VVC_VPS_NUT) ret = vvcc_parse_vps(&gbc, vvcc); else if (nal_type == VVC_SPS_NUT) ret = vvcc_parse_sps(&gbc, vvcc); @@ -551,11 +538,6 @@ static int vvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, } if (ret < 0) goto end; - break; - default: - ret = AVERROR_INVALIDDATA; - goto end; - } end: av_free(rbsp_buf); @@ -572,22 +554,21 @@ static void vvcc_init(VVCDecoderConfigurationRecord *vvcc) static void vvcc_close(VVCDecoderConfigurationRecord *vvcc) { - uint8_t i; + for (unsigned i = 0; i < FF_ARRAY_ELEMS(vvcc->arrays); i++) { + VVCCNALUnitArray *const array = &vvcc->arrays[i]; - for (i = 0; i < vvcc->num_of_arrays; i++) { - vvcc->array[i].num_nalus = 0; - av_freep(&vvcc->array[i].nal_unit); - av_freep(&vvcc->array[i].nal_unit_length); + array->num_nalus = 0; + av_freep(&array->nal_unit); + av_freep(&array->nal_unit_length); } vvcc->num_of_arrays = 0; - av_freep(&vvcc->array); } static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc) { uint8_t i; - uint16_t j, vps_count = 0, sps_count = 0, pps_count = 0; + uint16_t vps_count = 0, sps_count = 0, pps_count = 0; /* * It's unclear how to properly compute these fields, so * let's always set them to values meaning 'unspecified'. @@ -672,40 +653,33 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc) av_log(NULL, AV_LOG_TRACE, "num_of_arrays: %" PRIu8 "\n", vvcc->num_of_arrays); - for (i = 0; i < vvcc->num_of_arrays; i++) { + for (unsigned i = 0; i < FF_ARRAY_ELEMS(vvcc->arrays); i++) { + const VVCCNALUnitArray *const array = &vvcc->arrays[i]; + + if (array->num_nalus == 0) + continue; + av_log(NULL, AV_LOG_TRACE, - "array_completeness[%" PRIu8 "]: %" PRIu8 "\n", i, - vvcc->array[i].array_completeness); + "array_completeness[%u]: %" PRIu8 "\n", i, + array->array_completeness); av_log(NULL, AV_LOG_TRACE, - "NAL_unit_type[%" PRIu8 "]: %" PRIu8 "\n", i, - vvcc->array[i].NAL_unit_type); + "NAL_unit_type[%u]: %" PRIu8 "\n", i, + array->NAL_unit_type); av_log(NULL, AV_LOG_TRACE, - "num_nalus[%" PRIu8 "]: %" PRIu16 "\n", i, - vvcc->array[i].num_nalus); - for (j = 0; j < vvcc->array[i].num_nalus; j++) + "num_nalus[%u]: %" PRIu16 "\n", i, + array->num_nalus); + for (unsigned j = 0; j < array->num_nalus; j++) av_log(NULL, AV_LOG_TRACE, - "nal_unit_length[%" PRIu8 "][%" PRIu16 "]: %" - PRIu16 "\n", i, j, vvcc->array[i].nal_unit_length[j]); + "nal_unit_length[%u][%u]: %" + PRIu16 "\n", i, j, array->nal_unit_length[j]); } /* * We need at least one of each: VPS and SPS. */ - for (i = 0; i < vvcc->num_of_arrays; i++) - switch (vvcc->array[i].NAL_unit_type) { - case VVC_VPS_NUT: - vps_count += vvcc->array[i].num_nalus; - break; - case VVC_SPS_NUT: - sps_count += vvcc->array[i].num_nalus; - break; - case VVC_PPS_NUT: - pps_count += vvcc->array[i].num_nalus; - break; - default: - break; - } - + vps_count = vvcc->arrays[VPS_INDEX].num_nalus; + sps_count = vvcc->arrays[SPS_INDEX].num_nalus; + pps_count = vvcc->arrays[PPS_INDEX].num_nalus; if (vps_count > VVC_MAX_VPS_COUNT) return AVERROR_INVALIDDATA; if (!sps_count || sps_count > VVC_MAX_SPS_COUNT) @@ -804,25 +778,29 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc) /* unsigned int(8) num_of_arrays; */ avio_w8(pb, vvcc->num_of_arrays); - for (i = 0; i < vvcc->num_of_arrays; i++) { + for (unsigned i = 0; i < FF_ARRAY_ELEMS(vvcc->arrays); i++) { + const VVCCNALUnitArray *const array = &vvcc->arrays[i]; + + if (!array->num_nalus) + continue; /* * bit(1) array_completeness; * unsigned int(2) reserved = 0; * unsigned int(5) NAL_unit_type; */ - avio_w8(pb, vvcc->array[i].array_completeness << 7 | - vvcc->array[i].NAL_unit_type & 0x1f); + avio_w8(pb, array->array_completeness << 7 | + array->NAL_unit_type & 0x1f); /* unsigned int(16) num_nalus; */ - if (vvcc->array[i].NAL_unit_type != VVC_DCI_NUT && - vvcc->array[i].NAL_unit_type != VVC_OPI_NUT) - avio_wb16(pb, vvcc->array[i].num_nalus); - for (j = 0; j < vvcc->array[i].num_nalus; j++) { + if (array->NAL_unit_type != VVC_DCI_NUT && + array->NAL_unit_type != VVC_OPI_NUT) + avio_wb16(pb, array->num_nalus); + for (int j = 0; j < array->num_nalus; j++) { /* unsigned int(16) nal_unit_length; */ - avio_wb16(pb, vvcc->array[i].nal_unit_length[j]); + avio_wb16(pb, array->nal_unit_length[j]); /* bit(8*nal_unit_length) nal_unit; */ - avio_write(pb, vvcc->array[i].nal_unit[j], - vvcc->array[i].nal_unit_length[j]); + avio_write(pb, array->nal_unit[j], + array->nal_unit_length[j]); } } @@ -932,19 +910,18 @@ int ff_isom_write_vvcc(AVIOContext *pb, const uint8_t *data, buf += 4; - switch (type) { - case VVC_OPI_NUT: - case VVC_VPS_NUT: - case VVC_SPS_NUT: - case VVC_PPS_NUT: - case VVC_PREFIX_SEI_NUT: - case VVC_SUFFIX_SEI_NUT: - ret = vvcc_add_nal_unit(buf, len, ps_array_completeness, &vvcc); - if (ret < 0) - goto end; - break; - default: - break; + for (unsigned i = 0; i < FF_ARRAY_ELEMS(vvcc.arrays); i++) { + static const uint8_t array_idx_to_type[] = + { VVC_OPI_NUT, VVC_VPS_NUT, VVC_SPS_NUT, + VVC_PPS_NUT, VVC_PREFIX_SEI_NUT, VVC_SUFFIX_SEI_NUT }; + + if (type == array_idx_to_type[i]) { + ret = vvcc_add_nal_unit(buf, len, ps_array_completeness, + &vvcc, i); + if (ret < 0) + goto end; + break; + } } buf += len;