d3dvideosink: disable buffer pools
authorAndoni Morales Alastruey <ylatuya@gmail.com>
Wed, 28 Aug 2013 18:07:48 +0000 (20:07 +0200)
committerAndoni Morales Alastruey <ylatuya@gmail.com>
Mon, 2 Sep 2013 16:21:11 +0000 (18:21 +0200)
On a device lost, all the surfaces allocated in the
device need to be released before resetting the device,
which can't be done for the allocated buffers.

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

sys/d3dvideosink/Makefile.am
sys/d3dvideosink/d3dhelpers.c
sys/d3dvideosink/d3dvideosink.c

index b30c4da..986a006 100644 (file)
@@ -1,7 +1,8 @@
 plugin_LTLIBRARIES = libgstd3dvideosink.la
 
 libgstd3dvideosink_la_SOURCES = d3dvideosink.c d3dhelpers.c
-libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(DIRECT3D_CFLAGS) $(DIRECTX_CFLAGS)
+libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(DIRECT3D_CFLAGS) $(DIRECTX_CFLAGS) \
+       -DDISABLE_BUFFER_POOL
 libgstd3dvideosink_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
        -lgstvideo-$(GST_API_VERSION) \
        $(DIRECT3D_LIBS) $(DIRECTX_LDFAGS)
index 672bbeb..e405b1c 100644 (file)
@@ -1866,9 +1866,13 @@ d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
 
     surface = ((GstD3DSurfaceMemory *) mem)->surface;
 
+#ifndef DISABLE_BUFFER_POOL
     /* Need to keep an additional ref until the next buffer
      * to make sure it isn't reused until then */
     sink->fallback_buffer = buf;
+#else
+    sink->fallback_buffer = NULL;
+#endif
   } else {
     mem = gst_buffer_peek_memory (buf, 0);
     surface = ((GstD3DSurfaceMemory *) mem)->surface;
@@ -1881,7 +1885,9 @@ d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
 
   if (sink->d3d.surface)
     IDirect3DSurface9_Release (sink->d3d.surface);
+#ifndef DISABLE_BUFFER_POOL
   IDirect3DSurface9_AddRef (surface);
+#endif
   sink->d3d.surface = surface;
 
   if (!d3d_present_swap_chain (sink)) {
index 2b5086e..09ced08 100644 (file)
@@ -172,6 +172,7 @@ gst_d3dvideosink_init (GstD3DVideoSink * sink)
   sink->create_internal_window = DEFAULT_CREATE_RENDER_WINDOW;
   sink->stream_stop_on_close = DEFAULT_STREAM_STOP_ON_CLOSE;
   sink->enable_navigation_events = DEFAULT_ENABLE_NAVIGATION_EVENTS;
+  sink->d3d.surface = NULL;
 
   g_rec_mutex_init (&sink->lock);
 }
@@ -519,7 +520,9 @@ gst_d3dvideosink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
 
   if (pool) {
     /* we need at least 2 buffer because we hold on to the last one */
+#ifndef DISABLE_BUFFER_POOL
     gst_query_add_allocation_pool (query, pool, size, 2, 0);
+#endif
     gst_object_unref (pool);
   }