mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-12 02:15:31 +00:00
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:
parent
ca5fd56862
commit
f529481b3d
1 changed files with 3 additions and 0 deletions
|
@ -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),
|
||||||
|
|
Loading…
Reference in a new issue