From patchwork Fri May 10 16:56:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 48705 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1706:b0:1af:cdee:28c5 with SMTP id nv6csp718334pzb; Fri, 10 May 2024 09:56:56 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUPHbDJcacdg+pf6HfD9TcbzzuQxz1Fc/pqgza4i+JUJal4cd3rnkU3bxolkj78/JU+Jh6NecEF90jWT6DzO79wwjLwEvGQLJnH+Q== X-Google-Smtp-Source: AGHT+IEI5CHeBGPjUKhShjmt442hnVflqZbGCV1BFJvokOaiSpCuN+/o1uAvYVKoq2jNEvkphsIe X-Received: by 2002:a17:907:75cc:b0:a5a:1826:458 with SMTP id a640c23a62f3a-a5a2d668b78mr213835766b.4.1715360216280; Fri, 10 May 2024 09:56:56 -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 a640c23a62f3a-a5a17945f1asi227520066b.70.2024.05.10.09.56.55; Fri, 10 May 2024 09:56:56 -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=HdxSVXOd; 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 819D168D586; Fri, 10 May 2024 19:56:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2095.outbound.protection.outlook.com [40.92.91.95]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E1CDB68D56C for ; Fri, 10 May 2024 19:56:41 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XfGCnvahgbyVG86vIEQglvMX50mw4c5B0f89OsNOgIdJR5nA8cGKxEGeM97Nq6ii1NjMN4GGlYUlgcJNnkf53zkcAHDq5v3qeil7KvvI28AmseJPbrdD/8aZECOVmEmdQayO0OTBP06EuMtVcX5nMGgck8mNrYG924hjrFnLJlXgH+aDtkuu85ifbivn7b9JkqoXRKRq4QTdSblf3nrbuWS4A9NBV+TomUTQR1wq+vqeukspsdeX+G5dZOECT33yNLnzk43uUF2C2pud1OzWdqQeOG7QsNxlwznr8vwzGNKmJUAFg6XF8OPlNUY/QZkx64mNgNbwsnPyb8M+UCOnfA== 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=K4KRh+ML+lBnIvcfwRJTJBnN07MnrrXuqJqZTUhvOuI=; b=O4AJtpSySUev/i6A5vTYu6wGnFcgC93mIMIUr/qpyVxN8F7Vt2LFRkh8goT67qbVlZt8w8Q77GMFn2A0FEyBGKziuBkSHaHGTZd1pYnJBrlGtn29zGVDnL1/Iun8ZyZ8qXsx4Ms+dEkh6AoIb9kHdqhhs/R4+dH/H3q0y55IghHrhkR6XRPAKohY99Y+GtRG9j4BfhdGj6xkUjAe1VOvjJ2gQZ6W+b4PfFYnEtpClQYqIs8R4TnjNw92XBRW1u6aX9Sp0DZ3cx750lusXqpYXfpmGtooPxLz56AbUz10Mkv9E/HRdvX11s4JXATrtsY1wIzxJ7kC41YHNu6DfGM8uw== 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=K4KRh+ML+lBnIvcfwRJTJBnN07MnrrXuqJqZTUhvOuI=; b=HdxSVXOd/RXK5i7jCq0eFe3BGPb7yYxGrXQ20HW716sVx5OVugNZC16eCadH3NWz7UNFESX21lFZ3QAO2Hw3lxhHghDMptpwUu/oNTPKiQ4F6hHB+tDNrWX+5rihIFheJo++J/kQpMs/1L5OgyQUKNmER7e86l7H3E0iU9bx6zr1fkRT3cUJRBtykV0liK5/9TD2nbnJIqhawtOanvBFytBPMhBfiynG6MOiNw8+odyx4FY/A6nM0a/A8LOGeaUqpUu5NSUnB1s5KdnGsHCbF/QZj0iRE05CKAdkJKgdO+C/belUrfP88x7yROOTWZgLhthcFB9DFZWFoRpktIc4ZA== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AS8P250MB0283.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:37e::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.49; Fri, 10 May 2024 16:56:39 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%7]) with mapi id 15.20.7544.048; Fri, 10 May 2024 16:56:39 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 10 May 2024 18:56:26 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [meR2L+shRCYa/UXFWCMFCapoz+xcoRGvN0wCWWUXnPM=] X-ClientProxiedBy: ZR0P278CA0015.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:16::25) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240510165627.507659-2-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AS8P250MB0283:EE_ X-MS-Office365-Filtering-Correlation-Id: d9d4317a-f022-4aa1-992a-08dc711228da X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: GamgWp1NqZexnE/owhSSQtef/aOSNW3w4sj/PlZBFJAiBmtVg5WuSzy3iVLY5vw6OCthUoEDaXpvSRlN0rEIPn/d+/XbFB6BbNPMkYCqpmpbb8f2XMyiPpdEEs/b9ps8/McaWKrwzhZ9hin/QVe7DPHMC7arryrM+6uqsKjrhwPpCU/BGIbLFKAlVZW1KIwNrKFRahDkFEZZa9VfH9Jxzq0igFND2Rh+uuJBCU24FUfLzslAxkCeWgZueGYN2/abY1Lue0/yoqGVcMYd3ADYiRtOfUNyDO2ybbEH3rtE8pJbupwAh58wDwYPD9k/VgDXiZVZmAFnVav5Cm/thFp2aiV1wJmurO1xE0ruFvmOeThM0EJWlPTG+EH1mhncztfZ3mTDu5qwLAZtKN131tyeBUTEGHY4ALu3NMyB+6idh3kWjf4uoO7h9UHQc/LqcmVG42KbzxMqW2kKtGUJqSTFwFqKcLgt8nncQTsj5tkD4BMsW9ZtgzGt4/TJnN1DbfLUpYei3iPax2w4v7fPLUNNX+V8dxTBdpJkrPRxbE78KRbmjgFMA465iei257ZPy2FU1QkHxAaxom8AFnE75dNRuEuxwvm0SLmhlF2VhgXyQz6pN8T9n1EGkaUL+pdRm2LT X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cMvbL5efWXUdx4KbB+CoIDOBJf6JOxP/OTw9PwdeHC7z+27BCO6Wqaqa7Ar5iBQXO2urkshy5iZI3+xrTBLqd3nIgFUAEMBkzfu5Qzc0i4j2HB49neb/Liuh07zpQtx/qvHdOpiBgh6KOiOWIdQS1X5ql8LzRiGDVBHbZ5rncErFHn/cHAEHQiEv2MEb1fhErTrOKpj4orW5YyIuirgx2zWkT+TggiX6KtrUETE587epAmlBORW19BvYvSEwQOffkY6zsmH0Ka3U0MgDtxg1Ox+XbYNheZ9MmDHQZOwjKFNfUEZilsNTuTtwZBDjMfd3AZ3oE86Lco3H+yQp1t6EOHDLKeZCU+PjtbP+yRr3J+RGR/G8XkrKf1Dpj9td0FCYq7towsDBL1xdxGHwbPoiL3IAVJnlL/myEH/8K3Ay4p9yHSa547BZ+xXiw47y6kVonieKx/9wfkOAONNBJ8K7vLGwJyNj1nxupI0eUprCUojcjSE0CGgIcfvq8e0s/2FsRlNWRvInf8tffFAP7ibhcDwwgb3uiV+ymd98V3L+CPKtX9H/MfyDAlUc0kMs0N58cccp6gle1ecTec1kZudYe62jX5dhps5jZBzydbo9t0h6h7RX2h/U0uw6VdwcykytfANRU11gIRmDzQjfSbftTSYjM5ixQfqj/SwjGnJbGEVi4m10uAVTkMtvKMicGAdD6vjyQ1JyHQhedsfk7rKlT/iPA8GqgHZamwRHFpD1pl9EvXahMOhzHv4y/KTjOuw7e1WucDUssZ9fTKubIF4VH/W3r0W9wyk8Y1PvyxI5kwlugFHjF0Il1b/xHexCxzlLZH5AP556IFX5nclmvOn/luH399/ouIdA7RCDGjuUFgBvOTWvP7vXDZ6wOpcN5n6mzNG3f2dEe1W40pXFLVcSE0AFK/xYw5ZiyTX9uxMyEBRJgGBFtBr+7kP0VZm126nhy6m1pURwcglM+HfoSZQ2uJTJahTbJnBHI0HvM9JAvyNPMv+7DTRNgFS0ZoezVs1FZu+DMv8rDbG1Anqmw43Awg3/dqIFhStE48+lM7Tib/E2SZb3v62tZOKf5j7kyw+/ZXdzOq0GUJ8LElACEzxfGZwLKAGwAtiEZgcBhQIV9GdVxfODSer+PTVGfWeMdZitV7vfhKOtiHXRZ39dfiIROBfFAQ80GygOL5ki+pMsb8Uk2OoKnfvcNe4Zec4fYZ+IxSUGHY8PYNHy0RE+OHXah31+UlSggRUEiz2JuRYSpEr0DpGX7AMR7orszo3Tt26feyT6sYzGNu2iCw0cRY1M5A== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d9d4317a-f022-4aa1-992a-08dc711228da X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 May 2024 16:56:39.0541 (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: AS8P250MB0283 Subject: [FFmpeg-devel] [PATCH 3/4] avcodec/adts_header: Add ff_adts_header_parse_buf() 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: SWDZCckWReUm Most users of ff_adts_header_parse() don't already have an opened GetBitContext for the header, so add a convenience function for them. Also use a forward declaration of GetBitContext in adts_header.h as this avoids (implicit) inclusion of get_bits.h in some of the users that now no longer use a GetBitContext of their own. Signed-off-by: Andreas Rheinhardt --- libavcodec/aac_parser.c | 16 +++++----------- libavcodec/adts_header.c | 10 ++++++++++ libavcodec/adts_header.h | 14 ++++++++++++-- libavcodec/adts_parser.c | 18 ++++-------------- libavcodec/bsf/aac_adtstoasc.c | 6 ++---- libavcodec/ftr_parser.c | 7 ++----- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/libavcodec/aac_parser.c b/libavcodec/aac_parser.c index f295dfccdd..186fcd887a 100644 --- a/libavcodec/aac_parser.c +++ b/libavcodec/aac_parser.c @@ -24,24 +24,18 @@ #include "aac_ac3_parser.h" #include "adts_header.h" #include "adts_parser.h" -#include "get_bits.h" -#include "mpeg4audio.h" +#include "libavutil/intreadwrite.h" static int aac_sync(uint64_t state, int *need_next_header, int *new_frame_start) { - GetBitContext bits; + uint8_t tmp[8 + AV_INPUT_BUFFER_PADDING_SIZE]; AACADTSHeaderInfo hdr; int size; - union { - uint64_t u64; - uint8_t u8[8 + AV_INPUT_BUFFER_PADDING_SIZE]; - } tmp; - tmp.u64 = av_be2ne64(state); - init_get_bits(&bits, tmp.u8 + 8 - AV_AAC_ADTS_HEADER_SIZE, - AV_AAC_ADTS_HEADER_SIZE * 8); + AV_WB64(tmp, state); - if ((size = ff_adts_header_parse(&bits, &hdr)) < 0) + size = ff_adts_header_parse_buf(tmp + 8 - AV_AAC_ADTS_HEADER_SIZE, &hdr); + if (size < 0) return 0; *need_next_header = 0; *new_frame_start = 1; diff --git a/libavcodec/adts_header.c b/libavcodec/adts_header.c index 8663d00f4c..0d6be1aa0e 100644 --- a/libavcodec/adts_header.c +++ b/libavcodec/adts_header.c @@ -25,6 +25,7 @@ #include "adts_parser.h" #include "get_bits.h" #include "mpeg4audio.h" +#include "libavutil/avassert.h" int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr) { @@ -71,3 +72,12 @@ int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr) return size; } + +int ff_adts_header_parse_buf(const uint8_t buf[AV_AAC_ADTS_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE], + AACADTSHeaderInfo *hdr) +{ + GetBitContext gb; + av_unused int ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE); + av_assert1(ret >= 0); + return ff_adts_header_parse(&gb, hdr); +} diff --git a/libavcodec/adts_header.h b/libavcodec/adts_header.h index d89d487025..4f62edcbac 100644 --- a/libavcodec/adts_header.h +++ b/libavcodec/adts_header.h @@ -23,7 +23,8 @@ #ifndef AVCODEC_ADTS_HEADER_H #define AVCODEC_ADTS_HEADER_H -#include "get_bits.h" +#include "adts_parser.h" +#include "defs.h" typedef enum { AAC_PARSE_ERROR_SYNC = -0x1030c0a, @@ -43,6 +44,8 @@ typedef struct AACADTSHeaderInfo { uint32_t frame_length; } AACADTSHeaderInfo; +struct GetBitContext; + /** * Parse the ADTS frame header to the end of the variable header, which is * the first 54 bits. @@ -51,7 +54,14 @@ typedef struct AACADTSHeaderInfo { * @return Returns the size in bytes of the header parsed on success * and AAC_PARSE_ERROR_* values otherwise. */ -int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr); +int ff_adts_header_parse(struct GetBitContext *gbc, AACADTSHeaderInfo *hdr); + +/** + * Wrapper around ff_adts_header_parse() for users that already have + * a proper GetBitContext. + */ +int ff_adts_header_parse_buf(const uint8_t buf[AV_AAC_ADTS_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE], + AACADTSHeaderInfo *hdr); /** * Parse the ADTS frame header contained in the buffer, which is diff --git a/libavcodec/adts_parser.c b/libavcodec/adts_parser.c index 81e2669149..66b988d6f6 100644 --- a/libavcodec/adts_parser.c +++ b/libavcodec/adts_parser.c @@ -20,7 +20,9 @@ #include #include +#include +#include "libavutil/error.h" #include "libavutil/mem.h" #include "adts_header.h" #include "adts_parser.h" @@ -29,16 +31,12 @@ int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames) { #if CONFIG_ADTS_HEADER uint8_t tmpbuf[AV_AAC_ADTS_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; - GetBitContext gb; AACADTSHeaderInfo hdr; int err; if (!buf) return AVERROR(EINVAL); memcpy(tmpbuf, buf, AV_AAC_ADTS_HEADER_SIZE); - err = init_get_bits8(&gb, tmpbuf, AV_AAC_ADTS_HEADER_SIZE); - if (err < 0) - return err; - err = ff_adts_header_parse(&gb, &hdr); + err = ff_adts_header_parse_buf(tmpbuf, &hdr); if (err < 0) return err; *samples = hdr.samples; @@ -54,7 +52,6 @@ int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_ #if CONFIG_ADTS_HEADER int ret = 0; int allocated = 0; - GetBitContext gb; if (!phdr || !buf || size < AV_AAC_ADTS_HEADER_SIZE) return AVERROR_INVALIDDATA; @@ -66,14 +63,7 @@ int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_ if (!*phdr) return AVERROR(ENOMEM); - ret = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE); - if (ret < 0) { - if (allocated) - av_freep(phdr); - return ret; - } - - ret = ff_adts_header_parse(&gb, *phdr); + ret = ff_adts_header_parse_buf(buf, *phdr); if (ret < 0) { if (allocated) av_freep(phdr); diff --git a/libavcodec/bsf/aac_adtstoasc.c b/libavcodec/bsf/aac_adtstoasc.c index dd5e8b2a31..b821414f2a 100644 --- a/libavcodec/bsf/aac_adtstoasc.c +++ b/libavcodec/bsf/aac_adtstoasc.c @@ -40,7 +40,6 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *pkt) { AACBSFContext *ctx = bsfc->priv_data; - GetBitContext gb; PutBitContext pb; AACADTSHeaderInfo hdr; int ret; @@ -55,9 +54,7 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *pkt) if (pkt->size < AV_AAC_ADTS_HEADER_SIZE) goto packet_too_small; - init_get_bits(&gb, pkt->data, AV_AAC_ADTS_HEADER_SIZE * 8); - - if (ff_adts_header_parse(&gb, &hdr) < 0) { + if (ff_adts_header_parse_buf(pkt->data, &hdr) < 0) { av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n"); ret = AVERROR_INVALIDDATA; goto fail; @@ -81,6 +78,7 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *pkt) uint8_t *extradata; if (!hdr.chan_config) { + GetBitContext gb; init_get_bits(&gb, pkt->data, pkt->size * 8); if (get_bits(&gb, 3) != 5) { avpriv_report_missing_feature(bsfc, diff --git a/libavcodec/ftr_parser.c b/libavcodec/ftr_parser.c index 05e6cfed98..656fd289f6 100644 --- a/libavcodec/ftr_parser.c +++ b/libavcodec/ftr_parser.c @@ -25,7 +25,6 @@ */ #include "parser.h" -#include "get_bits.h" #include "adts_header.h" #include "adts_parser.h" #include "mpeg4audio.h" @@ -45,7 +44,6 @@ static int ftr_parse(AVCodecParserContext *s, AVCodecContext *avctx, FTRParseContext *ftr = s->priv_data; uint64_t state = ftr->pc.state64; int next = END_NOT_FOUND; - GetBitContext bits; AACADTSHeaderInfo hdr; int size; @@ -71,10 +69,9 @@ static int ftr_parse(AVCodecParserContext *s, AVCodecContext *avctx, state = (state << 8) | buf[i]; AV_WB64(tmp, state); - init_get_bits(&bits, tmp + 8 - AV_AAC_ADTS_HEADER_SIZE, - AV_AAC_ADTS_HEADER_SIZE * 8); + size = ff_adts_header_parse_buf(tmp + 8 - AV_AAC_ADTS_HEADER_SIZE, &hdr); - if ((size = ff_adts_header_parse(&bits, &hdr)) > 0) { + if (size > 0) { ftr->skip = size - 6; ftr->frame_index += ff_mpeg4audio_channels[hdr.chan_config]; if (ftr->frame_index >= avctx->ch_layout.nb_channels) {