summaryrefslogtreecommitdiff
path: root/sys/d3dvideosink
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2013-03-27 09:08:40 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2013-03-27 09:09:59 +0100
commit42965f5aa033f85f02ab3939cae39363562b338f (patch)
treee1832b445021ad129be1453a083b327c22e29579 /sys/d3dvideosink
parente7a69bb8de5bc81658ddfefbd8122df5e8b6f1c6 (diff)
downloadgstreamer-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.c25
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