From patchwork Sat Dec 5 20:33:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 24355 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 01431448D1F for ; Sat, 5 Dec 2020 22:33:55 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C8C5468A3DF; Sat, 5 Dec 2020 22:33:54 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1E5046882DE for ; Sat, 5 Dec 2020 22:33:48 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id 91so4779849wrj.7 for ; Sat, 05 Dec 2020 12:33:48 -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:mime-version :content-transfer-encoding; bh=clID8GhXrs6MeF1SAe431Qr0ISqirY7Mwdi+xFgOT3U=; b=EOkkYD6JMwIufMlj15wT5sdXE2vrOeA5VYDIIjSuRFEQuzyBdm7MjJjalEazuCkM+q 0bWWtCpI9rWZ2Y2v/zL17b4LJ1jM9hYOeE49UxQiZ6melk8RzIcFs975iUEnMqLvMZ4e DwZwrkXv+rkTZy2nSAif+Z1UOuB2b1zUeR+fKJmin+Gvu101GgbzBExs7kkqSylSV8hD O/F6Ekwnq6mE7zHneAXUtnqNbtsE2hUsEiSBeDWQKm2jWI3yyfuJ9mYaQ1yp4zFDN5Qh OzZPz4WJHJZ77vn9YM4pVI+bd/s2W1ZOVeCphzijUfsvPt9pvdem7FLXf37oj+24CvRu V79Q== 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:mime-version :content-transfer-encoding; bh=clID8GhXrs6MeF1SAe431Qr0ISqirY7Mwdi+xFgOT3U=; b=cPCGmJtQDbJmdyOwnTiI7X25VSrQ8TTvxxCnf668QiCtaOTC0DA545a9vXOnZVkhXU TMuRlBIUVr+lyeJTtW2s+FPzDiTaVYLpwvJe8/OSja/gH83WwZcGObFprzUqtxZaWaNz Dl6ZcoS7KvXxR80yseLHwA6hu6o39Xc4lF0YRcyA4YRr7Z/2scD0apW4DomqQD14UOlv p7iufWtGgbNdLdEZnUwo7/L13qzZ7GDhfcdxPfZ68Z/Y44lo4siOtAlbabGumcTBcH22 wUkuQPDIGcpx+s2YISrYAeE8smj0iL1wrmoJEQicZu8KvSI/md4H/7oAXM+Xey/UzRXR HgMg== X-Gm-Message-State: AOAM530IVr02IZw/cp/I77lBx+SgkjH0hKyFb+szxdOW4LzoJhYw3QhF 9DDptB1Z94ZTO8BcrDfvooZSb1YF9HEKjA== X-Google-Smtp-Source: ABdhPJzGzIztCPbHxOOc/OcAhD+qhNuh+QhOJE/LPmKD5RbfN+VHPwtpfMZxWHU70ZJ8sCjCiuJI8A== X-Received: by 2002:a05:6000:104b:: with SMTP id c11mr11542886wrx.329.1607200427235; Sat, 05 Dec 2020 12:33:47 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id e4sm8747079wrr.32.2020.12.05.12.33.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Dec 2020 12:33:46 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 5 Dec 2020 21:33:33 +0100 Message-Id: <20201205203340.19357-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/7] avcodec/[e]ac3enc: Make encoders init-threadsafe, fix race 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" ff_eac3_exponent_init() set values twice when initializing a static table; ergo the initialization code must not run concurrently with a running EAC-3 encoder. Yet this code is executed every time an EAC-3 encoder is initialized. So use ff_thread_once() for this and also for a similar initialization performed for all AC-3 encoders to make them all init-threadsafe. Signed-off-by: Andreas Rheinhardt --- libavcodec/ac3enc.c | 17 +++++++++-------- libavcodec/ac3enc_fixed.c | 2 +- libavcodec/ac3enc_float.c | 2 +- libavcodec/eac3enc.c | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 37dc0fb2ef..3354bf6b45 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -35,6 +35,7 @@ #include "libavutil/crc.h" #include "libavutil/internal.h" #include "libavutil/opt.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "internal.h" #include "me_cmp.h" @@ -303,7 +304,7 @@ void ff_ac3_apply_rematrixing(AC3EncodeContext *s) /* * Initialize exponent tables. */ -static av_cold void exponent_init(AC3EncodeContext *s) +static av_cold void exponent_init(void) { int expstr, i, grpsize; @@ -316,9 +317,6 @@ static av_cold void exponent_init(AC3EncodeContext *s) } /* LFE */ exponent_group_tab[0][0][7] = 2; - - if (CONFIG_EAC3_ENCODER && s->eac3) - ff_eac3_exponent_init(); } @@ -2408,6 +2406,7 @@ static av_cold int allocate_buffers(AC3EncodeContext *s) av_cold int ff_ac3_encode_init(AVCodecContext *avctx) { + static AVOnce init_static_once = AV_ONCE_INIT; AC3EncodeContext *s = avctx->priv_data; int ret, frame_size_58; @@ -2447,15 +2446,15 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) s->mdct_init = ff_ac3_float_mdct_init; s->allocate_sample_buffers = ff_ac3_float_allocate_sample_buffers; } - if (CONFIG_EAC3_ENCODER && s->eac3) + if (CONFIG_EAC3_ENCODER && s->eac3) { + static AVOnce init_static_once = AV_ONCE_INIT; + ff_thread_once(&init_static_once, ff_eac3_exponent_init); s->output_frame_header = ff_eac3_output_frame_header; - else + } else s->output_frame_header = ac3_output_frame_header; set_bandwidth(s); - exponent_init(s); - bit_alloc_init(s); ret = s->mdct_init(s); @@ -2472,5 +2471,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) dprint_options(s); + ff_thread_once(&init_static_once, exponent_init); + return 0; } diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c index 428bbfb3c5..d2e67f3214 100644 --- a/libavcodec/ac3enc_fixed.c +++ b/libavcodec/ac3enc_fixed.c @@ -155,7 +155,7 @@ AVCodec ff_ac3_fixed_encoder = { .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_NONE }, .priv_class = &ac3enc_class, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .supported_samplerates = ff_ac3_sample_rate_tab, .channel_layouts = ff_ac3_channel_layouts, .defaults = ac3_defaults, diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c index 99863a9722..571f603182 100644 --- a/libavcodec/ac3enc_float.c +++ b/libavcodec/ac3enc_float.c @@ -153,5 +153,5 @@ AVCodec ff_ac3_encoder = { .supported_samplerates = ff_ac3_sample_rate_tab, .channel_layouts = ff_ac3_channel_layouts, .defaults = ac3_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, }; diff --git a/libavcodec/eac3enc.c b/libavcodec/eac3enc.c index 8e1032f268..00721aa645 100644 --- a/libavcodec/eac3enc.c +++ b/libavcodec/eac3enc.c @@ -266,5 +266,5 @@ AVCodec ff_eac3_encoder = { .supported_samplerates = ff_ac3_sample_rate_tab, .channel_layouts = ff_ac3_channel_layouts, .defaults = ac3_defaults, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, };