[FFmpeg-devel] [PATCH] aac: prevent calling ff_aac_tableinit() twice during init
Rostislav Pehlivanov
atomnuker at gmail.com
Fri Nov 27 20:00:36 CET 2015
This commit prevents the corner case where both the decoder and the
encoder could call ff_aac_tableinit() twice during init (in case of
transcoding aac-aac).
Signed-off-by: Rostislav Pehlivanov <atomnuker at gmail.com>
---
libavcodec/aacdec_template.c | 10 ++++++----
libavcodec/aacenc.c | 5 +----
libavcodec/aactab.c | 3 +++
libavcodec/aactab.h | 3 +++
4 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
index 620600c..a68ded6 100644
--- a/libavcodec/aacdec_template.c
+++ b/libavcodec/aacdec_template.c
@@ -1081,8 +1081,6 @@ static av_cold void aac_static_table_init(void)
AAC_RENAME(ff_aac_sbr_init)();
- ff_aac_tableinit();
-
INIT_VLC_STATIC(&vlc_scalefactors, 7,
FF_ARRAY_ELEMS(ff_aac_scalefactor_code),
ff_aac_scalefactor_bits,
@@ -1103,14 +1101,18 @@ static av_cold void aac_static_table_init(void)
AAC_RENAME(cbrt_tableinit)();
}
-static AVOnce aac_table_init = AV_ONCE_INIT;
+static AVOnce aac_dec_tab_init_guard = AV_ONCE_INIT;
static av_cold int aac_decode_init(AVCodecContext *avctx)
{
AACContext *ac = avctx->priv_data;
int ret;
- ret = ff_thread_once(&aac_table_init, &aac_static_table_init);
+ ret = ff_thread_once(&aactab_init_guard, &ff_aac_tableinit);
+ if (ret != 0)
+ return AVERROR_UNKNOWN;
+
+ ret = ff_thread_once(&aac_dec_tab_init_guard, &aac_static_table_init);
if (ret != 0)
return AVERROR_UNKNOWN;
diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
index e49cf4b..d58aff4 100644
--- a/libavcodec/aacenc.c
+++ b/libavcodec/aacenc.c
@@ -29,7 +29,6 @@
* add sane pulse detection
***********************************/
-#include "libavutil/thread.h"
#include "libavutil/float_dsp.h"
#include "libavutil/opt.h"
#include "avcodec.h"
@@ -47,8 +46,6 @@
#include "psymodel.h"
-static AVOnce aac_table_init = AV_ONCE_INIT;
-
/**
* Make AAC audio config object.
* @see 1.6.2.1 "Syntax - AudioSpecificConfig"
@@ -989,7 +986,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
if (HAVE_MIPSDSPR1)
ff_aac_coder_init_mips(s);
- if ((ret = ff_thread_once(&aac_table_init, &ff_aac_tableinit)) != 0)
+ if ((ret = ff_thread_once(&aactab_init_guard, &ff_aac_tableinit)) != 0)
return AVERROR_UNKNOWN;
ff_af_queue_init(avctx, &s->afq);
diff --git a/libavcodec/aactab.c b/libavcodec/aactab.c
index dc9acc1..667b0ba 100644
--- a/libavcodec/aactab.c
+++ b/libavcodec/aactab.c
@@ -27,12 +27,15 @@
* @author Maxim Gavrilov ( maxim.gavrilov gmail com )
*/
+#include "libavutil/thread.h"
#include "libavutil/mem.h"
#include "aac.h"
#include "aac_tablegen.h"
#include <stdint.h>
+AVOnce aactab_init_guard = AV_ONCE_INIT;
+
DECLARE_ALIGNED(32, float, ff_aac_kbd_long_1024)[1024];
DECLARE_ALIGNED(32, float, ff_aac_kbd_short_128)[128];
DECLARE_ALIGNED(32, int, ff_aac_kbd_long_1024_fixed)[1024];
diff --git a/libavcodec/aactab.h b/libavcodec/aactab.h
index 321c5d3..18c46a6 100644
--- a/libavcodec/aactab.h
+++ b/libavcodec/aactab.h
@@ -30,6 +30,7 @@
#ifndef AVCODEC_AACTAB_H
#define AVCODEC_AACTAB_H
+#include "libavutil/thread.h"
#include "libavutil/mem.h"
#include "aac.h"
#include "aac_tablegen_decl.h"
@@ -40,6 +41,8 @@
* Tables in this file are shared by the AAC decoders and encoder
*/
+extern AVOnce aactab_init_guard; /* Protects ff_aac_tableinit() */
+
/* @name ltp_coef
* Table of the LTP coefficients
*/
--
2.6.2
More information about the ffmpeg-devel
mailing list