x11: don't block in buffer acquire

Don't ever block when acquiring a buffer from the bufferpool in the fallback
mode. If we block, we might deadlock when going to PAUSED because we never
unlock when going to paused.

The acquire can block when there are no more buffers in the pool, this is a
sign that the pool is too small. Since we are the only ones using the pool in
the fallback case and because we scale the buffer, someone else must be using
our pool as well and is doing something bad.
This commit is contained in:
Wim Taymans 2012-08-10 11:45:38 +02:00
parent 0dd2766d83
commit da4884a834
2 changed files with 16 additions and 8 deletions

View file

@ -1312,6 +1312,7 @@ gst_ximagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
res = GST_FLOW_OK; res = GST_FLOW_OK;
} else { } else {
GstVideoFrame src, dest; GstVideoFrame src, dest;
GstBufferPoolAcquireParams params = { 0, };
/* Else we have to copy the data into our private image, */ /* Else we have to copy the data into our private image, */
/* if we have one... */ /* if we have one... */
@ -1324,8 +1325,11 @@ gst_ximagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
if (!gst_buffer_pool_set_active (ximagesink->pool, TRUE)) if (!gst_buffer_pool_set_active (ximagesink->pool, TRUE))
goto activate_failed; goto activate_failed;
/* take a buffer from our pool */ /* take a buffer from our pool, if there is no buffer in the pool something
res = gst_buffer_pool_acquire_buffer (ximagesink->pool, &to_put, NULL); * is seriously wrong, waiting for the pool here might deadlock when we try
* to go to PAUSED because we never flush the pool. */
params.flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
res = gst_buffer_pool_acquire_buffer (ximagesink->pool, &to_put, &params);
if (res != GST_FLOW_OK) if (res != GST_FLOW_OK)
goto no_buffer; goto no_buffer;
@ -1367,12 +1371,12 @@ no_buffer:
{ {
/* No image available. That's very bad ! */ /* No image available. That's very bad ! */
GST_WARNING_OBJECT (ximagesink, "could not create image"); GST_WARNING_OBJECT (ximagesink, "could not create image");
return res; return GST_FLOW_OK;
} }
invalid_buffer: invalid_buffer:
{ {
/* No Window available to put our image into */ /* No Window available to put our image into */
GST_WARNING_OBJECT (ximagesink, "could map image"); GST_WARNING_OBJECT (ximagesink, "could not map image");
res = GST_FLOW_OK; res = GST_FLOW_OK;
goto done; goto done;
} }

View file

@ -1831,6 +1831,7 @@ gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
res = GST_FLOW_OK; res = GST_FLOW_OK;
} else { } else {
GstVideoFrame src, dest; GstVideoFrame src, dest;
GstBufferPoolAcquireParams params = { 0, };
/* Else we have to copy the data into our private image, */ /* Else we have to copy the data into our private image, */
/* if we have one... */ /* if we have one... */
@ -1843,8 +1844,11 @@ gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
if (!gst_buffer_pool_set_active (xvimagesink->pool, TRUE)) if (!gst_buffer_pool_set_active (xvimagesink->pool, TRUE))
goto activate_failed; goto activate_failed;
/* take a buffer from our pool */ /* take a buffer from our pool, if there is no buffer in the pool something
res = gst_buffer_pool_acquire_buffer (xvimagesink->pool, &to_put, NULL); * is seriously wrong, waiting for the pool here might deadlock when we try
* to go to PAUSED because we never flush the pool then. */
params.flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
res = gst_buffer_pool_acquire_buffer (xvimagesink->pool, &to_put, &params);
if (res != GST_FLOW_OK) if (res != GST_FLOW_OK)
goto no_buffer; goto no_buffer;
@ -1886,12 +1890,12 @@ no_buffer:
{ {
/* No image available. That's very bad ! */ /* No image available. That's very bad ! */
GST_WARNING_OBJECT (xvimagesink, "could not create image"); GST_WARNING_OBJECT (xvimagesink, "could not create image");
return res; return GST_FLOW_OK;
} }
invalid_buffer: invalid_buffer:
{ {
/* No Window available to put our image into */ /* No Window available to put our image into */
GST_WARNING_OBJECT (xvimagesink, "could map image"); GST_WARNING_OBJECT (xvimagesink, "could not map image");
res = GST_FLOW_OK; res = GST_FLOW_OK;
goto done; goto done;
} }