mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-20 15:27:07 +00:00
videobufferpool: don't reset surface when created internally
The bug fixing, in commit 89f202ea
, just considers the case when
surface's DMABuf is set through gst_buffer_pool_acquire_buffer(),
which is typically a decoder's behavior. But vaapipostproc doesn't
provide any surface when calling gst_buffer_pool_acquire_buffer(),
thus a surface is created when GstMemory is allocated.
If the surface proxy in buffer's meta is reset at
buffer_pool_reset_buffer(), that surface will be destroyed and it
won't be available anymore. But GstBuffers are cached in the buffer
pool and they are reused again, hence only those images are rendered
repeatedly.
Fixes: #232
This commit is contained in:
parent
57e792136c
commit
15e169fbf1
3 changed files with 19 additions and 1 deletions
|
@ -480,7 +480,10 @@ gst_vaapi_video_buffer_pool_reset_buffer (GstBufferPool * pool,
|
|||
/* Release the underlying surface proxy */
|
||||
if (GST_VAAPI_IS_VIDEO_MEMORY (mem)) {
|
||||
gst_vaapi_video_memory_reset_surface (GST_VAAPI_VIDEO_MEMORY_CAST (mem));
|
||||
} else {
|
||||
} else if (!gst_vaapi_dmabuf_memory_holds_surface (mem)) {
|
||||
/* If mem holds an internally created surface, don't reset it!
|
||||
* While surface is passed, we should clear it to avoid wrong
|
||||
* reference. */
|
||||
meta = gst_buffer_get_vaapi_video_meta (buffer);
|
||||
if (meta)
|
||||
gst_vaapi_video_meta_set_surface_proxy (meta, NULL);
|
||||
|
|
|
@ -1007,6 +1007,17 @@ gst_vaapi_buffer_proxy_quark_get (void)
|
|||
return g_quark;
|
||||
}
|
||||
|
||||
/* Whether @mem holds an internal VA surface proxy created at
|
||||
* gst_vaapi_dmabuf_memory_new(). */
|
||||
gboolean
|
||||
gst_vaapi_dmabuf_memory_holds_surface (GstMemory * mem)
|
||||
{
|
||||
g_return_val_if_fail (mem != NULL, FALSE);
|
||||
|
||||
return gst_mini_object_get_qdata (GST_MINI_OBJECT_CAST (mem),
|
||||
GST_VAAPI_BUFFER_PROXY_QUARK) != NULL;
|
||||
}
|
||||
|
||||
GstMemory *
|
||||
gst_vaapi_dmabuf_memory_new (GstAllocator * base_allocator,
|
||||
GstVaapiVideoMeta * meta)
|
||||
|
|
|
@ -216,6 +216,10 @@ GstMemory *
|
|||
gst_vaapi_dmabuf_memory_new (GstAllocator * allocator,
|
||||
GstVaapiVideoMeta * meta);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
gboolean
|
||||
gst_vaapi_dmabuf_memory_holds_surface (GstMemory * mem);
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* --- GstVaapiDmaBufAllocator --- */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
|
Loading…
Reference in a new issue