mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
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:
parent
743c6a4475
commit
5c933fa781
1 changed files with 14 additions and 20 deletions
|
@ -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 *
|
||||
|
|
Loading…
Reference in a new issue