v4l2allocator: Fix freeing of shared memory

When memory (that has been shared using gst_memory_share()) are freed,
the memory (or the DMABUF FD) should not bee freed. These memories have
a parent. This also removes the extra _v4l2mem_free function and avoid
calling close twice on the DMABUF FD.

https://bugzilla.gnome.org/show_bug.cgi?id=744573
This commit is contained in:
Nicolas Dufresne 2015-02-15 15:51:55 -05:00
parent afa5481c50
commit f5ef99fe5e

View file

@ -145,14 +145,6 @@ _v4l2mem_dispose (GstV4l2Memory * mem)
return ret; return ret;
} }
static void
_v4l2mem_free (GstV4l2Memory * mem)
{
if (mem->dmafd >= 0)
close (mem->dmafd);
g_slice_free (GstV4l2Memory, mem);
}
static inline GstV4l2Memory * static inline GstV4l2Memory *
_v4l2mem_new (GstMemoryFlags flags, GstAllocator * allocator, _v4l2mem_new (GstMemoryFlags flags, GstAllocator * allocator,
GstMemory * parent, gsize maxsize, gsize align, gsize offset, gsize size, GstMemory * parent, gsize maxsize, gsize align, gsize offset, gsize size,
@ -388,23 +380,22 @@ gst_v4l2_allocator_free (GstAllocator * gallocator, GstMemory * gmem)
GstV4l2Memory *mem = (GstV4l2Memory *) gmem; GstV4l2Memory *mem = (GstV4l2Memory *) gmem;
GstV4l2MemoryGroup *group = mem->group; GstV4l2MemoryGroup *group = mem->group;
GST_LOG_OBJECT (allocator, "freeing plane %i of buffer %u", /* Only free unparented memory */
mem->plane, group->buffer.index); if (mem->mem.parent == NULL) {
GST_LOG_OBJECT (allocator, "freeing plane %i of buffer %u",
mem->plane, group->buffer.index);
switch (allocator->memory) { if (allocator->memory == V4L2_MEMORY_MMAP) {
case V4L2_MEMORY_MMAP: if (mem->data)
if (mem->data) {
v4l2_munmap (mem->data, group->planes[mem->plane].length); v4l2_munmap (mem->data, group->planes[mem->plane].length);
} else if (group->planes[mem->plane].m.fd > 0) { }
close (group->planes[mem->plane].m.fd);
} /* This apply for both mmap with expbuf, and dmabuf imported memory */
break; if (mem->dmafd >= 0)
default: close (mem->dmafd);
/* Nothing to do */
break;
} }
_v4l2mem_free (mem); g_slice_free (GstV4l2Memory, mem);
} }
static void static void