From patchwork Sun Aug 22 11:29:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 29723 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp1201961iov; Sun, 22 Aug 2021 04:30:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwUFt97M+Jt7Pr8pSRw+T8ndnrWJOWCmTRzy3RUb8cv6iID+QSmvFmT/WJZGU0VcGMf6P+H X-Received: by 2002:aa7:dcd1:: with SMTP id w17mr31332124edu.322.1629631817956; Sun, 22 Aug 2021 04:30:17 -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 gn42si14088480ejc.607.2021.08.22.04.30.17; Sun, 22 Aug 2021 04:30:17 -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=DKPFKkcH; 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 3E96A689FB2; Sun, 22 Aug 2021 14:30:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (unknown [40.92.91.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7BD656898A8 for ; Sun, 22 Aug 2021 14:30:07 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CgfbknmbEIexx/bdBmnusgNbPOMZva9/aNqz6IRHjqDgxUZSyKqjunfvTUW0xIHcZExvGbG9KWorjMiOKeoNy7WthNHn+IFukYzImsnCGRA5i8P82mb/XB6UAH4l9N9Byx7WwRbIxO5SA8VgQEWjEaK9qysyKr1p+GLVMtgRa3dkhg9DXsa4i9TOEaKZfPROM/X4dOeqE1Vosxz84wdQ12A3Guc1Ei5S6COCT0N7UW0pZF9OKBGGdoNpuQ6eUVNfu36M2LCKcAx279K+t0eIF7qMCQS1NEX9kDPLqiUbuI//3rijDP6XDvjKWyvLbSovQ/jPX8a3ua1oj6cWlOGZig== 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-SenderADCheck; bh=XU7VCPq9gYbXhHRp9WrbtaOWEHuu8uNNgYHHVxq66+8=; b=Ftbb7MXR7bPGIHojoETEjZvxTlY1P2dHwSekskZ6EIIDnQd2UkMpBzJWtOkJC6AFOOBgaOP4sZGciP34P+Aq9CB/UQJeOFgQRgh9lNMPzv/8nsFb3kwhB6zIc7qvnZL/Bx2IZ8SjCz+37k7XgdN6yKXggcQneWcgKAdzeL8W6Vevgyuwt8+cMx27yXQ48H+6N0mB12j0RVAUE4zLmW2RZViwP7ens+7bRaivyBE4qjJLhCSXBYtv+dlerERV4IBhbbLzP1P7HcACYp2kBmNqQIr3f1RqpmHMDyx+e8hh3exEpfHT7rGBJ9WrFs0jvKk8zmWYqq+NNQBDmziiStewvg== 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=XU7VCPq9gYbXhHRp9WrbtaOWEHuu8uNNgYHHVxq66+8=; b=DKPFKkcHi4RhpvesEYSbschOWb7+SPpQa599lFbzzuq04PDnAI86v5bka86oQNoUUVGhwVtHof9OS1Zr4niJia4hRZ5+G21dp9yJ3DAZ1a/9gEFmC729yt5rOWiZ2dlWvvjJ54hVDVJbbtLEDJVFGLZEXAXfU9Q+YL7mOdG6zn873JVkNE0ERsQpvCj/zi+HLycaUSZVsXE0LudVjzePoPSPj82Vj1TfHsWFrTFkNs+CtxCKzX+PZIx6NIR8G6UonbJjGq2LoeC9aw1419IGxS8j5cJlG+JkjyAgj2oUwmI1K+bdGGeo/2HbNOHrfqcBa+0nhSNTGj/fnjifC5h7mw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB3765.eurprd03.prod.outlook.com (2603:10a6:209:2d::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4415.17; Sun, 22 Aug 2021 11:30:05 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::5574:1fd:cce2:d590]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::5574:1fd:cce2:d590%5]) with mapi id 15.20.4436.023; Sun, 22 Aug 2021 11:30:05 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 22 Aug 2021 13:29:52 +0200 Message-ID: X-Mailer: git-send-email 2.30.2 In-Reply-To: References: X-TMN: [+Txi4bFN/BC/OXrStnaULvGSRQA0jogy] X-ClientProxiedBy: PR1P264CA0033.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:19f::20) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20210822112955.1434452-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.142.38) by PR1P264CA0033.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:19f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4436.19 via Frontend Transport; Sun, 22 Aug 2021 11:30:05 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bbd5c2fe-3a92-4a7a-52e5-08d96560309b X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiTwpFlTyQGqvcPFYyI24dYLGPSndylGNLnIZ8xo5aHteL/DRJu0AeRwN2oKzW8fax6mBK5sakkfR5HjGFJ/v/urw3aMR1QCjzAz3U5BKEDhcPuWtrdNiZleVOy5tfryr1V4Ek68NdUslehUDJPjf0WFfNxUDKDgXu09Ig1x+N6enjJ9STXixZGmFxRwwsMsexMcXeTzljn7Kv+wI/THgW3UnJVhRtwsPLPbBak6jfIVx5Fzu4Y4invAJsbxnBGKgyCa2mI408ai65PO2RyztuqV1idg3lCUaiyF2wcEMMWim2TTKp3sjYFXxttBG/2CSP5DSp9SzVZecp8kJDvPJXTxV/9lDa68KFh8dN2iM6TdSWjMFTJW5ZqbxeG9jkU7M90NDv3SbwVyIsEYmOoabc28a88cGrysqgso0J0Q04nx1yvrBAmXTa67FFbG8unxYQkmwP3xRM4lnp1w+DF9DueXi8G3MZW9xvRQtFVKILp/2Ymp/lpEfXoviC71pNq357nGeuYHxTr0Z1OZTzomBKnyQfeJ1CxeetGbXIAJkoFRPhSDBms5aOaK64r0sAuY8lI0ahHyqfEMQfyuYYG9h2ymLoJXeBbQFqCibO7/BDE9h3x/eQCtasHML8XaRZ6L6b/XiOpEAkhPTNNxruBGN1OP5oGX4ZKKBBXbaI/4FRJzkX5vrDoDZmb0o9Txef5dqu9w+wg5pEpCE+t9diuEDO/op2tF2Se0W7GKaVLpTCXXL1S2YqoI556hZfq7cB1laBA= X-MS-TrafficTypeDiagnostic: AM6PR03MB3765: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: HnUhBIfOOdjDVl00+unhKQTXkr2eiiILO3kWnpmyLxu+7jNR277X+mi5XF5sJjqOHDz0JlNl1CAjQBaEFnAPhRjDyt0PTq9Feh2GF/gCCQGFsbWtPKfTgSo3+/l1Ezh8wBQQE3cARmWJU+Y+PP/ZJLSj9Gzi15yDNMzU4FYDRZfnBO9zFP3t3g6AhR6qcrnv2695bkoZbjlV19bsSU0Tz3cArKzukhzOLVNp1prq8pDzuywoG9tJojqIPfoh1rswely7kNbdJLqeH0AmMAm73FzFRdrHPzPsLtx/genu5xdyOy3/dIi3K4FrLFT+kD9V6tLUCooGK2lBUA98ed+r6BWDSC32dwjTjQJ1o7jGRG7Fair2fVEfEY4Wiv8/dr2bjwCFQpfW/k7tex/II0HjklMeYTa0oWiIUxrKuTJ6NUJeONG0fTKwIahNwew4/JlD X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hB3r1aFWJNws/0F46DX8rttIV0DZ8V8WeA2ARpS/bCZxRLjHBAV/P2H2IW5cmzvBAmC5kC6z/yxEv8B8S8pCPwDa53gx0QoT91QsFzALoj6N8zdLO1F77k0jitO7pQPWqeA3Lz3U/tXfGvFb8/oZcg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bbd5c2fe-3a92-4a7a-52e5-08d96560309b X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2021 11:30:05.8607 (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: AM6PR03MB3765 Subject: [FFmpeg-devel] [PATCH 2/5] avformat/av1dec: Deduplicate Annex B and low overhead OBU AV1 demuxer 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: RTGlp0lxXM9X Signed-off-by: Andreas Rheinhardt --- libavformat/av1dec.c | 133 +++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 86 deletions(-) diff --git a/libavformat/av1dec.c b/libavformat/av1dec.c index e021615c1f..d5d4548d8b 100644 --- a/libavformat/av1dec.c +++ b/libavformat/av1dec.c @@ -29,6 +29,14 @@ #include "avio_internal.h" #include "internal.h" +typedef struct AV1DemuxContext { + const AVClass *class; + AVBSFContext *bsf; + AVRational framerate; + uint32_t temporal_unit_size; + uint32_t frame_unit_size; +} AV1DemuxContext; + //return < 0 if we need more data static int get_score(int type, int *seq) { @@ -48,14 +56,15 @@ static int get_score(int type, int *seq) return 0; } -static int read_header(AVFormatContext *s, const AVRational *framerate, AVBSFContext **bsf, void *logctx) +static int av1_read_header(AVFormatContext *s) { + AV1DemuxContext *const c = s->priv_data; const AVBitStreamFilter *filter = av_bsf_get_by_name("av1_frame_merge"); AVStream *st; int ret; if (!filter) { - av_log(logctx, AV_LOG_ERROR, "av1_frame_merge bitstream filter " + av_log(s, AV_LOG_ERROR, "av1_frame_merge bitstream filter " "not found. This is a bug, please report it.\n"); return AVERROR_BUG; } @@ -68,35 +77,49 @@ static int read_header(AVFormatContext *s, const AVRational *framerate, AVBSFCon st->codecpar->codec_id = AV_CODEC_ID_AV1; st->internal->need_parsing = AVSTREAM_PARSE_HEADERS; - st->internal->avctx->framerate = *framerate; + st->internal->avctx->framerate = c->framerate; // taken from rawvideo demuxers avpriv_set_pts_info(st, 64, 1, 1200000); - ret = av_bsf_alloc(filter, bsf); + ret = av_bsf_alloc(filter, &c->bsf); if (ret < 0) return ret; - ret = avcodec_parameters_copy((*bsf)->par_in, st->codecpar); + ret = avcodec_parameters_copy(c->bsf->par_in, st->codecpar); if (ret < 0) return ret; - ret = av_bsf_init(*bsf); + ret = av_bsf_init(c->bsf); if (ret < 0) return ret; return 0; } +static int av1_read_close(AVFormatContext *s) +{ + AV1DemuxContext *const c = s->priv_data; + + av_bsf_free(&c->bsf); + return 0; +} + #define DEC AV_OPT_FLAG_DECODING_PARAM +#define OFFSET(x) offsetof(AV1DemuxContext, x) +static const AVOption av1_options[] = { + { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, + { NULL }, +}; +#undef OFFSET + +static const AVClass av1_demuxer_class = { + .class_name = "AV1 Annex B/low overhead OBU demuxer", + .item_name = av_default_item_name, + .option = av1_options, + .version = LIBAVUTIL_VERSION_INT, +}; #if CONFIG_AV1_DEMUXER -typedef struct AnnexBContext { - const AVClass *class; - AVBSFContext *bsf; - uint32_t temporal_unit_size; - uint32_t frame_unit_size; - AVRational framerate; -} AnnexBContext; static int leb(AVIOContext *pb, uint32_t *len) { int more, i = 0; @@ -193,15 +216,9 @@ static int annexb_probe(const AVProbeData *p) return 0; } -static int annexb_read_header(AVFormatContext *s) -{ - AnnexBContext *c = s->priv_data; - return read_header(s, &c->framerate, &c->bsf, c); -} - static int annexb_read_packet(AVFormatContext *s, AVPacket *pkt) { - AnnexBContext *c = s->priv_data; + AV1DemuxContext *const c = s->priv_data; uint32_t obu_unit_size; int ret, len; @@ -256,50 +273,22 @@ end: return ret; } -static int annexb_read_close(AVFormatContext *s) -{ - AnnexBContext *c = s->priv_data; - - av_bsf_free(&c->bsf); - return 0; -} - -#define OFFSET(x) offsetof(AnnexBContext, x) -static const AVOption annexb_options[] = { - { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, - { NULL }, -}; -#undef OFFSET - -static const AVClass annexb_demuxer_class = { - .class_name = "AV1 Annex B demuxer", - .item_name = av_default_item_name, - .option = annexb_options, - .version = LIBAVUTIL_VERSION_INT, -}; - const AVInputFormat ff_av1_demuxer = { .name = "av1", .long_name = NULL_IF_CONFIG_SMALL("AV1 Annex B"), - .priv_data_size = sizeof(AnnexBContext), + .priv_data_size = sizeof(AV1DemuxContext), .flags_internal = FF_FMT_INIT_CLEANUP, .read_probe = annexb_probe, - .read_header = annexb_read_header, + .read_header = av1_read_header, .read_packet = annexb_read_packet, - .read_close = annexb_read_close, + .read_close = av1_read_close, .extensions = "obu", .flags = AVFMT_GENERIC_INDEX, - .priv_class = &annexb_demuxer_class, + .priv_class = &av1_demuxer_class, }; #endif #if CONFIG_OBU_DEMUXER -typedef struct ObuContext { - const AVClass *class; - AVBSFContext *bsf; - AVRational framerate; -} ObuContext; - //For low overhead obu, we can't foresee the obu size before we parsed the header. //So, we can't use parse_obu_header here, since it will check size <= buf_size //see c27c7b49dc for more details @@ -367,15 +356,9 @@ static int obu_probe(const AVProbeData *p) return 0; } -static int obu_read_header(AVFormatContext *s) -{ - ObuContext *c = s->priv_data; - return read_header(s, &c->framerate, &c->bsf, c); -} - static int obu_get_packet(AVFormatContext *s, AVPacket *pkt) { - ObuContext *c = s->priv_data; + AV1DemuxContext *const c = s->priv_data; uint8_t header[MAX_OBU_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; int64_t obu_size; int size; @@ -404,7 +387,7 @@ static int obu_get_packet(AVFormatContext *s, AVPacket *pkt) static int obu_read_packet(AVFormatContext *s, AVPacket *pkt) { - ObuContext *c = s->priv_data; + AV1DemuxContext *const c = s->priv_data; int ret; while (1) { @@ -431,39 +414,17 @@ static int obu_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; } -static int obu_read_close(AVFormatContext *s) -{ - ObuContext *c = s->priv_data; - - av_bsf_free(&c->bsf); - return 0; -} - -#define OFFSET(x) offsetof(ObuContext, x) -static const AVOption obu_options[] = { - { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, - { NULL }, -}; -#undef OFFSET - -static const AVClass obu_demuxer_class = { - .class_name = "AV1 low overhead OBU demuxer", - .item_name = av_default_item_name, - .option = obu_options, - .version = LIBAVUTIL_VERSION_INT, -}; - const AVInputFormat ff_obu_demuxer = { .name = "obu", .long_name = NULL_IF_CONFIG_SMALL("AV1 low overhead OBU"), - .priv_data_size = sizeof(ObuContext), + .priv_data_size = sizeof(AV1DemuxContext), .flags_internal = FF_FMT_INIT_CLEANUP, .read_probe = obu_probe, - .read_header = obu_read_header, + .read_header = av1_read_header, .read_packet = obu_read_packet, - .read_close = obu_read_close, + .read_close = av1_read_close, .extensions = "obu", .flags = AVFMT_GENERIC_INDEX, - .priv_class = &obu_demuxer_class, + .priv_class = &av1_demuxer_class, }; #endif