Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
a66e3c1d
Commit
a66e3c1d
authored
Oct 22, 2008
by
Pavlov Konstantin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
video4linux2: Add libv4l2 support. Fixes #1804.
Based on patches by Nicolas Chauvet and Hans de Goede.
parent
1b1a6a4e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
113 additions
and
65 deletions
+113
-65
configure.ac
configure.ac
+14
-0
modules/access/v4l2/v4l2.c
modules/access/v4l2/v4l2.c
+99
-65
No files found.
configure.ac
View file @
a66e3c1d
...
@@ -2362,6 +2362,20 @@ then
...
@@ -2362,6 +2362,20 @@ then
CPPFLAGS="${CPPFLAGS_save}"
CPPFLAGS="${CPPFLAGS_save}"
fi
fi
dnl
dnl libv4l2 support for video4linux.
dnl
AC_ARG_ENABLE( libv4l2,
[ --enable-libv4l2 Libv4l2 Video4Linux2 support (default enabled)])
if test "${enable_libv4l2}" != "no" -a "${enable_v4l2}" != "no"
then
PKG_CHECK_MODULES( LIBV4L2, libv4l2, [
VLC_ADD_LDFLAGS([v4l2],[${LIBV4L2_LIBS}])
VLC_ADD_CFLAGS([v4l2],[${LIBV4L2_CFLAGS}])
AC_DEFINE(HAVE_LIBV4L2, 1, Define if libv4l is available)],
AC_MSG_WARN([LibV4L2 support disabled because libv4l2 development headers were not found])
)
fi
dnl
dnl
dnl special access module for Hauppauge PVR cards
dnl special access module for Hauppauge PVR cards
...
...
modules/access/v4l2/v4l2.c
View file @
a66e3c1d
...
@@ -67,6 +67,18 @@
...
@@ -67,6 +67,18 @@
#include <poll.h>
#include <poll.h>
#ifdef HAVE_LIBV4L2
# include <libv4l2.h>
#else
# define v4l2_fd_open(fd, flags) (fd)
# define v4l2_close close
# define v4l2_dup dup
# define v4l2_ioctl ioctl
# define v4l2_read read
# define v4l2_mmap mmap
# define v4l2_munmap munmap
#endif
/*****************************************************************************
/*****************************************************************************
* Module descriptior
* Module descriptior
*****************************************************************************/
*****************************************************************************/
...
@@ -1108,11 +1120,11 @@ static void DemuxClose( vlc_object_t *p_this )
...
@@ -1108,11 +1120,11 @@ static void DemuxClose( vlc_object_t *p_this )
buf
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
buf
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
buf
.
memory
=
(
p_sys
->
io
==
IO_METHOD_USERPTR
)
?
buf
.
memory
=
(
p_sys
->
io
==
IO_METHOD_USERPTR
)
?
V4L2_MEMORY_USERPTR
:
V4L2_MEMORY_MMAP
;
V4L2_MEMORY_USERPTR
:
V4L2_MEMORY_MMAP
;
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_DQBUF
,
&
buf
);
/* ignore result */
v4l2_
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_DQBUF
,
&
buf
);
/* ignore result */
}
}
buf_type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
buf_type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_STREAMOFF
,
&
buf_type
)
<
0
)
{
if
(
v4l2_
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_STREAMOFF
,
&
buf_type
)
<
0
)
{
msg_Err
(
p_this
,
"VIDIOC_STREAMOFF failed"
);
msg_Err
(
p_this
,
"VIDIOC_STREAMOFF failed"
);
}
}
...
@@ -1131,7 +1143,7 @@ static void DemuxClose( vlc_object_t *p_this )
...
@@ -1131,7 +1143,7 @@ static void DemuxClose( vlc_object_t *p_this )
case
IO_METHOD_MMAP
:
case
IO_METHOD_MMAP
:
for
(
i
=
0
;
i
<
p_sys
->
i_nbuffers
;
++
i
)
for
(
i
=
0
;
i
<
p_sys
->
i_nbuffers
;
++
i
)
{
{
if
(
munmap
(
p_sys
->
p_buffers
[
i
].
start
,
p_sys
->
p_buffers
[
i
].
length
)
)
if
(
v4l2_
munmap
(
p_sys
->
p_buffers
[
i
].
start
,
p_sys
->
p_buffers
[
i
].
length
)
)
{
{
msg_Err
(
p_this
,
"munmap failed"
);
msg_Err
(
p_this
,
"munmap failed"
);
}
}
...
@@ -1155,7 +1167,7 @@ static void CommonClose( vlc_object_t *p_this, demux_sys_t *p_sys )
...
@@ -1155,7 +1167,7 @@ static void CommonClose( vlc_object_t *p_this, demux_sys_t *p_sys )
{
{
(
void
)
p_this
;
(
void
)
p_this
;
/* Close */
/* Close */
if
(
p_sys
->
i_fd_video
>=
0
)
close
(
p_sys
->
i_fd_video
);
if
(
p_sys
->
i_fd_video
>=
0
)
v4l2_
close
(
p_sys
->
i_fd_video
);
#ifdef HAVE_ALSA
#ifdef HAVE_ALSA
if
(
p_sys
->
p_alsa_pcm
)
if
(
p_sys
->
p_alsa_pcm
)
{
{
...
@@ -1350,7 +1362,7 @@ static ssize_t AccessRead( access_t * p_access, uint8_t * p_buffer, size_t i_len
...
@@ -1350,7 +1362,7 @@ static ssize_t AccessRead( access_t * p_access, uint8_t * p_buffer, size_t i_len
return
-
1
;
return
-
1
;
}
}
i_ret
=
read
(
p_sys
->
i_fd_video
,
p_buffer
,
i_len
);
i_ret
=
v4l2_
read
(
p_sys
->
i_fd_video
,
p_buffer
,
i_len
);
if
(
i_ret
==
0
)
if
(
i_ret
==
0
)
{
{
p_access
->
info
.
b_eof
=
true
;
p_access
->
info
.
b_eof
=
true
;
...
@@ -1419,7 +1431,7 @@ static block_t* GrabVideo( demux_t *p_demux )
...
@@ -1419,7 +1431,7 @@ static block_t* GrabVideo( demux_t *p_demux )
switch
(
p_sys
->
io
)
switch
(
p_sys
->
io
)
{
{
case
IO_METHOD_READ
:
case
IO_METHOD_READ
:
i_ret
=
read
(
p_sys
->
i_fd_video
,
p_sys
->
p_buffers
[
0
].
start
,
p_sys
->
p_buffers
[
0
].
length
);
i_ret
=
v4l2_
read
(
p_sys
->
i_fd_video
,
p_sys
->
p_buffers
[
0
].
start
,
p_sys
->
p_buffers
[
0
].
length
);
if
(
i_ret
==
-
1
)
if
(
i_ret
==
-
1
)
{
{
switch
(
errno
)
switch
(
errno
)
...
@@ -1446,7 +1458,7 @@ static block_t* GrabVideo( demux_t *p_demux )
...
@@ -1446,7 +1458,7 @@ static block_t* GrabVideo( demux_t *p_demux )
buf
.
memory
=
V4L2_MEMORY_MMAP
;
buf
.
memory
=
V4L2_MEMORY_MMAP
;
/* Wait for next frame */
/* Wait for next frame */
if
(
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_DQBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_DQBUF
,
&
buf
)
<
0
)
{
{
switch
(
errno
)
switch
(
errno
)
{
{
...
@@ -1470,7 +1482,7 @@ static block_t* GrabVideo( demux_t *p_demux )
...
@@ -1470,7 +1482,7 @@ static block_t* GrabVideo( demux_t *p_demux )
if
(
!
p_block
)
return
0
;
if
(
!
p_block
)
return
0
;
/* Unlock */
/* Unlock */
if
(
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
{
{
msg_Err
(
p_demux
,
"Failed to unlock (VIDIOC_QBUF)"
);
msg_Err
(
p_demux
,
"Failed to unlock (VIDIOC_QBUF)"
);
block_Release
(
p_block
);
block_Release
(
p_block
);
...
@@ -1485,7 +1497,7 @@ static block_t* GrabVideo( demux_t *p_demux )
...
@@ -1485,7 +1497,7 @@ static block_t* GrabVideo( demux_t *p_demux )
buf
.
memory
=
V4L2_MEMORY_USERPTR
;
buf
.
memory
=
V4L2_MEMORY_USERPTR
;
/* Wait for next frame */
/* Wait for next frame */
if
(
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_DQBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_DQBUF
,
&
buf
)
<
0
)
{
{
switch
(
errno
)
switch
(
errno
)
{
{
...
@@ -1518,7 +1530,7 @@ static block_t* GrabVideo( demux_t *p_demux )
...
@@ -1518,7 +1530,7 @@ static block_t* GrabVideo( demux_t *p_demux )
if
(
!
p_block
)
return
0
;
if
(
!
p_block
)
return
0
;
/* Unlock */
/* Unlock */
if
(
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
p_sys
->
i_fd_video
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
{
{
msg_Err
(
p_demux
,
"Failed to unlock (VIDIOC_QBUF)"
);
msg_Err
(
p_demux
,
"Failed to unlock (VIDIOC_QBUF)"
);
block_Release
(
p_block
);
block_Release
(
p_block
);
...
@@ -1703,7 +1715,7 @@ static int InitMmap( demux_t *p_demux, int i_fd )
...
@@ -1703,7 +1715,7 @@ static int InitMmap( demux_t *p_demux, int i_fd )
req
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
req
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
req
.
memory
=
V4L2_MEMORY_MMAP
;
req
.
memory
=
V4L2_MEMORY_MMAP
;
if
(
ioctl
(
i_fd
,
VIDIOC_REQBUFS
,
&
req
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_REQBUFS
,
&
req
)
<
0
)
{
{
msg_Err
(
p_demux
,
"device does not support mmap i/o"
);
msg_Err
(
p_demux
,
"device does not support mmap i/o"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1728,7 +1740,7 @@ static int InitMmap( demux_t *p_demux, int i_fd )
...
@@ -1728,7 +1740,7 @@ static int InitMmap( demux_t *p_demux, int i_fd )
buf
.
memory
=
V4L2_MEMORY_MMAP
;
buf
.
memory
=
V4L2_MEMORY_MMAP
;
buf
.
index
=
p_sys
->
i_nbuffers
;
buf
.
index
=
p_sys
->
i_nbuffers
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYBUF
,
&
buf
)
<
0
)
{
{
msg_Err
(
p_demux
,
"VIDIOC_QUERYBUF"
);
msg_Err
(
p_demux
,
"VIDIOC_QUERYBUF"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1736,7 +1748,7 @@ static int InitMmap( demux_t *p_demux, int i_fd )
...
@@ -1736,7 +1748,7 @@ static int InitMmap( demux_t *p_demux, int i_fd )
p_sys
->
p_buffers
[
p_sys
->
i_nbuffers
].
length
=
buf
.
length
;
p_sys
->
p_buffers
[
p_sys
->
i_nbuffers
].
length
=
buf
.
length
;
p_sys
->
p_buffers
[
p_sys
->
i_nbuffers
].
start
=
p_sys
->
p_buffers
[
p_sys
->
i_nbuffers
].
start
=
mmap
(
NULL
,
buf
.
length
,
PROT_READ
|
PROT_WRITE
,
MAP_SHARED
,
i_fd
,
buf
.
m
.
offset
);
v4l2_
mmap
(
NULL
,
buf
.
length
,
PROT_READ
|
PROT_WRITE
,
MAP_SHARED
,
i_fd
,
buf
.
m
.
offset
);
if
(
p_sys
->
p_buffers
[
p_sys
->
i_nbuffers
].
start
==
MAP_FAILED
)
if
(
p_sys
->
p_buffers
[
p_sys
->
i_nbuffers
].
start
==
MAP_FAILED
)
{
{
...
@@ -1769,7 +1781,7 @@ static int InitUserP( demux_t *p_demux, int i_fd, unsigned int i_buffer_size )
...
@@ -1769,7 +1781,7 @@ static int InitUserP( demux_t *p_demux, int i_fd, unsigned int i_buffer_size )
req
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
req
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
req
.
memory
=
V4L2_MEMORY_USERPTR
;
req
.
memory
=
V4L2_MEMORY_USERPTR
;
if
(
ioctl
(
i_fd
,
VIDIOC_REQBUFS
,
&
req
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_REQBUFS
,
&
req
)
<
0
)
{
{
msg_Err
(
p_demux
,
"device does not support user pointer i/o"
);
msg_Err
(
p_demux
,
"device does not support user pointer i/o"
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
...
@@ -1825,6 +1837,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1825,6 +1837,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
enum
v4l2_buf_type
buf_type
;
enum
v4l2_buf_type
buf_type
;
char
*
psz_device
=
p_sys
->
psz_vdev
;
char
*
psz_device
=
p_sys
->
psz_vdev
;
es_format_t
es_fmt
;
es_format_t
es_fmt
;
int
libv4l2_fd
;
if
(
(
i_fd
=
open
(
psz_device
,
O_RDWR
)
)
<
0
)
if
(
(
i_fd
=
open
(
psz_device
,
O_RDWR
)
)
<
0
)
{
{
...
@@ -1832,6 +1845,16 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1832,6 +1845,16 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
goto
open_failed
;
goto
open_failed
;
}
}
/* 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. */
libv4l2_fd
=
v4l2_fd_open
(
i_fd
,
V4L2_ENABLE_ENUM_FMT_EMULATION
);
if
(
libv4l2_fd
!=
-
1
)
i_fd
=
libv4l2_fd
;
/* Tune the tuner */
/* Tune the tuner */
if
(
p_sys
->
i_frequency
>=
0
)
if
(
p_sys
->
i_frequency
>=
0
)
{
{
...
@@ -1845,7 +1868,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1845,7 +1868,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
frequency
.
tuner
=
p_sys
->
i_cur_tuner
;
frequency
.
tuner
=
p_sys
->
i_cur_tuner
;
frequency
.
type
=
p_sys
->
p_tuners
[
p_sys
->
i_cur_tuner
].
type
;
frequency
.
type
=
p_sys
->
p_tuners
[
p_sys
->
i_cur_tuner
].
type
;
frequency
.
frequency
=
p_sys
->
i_frequency
/
62
.
5
;
frequency
.
frequency
=
p_sys
->
i_frequency
/
62
.
5
;
if
(
ioctl
(
i_fd
,
VIDIOC_S_FREQUENCY
,
&
frequency
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_FREQUENCY
,
&
frequency
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot set tuner frequency (%m)"
);
msg_Err
(
p_obj
,
"cannot set tuner frequency (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1865,7 +1888,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1865,7 +1888,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
memset
(
&
tuner
,
0
,
sizeof
(
tuner
)
);
memset
(
&
tuner
,
0
,
sizeof
(
tuner
)
);
tuner
.
index
=
p_sys
->
i_cur_tuner
;
tuner
.
index
=
p_sys
->
i_cur_tuner
;
tuner
.
audmode
=
p_sys
->
i_audio_mode
;
tuner
.
audmode
=
p_sys
->
i_audio_mode
;
if
(
ioctl
(
i_fd
,
VIDIOC_S_TUNER
,
&
tuner
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_TUNER
,
&
tuner
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot set tuner audio mode (%m)"
);
msg_Err
(
p_obj
,
"cannot set tuner audio mode (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1877,7 +1900,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1877,7 +1900,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
if
(
p_sys
->
i_selected_standard_id
!=
V4L2_STD_UNKNOWN
)
if
(
p_sys
->
i_selected_standard_id
!=
V4L2_STD_UNKNOWN
)
{
{
if
(
ioctl
(
i_fd
,
VIDIOC_S_STD
,
&
p_sys
->
i_selected_standard_id
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_STD
,
&
p_sys
->
i_selected_standard_id
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot set standard (%m)"
);
msg_Err
(
p_obj
,
"cannot set standard (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1893,7 +1916,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1893,7 +1916,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
p_sys
->
i_selected_input
=
0
;
p_sys
->
i_selected_input
=
0
;
}
}
if
(
ioctl
(
i_fd
,
VIDIOC_S_INPUT
,
&
p_sys
->
i_selected_input
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_INPUT
,
&
p_sys
->
i_selected_input
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot set input (%m)"
);
msg_Err
(
p_obj
,
"cannot set input (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1910,7 +1933,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1910,7 +1933,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
p_sys
->
i_selected_audio_input
=
0
;
p_sys
->
i_selected_audio_input
=
0
;
}
}
if
(
ioctl
(
i_fd
,
VIDIOC_S_AUDIO
,
&
p_sys
->
p_audios
[
p_sys
->
i_selected_audio_input
]
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_AUDIO
,
&
p_sys
->
p_audios
[
p_sys
->
i_selected_audio_input
]
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot set audio input (%m)"
);
msg_Err
(
p_obj
,
"cannot set audio input (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -1959,11 +1982,11 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1959,11 +1982,11 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
/* Reset Cropping */
/* Reset Cropping */
memset
(
&
cropcap
,
0
,
sizeof
(
cropcap
)
);
memset
(
&
cropcap
,
0
,
sizeof
(
cropcap
)
);
cropcap
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
cropcap
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
ioctl
(
i_fd
,
VIDIOC_CROPCAP
,
&
cropcap
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_CROPCAP
,
&
cropcap
)
>=
0
)
{
{
crop
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
crop
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
crop
.
c
=
cropcap
.
defrect
;
/* reset to default */
crop
.
c
=
cropcap
.
defrect
;
/* reset to default */
if
(
ioctl
(
i_fd
,
VIDIOC_S_CROP
,
&
crop
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_CROP
,
&
crop
)
<
0
)
{
{
switch
(
errno
)
switch
(
errno
)
{
{
...
@@ -1983,7 +2006,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -1983,7 +2006,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
if
(
p_sys
->
i_width
<=
0
||
p_sys
->
i_height
<=
0
)
if
(
p_sys
->
i_width
<=
0
||
p_sys
->
i_height
<=
0
)
{
{
if
(
ioctl
(
i_fd
,
VIDIOC_G_FMT
,
&
fmt
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_FMT
,
&
fmt
)
<
0
)
{
{
msg_Err
(
p_demux
,
"Cannot get default width and height."
);
msg_Err
(
p_demux
,
"Cannot get default width and height."
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2026,7 +2049,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2026,7 +2049,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
}
}
}
}
/* Try and set user chroma */
/* Try and set user chroma */
if
(
!
IsPixelFormatSupported
(
p_demux
,
fmt
.
fmt
.
pix
.
pixelformat
)
||
(
fmt
.
fmt
.
pix
.
pixelformat
&&
ioctl
(
i_fd
,
VIDIOC_S_FMT
,
&
fmt
)
<
0
)
)
if
(
!
IsPixelFormatSupported
(
p_demux
,
fmt
.
fmt
.
pix
.
pixelformat
)
||
(
fmt
.
fmt
.
pix
.
pixelformat
&&
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_FMT
,
&
fmt
)
<
0
)
)
{
{
msg_Warn
(
p_demux
,
"Driver is unable to use specified chroma %s. Trying defaults."
,
p_sys
->
psz_requested_chroma
);
msg_Warn
(
p_demux
,
"Driver is unable to use specified chroma %s. Trying defaults."
,
p_sys
->
psz_requested_chroma
);
fmt
.
fmt
.
pix
.
pixelformat
=
0
;
fmt
.
fmt
.
pix
.
pixelformat
=
0
;
...
@@ -2042,7 +2065,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2042,7 +2065,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
{
{
fmt
.
fmt
.
pix
.
pixelformat
=
p_chroma_fallbacks
[
i
];
fmt
.
fmt
.
pix
.
pixelformat
=
p_chroma_fallbacks
[
i
];
if
(
IsPixelFormatSupported
(
p_demux
,
fmt
.
fmt
.
pix
.
pixelformat
)
if
(
IsPixelFormatSupported
(
p_demux
,
fmt
.
fmt
.
pix
.
pixelformat
)
&&
ioctl
(
i_fd
,
VIDIOC_S_FMT
,
&
fmt
)
>=
0
)
&&
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_FMT
,
&
fmt
)
>=
0
)
break
;
break
;
}
}
if
(
i
==
ARRAY_SIZE
(
p_chroma_fallbacks
)
)
if
(
i
==
ARRAY_SIZE
(
p_chroma_fallbacks
)
)
...
@@ -2087,7 +2110,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2087,7 +2110,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
frmival
.
pixel_format
=
fmt
.
fmt
.
pix
.
pixelformat
;
frmival
.
pixel_format
=
fmt
.
fmt
.
pix
.
pixelformat
;
frmival
.
width
=
p_sys
->
i_width
;
frmival
.
width
=
p_sys
->
i_width
;
frmival
.
height
=
p_sys
->
i_height
;
frmival
.
height
=
p_sys
->
i_height
;
if
(
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMEINTERVALS
,
&
frmival
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMEINTERVALS
,
&
frmival
)
>=
0
)
{
{
char
psz_fourcc
[
5
];
char
psz_fourcc
[
5
];
memset
(
&
psz_fourcc
,
0
,
sizeof
(
psz_fourcc
)
);
memset
(
&
psz_fourcc
,
0
,
sizeof
(
psz_fourcc
)
);
...
@@ -2103,7 +2126,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2103,7 +2126,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
frmival
.
discrete
.
numerator
,
frmival
.
discrete
.
numerator
,
frmival
.
discrete
.
denominator
);
frmival
.
discrete
.
denominator
);
frmival
.
index
++
;
frmival
.
index
++
;
}
while
(
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMEINTERVALS
,
&
frmival
)
>=
0
);
}
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMEINTERVALS
,
&
frmival
)
>=
0
);
break
;
break
;
case
V4L2_FRMIVAL_TYPE_STEPWISE
:
case
V4L2_FRMIVAL_TYPE_STEPWISE
:
msg_Dbg
(
p_demux
,
" supported frame intervals: %d/%d to "
msg_Dbg
(
p_demux
,
" supported frame intervals: %d/%d to "
...
@@ -2170,7 +2193,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2170,7 +2193,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
buf
.
memory
=
V4L2_MEMORY_MMAP
;
buf
.
memory
=
V4L2_MEMORY_MMAP
;
buf
.
index
=
i
;
buf
.
index
=
i
;
if
(
ioctl
(
i_fd
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
{
{
msg_Err
(
p_demux
,
"VIDIOC_QBUF failed"
);
msg_Err
(
p_demux
,
"VIDIOC_QBUF failed"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2178,7 +2201,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2178,7 +2201,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
}
}
buf_type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
buf_type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
ioctl
(
i_fd
,
VIDIOC_STREAMON
,
&
buf_type
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_STREAMON
,
&
buf_type
)
<
0
)
{
{
msg_Err
(
p_demux
,
"VIDIOC_STREAMON failed"
);
msg_Err
(
p_demux
,
"VIDIOC_STREAMON failed"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2198,7 +2221,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2198,7 +2221,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
buf
.
m
.
userptr
=
(
unsigned
long
)
p_sys
->
p_buffers
[
i
].
start
;
buf
.
m
.
userptr
=
(
unsigned
long
)
p_sys
->
p_buffers
[
i
].
start
;
buf
.
length
=
p_sys
->
p_buffers
[
i
].
length
;
buf
.
length
=
p_sys
->
p_buffers
[
i
].
length
;
if
(
ioctl
(
i_fd
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QBUF
,
&
buf
)
<
0
)
{
{
msg_Err
(
p_demux
,
"VIDIOC_QBUF failed"
);
msg_Err
(
p_demux
,
"VIDIOC_QBUF failed"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2206,7 +2229,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2206,7 +2229,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
}
}
buf_type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
buf_type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
ioctl
(
i_fd
,
VIDIOC_STREAMON
,
&
buf_type
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_STREAMON
,
&
buf_type
)
<
0
)
{
{
msg_Err
(
p_demux
,
"VIDIOC_STREAMON failed"
);
msg_Err
(
p_demux
,
"VIDIOC_STREAMON failed"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2224,7 +2247,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
...
@@ -2224,7 +2247,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
return
i_fd
;
return
i_fd
;
open_failed:
open_failed:
if
(
i_fd
>=
0
)
close
(
i_fd
);
if
(
i_fd
>=
0
)
v4l2_
close
(
i_fd
);
return
-
1
;
return
-
1
;
}
}
...
@@ -2543,6 +2566,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2543,6 +2566,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
int
i_standard
;
int
i_standard
;
int
i_fd
;
int
i_fd
;
int
libv4l2_fd
;
if
(
(
i_fd
=
open
(
psz_device
,
O_RDWR
)
)
<
0
)
if
(
(
i_fd
=
open
(
psz_device
,
O_RDWR
)
)
<
0
)
{
{
...
@@ -2550,9 +2574,19 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2550,9 +2574,19 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
goto
open_failed
;
goto
open_failed
;
}
}
/* 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. */
libv4l2_fd
=
v4l2_fd_open
(
i_fd
,
V4L2_ENABLE_ENUM_FMT_EMULATION
);
if
(
libv4l2_fd
!=
-
1
)
i_fd
=
libv4l2_fd
;
/* Get device capabilites */
/* Get device capabilites */
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCAP
,
&
p_sys
->
dev_cap
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCAP
,
&
p_sys
->
dev_cap
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot get video capabilities (%m)"
);
msg_Err
(
p_obj
,
"cannot get video capabilities (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2588,7 +2622,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2588,7 +2622,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
{
{
struct
v4l2_input
t_input
;
struct
v4l2_input
t_input
;
t_input
.
index
=
0
;
t_input
.
index
=
0
;
while
(
ioctl
(
i_fd
,
VIDIOC_ENUMINPUT
,
&
t_input
)
>=
0
)
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUMINPUT
,
&
t_input
)
>=
0
)
{
{
p_sys
->
i_input
++
;
p_sys
->
i_input
++
;
t_input
.
index
=
p_sys
->
i_input
;
t_input
.
index
=
p_sys
->
i_input
;
...
@@ -2601,7 +2635,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2601,7 +2635,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
{
{
p_sys
->
p_inputs
[
i_index
].
index
=
i_index
;
p_sys
->
p_inputs
[
i_index
].
index
=
i_index
;
if
(
ioctl
(
i_fd
,
VIDIOC_ENUMINPUT
,
&
p_sys
->
p_inputs
[
i_index
]
)
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUMINPUT
,
&
p_sys
->
p_inputs
[
i_index
]
)
)
{
{
msg_Err
(
p_obj
,
"cannot get video input characteristics (%m)"
);
msg_Err
(
p_obj
,
"cannot get video input characteristics (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2622,7 +2656,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2622,7 +2656,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
{
{
struct
v4l2_standard
t_standards
;
struct
v4l2_standard
t_standards
;
t_standards
.
index
=
0
;
t_standards
.
index
=
0
;
while
(
ioctl
(
i_fd
,
VIDIOC_ENUMSTD
,
&
t_standards
)
>=
0
)
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUMSTD
,
&
t_standards
)
>=
0
)
{
{
p_sys
->
i_standard
++
;
p_sys
->
i_standard
++
;
t_standards
.
index
=
p_sys
->
i_standard
;
t_standards
.
index
=
p_sys
->
i_standard
;
...
@@ -2635,7 +2669,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2635,7 +2669,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
{
{
p_sys
->
p_standards
[
i_standard
].
index
=
i_standard
;
p_sys
->
p_standards
[
i_standard
].
index
=
i_standard
;
if
(
ioctl
(
i_fd
,
VIDIOC_ENUMSTD
,
&
p_sys
->
p_standards
[
i_standard
]
)
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUMSTD
,
&
p_sys
->
p_standards
[
i_standard
]
)
)
{
{
msg_Err
(
p_obj
,
"cannot get video input standards (%m)"
);
msg_Err
(
p_obj
,
"cannot get video input standards (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2657,9 +2691,9 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2657,9 +2691,9 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
if
(
p_sys
->
dev_cap
.
capabilities
&
V4L2_CAP_AUDIO
)
if
(
p_sys
->
dev_cap
.
capabilities
&
V4L2_CAP_AUDIO
)
{
{
while
(
p_sys
->
i_audio
<
32
&&
while
(
p_sys
->
i_audio
<
32
&&
ioctl
(
i_fd
,
VIDIOC_S_AUDIO
,
&
p_sys
->
p_audios
[
p_sys
->
i_audio
]
)
>=
0
)
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_AUDIO
,
&
p_sys
->
p_audios
[
p_sys
->
i_audio
]
)
>=
0
)
{
{
if
(
ioctl
(
i_fd
,
VIDIOC_G_AUDIO
,
&
p_sys
->
p_audios
[
p_sys
->
i_audio
]
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_AUDIO
,
&
p_sys
->
p_audios
[
p_sys
->
i_audio
]
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot get audio input characteristics (%m)"
);
msg_Err
(
p_obj
,
"cannot get audio input characteristics (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2685,7 +2719,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2685,7 +2719,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
{
{
struct
v4l2_tuner
tuner
;
struct
v4l2_tuner
tuner
;
memset
(
&
tuner
,
0
,
sizeof
(
tuner
)
);
memset
(
&
tuner
,
0
,
sizeof
(
tuner
)
);
while
(
ioctl
(
i_fd
,
VIDIOC_G_TUNER
,
&
tuner
)
>=
0
)
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_TUNER
,
&
tuner
)
>=
0
)
{
{
p_sys
->
i_tuner
++
;
p_sys
->
i_tuner
++
;
memset
(
&
tuner
,
0
,
sizeof
(
tuner
)
);
memset
(
&
tuner
,
0
,
sizeof
(
tuner
)
);
...
@@ -2699,7 +2733,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2699,7 +2733,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
{
{
p_sys
->
p_tuners
[
i_index
].
index
=
i_index
;
p_sys
->
p_tuners
[
i_index
].
index
=
i_index
;
if
(
ioctl
(
i_fd
,
VIDIOC_G_TUNER
,
&
p_sys
->
p_tuners
[
i_index
]
)
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_TUNER
,
&
p_sys
->
p_tuners
[
i_index
]
)
)
{
{
msg_Err
(
p_obj
,
"cannot get tuner characteristics (%m)"
);
msg_Err
(
p_obj
,
"cannot get tuner characteristics (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2722,7 +2756,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2722,7 +2756,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
struct
v4l2_frequency
frequency
;
struct
v4l2_frequency
frequency
;
memset
(
&
frequency
,
0
,
sizeof
(
frequency
)
);
memset
(
&
frequency
,
0
,
sizeof
(
frequency
)
);
if
(
ioctl
(
i_fd
,
VIDIOC_G_FREQUENCY
,
&
frequency
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_FREQUENCY
,
&
frequency
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot get tuner frequency (%m)"
);
msg_Err
(
p_obj
,
"cannot get tuner frequency (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2747,7 +2781,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2747,7 +2781,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
codec
.
index
=
i_index
;
codec
.
index
=
i_index
;
codec
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
codec
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
while
(
ioctl
(
i_fd
,
VIDIOC_ENUM_FMT
,
&
codec
)
>=
0
)
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUM_FMT
,
&
codec
)
>=
0
)
{
{
i_index
++
;
i_index
++
;
codec
.
index
=
i_index
;
codec
.
index
=
i_index
;
...
@@ -2762,7 +2796,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2762,7 +2796,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
p_sys
->
p_codecs
[
i_index
].
index
=
i_index
;
p_sys
->
p_codecs
[
i_index
].
index
=
i_index
;
p_sys
->
p_codecs
[
i_index
].
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
p_sys
->
p_codecs
[
i_index
].
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
ioctl
(
i_fd
,
VIDIOC_ENUM_FMT
,
&
p_sys
->
p_codecs
[
i_index
]
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUM_FMT
,
&
p_sys
->
p_codecs
[
i_index
]
)
<
0
)
{
{
msg_Err
(
p_obj
,
"cannot get codec description (%m)"
);
msg_Err
(
p_obj
,
"cannot get codec description (%m)"
);
goto
open_failed
;
goto
open_failed
;
...
@@ -2795,7 +2829,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2795,7 +2829,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
struct
v4l2_frmsizeenum
frmsize
;
struct
v4l2_frmsizeenum
frmsize
;
frmsize
.
index
=
0
;
frmsize
.
index
=
0
;
frmsize
.
pixel_format
=
p_sys
->
p_codecs
[
i_index
].
pixelformat
;
frmsize
.
pixel_format
=
p_sys
->
p_codecs
[
i_index
].
pixelformat
;
if
(
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMESIZES
,
&
frmsize
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMESIZES
,
&
frmsize
)
<
0
)
{
{
/* Not all devices support this ioctl */
/* Not all devices support this ioctl */
msg_Warn
(
p_obj
,
"Unable to query for frame sizes"
);
msg_Warn
(
p_obj
,
"Unable to query for frame sizes"
);
...
@@ -2811,7 +2845,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2811,7 +2845,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
" device supports size %dx%d"
,
" device supports size %dx%d"
,
frmsize
.
discrete
.
width
,
frmsize
.
discrete
.
height
);
frmsize
.
discrete
.
width
,
frmsize
.
discrete
.
height
);
frmsize
.
index
++
;
frmsize
.
index
++
;
}
while
(
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMESIZES
,
&
frmsize
)
>=
0
);
}
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_ENUM_FRAMESIZES
,
&
frmsize
)
>=
0
);
break
;
break
;
case
V4L2_FRMSIZE_TYPE_STEPWISE
:
case
V4L2_FRMSIZE_TYPE_STEPWISE
:
msg_Dbg
(
p_obj
,
msg_Dbg
(
p_obj
,
...
@@ -2843,12 +2877,12 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
...
@@ -2843,12 +2877,12 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys,
}
}
if
(
i_fd
>=
0
)
close
(
i_fd
);
if
(
i_fd
>=
0
)
v4l2_
close
(
i_fd
);
return
true
;
return
true
;
open_failed:
open_failed:
if
(
i_fd
>=
0
)
close
(
i_fd
);
if
(
i_fd
>=
0
)
v4l2_
close
(
i_fd
);
return
false
;
return
false
;
}
}
...
@@ -3014,7 +3048,7 @@ static void ControlListPrint( vlc_object_t *p_obj, int i_fd,
...
@@ -3014,7 +3048,7 @@ static void ControlListPrint( vlc_object_t *p_obj, int i_fd,
{
{
querymenu
.
index
=
i_mid
;
querymenu
.
index
=
i_mid
;
querymenu
.
id
=
queryctrl
.
id
;
querymenu
.
id
=
queryctrl
.
id
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYMENU
,
&
querymenu
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYMENU
,
&
querymenu
)
>=
0
)
{
{
msg_Dbg
(
p_obj
,
" %d: %s"
,
msg_Dbg
(
p_obj
,
" %d: %s"
,
querymenu
.
index
,
querymenu
.
name
);
querymenu
.
index
,
querymenu
.
name
);
...
@@ -3051,7 +3085,7 @@ static void ControlListPrint( vlc_object_t *p_obj, int i_fd,
...
@@ -3051,7 +3085,7 @@ static void ControlListPrint( vlc_object_t *p_obj, int i_fd,
queryctrl
.
default_value
);
queryctrl
.
default_value
);
memset
(
&
control
,
0
,
sizeof
(
control
)
);
memset
(
&
control
,
0
,
sizeof
(
control
)
);
control
.
id
=
queryctrl
.
id
;
control
.
id
=
queryctrl
.
id
;
if
(
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
)
{
{
msg_Dbg
(
p_obj
,
" current value: %d"
,
control
.
value
);
msg_Dbg
(
p_obj
,
" current value: %d"
,
control
.
value
);
}
}
...
@@ -3148,13 +3182,13 @@ static int ControlList( vlc_object_t *p_obj, int i_fd,
...
@@ -3148,13 +3182,13 @@ static int ControlList( vlc_object_t *p_obj, int i_fd,
var_AddCallback
(
p_obj
,
"controls-reset"
,
AccessControlResetCallback
,
NULL
);
var_AddCallback
(
p_obj
,
"controls-reset"
,
AccessControlResetCallback
,
NULL
);
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
msg_Dbg
(
p_obj
,
"Extended control API supported by v4l2 driver"
);
msg_Dbg
(
p_obj
,
"Extended control API supported by v4l2 driver"
);
/* List extended controls */
/* List extended controls */
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
while
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
if
(
queryctrl
.
type
==
V4L2_CTRL_TYPE_CTRL_CLASS
)
if
(
queryctrl
.
type
==
V4L2_CTRL_TYPE_CTRL_CLASS
)
{
{
...
@@ -3192,7 +3226,7 @@ static int ControlList( vlc_object_t *p_obj, int i_fd,
...
@@ -3192,7 +3226,7 @@ static int ControlList( vlc_object_t *p_obj, int i_fd,
i_cid
++
)
i_cid
++
)
{
{
queryctrl
.
id
=
i_cid
;
queryctrl
.
id
=
i_cid
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
continue
;
continue
;
...
@@ -3208,7 +3242,7 @@ static int ControlList( vlc_object_t *p_obj, int i_fd,
...
@@ -3208,7 +3242,7 @@ static int ControlList( vlc_object_t *p_obj, int i_fd,
i_cid
++
)
i_cid
++
)
{
{
queryctrl
.
id
=
i_cid
;
queryctrl
.
id
=
i_cid
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
continue
;
continue
;
...
@@ -3307,11 +3341,11 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
...
@@ -3307,11 +3341,11 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
memset
(
&
queryctrl
,
0
,
sizeof
(
queryctrl
)
);
memset
(
&
queryctrl
,
0
,
sizeof
(
queryctrl
)
);
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
/* Extended control API supported */
/* Extended control API supported */
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
queryctrl
.
id
=
V4L2_CTRL_FLAG_NEXT_CTRL
;
while
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
while
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
if
(
queryctrl
.
type
==
V4L2_CTRL_TYPE_CTRL_CLASS
if
(
queryctrl
.
type
==
V4L2_CTRL_TYPE_CTRL_CLASS
||
V4L2_CTRL_ID2CLASS
(
queryctrl
.
id
)
==
V4L2_CTRL_CLASS_MPEG
)
||
V4L2_CTRL_ID2CLASS
(
queryctrl
.
id
)
==
V4L2_CTRL_CLASS_MPEG
)
...
@@ -3322,7 +3356,7 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
...
@@ -3322,7 +3356,7 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
struct
v4l2_control
control
;
struct
v4l2_control
control
;
memset
(
&
control
,
0
,
sizeof
(
control
)
);
memset
(
&
control
,
0
,
sizeof
(
control
)
);
control
.
id
=
queryctrl
.
id
;
control
.
id
=
queryctrl
.
id
;
if
(
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
&&
queryctrl
.
default_value
!=
control
.
value
)
&&
queryctrl
.
default_value
!=
control
.
value
)
{
{
int
i
;
int
i
;
...
@@ -3345,14 +3379,14 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
...
@@ -3345,14 +3379,14 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
i_cid
++
)
i_cid
++
)
{
{
queryctrl
.
id
=
i_cid
;
queryctrl
.
id
=
i_cid
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
struct
v4l2_control
control
;
struct
v4l2_control
control
;
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
continue
;
continue
;
memset
(
&
control
,
0
,
sizeof
(
control
)
);
memset
(
&
control
,
0
,
sizeof
(
control
)
);
control
.
id
=
queryctrl
.
id
;
control
.
id
=
queryctrl
.
id
;
if
(
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
&&
queryctrl
.
default_value
!=
control
.
value
)
&&
queryctrl
.
default_value
!=
control
.
value
)
{
{
int
i
;
int
i
;
...
@@ -3372,14 +3406,14 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
...
@@ -3372,14 +3406,14 @@ static int ControlReset( vlc_object_t *p_obj, int i_fd )
i_cid
++
)
i_cid
++
)
{
{
queryctrl
.
id
=
i_cid
;
queryctrl
.
id
=
i_cid
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
>=
0
)
{
{
struct
v4l2_control
control
;
struct
v4l2_control
control
;
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
if
(
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
continue
;
continue
;
memset
(
&
control
,
0
,
sizeof
(
control
)
);
memset
(
&
control
,
0
,
sizeof
(
control
)
);
control
.
id
=
queryctrl
.
id
;
control
.
id
=
queryctrl
.
id
;
if
(
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
)
>=
0
&&
queryctrl
.
default_value
!=
control
.
value
)
&&
queryctrl
.
default_value
!=
control
.
value
)
{
{
name2var
(
queryctrl
.
name
);
name2var
(
queryctrl
.
name
);
...
@@ -3412,7 +3446,7 @@ static int Control( vlc_object_t *p_obj, int i_fd,
...
@@ -3412,7 +3446,7 @@ static int Control( vlc_object_t *p_obj, int i_fd,
queryctrl
.
id
=
i_cid
;
queryctrl
.
id
=
i_cid
;
if
(
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
<
0
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_QUERYCTRL
,
&
queryctrl
)
<
0
||
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
||
queryctrl
.
flags
&
V4L2_CTRL_FLAG_DISABLED
)
{
{
msg_Dbg
(
p_obj
,
"%s (%x) control is not supported."
,
psz_name
,
i_cid
);
msg_Dbg
(
p_obj
,
"%s (%x) control is not supported."
,
psz_name
,
i_cid
);
...
@@ -3433,20 +3467,20 @@ static int Control( vlc_object_t *p_obj, int i_fd,
...
@@ -3433,20 +3467,20 @@ static int Control( vlc_object_t *p_obj, int i_fd,
if
(
i_value
>=
0
)
if
(
i_value
>=
0
)
{
{
ext_control
.
value
=
i_value
;
ext_control
.
value
=
i_value
;
if
(
ioctl
(
i_fd
,
VIDIOC_S_EXT_CTRLS
,
&
ext_controls
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_EXT_CTRLS
,
&
ext_controls
)
<
0
)
{
{
control
.
value
=
i_value
;
control
.
value
=
i_value
;
if
(
ioctl
(
i_fd
,
VIDIOC_S_CTRL
,
&
control
)
<
0
)
if
(
v4l2_
ioctl
(
i_fd
,
VIDIOC_S_CTRL
,
&
control
)
<
0
)
{
{
msg_Err
(
p_obj
,
"unable to set %s (%x) to %d (%m)"
,
msg_Err
(
p_obj
,
"unable to set %s (%x) to %d (%m)"
,
psz_name
,
i_cid
,
i_value
);
psz_name
,
i_cid
,
i_value
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
i_ret
=
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
);
i_ret
=
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_CTRL
,
&
control
);
}
}
else
else
{
{
i_ret
=
ioctl
(
i_fd
,
VIDIOC_G_EXT_CTRLS
,
&
ext_controls
);
i_ret
=
v4l2_
ioctl
(
i_fd
,
VIDIOC_G_EXT_CTRLS
,
&
ext_controls
);
control
.
value
=
ext_control
.
value
;
control
.
value
=
ext_control
.
value
;
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment