From patchwork Thu Dec 10 11:16:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 24496 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 DF63844A03C for ; Thu, 10 Dec 2020 13:23:20 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BBDBB68A84A; Thu, 10 Dec 2020 13:19:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3E7FC689BD5 for ; Thu, 10 Dec 2020 13:19:14 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id 91so5055803wrj.7 for ; Thu, 10 Dec 2020 03:19:14 -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=uEZPzk/6pUB5UqgJy1OcWHQw89yY13ijCib9QMJmKL8=; b=o6hr9mvM7PNP9nUGTpHxqxZfUWZLojZOYvaLl7fBjPO+pvJHFkF5mjmi39mgs/4EVF lCzWvOo0fTvelEcx9eyiJwu5onuGmxmOXk0i8QS/FTaDIcBAkUkUKO9PLOpG51hfYEGo 4v3Qk1LDErW5V04vv9Qo1Ri0BWshFC1iEmxx5QtnqKHM0PUlLQ6YmQE2QHIMWqgaNaq9 dLZE5+RPnFTzUFCfO1yE/542TZEhhxvS7ttExQ0BKK33XZubZtfsfKaeJHFwf2BIsD6w 4m1MJlZmIbS0MTI9BCX+ElfYDGu8TZMsMAWhH8YtqbxA1PMOggbxKX/QRrPH30kQKtyV YblA== 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=uEZPzk/6pUB5UqgJy1OcWHQw89yY13ijCib9QMJmKL8=; b=dXhWgG8L/l3LPF/olmKfD64W37r79Tc/LSQ6e241jTNbAXogekdIoS2MZqyfJezNno 0I89aWr3k3FxuPC3ropAIkrT8lOq5wA6L7pToElbCSqTc4i6BtVvfPFSwt34qtovJJH0 AyPFBdbkJ/B8bNHL/+5p36nDq5G7iQLca1hD32kot/PUc5n4e7kwtWGiRK4sUZvkWHUe cOooGcSrYXCUk99ypDpAqjqI3XfbRV6rRd4a6ZbAPAXDRYFNkK0ryllgkGwwDpMEgkTy tR/6+6LqkFW3GTniGPcmJtz1aHIzuJG7GC+lgJv5w/2eFHN5LQnLOTM9Amu5ZujMhdG6 qhLA== X-Gm-Message-State: AOAM533qnGFLmzJg0f3vxi29cJEA6jvcAkO/XXbQtRBoXqnIwzehh/mH gLcT+yESyNb+NjlzMlGeIHjANl80HpZY2g== X-Google-Smtp-Source: ABdhPJzR+vUxmesGzF4ApiJAR87DGacT99UksjPzf/ej/FZMQyiuK+t9UL9BdX7Sg4mx19wnPg7znw== X-Received: by 2002:a5d:6751:: with SMTP id l17mr7654753wrw.73.1607599153447; Thu, 10 Dec 2020 03:19:13 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id s133sm8942330wmf.38.2020.12.10.03.19.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Dec 2020 03:19:12 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 10 Dec 2020 12:16:45 +0100 Message-Id: <20201210111657.2276739-28-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201210111657.2276739-1-andreas.rheinhardt@gmail.com> References: <20201210111657.2276739-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 27/39] avcodec/ituh263enc: Make static initializations thread-safe 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" This already makes several encoders (namely FLV, H.263, H.263+ and RealVideo 1.0 and 2.0) that use this init-threadsafe. It also makes the Snow encoder init-threadsafe; it was already marked as such since commit d49210788b0836d56dd872d517fe73f83b080101, because it was thought to be harmless if one and the same object was initialized by multiple threads at the same time. Signed-off-by: Andreas Rheinhardt --- libavcodec/flvenc.c | 2 +- libavcodec/ituh263enc.c | 28 ++++++++++++++++------------ libavcodec/mpegvideo_enc.c | 4 ++-- libavcodec/rv10enc.c | 2 +- libavcodec/rv20enc.c | 2 +- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/libavcodec/flvenc.c b/libavcodec/flvenc.c index b85e4667c4..9429862159 100644 --- a/libavcodec/flvenc.c +++ b/libavcodec/flvenc.c @@ -107,7 +107,7 @@ AVCodec ff_flv_encoder = { .init = ff_mpv_encode_init, .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE}, .priv_class = &flv_class, diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c index 43260e6984..79c8c9999e 100644 --- a/libavcodec/ituh263enc.c +++ b/libavcodec/ituh263enc.c @@ -30,6 +30,7 @@ #include #include "libavutil/attributes.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "mpegvideo.h" #include "mpegvideodata.h" @@ -671,7 +672,7 @@ void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code) } } -static av_cold void init_mv_penalty_and_fcode(MpegEncContext *s) +static av_cold void init_mv_penalty_and_fcode(void) { int f_code; int mv; @@ -754,22 +755,23 @@ static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab) } } -av_cold void ff_h263_encode_init(MpegEncContext *s) +static av_cold void h263_encode_init_static(void) { - static int done = 0; + static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; - if (!done) { - static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; - done = 1; + ff_rl_init(&ff_rl_intra_aic, rl_intra_table); + ff_h263_init_rl_inter(); - ff_rl_init(&ff_rl_intra_aic, rl_intra_table); - ff_h263_init_rl_inter(); + init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len); + init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len); - init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len); - init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len); + init_mv_penalty_and_fcode(); +} + +av_cold void ff_h263_encode_init(MpegEncContext *s) +{ + static AVOnce init_static_once = AV_ONCE_INIT; - init_mv_penalty_and_fcode(s); - } s->me.mv_penalty= mv_penalty; // FIXME exact table for MSMPEG4 & H.263+ s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len; @@ -817,6 +819,8 @@ av_cold void ff_h263_encode_init(MpegEncContext *s) s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } + + ff_thread_once(&init_static_once, h263_encode_init_static); } void ff_h263_encode_mba(MpegEncContext *s) diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 061081db08..8fb415f42b 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -4786,7 +4786,7 @@ AVCodec ff_h263_encoder = { .init = ff_mpv_encode_init, .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE}, .priv_class = &h263_class, }; @@ -4816,7 +4816,7 @@ AVCodec ff_h263p_encoder = { .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, .capabilities = AV_CODEC_CAP_SLICE_THREADS, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .priv_class = &h263p_class, }; diff --git a/libavcodec/rv10enc.c b/libavcodec/rv10enc.c index 42316836c5..6add8e4dd1 100644 --- a/libavcodec/rv10enc.c +++ b/libavcodec/rv10enc.c @@ -79,7 +79,7 @@ AVCodec ff_rv10_encoder = { .init = ff_mpv_encode_init, .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .priv_class = &rv10_class, }; diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c index d9d63d4d9c..95f90389bc 100644 --- a/libavcodec/rv20enc.c +++ b/libavcodec/rv20enc.c @@ -76,7 +76,7 @@ AVCodec ff_rv20_encoder = { .init = ff_mpv_encode_init, .encode2 = ff_mpv_encode_picture, .close = ff_mpv_encode_end, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .priv_class = &rv20_class, };