mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 18:05:37 +00:00
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
This commit is contained in:
parent
994739332d
commit
ef7a8c2ca8
3 changed files with 11 additions and 1 deletions
|
@ -1,7 +1,8 @@
|
||||||
plugin_LTLIBRARIES = libgstd3dvideosink.la
|
plugin_LTLIBRARIES = libgstd3dvideosink.la
|
||||||
|
|
||||||
libgstd3dvideosink_la_SOURCES = d3dvideosink.c d3dhelpers.c
|
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) \
|
libgstd3dvideosink_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
|
||||||
-lgstvideo-$(GST_API_VERSION) \
|
-lgstvideo-$(GST_API_VERSION) \
|
||||||
$(DIRECT3D_LIBS) $(DIRECTX_LDFAGS)
|
$(DIRECT3D_LIBS) $(DIRECTX_LDFAGS)
|
||||||
|
|
|
@ -1866,9 +1866,13 @@ d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
|
||||||
|
|
||||||
surface = ((GstD3DSurfaceMemory *) mem)->surface;
|
surface = ((GstD3DSurfaceMemory *) mem)->surface;
|
||||||
|
|
||||||
|
#ifndef DISABLE_BUFFER_POOL
|
||||||
/* Need to keep an additional ref until the next buffer
|
/* Need to keep an additional ref until the next buffer
|
||||||
* to make sure it isn't reused until then */
|
* to make sure it isn't reused until then */
|
||||||
sink->fallback_buffer = buf;
|
sink->fallback_buffer = buf;
|
||||||
|
#else
|
||||||
|
sink->fallback_buffer = NULL;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
mem = gst_buffer_peek_memory (buf, 0);
|
mem = gst_buffer_peek_memory (buf, 0);
|
||||||
surface = ((GstD3DSurfaceMemory *) mem)->surface;
|
surface = ((GstD3DSurfaceMemory *) mem)->surface;
|
||||||
|
@ -1881,7 +1885,9 @@ d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
|
||||||
|
|
||||||
if (sink->d3d.surface)
|
if (sink->d3d.surface)
|
||||||
IDirect3DSurface9_Release (sink->d3d.surface);
|
IDirect3DSurface9_Release (sink->d3d.surface);
|
||||||
|
#ifndef DISABLE_BUFFER_POOL
|
||||||
IDirect3DSurface9_AddRef (surface);
|
IDirect3DSurface9_AddRef (surface);
|
||||||
|
#endif
|
||||||
sink->d3d.surface = surface;
|
sink->d3d.surface = surface;
|
||||||
|
|
||||||
if (!d3d_present_swap_chain (sink)) {
|
if (!d3d_present_swap_chain (sink)) {
|
||||||
|
|
|
@ -172,6 +172,7 @@ gst_d3dvideosink_init (GstD3DVideoSink * sink)
|
||||||
sink->create_internal_window = DEFAULT_CREATE_RENDER_WINDOW;
|
sink->create_internal_window = DEFAULT_CREATE_RENDER_WINDOW;
|
||||||
sink->stream_stop_on_close = DEFAULT_STREAM_STOP_ON_CLOSE;
|
sink->stream_stop_on_close = DEFAULT_STREAM_STOP_ON_CLOSE;
|
||||||
sink->enable_navigation_events = DEFAULT_ENABLE_NAVIGATION_EVENTS;
|
sink->enable_navigation_events = DEFAULT_ENABLE_NAVIGATION_EVENTS;
|
||||||
|
sink->d3d.surface = NULL;
|
||||||
|
|
||||||
g_rec_mutex_init (&sink->lock);
|
g_rec_mutex_init (&sink->lock);
|
||||||
}
|
}
|
||||||
|
@ -519,7 +520,9 @@ gst_d3dvideosink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
||||||
|
|
||||||
if (pool) {
|
if (pool) {
|
||||||
/* we need at least 2 buffer because we hold on to the last one */
|
/* 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);
|
gst_query_add_allocation_pool (query, pool, size, 2, 0);
|
||||||
|
#endif
|
||||||
gst_object_unref (pool);
|
gst_object_unref (pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue