#ifdef TIZEN_FEATURE_V4L2SRC_SUPPORT_CAMERA_ID
PROP_CAMERA_ID,
#endif /* TIZEN_FEATURE_V4L2SRC_SUPPORT_CAMERA_ID */
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ PROP_AUTO_SCAN_DEVICE,
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
PROP_LAST
};
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
#endif /* TIZEN_FEATURE_V4L2SRC_SUPPORT_CAMERA_ID */
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ /**
+ * GstV4l2Src:auto-scan-device:
+ */
+ g_object_class_install_property (gobject_class, PROP_AUTO_SCAN_DEVICE,
+ g_param_spec_boolean ("auto-scan-device", "Scan device automatically",
+ "Scan all device nodes automatically until device open success.",
+ TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
+
/**
* GstV4l2Src::prepare-format:
* @v4l2src: the v4l2src instance
/* Avoid the slow probes */
v4l2src->v4l2object->skip_try_fmt_probes = TRUE;
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ v4l2src->v4l2object->auto_scan_device = TRUE;
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
gst_base_src_set_format (GST_BASE_SRC (v4l2src), GST_FORMAT_TIME);
gst_base_src_set_live (GST_BASE_SRC (v4l2src), TRUE);
v4l2src->camera_id = g_value_get_uint (value);
v4l2src->v4l2object->videodev = g_strdup_printf ("/dev/video%u", v4l2src->camera_id);
- GST_INFO_OBJECT(v4l2src, "videodev [%s]", v4l2src->v4l2object->videodev);
+ GST_INFO_OBJECT (v4l2src, "videodev [%s]", v4l2src->v4l2object->videodev);
break;
#endif /* TIZEN_FEATURE_V4L2SRC_SUPPORT_CAMERA_ID */
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ case PROP_AUTO_SCAN_DEVICE:
+ v4l2src->v4l2object->auto_scan_device = g_value_get_boolean (value);
+ GST_INFO_OBJECT (v4l2src, "auto scan device [%d]", v4l2src->v4l2object->auto_scan_device);
+ break;
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
g_value_set_uint (value, v4l2src->camera_id);
break;
#endif /* TIZEN_FEATURE_V4L2SRC_SUPPORT_CAMERA_ID */
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ case PROP_AUTO_SCAN_DEVICE:
+ GST_INFO_OBJECT (v4l2src, "auto scan device [%d]", v4l2src->v4l2object->auto_scan_device);
+ g_value_set_boolean (value, v4l2src->v4l2object->auto_scan_device);
+ break;
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
#include <string.h>
#include <errno.h>
#include <unistd.h>
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
#include <glob.h>
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
#ifdef __sun
/* Needed on older Solaris Nevada builds (72 at least) */
#include <stropts.h>
#include "gst/gst-i18n-plugin.h"
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
enum {
V4L2_OPEN_ERROR = 0,
V4L2_OPEN_ERROR_STAT_FAILED,
V4L2_OPEN_ERROR_NOT_CAPTURE,
V4L2_OPEN_ERROR_NOT_OUTPUT
};
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
GST_DEBUG_CATEGORY_EXTERN (v4l2_debug);
#define GST_CAT_DEFAULT v4l2_debug
{
struct stat st;
int libv4l2_fd = -1;
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
int error_type = V4L2_OPEN_ERROR_STAT_FAILED;
int device_index = 0;
glob_t glob_buf;
- memset(&glob_buf, 0x0, sizeof(glob_t));
+ memset (&glob_buf, 0x0, sizeof(glob_t));
if (!v4l2object) {
- GST_ERROR("v4l2object is NULL");
+ GST_ERROR ("v4l2object is NULL");
return FALSE;
}
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
GST_DEBUG_OBJECT (v4l2object->dbg_obj, "Trying to open device %s",
v4l2object->videodev);
if (!v4l2object->videodev)
v4l2object->videodev = g_strdup ("/dev/video");
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
if (!v4l2object->videodev) {
- GST_ERROR_OBJECT(v4l2object->element, "videodev is NULL");
+ GST_ERROR_OBJECT (v4l2object->element, "videodev is NULL");
return FALSE;
}
CHECK_AGAIN:
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
/* check if it is a device */
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
if (stat (v4l2object->videodev, &st) == -1) {
error_type = V4L2_OPEN_ERROR_STAT_FAILED;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
- if (stat (v4l2object->videodev, &st) == -1)
- goto stat_failed;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
if (!S_ISCHR (st.st_mode)) {
error_type = V4L2_OPEN_ERROR_NO_DEVICE;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#else /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
+ /* check if it is a device */
+ if (stat (v4l2object->videodev, &st) == -1)
+ goto stat_failed;
+
if (!S_ISCHR (st.st_mode))
goto no_device;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
/* open the device */
v4l2object->video_fd =
open (v4l2object->videodev, O_RDWR /* | O_NONBLOCK */ );
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
if (!GST_V4L2_IS_OPEN (v4l2object)) {
error_type = V4L2_OPEN_ERROR_NOT_OPEN;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#else /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
if (!GST_V4L2_IS_OPEN (v4l2object))
goto not_open;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
#ifdef HAVE_LIBV4L2
if (v4l2object->fd_open)
v4l2object->video_fd = libv4l2_fd;
/* get capabilities, error will be posted */
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
if (!gst_v4l2_get_capabilities (v4l2object)) {
error_type = V4L2_OPEN_ERROR;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
- if (!gst_v4l2_get_capabilities (v4l2object))
- goto error;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
- /* do we need to be a capture device? */
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
- GST_INFO_OBJECT(v4l2object->element, "device_caps 0x%x", v4l2object->device_caps);
+ GST_INFO_OBJECT (v4l2object->element, "device_caps 0x%x", v4l2object->device_caps);
+
if (GST_IS_V4L2SRC (v4l2object->element) &&
(!(v4l2object->device_caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_CAPTURE_MPLANE)) ||
(v4l2object->device_caps & (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE)))) {
error_type = V4L2_OPEN_ERROR_NOT_CAPTURE;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
- if (GST_IS_V4L2SRC (v4l2object->element) &&
- !(v4l2object->device_caps & (V4L2_CAP_VIDEO_CAPTURE |
- V4L2_CAP_VIDEO_CAPTURE_MPLANE)))
- goto not_capture;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
if (GST_IS_V4L2SINK (v4l2object->element) &&
!(v4l2object->device_caps & (V4L2_CAP_VIDEO_OUTPUT |
V4L2_CAP_VIDEO_OUTPUT_MPLANE))) {
error_type = V4L2_OPEN_ERROR_NOT_OUTPUT;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#else /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
+ if (!gst_v4l2_get_capabilities (v4l2object))
+ goto error;
+
+ /* do we need to be a capture device? */
+ if (GST_IS_V4L2SRC (v4l2object->element) &&
+ !(v4l2object->device_caps & (V4L2_CAP_VIDEO_CAPTURE |
+ V4L2_CAP_VIDEO_CAPTURE_MPLANE)))
+ goto not_capture;
+
if (GST_IS_V4L2SINK (v4l2object->element) &&
!(v4l2object->device_caps & (V4L2_CAP_VIDEO_OUTPUT |
V4L2_CAP_VIDEO_OUTPUT_MPLANE)))
goto not_output;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
if (GST_IS_V4L2_VIDEO_DEC (v4l2object->element) &&
!GST_V4L2_IS_M2M (v4l2object->device_caps))
gst_v4l2_adjust_buf_type (v4l2object);
/* create enumerations, posts errors. */
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
if (!gst_v4l2_fill_lists (v4l2object)) {
error_type = V4L2_OPEN_ERROR;
goto pre_error_check;
}
-#else /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#else /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
if (!gst_v4l2_fill_lists (v4l2object))
goto error;
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
GST_INFO_OBJECT (v4l2object->dbg_obj,
"Opened device '%s' (%s) successfully",
if (v4l2object->extra_controls)
gst_v4l2_set_controls (v4l2object, v4l2object->extra_controls);
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
- globfree(&glob_buf);
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ globfree (&glob_buf);
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
/* UVC devices are never interlaced, and doing VIDIOC_TRY_FMT on them
* causes expensive and slow USB IO, so don't probe them for interlaced
return TRUE;
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
pre_error_check:
{
- if (GST_IS_V4L2SRC(v4l2object->element) && glob_buf.gl_pathc == 0) {
+ if (v4l2object->auto_scan_device == FALSE) {
+ GST_WARNING_OBJECT (v4l2object->element, "auto scan device disabled");
+ goto error;
+ }
+
+ if (GST_IS_V4L2SRC (v4l2object->element) && glob_buf.gl_pathc == 0) {
if (glob("/dev/video*", 0, 0, &glob_buf) != 0) {
- GST_WARNING_OBJECT(v4l2object->element, "glob failed");
+ GST_WARNING_OBJECT (v4l2object->element, "glob failed");
}
}
if (glob_buf.gl_pathc > 0 && device_index < glob_buf.gl_pathc) {
- if (v4l2object->videodev) {
- g_free(v4l2object->videodev);
- v4l2object->videodev = NULL;
- }
- v4l2object->videodev = g_strdup(glob_buf.gl_pathv[device_index]);
+ if (v4l2object->videodev)
+ g_free (v4l2object->videodev);
+
+ v4l2object->videodev = g_strdup (glob_buf.gl_pathv[device_index]);
if (v4l2object->videodev) {
device_index++;
- GST_INFO_OBJECT(v4l2object->element, "check device [%s]",
- v4l2object->videodev);
+
+ GST_INFO_OBJECT (v4l2object->element, "check device [%s]",
+ v4l2object->videodev);
if (GST_V4L2_IS_OPEN (v4l2object)) {
/* close device */
goto CHECK_AGAIN;
} else {
- GST_WARNING_OBJECT(v4l2object->element, "g_strdup failed [%s]",
- glob_buf.gl_pathv[device_index]);
+ GST_WARNING_OBJECT (v4l2object->element, "g_strdup failed [%s]",
+ glob_buf.gl_pathv[device_index]);
}
}
- GST_WARNING_OBJECT(v4l2object->element, "error type : %d", error_type);
+ GST_WARNING_OBJECT (v4l2object->element, "error type : %d", error_type);
switch (error_type) {
case V4L2_OPEN_ERROR_STAT_FAILED:
goto error;
}
}
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
/* ERRORS */
stat_failed:
/* empty lists */
gst_v4l2_empty_lists (v4l2object);
-#ifdef TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE
- globfree(&glob_buf);
-#endif /* TIZEN_FEATURE_V4L2SRC_SCAN_DEVICE_NODE */
+#ifdef TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE
+ globfree (&glob_buf);
+#endif /* TIZEN_FEATURE_V4L2SRC_AUTO_SCAN_DEVICE_NODE */
return FALSE;
}