d3dvideosink: Make sure that all buffers in our pool contain our own memory

This commit is contained in:
Sebastian Dröge 2013-03-27 09:08:40 +01:00
parent e7a69bb8de
commit 42965f5aa0

View file

@ -558,8 +558,8 @@ gst_d3dsurface_buffer_pool_set_config (GstBufferPool * bpool,
} }
static GstFlowReturn static GstFlowReturn
gst_d3dsurface_buffer_pool_alloc (GstBufferPool * bpool, GstBuffer ** buffer, gst_d3dsurface_buffer_pool_alloc_buffer (GstBufferPool * bpool,
GstBufferPoolAcquireParams * params) GstBuffer ** buffer, GstBufferPoolAcquireParams * params)
{ {
GstD3DSurfaceBufferPool *pool = GST_D3DSURFACE_BUFFER_POOL_CAST (bpool); GstD3DSurfaceBufferPool *pool = GST_D3DSURFACE_BUFFER_POOL_CAST (bpool);
GstD3DVideoSink *sink = pool->sink; GstD3DVideoSink *sink = pool->sink;
@ -683,6 +683,23 @@ fallback:
} }
} }
static void
gst_d3dsurface_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer)
{
GstMemory *mem = NULL;
/* Check if something replaced our memory */
if (gst_buffer_n_memory (buffer) != 1 ||
(mem = gst_buffer_peek_memory (buffer, 0)) == 0 ||
!gst_memory_is_type (mem, GST_D3D_SURFACE_MEMORY_NAME)) {
gst_buffer_unref (buffer);
return;
}
return GST_BUFFER_POOL_CLASS
(gst_d3dsurface_buffer_pool_parent_class)->release_buffer (bpool, buffer);
}
static void static void
gst_d3dsurface_buffer_pool_class_init (GstD3DSurfaceBufferPoolClass * klass) gst_d3dsurface_buffer_pool_class_init (GstD3DSurfaceBufferPoolClass * klass)
{ {
@ -693,7 +710,9 @@ gst_d3dsurface_buffer_pool_class_init (GstD3DSurfaceBufferPoolClass * klass)
gstbufferpool_class->get_options = gst_d3dsurface_buffer_pool_get_options; gstbufferpool_class->get_options = gst_d3dsurface_buffer_pool_get_options;
gstbufferpool_class->set_config = gst_d3dsurface_buffer_pool_set_config; gstbufferpool_class->set_config = gst_d3dsurface_buffer_pool_set_config;
gstbufferpool_class->alloc_buffer = gst_d3dsurface_buffer_pool_alloc; gstbufferpool_class->alloc_buffer = gst_d3dsurface_buffer_pool_alloc_buffer;
gstbufferpool_class->release_buffer =
gst_d3dsurface_buffer_pool_release_buffer;
} }
static void static void