summaryrefslogtreecommitdiffstats
path: root/sys/v4l2/v4l2_calls.c
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2008-11-04 12:32:48 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-11-04 12:32:48 +0000
commita50de826a2cfc400423c9259ef8c6e5aa8208d7d (patch)
tree29dc9709bbf6a7364ff382fb9672a788d0a51f51 /sys/v4l2/v4l2_calls.c
parent084812bffd39403794039f30e25a4bb0d9e2ad17 (diff)
Optionally use libv4l to access v4l2 devices. Fixes bug #545033.
Original commit message from CVS: Patch by: Bastien Nocera <hadess at hadess dot net>, Hans de Goede <jwrdegoede at fedoraproject dot org> * configure.ac: * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_close), (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), (gst_v4l2_get_input), (gst_v4l2_set_input): * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), (gst_v4l2_buffer_new), (gst_v4l2_buffer_pool_finalize), (gst_v4l2_buffer_pool_new), (gst_v4l2_buffer_pool_activate), (gst_v4l2src_fill_format_list), (gst_v4l2src_probe_caps_for_format_and_size), (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), (gst_v4l2src_get_nearest_size): Optionally use libv4l to access v4l2 devices. Fixes bug #545033.
Diffstat (limited to 'sys/v4l2/v4l2_calls.c')
-rw-r--r--sys/v4l2/v4l2_calls.c48
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;