From patchwork Wed Jan 5 21:56:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33108 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp1112071iog; Wed, 5 Jan 2022 13:57:41 -0800 (PST) X-Google-Smtp-Source: ABdhPJx2qsunjwvj9gHm52VMdPnvOPjdGq/nTJZNektZSiDWrNuHBaYv+JOssA/OlbG+CzM+/wcH X-Received: by 2002:aa7:c48a:: with SMTP id m10mr54063785edq.374.1641419861156; Wed, 05 Jan 2022 13:57:41 -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 gs38si41410ejc.572.2022.01.05.13.57.40; Wed, 05 Jan 2022 13:57:41 -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=X9U0gd2A; 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 EB53B68AF12; Wed, 5 Jan 2022 23:56:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075100.outbound.protection.outlook.com [40.92.75.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1CD268AEE5 for ; Wed, 5 Jan 2022 23:56:34 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=H59AKOi4acu1YvwQFujkzSky4xRtrC8S2KxuwF8a+hYZx7Mdx9LBPd1M0XMsQEU4iTesHjS6o5AEPvzzobObfZNfit/vB7ohniNMjCyBaMR4ECZ6R6hQ3y4L6LQ03qnUcXrajbnrHy9ij+A5QAWQDpgT39nB3k3dLIO3qD3DzQNmTL5L+EM8w3HWVIES5uFj592Menld9N3yST9+iMPX3JYC9vphtiYH2KT3NBr3MMXyDHDAEP3xWw5GkgUD3AUwW9rSi7FYcvAlZl1dk2/4yQpxEa2T+ZYH/f+bPLMj/IvmZy5bWzqw4+q7P6ZiCdtrKT18jl4wTn06gT0UjuhMNA== 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=k4W3CQgFeSqpShhUYUje6N4u9PiExJyd1c+yi15KLt4=; b=PJH7b73AwF9u1gIWVX9pSpUBDxLERX4yZhjtvSTEfZ01hJhlBNArNCGxYywpOvEp6FIwDnVf19OUw/1OL2CPvd5Cg2SHgoZYymFXg2AwCWWZaxeWTmKMsGOGlai2WThRt+AlhXEAADLN2pV7BAfY4lDbMcus9IQGk8p0lIkAMqcozRzfBSi0/RagOdUsDWeGpMmxE2kLGFvZhMjQ8YXienkKyZnXaanF5xyoNT3J8MP2Z230djsJmwHwjKUQQbKktm5vV5mV7vNJSp2wLxjXdd1wQjw4Ur4lzAhmjtKBsjivWUe+gmYrmyjQkjJBEmuUOm+OS2vGEienCFqriucg1g== 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=k4W3CQgFeSqpShhUYUje6N4u9PiExJyd1c+yi15KLt4=; b=X9U0gd2A2pS8jqN6exi8RmZVo1bKQ8c8RGibSCgBOlTJs35TgFB1zGUNXwJVHKuIACuoxcyJGu4WhAF5EBLGnUDm4HCvdUIyoXMpJlAD92Pn8dn/KSjPmRj0Fd8KBFYjFZTHzVvqriT7Wu6L87GTQDDLYdArlmKI27NfR+3RpmCRmhtLdbEJSAwkQm5ajPwFcr6POGny2//u5WECTgzFlobXFw+qI7wNI24elWzKvUw9VjIgBLEioBrtGFVpeQLlEQ0kuyAd2Xhy41v2rXGKA4lKxVORZXbeB9Gb9bW8KVblgdmzPt3lO2omEt4Hb008Io3OyO3gTIx2h4pp1Ia6Ww== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM7PR03MB6450.eurprd03.prod.outlook.com (2603:10a6:20b:1b2::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4867.7; Wed, 5 Jan 2022 21:56:26 +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.4867.009; Wed, 5 Jan 2022 21:56:25 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 5 Jan 2022 22:56:06 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [d6I7n9/V/+PYoIL9dnrPoskWPrJLFPWW] X-ClientProxiedBy: AM0PR02CA0183.eurprd02.prod.outlook.com (2603:10a6:20b:28e::20) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220105215610.813119-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d4475cc0-7266-4089-f8fa-08d9d0963838 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNWm3GLoeUntTG6KfWWWbWhlMmSfUg059vfeaz3x12NUVnYCKLbZ2ukyylKZwTe34DJ0bVki4XSdtjWgKsNJOI26EtWyPjZA036cYAbAinSIbcrnREqARktIM1eiUPAr274QyeFW8pD3vM3mNeRr+sJHX5sVIR+ryzKOmplSnJ6Nl7NhDDgOTfOMY1aBmDWM0lWojrLa5rsrJzUe4MhkI5jOPJWPb8X+NomV1A7LISDejqvjDk31/uVApMrWbNv/7g0OF7zf3c9iOyuEoVI+a6iyPTW+leFLMS7N+DjYiuCe0UQY3Z5w7mjLYsPPvDD9dcEmQ5P7sAZoPKjr+BR9yogz0OIuy8UtHQYQNg+Oo43WC6LnBuxVbXgWkc67jM5kwqm/mNC28NYvPCjm0waJIO1AmZBBvANbPKzyT1r2K4rrf0c5y5iDkNiETueHFToFO2Js7p2RMlTU//YkWXVSVoQ8v0kIOvOEnddQlDFK+gODXiy7JEOcaUuulkMlz2ZzBT6OJ9wwHONlIY/zoEszjLSmxHePqTp7vkN2OoBMjAP6W7BSI4HYkyqhsw4hrFRKLvbDE+uP6nl0nOEWy7PBuJ7GtR/Wml5iiAsbXQCaQYrevMZZPyK5kjOCth01I7T02fhWMafPURk7vbhlucfHGgJDv0i52ukEzdPMvxW8ywvWq/DOoqkpY6kx/DGDD6u/w60JFCfr5kxbjnR2Ahp50SDTVVtEEycujvw= X-MS-TrafficTypeDiagnostic: AM7PR03MB6450:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: fOUglxwvVpyVfI0mMgKziybvotHby5VWJqb4AH7tv5CKnoSX1IZnBSLamP48QuQFgpFiEl2/pXZBWJGbqhm9laYwDtN2F6kBOXK0KudimnmZGHLl9AwACMHF/rI+G7Jp2S084/7XqMi2bblLUApRH0T4vrNgtr83li0traXLj86NGpbDDZDtetAEKzO9lZwxpNRKErvXC7hb3aaht/GJVrVNLQYKKnhy5kNu/F5ivzFCXK2+EPEeZYyw9zEI2CF+caYt6obT3dcsL3cNI6Pr4Qfk+j9xwe7xsdZZImRXbem9giPvWAj3UnninotWkLSME6SqDjspblRkvyDu1fus/ThSau8dI8isN3ycEEDm4X0DZHapAZS1T+hyabKsb6hgHccYSprNRwu6je7YBDxwLwK0d3I+63yzAZnS7iIDygCIo7e9Ir4XWKhBcFM7B45VdFhvV/autZC4GVpEZtgiaQSzQ8r0B6vgZELI+QMS3f02tW+E7lp5ILUxgaf+T8J/mbxsYW0n1Ho2H4JuNNXsD45Ei8Sdt4DE9LGBiosQWUBBdwpabWltmrtJuYt64h96sAnwdSMnWS34hElB+Gk5qg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vLc83ZFjRVXPN3hWTFRSv/hwXh3B3I69WgjHgpyRCwRkOz51BVwiprmHYcCXSdhW9I1Vs8kjOZIUWhBTv22L66ilxOwT9okLLTaFfVec9EysutJybPPXl2vZ8wYxj9zIw+WdkrDfo0ShLsJ2tDEzYFpB/eRmGek8mkdVOFHHnB3aD0Vw4Yoaqi1aKj4MU4yZx5T6VSNE+GFcADPWsqqgdyoOsTVFJ155au0qawS1D7AlFXrQakeNQltWvylPiKpRB7m3p5VuvI3VxtjYQqLQzT09CwQM71qaTxXuG3EjQLefQ7hf3EIZ7vVP8e8mELX0Dsof+23WtwQLN+fp2TBmretycHT7zzlA2R5wsWajfdLF44hMJscLNdgqYJeo1EqmUw3LmNr9d6oFWs68rzDy1gtzojjnWAKjPVd1oBmGTBcGNfpWK8xmOq2pPA+puNv753sygLgClVsaGrHoOSENPNsNMsahlac5kEElW6AWNC6zcOzl6wjr9BAPOlrU5q3pWBEEDJWnrBgpl8VRHNmNr1aqJlI1U6amkLvWqQmqDvzZu3WYVIBGNBE/QExUctKnPeHFr/SNKQKWSbzQACiemLKG3jqhs4vR+UR3ke5qr9paKHRYHgP7iG3daJf7nw/qZDbnqaQ9cAwKELcxWOO6IqOnPAFCZEbfEcNN29QtJTUTbw/W3Ez+s7IpKhHaDTy9YC+uXj6D7cCRgxHc/WsyECfSOWLNCUIb4yMhJlPRnWqmTvpoDKt1kb6DShOQCarzlfbR/aifruyTAi5tP1anK7nnW3p1qauwMOW0u7IgPlDnuiO4YQQLEoOSXNlgN2dE5KMCIda1lS6r5sfdsrGtOY6zrHWHBle8Ab12/lsXZO9ymEzyB5oHOBpbF8pc0MHzMdGUX0Qhx+qVV1kGe9HP2fCzigET4fj/a38kpz+aKfEE/CtBx6fjHXY1c+J7jE54Z7iih36y47a7SHMw484zqg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d4475cc0-7266-4089-f8fa-08d9d0963838 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jan 2022 21:56:25.8440 (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: AM7PR03MB6450 Subject: [FFmpeg-devel] [PATCH 06/10] avcodec/mpeg4videodec: Fix data race when initializing VLCs 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: kmUCPmyufV5T Both the MPEG-4 parser as well as the decoder initialized several VLCs. There is a "static int done = 0;" in order to guard against initializing these multiple times, but this does not work when several threads try to initialize these VLCs concurrently, which can happen when initializing several parsers at the same time (they don't use the global lock that is used for codecs without the FF_CODEC_CAP_INIT_THREADSAFE cap; actually, they don't use any lock at all). Since ff_mpeg4_decode_picture_header() now aborts early when called from the parser, it no longer needs to have these VLCs initialized at all. This commit therefore does exactly this. Signed-off-by: Andreas Rheinhardt --- libavcodec/mpeg4video.h | 1 - libavcodec/mpeg4video_parser.c | 2 -- libavcodec/mpeg4videodec.c | 50 ++++++++++++++-------------------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h index ee8eea7121..cec8b30c32 100644 --- a/libavcodec/mpeg4video.h +++ b/libavcodec/mpeg4video.h @@ -173,7 +173,6 @@ int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx); int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx); void ff_mpeg4_init_direct_mv(MpegEncContext *s); -void ff_mpeg4videodec_static_init(void); int ff_mpeg4_workaround_bugs(AVCodecContext *avctx); int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size); diff --git a/libavcodec/mpeg4video_parser.c b/libavcodec/mpeg4video_parser.c index 9e96619a12..1f89bae490 100644 --- a/libavcodec/mpeg4video_parser.c +++ b/libavcodec/mpeg4video_parser.c @@ -129,8 +129,6 @@ static av_cold int mpeg4video_parse_init(AVCodecParserContext *s) { struct Mp4vParseContext *pc = s->priv_data; - ff_mpeg4videodec_static_init(); - pc->first_picture = 1; pc->dec_ctx.m.quant_precision = 5; pc->dec_ctx.m.slice_context_count = 1; diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index ab8d2e8236..325593a795 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -3386,34 +3386,6 @@ end: return decode_vop_header(ctx, gb, parse_only); } -av_cold void ff_mpeg4videodec_static_init(void) { - static int done = 0; - - if (!done) { - static uint8_t mpeg4_rvlc_rl_tables[2][2][2 * MAX_RUN + MAX_LEVEL + 3]; - - ff_mpeg4_init_rl_intra(); - ff_rl_init(&ff_rvlc_rl_inter, mpeg4_rvlc_rl_tables[0]); - ff_rl_init(&ff_rvlc_rl_intra, mpeg4_rvlc_rl_tables[1]); - INIT_FIRST_VLC_RL(ff_mpeg4_rl_intra, 554); - INIT_VLC_RL(ff_rvlc_rl_inter, 1072); - INIT_FIRST_VLC_RL(ff_rvlc_rl_intra, 1072); - INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */, - &ff_mpeg4_DCtab_lum[0][1], 2, 1, - &ff_mpeg4_DCtab_lum[0][0], 2, 1, 512); - INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, - &ff_mpeg4_DCtab_chrom[0][1], 2, 1, - &ff_mpeg4_DCtab_chrom[0][0], 2, 1, 512); - INIT_VLC_STATIC_FROM_LENGTHS(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, - ff_sprite_trajectory_lens, 1, - NULL, 0, 0, 0, 0, 128); - INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, - &ff_mb_type_b_tab[0][1], 2, 1, - &ff_mb_type_b_tab[0][0], 2, 1, 16); - done = 1; - } -} - int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { Mpeg4DecContext *ctx = avctx->priv_data; @@ -3525,6 +3497,8 @@ static int mpeg4_update_thread_context_for_user(AVCodecContext *dst, static av_cold void mpeg4_init_static(void) { + static uint8_t mpeg4_rvlc_rl_tables[2][2][2 * MAX_RUN + MAX_LEVEL + 3]; + INIT_VLC_STATIC_FROM_LENGTHS(&studio_luma_dc, STUDIO_INTRA_BITS, 19, &ff_mpeg4_studio_dc_luma[0][1], 2, &ff_mpeg4_studio_dc_luma[0][0], 2, 1, @@ -3547,7 +3521,25 @@ static av_cold void mpeg4_init_static(void) 0, INIT_VLC_STATIC_OVERLONG, NULL); offset += studio_intra_tab[i].table_size; } - ff_mpeg4videodec_static_init(); + + ff_mpeg4_init_rl_intra(); + ff_rl_init(&ff_rvlc_rl_inter, mpeg4_rvlc_rl_tables[0]); + ff_rl_init(&ff_rvlc_rl_intra, mpeg4_rvlc_rl_tables[1]); + INIT_FIRST_VLC_RL(ff_mpeg4_rl_intra, 554); + INIT_VLC_RL(ff_rvlc_rl_inter, 1072); + INIT_FIRST_VLC_RL(ff_rvlc_rl_intra, 1072); + INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */, + &ff_mpeg4_DCtab_lum[0][1], 2, 1, + &ff_mpeg4_DCtab_lum[0][0], 2, 1, 512); + INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, + &ff_mpeg4_DCtab_chrom[0][1], 2, 1, + &ff_mpeg4_DCtab_chrom[0][0], 2, 1, 512); + INIT_VLC_STATIC_FROM_LENGTHS(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, + ff_sprite_trajectory_lens, 1, + NULL, 0, 0, 0, 0, 128); + INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, + &ff_mb_type_b_tab[0][1], 2, 1, + &ff_mb_type_b_tab[0][0], 2, 1, 16); } static av_cold int decode_init(AVCodecContext *avctx)