[FFmpeg-devel] [PATCH] aac: prevent calling ff_aac_tableinit() twice during init

Hendrik Leppkes h.leppkes at gmail.com
Fri Nov 27 21:14:49 CET 2015


On Fri, Nov 27, 2015 at 8:00 PM, Rostislav Pehlivanov
<atomnuker at gmail.com> wrote:
> 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;

I would just put this part inside aac_static_table_init, instead of
moving it here.
Nesting once calls shouldn't hurt, I don't think.

> +
> +    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
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list