diff options
Diffstat (limited to 'sys/v4l2/v4l2_calls.c')
-rw-r--r-- | sys/v4l2/v4l2_calls.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c index f318fc5b..3564d335 100644 --- a/sys/v4l2/v4l2_calls.c +++ b/sys/v4l2/v4l2_calls.c @@ -75,7 +75,7 @@ gst_v4l2_get_capabilities (GstV4l2Object * v4l2object) if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; - if (ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &v4l2object->vcap) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &v4l2object->vcap) < 0) goto cap_failed; GST_LOG_OBJECT (e, "driver: '%s'", v4l2object->vcap.driver); @@ -124,7 +124,7 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object) GstTunerChannel *channel; input.index = n; - if (ioctl (v4l2object->video_fd, VIDIOC_ENUMINPUT, &input) < 0) { + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUMINPUT, &input) < 0) { if (errno == EINVAL) break; /* end of enumeration */ else { @@ -157,7 +157,7 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object) channel->flags |= GST_TUNER_CHANNEL_FREQUENCY; vtun.index = input.tuner; - if (ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &vtun) < 0) { + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &vtun) < 0) { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Failed to get setting of tuner %d on device '%s'."), input.tuner, v4l2object->videodev), GST_ERROR_SYSTEM); @@ -197,7 +197,7 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object) standard.frameperiod.denominator = 0; standard.index = n; - if (ioctl (v4l2object->video_fd, VIDIOC_ENUMSTD, &standard) < 0) { + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUMSTD, &standard) < 0) { if (errno == EINVAL || errno == ENOTTY) break; /* end of enumeration */ else { @@ -242,7 +242,7 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object) } control.id = n; - if (ioctl (v4l2object->video_fd, VIDIOC_QUERYCTRL, &control) < 0) { + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCTRL, &control) < 0) { if (errno == EINVAL) { if (n < V4L2_CID_PRIVATE_BASE) /* continue so that we also check private controls */ @@ -324,7 +324,7 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object) menu.id = n; for (i = 0;; i++) { menu.index = i; - if (ioctl (v4l2object->video_fd, VIDIOC_QUERYMENU, &menu) < 0) { + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYMENU, &menu) < 0) { if (errno == EINVAL) break; /* end of enumeration */ else { @@ -399,6 +399,7 @@ gboolean gst_v4l2_open (GstV4l2Object * v4l2object) { struct stat st; + int libv4l2_fd; GST_DEBUG_OBJECT (v4l2object->element, "Trying to open device %s", v4l2object->videodev); @@ -424,6 +425,17 @@ gst_v4l2_open (GstV4l2Object * v4l2object) if (!GST_V4L2_IS_OPEN (v4l2object)) goto not_open; + libv4l2_fd = v4l2_fd_open (v4l2object->video_fd, + V4L2_ENABLE_ENUM_FMT_EMULATION); + /* Note the v4l2_xxx functions are designed so that if they get passed an + unknown fd, the will behave exactly as their regular xxx counterparts, so + if v4l2_fd_open fails, we continue as normal (missing the libv4l2 custom + cam format to normal formats conversion). Chances are big we will still + fail then though, as normally v4l2_fd_open only fails if the device is not + a v4l2 device. */ + if (libv4l2_fd != -1) + v4l2object->video_fd = libv4l2_fd; + /* get capabilities, error will be posted */ if (!gst_v4l2_get_capabilities (v4l2object)) goto error; @@ -477,7 +489,7 @@ error: { if (GST_V4L2_IS_OPEN (v4l2object)) { /* close device */ - close (v4l2object->video_fd); + v4l2_close (v4l2object->video_fd); v4l2object->video_fd = -1; } /* empty lists */ @@ -503,7 +515,7 @@ gst_v4l2_close (GstV4l2Object * v4l2object) GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); /* close device */ - close (v4l2object->video_fd); + v4l2_close (v4l2object->video_fd); v4l2object->video_fd = -1; /* empty lists */ @@ -526,7 +538,7 @@ gst_v4l2_get_norm (GstV4l2Object * v4l2object, v4l2_std_id * norm) if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; - if (ioctl (v4l2object->video_fd, VIDIOC_G_STD, norm) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_STD, norm) < 0) goto std_failed; return TRUE; @@ -554,7 +566,7 @@ gst_v4l2_set_norm (GstV4l2Object * v4l2object, v4l2_std_id norm) if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; - if (ioctl (v4l2object->video_fd, VIDIOC_S_STD, &norm) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_STD, &norm) < 0) goto std_failed; return TRUE; @@ -590,7 +602,7 @@ gst_v4l2_get_frequency (GstV4l2Object * v4l2object, channel = gst_tuner_get_channel (GST_TUNER (v4l2object->element)); freq.tuner = tunernum; - if (ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq) < 0) goto freq_failed; *frequency = freq.frequency * channel->freq_multiplicator; @@ -631,10 +643,10 @@ gst_v4l2_set_frequency (GstV4l2Object * v4l2object, freq.tuner = tunernum; /* fill in type - ignore error */ - ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq); + v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq); freq.frequency = frequency / channel->freq_multiplicator; - if (ioctl (v4l2object->video_fd, VIDIOC_S_FREQUENCY, &freq) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_FREQUENCY, &freq) < 0) goto freq_failed; return TRUE; @@ -666,7 +678,7 @@ gst_v4l2_signal_strength (GstV4l2Object * v4l2object, return FALSE; tuner.index = tunernum; - if (ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &tuner) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &tuner) < 0) goto tuner_failed; *signal_strength = tuner.signal; @@ -702,7 +714,7 @@ gst_v4l2_get_attribute (GstV4l2Object * v4l2object, control.id = attribute_num; - if (ioctl (v4l2object->video_fd, VIDIOC_G_CTRL, &control) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_CTRL, &control) < 0) goto ctrl_failed; *value = control.value; @@ -739,7 +751,7 @@ gst_v4l2_set_attribute (GstV4l2Object * v4l2object, control.id = attribute_num; control.value = value; - if (ioctl (v4l2object->video_fd, VIDIOC_S_CTRL, &control) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_CTRL, &control) < 0) goto ctrl_failed; return TRUE; @@ -764,7 +776,7 @@ gst_v4l2_get_input (GstV4l2Object * v4l2object, gint * input) if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; - if (ioctl (v4l2object->video_fd, VIDIOC_G_INPUT, &n) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_INPUT, &n) < 0) goto input_failed; *input = n; @@ -790,7 +802,7 @@ gst_v4l2_set_input (GstV4l2Object * v4l2object, gint input) if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; - if (ioctl (v4l2object->video_fd, VIDIOC_S_INPUT, &input) < 0) + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_INPUT, &input) < 0) goto input_failed; return TRUE; |