mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
v4l2object: Implement gst_v4l2_dup()
This will duplicated the FD from another object and copy over the probed result. https://bugzilla.gnome.org/show_bug.cgi?id=720568
This commit is contained in:
parent
7fd6dc08b9
commit
cf32d6ec43
2 changed files with 86 additions and 26 deletions
|
@ -470,6 +470,40 @@ gst_v4l2_empty_lists (GstV4l2Object * v4l2object)
|
||||||
g_datalist_clear (&v4l2object->controls);
|
g_datalist_clear (&v4l2object->controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_v4l2_adjust_buf_type (GstV4l2Object * v4l2object)
|
||||||
|
{
|
||||||
|
/* when calling gst_v4l2_object_new the user decides the initial type
|
||||||
|
* so adjust it if multi-planar is supported
|
||||||
|
* the driver should make it exclusive. So the driver should
|
||||||
|
* not support both MPLANE and non-PLANE.
|
||||||
|
* Because even when using MPLANE it still possibles to use it
|
||||||
|
* in a contiguous manner. In this case the first v4l2 plane
|
||||||
|
* contains all the gst planes.
|
||||||
|
*/
|
||||||
|
switch (v4l2object->type) {
|
||||||
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
||||||
|
if (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OUTPUT_MPLANE
|
||||||
|
|| v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) {
|
||||||
|
GST_DEBUG ("adjust type to multi-planar output");
|
||||||
|
v4l2object->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
||||||
|
if (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE
|
||||||
|
|| v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) {
|
||||||
|
/* FIXME: for now it's an untested case so just put a warning */
|
||||||
|
GST_WARNING ("untested V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE");
|
||||||
|
|
||||||
|
GST_DEBUG ("adjust type to multi-planar capture");
|
||||||
|
v4l2object->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************
|
/******************************************************
|
||||||
* gst_v4l2_open():
|
* gst_v4l2_open():
|
||||||
* open the video device (v4l2object->videodev)
|
* open the video device (v4l2object->videodev)
|
||||||
|
@ -534,33 +568,8 @@ gst_v4l2_open (GstV4l2Object * v4l2object)
|
||||||
V4L2_CAP_VIDEO_OUTPUT_MPLANE)))
|
V4L2_CAP_VIDEO_OUTPUT_MPLANE)))
|
||||||
goto not_output;
|
goto not_output;
|
||||||
|
|
||||||
/* when calling gst_v4l2_object_new the user decides the initial type
|
|
||||||
* so adjust it if multi-planar is supported
|
|
||||||
* the driver should make it exclusive. So the driver should
|
|
||||||
* not support both MPLANE and non-PLANE.
|
|
||||||
* Because even when using MPLANE it still possibles to use it
|
|
||||||
* in a contiguous manner. In this case the first v4l2 plane
|
|
||||||
* contains all the gst planes.
|
|
||||||
*/
|
|
||||||
switch (v4l2object->type) {
|
|
||||||
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
||||||
if (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OUTPUT_MPLANE) {
|
|
||||||
GST_DEBUG ("adjust type to multi-planar output");
|
|
||||||
v4l2object->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
||||||
if (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE) {
|
|
||||||
/* FIXME: for now it's an untested case so just put a warning */
|
|
||||||
GST_WARNING ("untested V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE");
|
|
||||||
|
|
||||||
GST_DEBUG ("adjust type to multi-planar capture");
|
gst_v4l2_adjust_buf_type (v4l2object);
|
||||||
v4l2object->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create enumerations, posts errors. */
|
/* create enumerations, posts errors. */
|
||||||
if (!gst_v4l2_fill_lists (v4l2object))
|
if (!gst_v4l2_fill_lists (v4l2object))
|
||||||
|
@ -642,6 +651,56 @@ error:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_v4l2_dup (GstV4l2Object * v4l2object, GstV4l2Object * other)
|
||||||
|
{
|
||||||
|
GstPollFD pollfd = GST_POLL_FD_INIT;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (v4l2object->element, "Trying to dup device %s",
|
||||||
|
other->videodev);
|
||||||
|
|
||||||
|
GST_V4L2_CHECK_OPEN (other);
|
||||||
|
GST_V4L2_CHECK_NOT_OPEN (v4l2object);
|
||||||
|
GST_V4L2_CHECK_NOT_ACTIVE (other);
|
||||||
|
GST_V4L2_CHECK_NOT_ACTIVE (v4l2object);
|
||||||
|
|
||||||
|
v4l2object->vcap = other->vcap;
|
||||||
|
gst_v4l2_adjust_buf_type (v4l2object);
|
||||||
|
|
||||||
|
v4l2object->video_fd = v4l2_dup (other->video_fd);
|
||||||
|
if (!GST_V4L2_IS_OPEN (v4l2object))
|
||||||
|
goto not_open;
|
||||||
|
|
||||||
|
g_free (v4l2object->videodev);
|
||||||
|
v4l2object->videodev = g_strdup (other->videodev);
|
||||||
|
|
||||||
|
GST_INFO_OBJECT (v4l2object->element,
|
||||||
|
"Cloned device '%s' (%s) successfully",
|
||||||
|
v4l2object->vcap.card, v4l2object->videodev);
|
||||||
|
|
||||||
|
pollfd.fd = v4l2object->video_fd;
|
||||||
|
gst_poll_add_fd (v4l2object->poll, &pollfd);
|
||||||
|
if (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE
|
||||||
|
|| v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
|
||||||
|
gst_poll_fd_ctl_read (v4l2object->poll, &pollfd, TRUE);
|
||||||
|
else
|
||||||
|
gst_poll_fd_ctl_write (v4l2object->poll, &pollfd, TRUE);
|
||||||
|
|
||||||
|
v4l2object->never_interlaced = other->never_interlaced;
|
||||||
|
v4l2object->can_poll_device = TRUE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
not_open:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ_WRITE,
|
||||||
|
(_("Could not dup device '%s' for reading and writing."),
|
||||||
|
v4l2object->videodev), GST_ERROR_SYSTEM);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************
|
/******************************************************
|
||||||
* gst_v4l2_close():
|
* gst_v4l2_close():
|
||||||
|
|
|
@ -91,6 +91,7 @@
|
||||||
|
|
||||||
/* open/close the device */
|
/* open/close the device */
|
||||||
gboolean gst_v4l2_open (GstV4l2Object *v4l2object);
|
gboolean gst_v4l2_open (GstV4l2Object *v4l2object);
|
||||||
|
gboolean gst_v4l2_dup (GstV4l2Object *v4l2object, GstV4l2Object *other);
|
||||||
gboolean gst_v4l2_close (GstV4l2Object *v4l2object);
|
gboolean gst_v4l2_close (GstV4l2Object *v4l2object);
|
||||||
|
|
||||||
/* norm/input/output */
|
/* norm/input/output */
|
||||||
|
|
Loading…
Reference in a new issue