From patchwork Wed Dec 2 04:22:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 24314 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id ADB8544AAF6 for ; Wed, 2 Dec 2020 06:36:31 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5369F68A70F; Wed, 2 Dec 2020 06:24:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3F4FD68A2BC for ; Wed, 2 Dec 2020 06:24:36 +0200 (EET) Received: by mail-ed1-f65.google.com with SMTP id c7so1176444edv.6 for ; Tue, 01 Dec 2020 20:24:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=KblzznU5z0uSue9KPx5wEblMSU6dttmZzcCpetEazGI=; b=BtRxZ5zKaOgRd+COrwFeTtUwVYRJSb7G35JPNKCRZ9AtMcgD71054DuvYuOryZovlA 7DI2ylsJrSTszCqnWH8X/cUdEpjzMAQKhRMVqHwfV+SJvDyve8IGkE+ljd9I92J4Kcns HXN3eNCw4Y2chN8cgUJbK9eRi4Oqy8cZiz+/P4Rml/ch0RtM97u1JzckJ7UkyNrGeBwU Xd5T7o/LIYre98j6LdhFNuY3g9UX0qUt1Y7qlNRBA2keUFxeeo1Kk4k2KM3OO/be9WYl PGemMYqEsmNh4Uhr/nP0l6KAjGgFIz7LTjNLd1v/3kJ6UhPKUFDIq/5KMNBYXHX2hBiH 7Sdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=KblzznU5z0uSue9KPx5wEblMSU6dttmZzcCpetEazGI=; b=qNEoIIMfLlQiwMYHYrYwaKpPP0gNsyYtjoFOLGk9rMpj/EFfydgm7Jgo6Ephl/N9x0 NYVxb/qVlYNzkxT+E0+65LolMscjOvfnFMFMrAUdutN4S5yE3bhXdePEAq3ZkLTzG2zf e4MhWPKyozgp7rACtfRrFpI5qvCtCjyH77HJM/k4WgsiVEPH6aJNvvc+kbH755BqLQcr H8FdEIo8VU5ZJjU1kDrp+Wnbp9fglU2PjWbzPwi4ZGQQ1tC8qBRwPWxarRvUE+smRnz/ ifjgmWVdUl8h5Y6MLOUiP2jBvY3LhGudEHPc5W73+k0NOu1v+VO7bdfV0ancIYabL9Cd /N/g== X-Gm-Message-State: AOAM531g1yzYF6SLo1AMa5rArWkxl53b7MvcqAf6AiB/rgxU1OYg0Kg9 ytGkHXlxHx1+SMUqnzCeNqjTLwHDc9ifeQ== X-Google-Smtp-Source: ABdhPJz69E94GDZ9ZYC9eBwwr1J7t8sYVDjkC4CnNDmOilEEz9Gud1ITOORXridOZZ6EK451DWzOEQ== X-Received: by 2002:a50:9344:: with SMTP id n4mr818038eda.85.1606883075416; Tue, 01 Dec 2020 20:24:35 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id mc25sm265087ejb.58.2020.12.01.20.24.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Dec 2020 20:24:34 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 2 Dec 2020 05:22:37 +0100 Message-Id: <20201202042244.519127-76-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201127010249.2724610-1-andreas.rheinhardt@gmail.com> References: <20201127010249.2724610-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 210/217] avcodec/bink: Make decoder init-threadsafe X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" Signed-off-by: Andreas Rheinhardt --- libavcodec/bink.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/libavcodec/bink.c b/libavcodec/bink.c index ec164d0165..f1fa9c0071 100644 --- a/libavcodec/bink.c +++ b/libavcodec/bink.c @@ -23,6 +23,7 @@ #include "libavutil/attributes.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" +#include "libavutil/thread.h" #define BITSTREAM_READER_LE #include "avcodec.h" @@ -1308,6 +1309,19 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac return pkt->size; } +static av_cold void bink_init_vlcs(void) +{ + for (int i = 0; i < 16; i++) { + static VLC_TYPE table[16 * 128][2]; + const int maxbits = bink_tree_lens[i][15]; + bink_trees[i].table = table + i*128; + bink_trees[i].table_allocated = 1 << maxbits; + init_vlc(&bink_trees[i], maxbits, 16, + bink_tree_lens[i], 1, 1, + bink_tree_bits[i], 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE); + } +} + /** * Calculate quantization tables for version b */ @@ -1342,11 +1356,10 @@ static av_cold void binkb_calc_quant(void) static av_cold int decode_init(AVCodecContext *avctx) { + static AVOnce init_static_once = AV_ONCE_INIT; BinkContext * const c = avctx->priv_data; - static VLC_TYPE table[16 * 128][2]; - static int binkb_initialised = 0; HpelDSPContext hdsp; - int i, ret; + int ret; int flags; c->version = avctx->codec_tag >> 24; @@ -1357,16 +1370,6 @@ static av_cold int decode_init(AVCodecContext *avctx) flags = AV_RL32(avctx->extradata); c->has_alpha = flags & BINK_FLAG_ALPHA; c->swap_planes = c->version >= 'h'; - if (!bink_trees[15].table) { - for (i = 0; i < 16; i++) { - const int maxbits = bink_tree_lens[i][15]; - bink_trees[i].table = table + i*128; - bink_trees[i].table_allocated = 1 << maxbits; - init_vlc(&bink_trees[i], maxbits, 16, - bink_tree_lens[i], 1, 1, - bink_tree_bits[i], 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE); - } - } c->avctx = avctx; if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0) @@ -1388,11 +1391,10 @@ static av_cold int decode_init(AVCodecContext *avctx) return ret; if (c->version == 'b') { - if (!binkb_initialised) { - binkb_calc_quant(); - binkb_initialised = 1; - } + static AVOnce binkb_init_once = AV_ONCE_INIT; + ff_thread_once(&binkb_init_once, binkb_calc_quant); } + ff_thread_once(&init_static_once, bink_init_vlcs); return 0; } @@ -1425,5 +1427,5 @@ AVCodec ff_bink_decoder = { .decode = decode_frame, .flush = flush, .capabilities = AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, };