vlc | branch: master | Rémi Denis-Courmont <[email protected]> | 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 */ _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
