diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-03-27 09:08:40 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-03-27 09:09:59 +0100 |
commit | 42965f5aa033f85f02ab3939cae39363562b338f (patch) | |
tree | e1832b445021ad129be1453a083b327c22e29579 /sys/d3dvideosink | |
parent | e7a69bb8de5bc81658ddfefbd8122df5e8b6f1c6 (diff) | |
download | gstreamer-plugins-bad-42965f5aa033f85f02ab3939cae39363562b338f.tar.gz |
d3dvideosink: Make sure that all buffers in our pool contain our own memory
Diffstat (limited to 'sys/d3dvideosink')
-rw-r--r-- | sys/d3dvideosink/d3dhelpers.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/sys/d3dvideosink/d3dhelpers.c b/sys/d3dvideosink/d3dhelpers.c index 025190782..e3c9f6474 100644 --- a/sys/d3dvideosink/d3dhelpers.c +++ b/sys/d3dvideosink/d3dhelpers.c @@ -558,8 +558,8 @@ gst_d3dsurface_buffer_pool_set_config (GstBufferPool * bpool, } static GstFlowReturn -gst_d3dsurface_buffer_pool_alloc (GstBufferPool * bpool, GstBuffer ** buffer, - GstBufferPoolAcquireParams * params) +gst_d3dsurface_buffer_pool_alloc_buffer (GstBufferPool * bpool, + GstBuffer ** buffer, GstBufferPoolAcquireParams * params) { GstD3DSurfaceBufferPool *pool = GST_D3DSURFACE_BUFFER_POOL_CAST (bpool); GstD3DVideoSink *sink = pool->sink; @@ -684,6 +684,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 gst_d3dsurface_buffer_pool_class_init (GstD3DSurfaceBufferPoolClass * klass) { GObjectClass *gobject_class = (GObjectClass *) 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->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 |