v4l2allocator: Workaround driver that don't support REQBUFS(0)

There is still around 18 drivers not yet ported to videobuf2. These driver
don't support freeing buffetrs through REQBUFS(0) hence for these the
memory type probing fails. In order to gain back our previous behaviour in
presence of these, we implement a workaround that assuming MMAP is
supported. Note that an allocator is only created for device with
STREAMING support in the device capabilities. In such case one of MMAP,
USERPTR and DMABUF is required. Though DMABUF came afterward, so is
not an option and in practice none of these drivers will only do USERPTR.

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

Also-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Nicolas Dufresne 2014-08-29 17:09:30 -04:00 committed by Nicolas Dufresne
parent 743c6a4475
commit 5c933fa781

View file

@ -637,20 +637,20 @@ gst_v4l2_allocator_new (GstObject * parent, gint video_fd,
flags |= GST_V4L2_ALLOCATOR_PROBE (allocator, USERPTR);
flags |= GST_V4L2_ALLOCATOR_PROBE (allocator, DMABUF);
if (flags == 0) {
/* Drivers not ported from videobuf to videbuf2 don't allow freeing buffers
* using REQBUFS(0). This is a workaround to still support these drivers,
* which are known to have MMAP support. */
GST_WARNING_OBJECT (allocator, "Could not probe supported memory type, "
"assuming MMAP is supported, this is expected for older drivers not "
" yet ported to videobuf2 framework");
flags = GST_V4L2_ALLOCATOR_FLAG_MMAP_REQBUFS;
}
GST_OBJECT_FLAG_SET (allocator, flags);
if (flags == 0)
goto not_supported;
return allocator;
not_supported:
{
GST_ERROR_OBJECT (allocator,
"No memory model supported by GStreamer for this device");
g_object_unref (allocator);
return NULL;
}
}
guint
@ -766,8 +766,10 @@ gst_v4l2_allocator_stop (GstV4l2Allocator * allocator)
gst_v4l2_memory_group_free (group);
}
/* Not all drivers support rebufs(0), so warn only */
if (v4l2_ioctl (allocator->video_fd, VIDIOC_REQBUFS, &breq) < 0)
goto reqbufs_failed;
GST_WARNING_OBJECT (allocator,
"error releasing buffers buffers: %s", g_strerror (errno));
allocator->count = 0;
@ -776,14 +778,6 @@ gst_v4l2_allocator_stop (GstV4l2Allocator * allocator)
done:
GST_OBJECT_UNLOCK (allocator);
return ret;
reqbufs_failed:
{
GST_ERROR_OBJECT (allocator,
"error releasing buffers buffers: %s", g_strerror (errno));
ret = GST_V4L2_ERROR;
goto done;
}
}
GstV4l2MemoryGroup *