a52dec: fix race in liba52dec lookup table initialization

a52_init initializes the IMDCT global state as well as creating
a new state. When two A52 decoders are created (eg, when two AC3
tracks are contained in a video), calls to a52_init may happen
at the same time, and the IMDCT initialization is not reentrant.

https://bugzilla.gnome.org/show_bug.cgi?id=746781
This commit is contained in:
Vincent Penquerc'h 2015-04-02 17:24:05 +01:00
parent ca5fd56862
commit f529481b3d

View file

@ -242,10 +242,12 @@ gst_a52dec_start (GstAudioDecoder * dec)
{ {
GstA52Dec *a52dec = GST_A52DEC (dec); GstA52Dec *a52dec = GST_A52DEC (dec);
GstA52DecClass *klass; GstA52DecClass *klass;
static GMutex init_mutex;
GST_DEBUG_OBJECT (dec, "start"); GST_DEBUG_OBJECT (dec, "start");
klass = GST_A52DEC_CLASS (G_OBJECT_GET_CLASS (a52dec)); klass = GST_A52DEC_CLASS (G_OBJECT_GET_CLASS (a52dec));
g_mutex_lock (&init_mutex);
#if defined(A52_ACCEL_DETECT) #if defined(A52_ACCEL_DETECT)
a52dec->state = a52_init (); a52dec->state = a52_init ();
/* This line is just to avoid being accused of not using klass */ /* This line is just to avoid being accused of not using klass */
@ -253,6 +255,7 @@ gst_a52dec_start (GstAudioDecoder * dec)
#else #else
a52dec->state = a52_init (klass->a52_cpuflags); a52dec->state = a52_init (klass->a52_cpuflags);
#endif #endif
g_mutex_unlock (&init_mutex);
if (!a52dec->state) { if (!a52dec->state) {
GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), LIBRARY, INIT, (NULL), GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), LIBRARY, INIT, (NULL),