Work around ABBA deadlock between vaapisink and vaapipostproc
authorSimon Farnsworth <simon.farnsworth@onelan.co.uk>
Mon, 29 Jun 2015 10:06:30 +0000 (13:06 +0300)
committerSreerenj Balachandran <sreerenj.balachandran@intel.com>
Mon, 29 Jun 2015 10:10:15 +0000 (13:10 +0300)
commitd946e7972e0d361f2060349440f0b879c458f59b
tree17d1d5bd296eb23557061fd8a47f2c679cc9fb5e
parent76060c9542847a93edc6912dc21a4ef8f162dd75
Work around ABBA deadlock between vaapisink and vaapipostproc

vaapisink takes the display lock, then does a gst_buffer_replace which can
take the lock on the gst_vaapi_video_pool.

vaapipostproc asks the gst_vaapi_video_pool for a new surface. This takes
the lock on the gst_vaapi_video_pool; if you're unlucky, there are no free
surfaces, which means that gst_vaapi_surface_create is
called. gst_vaapi_surface_create takes the display lock.

If vaapisink and vaapipostproc are in different threads, and this happens,
you get a deadlock. vaapisink holds the display lock, and wants the
gst_vaapi_video_pool lock. vaapipostproc holds the gst_vaapi_video_pool lock
and wants the display lock.

Work around this by releasing the display lock in vaapisink around the
gst_buffer_replace.

https://bugzilla.gnome.org/show_bug.cgi?id=738249

Signed-off-by: Simon Farnsworth <simon.farnsworth@onelan.co.uk>
Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
gst/vaapi/gstvaapisink.c