guint flags = 0;
if (GST_V4L2_IS_OPEN (v4l2object)) {
- flags |= v4l2object->vcap.capabilities &
+ flags |= v4l2object->device_caps &
(V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_VIDEO_OUTPUT |
V4L2_CAP_VIDEO_OVERLAY |
V4L2_CAP_VBI_CAPTURE |
V4L2_CAP_VBI_OUTPUT | V4L2_CAP_TUNER | V4L2_CAP_AUDIO);
- if (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE)
+ if (v4l2object->device_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE)
flags |= V4L2_CAP_VIDEO_CAPTURE;
- if (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OUTPUT_MPLANE)
+ if (v4l2object->device_caps & V4L2_CAP_VIDEO_OUTPUT_MPLANE)
flags |= V4L2_CAP_VIDEO_OUTPUT;
}
g_value_set_flags (value, flags);
gst_caps_replace (&v4l2object->probed_caps, NULL);
+ /* reset our copy of the device caps */
+ v4l2object->device_caps = 0;
+
if (v4l2object->formats) {
gst_v4l2_object_clear_format_list (v4l2object);
}
/* find transport */
mode = v4l2object->req_mode;
- if (v4l2object->vcap.capabilities & V4L2_CAP_READWRITE) {
+ if (v4l2object->device_caps & 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->device_caps & 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)
if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &v4l2object->vcap) < 0)
goto cap_failed;
+ if (v4l2object->vcap.capabilities & V4L2_CAP_DEVICE_CAPS)
+ v4l2object->device_caps = v4l2object->vcap.device_caps;
+ else
+ v4l2object->device_caps = v4l2object->vcap.capabilities;
+
GST_LOG_OBJECT (e, "driver: '%s'", v4l2object->vcap.driver);
GST_LOG_OBJECT (e, "card: '%s'", v4l2object->vcap.card);
GST_LOG_OBJECT (e, "bus_info: '%s'", v4l2object->vcap.bus_info);
GST_LOG_OBJECT (e, "version: %08x", v4l2object->vcap.version);
- GST_LOG_OBJECT (e, "capabilites: %08x", v4l2object->vcap.capabilities);
+ GST_LOG_OBJECT (e, "capabilites: %08x", v4l2object->device_caps);
return TRUE;
#define CHECK_CAPS (V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE)
switch (v4l2object->type) {
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
- if (v4l2object->vcap.capabilities & CHECK_CAPS) {
+ if (v4l2object->device_caps & CHECK_CAPS) {
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 & CHECK_CAPS) {
+ if (v4l2object->device_caps & CHECK_CAPS) {
GST_DEBUG ("adjust type to multi-planar capture");
v4l2object->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
}
/* do we need to be a capture device? */
if (GST_IS_V4L2SRC (v4l2object->element) &&
- !(v4l2object->vcap.capabilities & (V4L2_CAP_VIDEO_CAPTURE |
+ !(v4l2object->device_caps & (V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_VIDEO_CAPTURE_MPLANE)))
goto not_capture;
if (GST_IS_V4L2SINK (v4l2object->element) &&
- !(v4l2object->vcap.capabilities & (V4L2_CAP_VIDEO_OUTPUT |
+ !(v4l2object->device_caps & (V4L2_CAP_VIDEO_OUTPUT |
V4L2_CAP_VIDEO_OUTPUT_MPLANE)))
goto not_output;
if (GST_IS_V4L2_VIDEO_DEC (v4l2object->element) &&
/* Today's M2M device only expose M2M */
- !((v4l2object->vcap.capabilities & (V4L2_CAP_VIDEO_M2M |
+ !((v4l2object->device_caps & (V4L2_CAP_VIDEO_M2M |
V4L2_CAP_VIDEO_M2M_MPLANE)) ||
/* But legacy driver may expose both CAPTURE and OUTPUT */
- ((v4l2object->vcap.capabilities &
+ ((v4l2object->device_caps &
(V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_CAPTURE_MPLANE)) &&
- (v4l2object->vcap.capabilities &
+ (v4l2object->device_caps &
(V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE)))))
goto not_m2m;
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND,
(_("Device '%s' is not a capture device."),
v4l2object->videodev),
- ("Capabilities: 0x%x", v4l2object->vcap.capabilities));
+ ("Capabilities: 0x%x", v4l2object->device_caps));
goto error;
}
not_output:
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND,
(_("Device '%s' is not a output device."),
v4l2object->videodev),
- ("Capabilities: 0x%x", v4l2object->vcap.capabilities));
+ ("Capabilities: 0x%x", v4l2object->device_caps));
goto error;
}
not_m2m:
GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND,
(_("Device '%s' is not a M2M device."),
v4l2object->videodev),
- ("Capabilities: 0x%x", v4l2object->vcap.capabilities));
+ ("Capabilities: 0x%x", v4l2object->device_caps));
goto error;
}
error:
/* ERRORS */
input_failed:
- if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) {
+ if (v4l2object->device_caps & V4L2_CAP_TUNER) {
/* only give a warning message if driver actually claims to have tuner
* support
*/
/* ERRORS */
input_failed:
- if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) {
+ if (v4l2object->device_caps & V4L2_CAP_TUNER) {
/* only give a warning message if driver actually claims to have tuner
* support
*/
/* ERRORS */
output_failed:
- if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) {
+ if (v4l2object->device_caps & V4L2_CAP_TUNER) {
/* only give a warning message if driver actually claims to have tuner
* support
*/
/* ERRORS */
output_failed:
- if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) {
+ if (v4l2object->device_caps & V4L2_CAP_TUNER) {
/* only give a warning message if driver actually claims to have tuner
* support
*/