From patchwork Sun Jan 16 23:03:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33628 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2273626iog; Sun, 16 Jan 2022 15:06:40 -0800 (PST) X-Google-Smtp-Source: ABdhPJxTBCBqJbhxqo7mL+2jZl4S7n1ImUOw64BLzwKORzBrNHAcKL2wjurmJ++8yIqSCiF2p4ad X-Received: by 2002:a17:907:3e8b:: with SMTP id hs11mr14658490ejc.461.1642374400227; Sun, 16 Jan 2022 15:06:40 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n9si8159311edx.526.2022.01.16.15.06.39; Sun, 16 Jan 2022 15:06:40 -0800 (PST) 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=HMXzZjJv; 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 BFC5768AF86; Mon, 17 Jan 2022 01:05:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073065.outbound.protection.outlook.com [40.92.73.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E5A5D68AF5C for ; Mon, 17 Jan 2022 01:05:10 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MUG6HCXRstQmEb4Xa8iqo4OEEv1nSMWtFt1bPEqgtPHF9QbUJkcTqUTX/jiHFMwiMq+NbKtVUxjcZP3PjaRLw/RsNc6ScEHp4k/x7Bqy/9k6Q7ni6m5DS6RXa3ww08tTCKlSXiZIMfDp0tCzWtw1ozJxi+QGSIIi+v8jQwu76sJyPkvSXIY/16doofcKAtiD7HA9SeGIDmkUkDR5lBijYivvsiM+27rkXiCORXC1EFlvkYUh2WV6a6EjHkMwECvOgScImMpO/7Bg+2TZ5VVThq5mZ8RjGAtMsvaKU9uPEPf3NEQJPuNbJKdfILqB0q6f9sW/whU8V6u0HtC2LOtnHw== 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=Y8Ze710JvHupgtJoWl6Wj1ljCH4hDZDgblM+x3YCaEQ=; b=ZwD7hnsgQfROBdzfH1T07Mp2ymYNEhLbGcdw5VrDKVsMTYWe7F8Fs40ET6xiDip5ms8nlRcW1yKQdja4vXLDY/WzvpIndvaqcP48t6wkpkEtcRhH61EW3bhV8wvjZCHnr8/DLoXFt1UWtrK8bUMum5Z0I9FkYaKYpFno+RdLy5+rTHd0lhtoePneEFyh0sNE6BH73JH9XZsPjbglHVbiX1bI6sXF0kZIoItHgUFuN2vqBihG0XOXrw1FGXV4YMGvdXl2OM1xdi5U1vgw4cYV3z9bIdDIWP0yBd4rY+ppTs9tyhvJ/8RQ/eNAep3tS/WVd1CnmxUARQJQs7Ugp3A4hg== 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=Y8Ze710JvHupgtJoWl6Wj1ljCH4hDZDgblM+x3YCaEQ=; b=HMXzZjJvglTgWy5/fL9PJbduDynLFfxtATkXst2jtexng5coIwzCSYWJEfIfrbSDnCaWHAr81RKGVpxMyNEHb0Jf0GBkfA1HkrD/JczjxWuXVx4a4Zf2VQMiZ0SjxfO14e2CzS4QbiVbNWyUKFsWO+Buhso+naO3JQUNZuAtl6Tpo6g8aifK1dkJoudpqlFzFVpOnRr9+lrgetTI+1SA8G9LcpUtV2F00XxpGpqUWhL4G3wU57ZkYZVihDvu94lCRUvrFFymuoRo1MXHQCWMtyUElRjtt2WvevNDIV4RwMOT5ShYvLGdAH0ByXRd5Ot4V2TKfSGVPZRzyE8es6E7QQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AS8PR03MB7704.eurprd03.prod.outlook.com (2603:10a6:20b:403::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4888.10; Sun, 16 Jan 2022 23:05:09 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5%9]) with mapi id 15.20.4888.013; Sun, 16 Jan 2022 23:05:09 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jan 2022 00:03:56 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [d1eDHsF6/G/Hi0F9Dtv5ZbpeAWmD85Bv] X-ClientProxiedBy: AM0PR10CA0070.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:15::23) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220116230405.194506-15-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c83f24bc-eb05-4924-f0db-08d9d944a4b4 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQ2WpFcKeHQajRkhOqduPnsMk3DQ7gjIN67IdoxSs6dDztI0m168njPumeUMTe48wkMqKmRJ3cZXDVorSoxnRIbKmWZhJM2qubyEFvgxV4itXIvth55knDZeczGB2/4Izy4+hGXZT5cudvwI87ss8cPFbHfm9hjKLsm+bp2w1g7Peb7e53qHInW+WIwaXFU7hbLQHzNfp1RXZ1BrQHqv11MNQAxLdNBEQgY+KQ493Qppgt159laqPPz205iVk1hmYE5u6+X61lRLRLq57dPbBih/9InbdgD2M3ahnfyqTZebRj78M7SnTyP8eysruJq9tAsACzR4Kig1U7rZVOXiiK7Cz9p1PB2sHUdz09wLapC+TZ13G+oxL6oKMPk4zgEpUEjBqwb4qvrsWzULI5mI7HGSMKg8rtKVRDWtrW7wd5dFB5pAbdUoCihnxOVVW4eUUlajc5tvDt90oeDZ7qwuHTunSVpTRfMqqxVtVeb4UyiH/XxntXYIsGfTkvt5005eomsgvDBs4ws05wxt6OUESu4Cs9vMnKNNJGdFjNU4Y6oVg92q1NUL1HynkFFusxeIGVDXhREIvk2uEBe6BexXRiNZzR9DGFgG/e/xrfhn3qptxaSx7wM1ngpOs58QM/zSSIZCo+sBGxN74Qc+vnGHAstnkLd9fKdXz1CfoNEVlVegL2O/WijVyx2BLivW2qsAC3LOEccU4UEVI6xXLcxIs2C3a0vR84UljrWXWoYHrmloXsnWSS5xr9D6KRy5jaoa70= X-MS-TrafficTypeDiagnostic: AS8PR03MB7704:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ljSUs40VY24kDBA9VXeF5NGay5WbZtQXNk97nKgdjcAab6Ojno+vFzjof9MJfdwXfyr2S8C/SoT8GfnuaQO7KuG+cBh01dEE+81pZJ/ookkr/bMKH7Tm9C3Eezx+DJoIggoMwa1ryOUQDVmV0ez+CzfBRfwWJW6wCQ0aiROAw4dZYDomVYrXAYO17RHoIoyRWhqsqmPBIllGF6psY5oZrcwnjorHPql6t+PMG1/bhK+zmZ3k/Jn4e9fRL9VoEp9FlQtyftYKZ2Z+9xV5XFnktAwsiusu25Wawy993laZGJf9oIJSp8nVWplLiWR2LNmqh/lWCvIslZeNzQlTHZ6O7ZuLsUK38x8RizUWNrHNK0Bc/WDGz8e28AIZaOa1N82JzPAOl26hryY7lgE78HJ0bCjhyKPbGfNhIp2IjHUqP0Ik3xbMKyF7eyvVmiY/4N4M9icbzEZ8iFCurpxeioS49Sc0c2CX7nnelo8ebDdOBK9FjnVE2yAyaUyXeIyJB6KKLfbTyS4zFzTferTYAvmahDE/3tYfD4emMzvwVNmVAL4IOLSJ71xHTYgqS6c4kwSQ3wu1GKg7klhPsknxbMbIsw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 3dSXNRng/zgHd//dktlmWx2qMA1BrhQ937yRMQQuDG4JSSm27+t06kJmOOUJsvThbR5hda4XjnHuwyPvzOhw+TvUfWtUJ5p24D1Fxto6bGGAI8FvHnp6E8OK3xLdoHgKD9TQ5jGH45GqySmTylivWTCcdv6we/92kiYD54JgL2ffi2OEbkiid5S1tuU36wH1k7hIXzvXCBta3jG44TfJxNYbJdVA7A3wblaD7dtYkPhlG7vLmMNCzso89jryGcAq1maRlnPacNeJtwwuLL6QwdA8DJT7kkDkv97elIjWkyCL8/qVwq/K3tJrgPyNsI2lO3QcrX2/NHKjgEo3EZzmzYTXZeUfhhc9JWcdAXtD1Fr/khoKreOdxkvN7G7VfRsHlW6S7yO0wOKtV7Ldp890VMvbgDMinCwAtaDqwKWzkaBY55FexVI8H5e65Mg6eNeXItokYCHMNJ+iAuybn20fY5dFXRYvIbcPPfdmWrr4rF+sEaULphnbZnOfICjSYU70yK987CtbxmfTYIoq1vTlHKS8u7b6ktgFXU+bBG4DkR58z6e6tgJvqjjtEJeY3Ca/r80wfxhtY8ccpO+LMlv3wZ1jh4JZqqPq3+bRCT+RrvAVU+ghILDxTyPzWvmxS5/EYFG8XdTnZi528qPDlFsEpPHf4PD9cBWvNOfzIlVTYdNuvjyXn/2L7NEc/cmpXa62JZ1MLattMt1MyAI+o17qBTyVbp/yAjLpxTKkdOmI3gTYW6LdS9qiE63gfZI1+Z3U8nVZUVo6LpeVxJqWLqqaGLUOf+wPzLNB5qia6MoBZYpqNLSg0bN6Fw8z744ySzMrdDCuz0UGn98b0OgNnaBIGfyI86sVolTnVJle7qyzINPKC3iaPVWP5bGZ9Rz/7Szk1svfTYaDEh9MxWWq4JWt6qinvERTPL8b2esn9WTvfFWWQgHIiBrcAiw9jkrDoPUgEjhPPy6AG5/TnVWVARg2Sg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c83f24bc-eb05-4924-f0db-08d9d944a4b4 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2022 23:05:09.5679 (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: AS8PR03MB7704 Subject: [FFmpeg-devel] [PATCH 16/25] avformat/avc: Add functions to split access unit into list of NALUs 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: YqpVGImCwyXe This will allow to avoid the temporary buffer and memcpys when repacketing annex B to mp4-style H.264/H.265 without searching twice for start codes. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 40 +++++++++++++++++++++++++++++++++++++--- libavformat/avc.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index b5e2921388..b0ceb1d2d8 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -70,7 +70,8 @@ const uint8_t *ff_avc_find_startcode(const uint8_t *p, const uint8_t *end){ return out; } -int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) +static int avc_parse_nal_units(AVIOContext *pb, NALUList *list, + const uint8_t *buf_in, int size) { const uint8_t *p = buf_in; const uint8_t *end = p + size; @@ -79,19 +80,52 @@ int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) size = 0; nal_start = ff_avc_find_startcode(p, end); for (;;) { + const size_t nalu_limit = SIZE_MAX / sizeof(*list->nalus); while (nal_start < end && !*(nal_start++)); if (nal_start == end) break; nal_end = ff_avc_find_startcode(nal_start, end); - avio_wb32(pb, nal_end - nal_start); - avio_write(pb, nal_start, nal_end - nal_start); + if (pb) { + avio_wb32(pb, nal_end - nal_start); + avio_write(pb, nal_start, nal_end - nal_start); + } else if (list->nb_nalus >= nalu_limit) { + return AVERROR(ERANGE); + } else { + NALU *tmp = av_fast_realloc(list->nalus, &list->nalus_array_size, + (list->nb_nalus + 1) * sizeof(*list->nalus)); + if (!tmp) + return AVERROR(ENOMEM); + list->nalus = tmp; + tmp[list->nb_nalus++] = (NALU){ .offset = nal_start - p, + .size = nal_end - nal_start }; + } size += 4 + nal_end - nal_start; nal_start = nal_end; } return size; } +int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) +{ + return avc_parse_nal_units(pb, NULL, buf_in, size); +} + +int ff_nal_units_create_list(NALUList *list, const uint8_t *buf, int size) +{ + list->nb_nalus = 0; + return avc_parse_nal_units(NULL, list, buf, size); +} + +void ff_nal_units_write_list(const NALUList *list, AVIOContext *pb, + const uint8_t *buf) +{ + for (unsigned i = 0; i < list->nb_nalus; i++) { + avio_wb32(pb, list->nalus[i].size); + avio_write(pb, buf + list->nalus[i].offset, list->nalus[i].size); + } +} + int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size) { AVIOContext *pb; diff --git a/libavformat/avc.h b/libavformat/avc.h index 9792b77913..aced285c7a 100644 --- a/libavformat/avc.h +++ b/libavformat/avc.h @@ -25,6 +25,35 @@ #include #include "avio.h" +typedef struct NALU { + int offset; + uint32_t size; +} NALU; + +typedef struct NALUList { + NALU *nalus; + unsigned nalus_array_size; + unsigned nb_nalus; ///< valid entries in nalus +} NALUList; + +/* This function will parse the given annex B buffer and create + * a NALUList from it. This list can be passed to ff_nal_units_write_list() + * to write the access unit reformatted to mp4. + * + * @param list A NALUList. The list->nalus and list->nalus_array_size + * must be valid when calling this function and may be updated. + * nb_nalus is set by this function on success. + * @param buf buffer containing annex B H.264 or H.265. Must be padded. + * @param size size of buf, excluding padding. + * @return < 0 on error, the size of the mp4-style packet on success. + */ +int ff_nal_units_create_list(NALUList *list, const uint8_t *buf, int size); + +/* Writes a NALUList to the specified AVIOContext. The list must originate + * from ff_nal_units_create_list() with the same buf. */ +void ff_nal_units_write_list(const NALUList *list, AVIOContext *pb, + const uint8_t *buf); + int ff_avc_parse_nal_units(AVIOContext *s, const uint8_t *buf, int size); int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size); int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len);