mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
v4l2: improve IO mode error handling
Error out when an unsupported IO mode was selected
This commit is contained in:
parent
9a8f1c4339
commit
be32a6393e
1 changed files with 27 additions and 16 deletions
|
@ -2094,31 +2094,35 @@ gst_v4l2_object_setup_pool (GstV4l2Object * v4l2object, GstCaps * caps)
|
||||||
{
|
{
|
||||||
guint num_buffers;
|
guint num_buffers;
|
||||||
GstStructure *config;
|
GstStructure *config;
|
||||||
|
GstV4l2IOMode mode;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (v4l2object->element, "initializing the capture system");
|
GST_DEBUG_OBJECT (v4l2object->element, "initializing the capture system");
|
||||||
|
|
||||||
GST_V4L2_CHECK_OPEN (v4l2object);
|
GST_V4L2_CHECK_OPEN (v4l2object);
|
||||||
GST_V4L2_CHECK_NOT_ACTIVE (v4l2object);
|
GST_V4L2_CHECK_NOT_ACTIVE (v4l2object);
|
||||||
|
|
||||||
/* use specified mode */
|
/* find transport */
|
||||||
v4l2object->mode = v4l2object->req_mode;
|
mode = v4l2object->req_mode;
|
||||||
|
|
||||||
|
if (v4l2object->vcap.capabilities & V4L2_CAP_READWRITE) {
|
||||||
|
if (v4l2object->req_mode == GST_V4L2_IO_AUTO)
|
||||||
|
mode = GST_V4L2_IO_RW;
|
||||||
|
} else if (v4l2object->req_mode == GST_V4L2_IO_RW)
|
||||||
|
goto method_not_supported;
|
||||||
|
|
||||||
|
if (v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) {
|
||||||
|
if (v4l2object->req_mode == GST_V4L2_IO_AUTO)
|
||||||
|
mode = GST_V4L2_IO_MMAP;
|
||||||
|
} else if (v4l2object->req_mode == GST_V4L2_IO_MMAP)
|
||||||
|
goto method_not_supported;
|
||||||
|
|
||||||
if (v4l2object->req_mode == GST_V4L2_IO_AUTO) {
|
|
||||||
/* automatic mode, find transport */
|
|
||||||
if (v4l2object->vcap.capabilities & V4L2_CAP_READWRITE) {
|
|
||||||
GST_INFO_OBJECT (v4l2object->element,
|
|
||||||
"accessing buffers via read()/write()");
|
|
||||||
v4l2object->mode = GST_V4L2_IO_RW;
|
|
||||||
}
|
|
||||||
if (v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) {
|
|
||||||
GST_INFO_OBJECT (v4l2object->element, "accessing buffers via mmap()");
|
|
||||||
v4l2object->mode = GST_V4L2_IO_MMAP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* if still no transport selected, error out */
|
/* if still no transport selected, error out */
|
||||||
if (v4l2object->mode == GST_V4L2_IO_AUTO)
|
if (mode == GST_V4L2_IO_AUTO)
|
||||||
goto no_supported_capture_method;
|
goto no_supported_capture_method;
|
||||||
|
|
||||||
|
GST_INFO_OBJECT (v4l2object->element, "accessing buffers via mode %d", mode);
|
||||||
|
v4l2object->mode = mode;
|
||||||
|
|
||||||
/* keep track of current number of buffers */
|
/* keep track of current number of buffers */
|
||||||
num_buffers = v4l2object->num_buffers;
|
num_buffers = v4l2object->num_buffers;
|
||||||
|
|
||||||
|
@ -2146,10 +2150,17 @@ buffer_pool_new_failed:
|
||||||
("Failed to create buffer pool: %s", g_strerror (errno)));
|
("Failed to create buffer pool: %s", g_strerror (errno)));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
method_not_supported:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, READ,
|
||||||
|
(_("The driver of device '%s' does not support the IO method %d"),
|
||||||
|
v4l2object->videodev, mode), (NULL));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
no_supported_capture_method:
|
no_supported_capture_method:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, READ,
|
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, READ,
|
||||||
(_("The driver of device '%s' does not support any known capture "
|
(_("The driver of device '%s' does not support any known IO "
|
||||||
"method."), v4l2object->videodev), (NULL));
|
"method."), v4l2object->videodev), (NULL));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue