From ef7a8c2ca86590d994f6cf768070d75b05dd7b61 Mon Sep 17 00:00:00 2001 From: Andoni Morales Alastruey Date: Wed, 28 Aug 2013 20:07:48 +0200 Subject: [PATCH] d3dvideosink: disable buffer pools 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 | 3 ++- sys/d3dvideosink/d3dhelpers.c | 6 ++++++ sys/d3dvideosink/d3dvideosink.c | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sys/d3dvideosink/Makefile.am b/sys/d3dvideosink/Makefile.am index b30c4da..986a006 100644 --- a/sys/d3dvideosink/Makefile.am +++ b/sys/d3dvideosink/Makefile.am @@ -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) diff --git a/sys/d3dvideosink/d3dhelpers.c b/sys/d3dvideosink/d3dhelpers.c index 672bbeb..e405b1c 100644 --- a/sys/d3dvideosink/d3dhelpers.c +++ b/sys/d3dvideosink/d3dhelpers.c @@ -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)) { diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c index 2b5086e..09ced08 100644 --- a/sys/d3dvideosink/d3dvideosink.c +++ b/sys/d3dvideosink/d3dvideosink.c @@ -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); } -- 2.7.4