[vlc-commits] v4l2: factor device open
Rémi Denis-Courmont
git at videolan.org
Thu Aug 23 11:18:07 CEST 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Aug 23 12:11:01 2012 +0300| [264ad6ea299ab9eb57016e3f6a95fd300a7571e9] | committer: Rémi Denis-Courmont
v4l2: factor device open
This will be used by the radio tuner.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=264ad6ea299ab9eb57016e3f6a95fd300a7571e9
---
modules/access/v4l2/access.c | 55 +++++++-----------------------------------
modules/access/v4l2/demux.c | 53 +++++-----------------------------------
modules/access/v4l2/v4l2.c | 53 ++++++++++++++++++++++++++++++++++++++++
modules/access/v4l2/v4l2.h | 1 +
4 files changed, 69 insertions(+), 93 deletions(-)
diff --git a/modules/access/v4l2/access.c b/modules/access/v4l2/access.c
index 353ad05..5dc1928 100644
--- a/modules/access/v4l2/access.c
+++ b/modules/access/v4l2/access.c
@@ -29,12 +29,10 @@
#include <assert.h>
#include <errno.h>
-#include <fcntl.h>
#include <poll.h>
#include <vlc_common.h>
#include <vlc_access.h>
-#include <vlc_fs.h>
#include "v4l2.h"
@@ -54,7 +52,7 @@ struct access_sys_t
static block_t *AccessRead( access_t * );
static ssize_t AccessReadStream( access_t *, uint8_t *, size_t );
static int AccessControl( access_t *, int, va_list );
-static int InitVideo(access_t *, int);
+static int InitVideo(access_t *, int, uint32_t);
int AccessOpen( vlc_object_t *obj )
{
@@ -72,27 +70,15 @@ int AccessOpen( vlc_object_t *obj )
char *path = var_InheritString (obj, CFG_PREFIX"dev");
if (unlikely(path == NULL))
goto error; /* probably OOM */
- msg_Dbg (obj, "opening device '%s'", path);
- int rawfd = vlc_open (path, O_RDWR);
- if (rawfd == -1)
- {
- msg_Err (obj, "cannot open device '%s': %m", path);
- free (path);
- goto error;
- }
+ uint32_t caps;
+ int fd = OpenDevice (obj, path, &caps);
free (path);
-
- int fd = v4l2_fd_open (rawfd, 0);
if (fd == -1)
- {
- msg_Warn (obj, "cannot initialize user-space library: %m");
- /* fallback to direct kernel mode anyway */
- fd = rawfd;
- }
+ goto error;
sys->fd = fd;
- if (InitVideo (access, fd))
+ if (InitVideo (access, fd, caps))
{
v4l2_close (fd);
goto error;
@@ -106,34 +92,11 @@ error:
return VLC_EGENERIC;
}
-int InitVideo (access_t *access, int fd)
+int InitVideo (access_t *access, int fd, uint32_t caps)
{
access_sys_t *sys = access->p_sys;
- /* Get device capabilites */
- struct v4l2_capability cap;
- if (v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap) < 0)
- {
- msg_Err (access, "cannot get device capabilities: %m");
- return -1;
- }
-
- msg_Dbg (access, "device %s using driver %s (version %u.%u.%u) on %s",
- cap.card, cap.driver, (cap.version >> 16) & 0xFF,
- (cap.version >> 8) & 0xFF, cap.version & 0xFF, cap.bus_info);
- msg_Dbg (access, "the device has the capabilities: 0x%08X",
- cap.capabilities);
- msg_Dbg (access, " (%c) Video Capture, (%c) Audio, (%c) Tuner, (%c) Radio",
- (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE ? 'X':' '),
- (cap.capabilities & V4L2_CAP_AUDIO ? 'X':' '),
- (cap.capabilities & V4L2_CAP_TUNER ? 'X':' '),
- (cap.capabilities & V4L2_CAP_RADIO ? 'X':' '));
- msg_Dbg (access, " (%c) Read/Write, (%c) Streaming, (%c) Asynchronous",
- (cap.capabilities & V4L2_CAP_READWRITE ? 'X':' '),
- (cap.capabilities & V4L2_CAP_STREAMING ? 'X':' '),
- (cap.capabilities & V4L2_CAP_ASYNCIO ? 'X':' '));
-
- if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
+ if (!(caps & V4L2_CAP_VIDEO_CAPTURE))
{
msg_Err (access, "not a video capture device");
return -1;
@@ -178,7 +141,7 @@ int InitVideo (access_t *access, int fd)
}
/* Init I/O method */
- if (cap.capabilities & V4L2_CAP_STREAMING)
+ if (caps & V4L2_CAP_STREAMING)
{
sys->bufc = 4;
sys->bufv = StartMmap (VLC_OBJECT(access), fd, &sys->bufc);
@@ -186,7 +149,7 @@ int InitVideo (access_t *access, int fd)
return -1;
access->pf_block = AccessRead;
}
- else if (cap.capabilities & V4L2_CAP_READWRITE)
+ else if (caps & V4L2_CAP_READWRITE)
{
sys->blocksize = fmt.fmt.pix.sizeimage;
sys->bufv = NULL;
diff --git a/modules/access/v4l2/demux.c b/modules/access/v4l2/demux.c
index 987ad00..74c3a73 100644
--- a/modules/access/v4l2/demux.c
+++ b/modules/access/v4l2/demux.c
@@ -30,7 +30,6 @@
#include <math.h>
#include <errno.h>
#include <assert.h>
-#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#ifndef MAP_ANONYMOUS
@@ -40,7 +39,6 @@
#include <vlc_common.h>
#include <vlc_demux.h>
-#include <vlc_fs.h>
#include "v4l2.h"
@@ -65,7 +63,7 @@ static void *UserPtrThread (void *);
static void *MmapThread (void *);
static void *ReadThread (void *);
static int DemuxControl( demux_t *, int, va_list );
-static int InitVideo (demux_t *, int);
+static int InitVideo (demux_t *, int fd, uint32_t caps);
int DemuxOpen( vlc_object_t *obj )
{
@@ -81,27 +79,15 @@ int DemuxOpen( vlc_object_t *obj )
char *path = var_InheritString (obj, CFG_PREFIX"dev");
if (unlikely(path == NULL))
goto error; /* probably OOM */
- msg_Dbg (obj, "opening device '%s'", path);
- int rawfd = vlc_open (path, O_RDWR);
- if (rawfd == -1)
- {
- msg_Err (obj, "cannot open device '%s': %m", path);
- free (path);
- goto error;
- }
+ uint32_t caps;
+ int fd = OpenDevice (obj, path, &caps);
free (path);
-
- int fd = v4l2_fd_open (rawfd, 0);
if (fd == -1)
- {
- msg_Warn (obj, "cannot initialize user-space library: %m");
- /* fallback to direct kernel mode anyway */
- fd = rawfd;
- }
+ goto error;
sys->fd = fd;
- if (InitVideo (demux, fd))
+ if (InitVideo (demux, fd, caps))
{
v4l2_close (fd);
goto error;
@@ -275,37 +261,10 @@ static void GetAR (int fd, unsigned *restrict num, unsigned *restrict den)
*den = cropcap.pixelaspect.denominator;
}
-static int InitVideo (demux_t *demux, int fd)
+static int InitVideo (demux_t *demux, int fd, uint32_t caps)
{
demux_sys_t *sys = demux->p_sys;
- /* Get device capabilites */
- struct v4l2_capability cap;
- if (v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap) < 0)
- {
- msg_Err (demux, "cannot get device capabilities: %m");
- return -1;
- }
-
- msg_Dbg (demux, "device %s using driver %s (version %u.%u.%u) on %s",
- cap.card, cap.driver, (cap.version >> 16) & 0xFF,
- (cap.version >> 8) & 0xFF, cap.version & 0xFF, cap.bus_info);
-
- uint32_t caps;
-#ifdef V4L2_CAP_DEVICE_CAPS
- if (cap.capabilities & V4L2_CAP_DEVICE_CAPS)
- {
- msg_Dbg (demux, " with capabilities 0x%08"PRIX32" "
- "(overall 0x%08"PRIX32")", cap.device_caps, cap.capabilities);
- caps = cap.device_caps;
- }
- else
-#endif
- {
- msg_Dbg (demux, " with unknown capabilities "
- "(overall 0x%08"PRIX32")", cap.capabilities);
- caps = cap.capabilities;
- }
if (!(caps & V4L2_CAP_VIDEO_CAPTURE))
{
msg_Err (demux, "not a video capture device");
diff --git a/modules/access/v4l2/v4l2.c b/modules/access/v4l2/v4l2.c
index 14419bc..ec0c7d2 100644
--- a/modules/access/v4l2/v4l2.c
+++ b/modules/access/v4l2/v4l2.c
@@ -32,8 +32,12 @@
#include <string.h>
#include <assert.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
#include <vlc_common.h>
#include <vlc_plugin.h>
+#include <vlc_fs.h>
#include "v4l2.h"
@@ -440,6 +444,55 @@ void ParseMRL( vlc_object_t *obj, const char *mrl )
}
}
+int OpenDevice (vlc_object_t *obj, const char *path, uint32_t *restrict caps)
+{
+ msg_Dbg (obj, "opening device '%s'", path);
+
+ int rawfd = vlc_open (path, O_RDWR);
+ if (rawfd == -1)
+ {
+ msg_Err (obj, "cannot open device '%s': %m", path);
+ return -1;
+ }
+
+ int fd = v4l2_fd_open (rawfd, 0);
+ if (fd == -1)
+ {
+ msg_Warn (obj, "cannot initialize user-space library: %m");
+ /* fallback to direct kernel mode anyway */
+ fd = rawfd;
+ }
+
+ /* Get device capabilites */
+ struct v4l2_capability cap;
+ if (v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap) < 0)
+ {
+ msg_Err (obj, "cannot get device capabilities: %m");
+ v4l2_close (fd);
+ return -1;
+ }
+
+ msg_Dbg (obj, "device %s using driver %s (version %u.%u.%u) on %s",
+ cap.card, cap.driver, (cap.version >> 16) & 0xFF,
+ (cap.version >> 8) & 0xFF, cap.version & 0xFF, cap.bus_info);
+
+#ifdef V4L2_CAP_DEVICE_CAPS
+ if (cap.capabilities & V4L2_CAP_DEVICE_CAPS)
+ {
+ msg_Dbg (obj, " with capabilities 0x%08"PRIX32" "
+ "(overall 0x%08"PRIX32")", cap.device_caps, cap.capabilities);
+ *caps = cap.device_caps;
+ }
+ else
+#endif
+ {
+ msg_Dbg (obj, " with unknown capabilities "
+ "(overall 0x%08"PRIX32")", cap.capabilities);
+ *caps = cap.capabilities;
+ }
+ return fd;
+}
+
v4l2_std_id var_InheritStandard (vlc_object_t *obj, const char *varname)
{
char *name = var_InheritString (obj, varname);
diff --git a/modules/access/v4l2/v4l2.h b/modules/access/v4l2/v4l2.h
index d44c790..bdcacb6 100644
--- a/modules/access/v4l2/v4l2.h
+++ b/modules/access/v4l2/v4l2.h
@@ -79,6 +79,7 @@ struct buffer_t
/* v4l2.c */
void ParseMRL(vlc_object_t *, const char *);
+int OpenDevice (vlc_object_t *, const char *, uint32_t *);
v4l2_std_id var_InheritStandard (vlc_object_t *, const char *);
/* video.c */
More information about the vlc-commits
mailing list