Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
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
Commits
fab94230
Commit
fab94230
authored
Jun 11, 2007
by
Sigmund Augdal Helberg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
backported half of [16084] and [19842] and [20507]. Gives support for the new v4l2
encoder api.
parent
a051951a
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
508 additions
and
1029 deletions
+508
-1029
THANKS
THANKS
+1
-0
configure.ac
configure.ac
+20
-1
modules/access/Modules.am
modules/access/Modules.am
+1
-0
modules/access/pvr.c
modules/access/pvr.c
+486
-169
modules/access/pvr/Modules.am
modules/access/pvr/Modules.am
+0
-1
modules/access/pvr/videodev2.h
modules/access/pvr/videodev2.h
+0
-858
No files found.
THANKS
View file @
fab94230
...
...
@@ -123,6 +123,7 @@ Olivier Pomel <pomel at via.ecp.fr> - original VLC code
Ondrej Kuda aka Albert <kuda at natur dot cuni dot cz> - HTTP interface tips and fixes
Øyvind Kolbu <oyvindk at world-online.no> - FreeBSD patches
Patrick Horn <patrickd0thorn at mindspring d0t com> - DirectShow patch
Paul Corke <paul.corke at datatote dot co do uk> - pvr patch for newer ivtv drivers
Paul Mackerras <paulus at linuxcare.com.au> - AltiVec IDCT and motion
Pavlov Konstantin “thresh” - several Linux build system fixes
Petr Vacek - FTP cleartext authentication
...
...
configure.ac
View file @
fab94230
...
...
@@ -2016,6 +2016,26 @@ AC_ARG_ENABLE(pvr,
if test "${enable_pvr}" = "yes"
then
VLC_ADD_PLUGINS([pvr])
AC_ARG_WITH(videodev2,
[ --with-videodev2=FILE Location of videodev2.h file (default /usr/include/linux/videodev2.h)],[],[])
if test "${with_videodev2}" != "no" -a -n "${with_videodev2}"
then
AC_DEFINE_UNQUOTED(VIDEODEV2_H_FILE, "${with_videodev2}", [Location of videodev2.h])
else
AC_DEFINE(VIDEODEV2_H_FILE, <linux/videodev2.h>, [Location of videodev2.h])
fi
AC_CACHE_CHECK([for new linux/videodev2.h],
[new_linux_videodev2_h],
[AC_TRY_COMPILE([#include <sys/types.h>
#include VIDEODEV2_H_FILE],
[struct v4l2_ext_controls ctrls; ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG; ],
new_linux_videodev2_h=yes,
new_linux_videodev2_h=no)])
if test "${new_linux_videodev2_h}" != "no"; then
AC_DEFINE(HAVE_NEW_LINUX_VIDEODEV2_H, 1, [Define if new linux/videodev2.h present])
fi
fi
dnl
...
...
@@ -5557,7 +5577,6 @@ AC_CONFIG_FILES([
modules/access/dshow/Makefile
modules/access/dvb/Makefile
modules/access/mms/Makefile
modules/access/pvr/Makefile
modules/access/v4l/Makefile
modules/access/cdda/Makefile
modules/access/rtsp/Makefile
...
...
modules/access/Modules.am
View file @
fab94230
SOURCES_access_file = file.c
SOURCES_pvr = pvr.c
SOURCES_access_directory = directory.c
SOURCES_access_dv = dv.c
SOURCES_access_udp = udp.c
...
...
modules/access/pvr
/pvr
.c
→
modules/access/pvr.c
View file @
fab94230
...
...
@@ -5,6 +5,7 @@
* $Id$
*
* Authors: Eric Petit <titer@videolan.org>
* Paul Corke <paulc@datatote.co.uk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
...
...
@@ -36,7 +37,11 @@
#include <linux/types.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#ifdef HAVE_NEW_LINUX_VIDEODEV2_H
#include VIDEODEV2_H_FILE
#else
#include "videodev2.h"
#endif
/*****************************************************************************
* Module descriptor
...
...
@@ -104,11 +109,11 @@ static void Close( vlc_object_t * );
static
int
i_norm_list
[]
=
{
V4L2_STD_UNKNOWN
,
V4L2_STD_SECAM
,
V4L2_STD_PAL
,
V4L2_STD_NTSC
};
static
char
*
psz_norm_list_text
[]
=
static
c
onst
c
har
*
psz_norm_list_text
[]
=
{
N_
(
"Automatic"
),
N_
(
"SECAM"
),
N_
(
"PAL"
),
N_
(
"NTSC"
)
};
static
int
i_bitrates
[]
=
{
0
,
1
};
static
char
*
psz_bitrates_list_text
[]
=
{
N_
(
"vbr"
),
N_
(
"cbr"
)
};
static
c
onst
c
har
*
psz_bitrates_list_text
[]
=
{
N_
(
"vbr"
),
N_
(
"cbr"
)
};
static
int
pi_radio_range
[
2
]
=
{
65000
,
108000
};
...
...
@@ -120,7 +125,8 @@ vlc_module_begin();
set_capability
(
"access2"
,
0
);
add_shortcut
(
"pvr"
);
add_integer
(
"pvr-caching"
,
DEFAULT_PTS_DELAY
/
1000
,
NULL
,
CACHING_TEXT
,
CACHING_LONGTEXT
,
VLC_TRUE
);
add_integer
(
"pvr-caching"
,
DEFAULT_PTS_DELAY
/
1000
,
NULL
,
CACHING_TEXT
,
CACHING_LONGTEXT
,
VLC_TRUE
);
add_string
(
"pvr-device"
,
"/dev/video0"
,
NULL
,
DEVICE_TEXT
,
DEVICE_LONGTEXT
,
VLC_FALSE
);
add_string
(
"pvr-radio-device"
,
"/dev/radio0"
,
NULL
,
RADIO_DEVICE_TEXT
,
...
...
@@ -168,21 +174,21 @@ static int Control( access_t *, int, va_list );
/* for use with IVTV_IOC_G_CODEC and IVTV_IOC_S_CODEC */
struct
ivtv_ioctl_codec
{
uint32_t
aspect
;
uint32_t
audio_bitmask
;
uint32_t
bframes
;
uint32_t
bitrate_mode
;
uint32_t
bitrate
;
uint32_t
bitrate_peak
;
uint32_t
dnr_mode
;
uint32_t
dnr_spatial
;
uint32_t
dnr_temporal
;
uint32_t
dnr_type
;
uint32_t
framerate
;
uint32_t
framespergop
;
uint32_t
gop_closure
;
uint32_t
pulldown
;
uint32_t
stream_type
;
uint32_t
aspect
;
uint32_t
audio_bitmask
;
uint32_t
bframes
;
uint32_t
bitrate_mode
;
uint32_t
bitrate
;
uint32_t
bitrate_peak
;
uint32_t
dnr_mode
;
uint32_t
dnr_spatial
;
uint32_t
dnr_temporal
;
uint32_t
dnr_type
;
uint32_t
framerate
;
uint32_t
framespergop
;
uint32_t
gop_closure
;
uint32_t
pulldown
;
uint32_t
stream_type
;
};
struct
access_sys_t
...
...
@@ -191,6 +197,9 @@ struct access_sys_t
int
i_fd
;
int
i_radio_fd
;
char
*
psz_videodev
;
char
*
psz_radiodev
;
/* options */
int
i_standard
;
int
i_width
;
...
...
@@ -205,8 +214,323 @@ struct access_sys_t
int
i_audio_bitmask
;
int
i_input
;
int
i_volume
;
/* driver version */
vlc_bool_t
b_v4l2_api
;
};
/*****************************************************************************
* ConfigureIVTV: set up codec parameters using the old ivtv api
*****************************************************************************/
static
int
ConfigureIVTV
(
access_t
*
p_access
)
{
access_sys_t
*
p_sys
=
(
access_sys_t
*
)
p_access
->
p_sys
;
struct
ivtv_ioctl_codec
codec
;
int
result
;
memset
(
&
codec
,
0
,
sizeof
(
struct
ivtv_ioctl_codec
)
);
result
=
ioctl
(
p_sys
->
i_fd
,
IVTV_IOC_G_CODEC
,
&
codec
);
if
(
result
<
0
)
{
msg_Err
(
p_access
,
"Failed to read current capture card settings."
);
return
VLC_EGENERIC
;
}
if
(
p_sys
->
i_framerate
!=
-
1
)
{
switch
(
p_sys
->
i_framerate
)
{
case
30
:
codec
.
framerate
=
0
;
break
;
case
25
:
codec
.
framerate
=
1
;
break
;
default:
msg_Warn
(
p_access
,
"Invalid framerate, reverting to 25."
);
codec
.
framerate
=
1
;
break
;
}
}
if
(
p_sys
->
i_bitrate
!=
-
1
)
{
codec
.
bitrate
=
p_sys
->
i_bitrate
;
}
if
(
p_sys
->
i_bitrate_peak
!=
-
1
)
{
codec
.
bitrate_peak
=
p_sys
->
i_bitrate_peak
;
}
if
(
p_sys
->
i_bitrate_mode
!=
-
1
)
{
codec
.
bitrate_mode
=
p_sys
->
i_bitrate_mode
;
}
if
(
p_sys
->
i_audio_bitmask
!=
-
1
)
{
codec
.
audio_bitmask
=
p_sys
->
i_audio_bitmask
;
}
if
(
p_sys
->
i_keyint
!=
-
1
)
{
codec
.
framespergop
=
p_sys
->
i_keyint
;
}
if
(
p_sys
->
i_bframes
!=
-
1
)
{
codec
.
bframes
=
p_sys
->
i_bframes
;
}
result
=
ioctl
(
p_sys
->
i_fd
,
IVTV_IOC_S_CODEC
,
&
codec
);
if
(
result
<
0
)
{
msg_Err
(
p_access
,
"Failed to write new capture card settings."
);
return
VLC_EGENERIC
;
}
msg_Dbg
(
p_access
,
"Setting codec parameters to: framerate: "
"%d, bitrate: %d/%d/%d"
,
codec
.
framerate
,
codec
.
bitrate
,
codec
.
bitrate_peak
,
codec
.
bitrate_mode
);
return
VLC_SUCCESS
;
}
#ifdef HAVE_NEW_LINUX_VIDEODEV2_H
#define MAX_V4L2_CTRLS (6)
/*****************************************************************************
* AddV4L2Ctrl: adds a control to the v4l2 controls list
*****************************************************************************/
static
void
AddV4L2Ctrl
(
access_t
*
p_access
,
struct
v4l2_ext_controls
*
p_controls
,
uint32_t
i_id
,
uint32_t
i_value
)
{
if
(
p_controls
->
count
>=
MAX_V4L2_CTRLS
)
{
msg_Err
(
p_access
,
"Tried to set too many v4l2 controls at once."
);
return
;
}
p_controls
->
controls
[
p_controls
->
count
].
id
=
i_id
;
p_controls
->
controls
[
p_controls
->
count
].
value
=
i_value
;
p_controls
->
count
++
;
}
/*****************************************************************************
* V4L2SampleRate: calculate v4l2 sample rate from pvr-audio-bitmask
*****************************************************************************/
static
uint32_t
V4L2SampleRate
(
uint32_t
i_bitmask
)
{
switch
(
i_bitmask
&
0x0003
)
{
case
0x0001
:
return
V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
;
case
0x0002
:
return
V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000
;
}
return
V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100
;
}
/*****************************************************************************
* V4L2AudioEncoding: calculate v4l2 audio encoding level from pvr-audio-bitmask
*****************************************************************************/
static
uint32_t
V4L2AudioEncoding
(
uint32_t
i_bitmask
)
{
switch
(
i_bitmask
&
0x000c
)
{
case
0x0004
:
return
V4L2_MPEG_AUDIO_ENCODING_LAYER_1
;
case
0x0008
:
return
V4L2_MPEG_AUDIO_ENCODING_LAYER_2
;
}
return
0xffffffff
;
}
/*****************************************************************************
* V4L2AudioL1Bitrate: calculate v4l2 audio bitrate for layer-1 audio from pvr-audio-bitmask
*****************************************************************************/
static
uint32_t
V4L2AudioL1Bitrate
(
uint32_t
i_bitmask
)
{
switch
(
i_bitmask
&
0x00f0
)
{
case
0x0010
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_32K
;
case
0x0020
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_64K
;
case
0x0030
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_96K
;
case
0x0040
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_128K
;
case
0x0050
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_160K
;
case
0x0060
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_192K
;
case
0x0070
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_224K
;
case
0x0080
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_256K
;
case
0x0090
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_288K
;
case
0x00a0
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_320K
;
case
0x00b0
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_352K
;
case
0x00c0
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_384K
;
case
0x00d0
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_416K
;
case
0x00e0
:
return
V4L2_MPEG_AUDIO_L1_BITRATE_448K
;
}
return
V4L2_MPEG_AUDIO_L1_BITRATE_320K
;
}
/*****************************************************************************
* V4L2AudioL2Bitrate: calculate v4l2 audio bitrate for layer-1 audio from pvr-audio-bitmask
*****************************************************************************/
static
uint32_t
V4L2AudioL2Bitrate
(
uint32_t
i_bitmask
)
{
switch
(
i_bitmask
&
0x00f0
)
{
case
0x0010
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_32K
;
case
0x0020
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_48K
;
case
0x0030
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_56K
;
case
0x0040
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_64K
;
case
0x0050
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_80K
;
case
0x0060
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_96K
;
case
0x0070
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_112K
;
case
0x0080
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_128K
;
case
0x0090
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_160K
;
case
0x00a0
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_192K
;
case
0x00b0
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_224K
;
case
0x00c0
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_256K
;
case
0x00d0
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_320K
;
case
0x00e0
:
return
V4L2_MPEG_AUDIO_L2_BITRATE_384K
;
}
return
V4L2_MPEG_AUDIO_L2_BITRATE_192K
;
}
/*****************************************************************************
* V4L2AudioMode: calculate v4l2 audio mode from pvr-audio-bitmask
*****************************************************************************/
static
uint32_t
V4L2AudioMode
(
uint32_t
i_bitmask
)
{
switch
(
i_bitmask
&
0x0300
)
{
case
0x0100
:
return
V4L2_MPEG_AUDIO_MODE_JOINT_STEREO
;
case
0x0200
:
return
V4L2_MPEG_AUDIO_MODE_DUAL
;
case
0x0300
:
return
V4L2_MPEG_AUDIO_MODE_MONO
;
}
return
V4L2_MPEG_AUDIO_MODE_STEREO
;
}
/*****************************************************************************
* ConfigureV4L2: set up codec parameters using the new v4l2 api
*****************************************************************************/
static
int
ConfigureV4L2
(
access_t
*
p_access
)
{
access_sys_t
*
p_sys
=
(
access_sys_t
*
)
p_access
->
p_sys
;
struct
v4l2_ext_controls
controls
;
int
result
;
memset
(
&
controls
,
0
,
sizeof
(
struct
v4l2_ext_controls
)
);
controls
.
ctrl_class
=
V4L2_CTRL_CLASS_MPEG
;
controls
.
error_idx
=
0
;
controls
.
reserved
[
0
]
=
0
;
controls
.
reserved
[
1
]
=
0
;
controls
.
count
=
0
;
controls
.
controls
=
calloc
(
sizeof
(
struct
v4l2_ext_control
),
MAX_V4L2_CTRLS
);
if
(
controls
.
controls
==
NULL
)
return
VLC_ENOMEM
;
/* Note: Ignore frame rate. Doesn't look like it can be changed. */
if
(
p_sys
->
i_bitrate
!=
-
1
)
{
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_VIDEO_BITRATE
,
p_sys
->
i_bitrate
);
msg_Dbg
(
p_access
,
"Setting [%u] bitrate = %u"
,
controls
.
count
-
1
,
p_sys
->
i_bitrate
);
}
if
(
p_sys
->
i_bitrate_peak
!=
-
1
)
{
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
,
p_sys
->
i_bitrate_peak
);
msg_Dbg
(
p_access
,
"Setting [%u] bitrate_peak = %u"
,
controls
.
count
-
1
,
p_sys
->
i_bitrate_peak
);
}
if
(
p_sys
->
i_bitrate_mode
!=
-
1
)
{
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_VIDEO_BITRATE_MODE
,
p_sys
->
i_bitrate_mode
);
msg_Dbg
(
p_access
,
"Setting [%u] bitrate_mode = %u"
,
controls
.
count
-
1
,
p_sys
->
i_bitrate_mode
);
}
if
(
p_sys
->
i_audio_bitmask
!=
-
1
)
{
/* Sample rate */
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
,
V4L2SampleRate
(
p_sys
->
i_audio_bitmask
)
);
/* Encoding layer and bitrate */
switch
(
V4L2AudioEncoding
(
p_sys
->
i_audio_bitmask
)
)
{
case
V4L2_MPEG_AUDIO_ENCODING_LAYER_1
:
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
,
V4L2_MPEG_AUDIO_ENCODING_LAYER_1
);
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_AUDIO_L1_BITRATE
,
V4L2AudioL1Bitrate
(
p_sys
->
i_audio_bitmask
)
);
break
;
case
V4L2_MPEG_AUDIO_ENCODING_LAYER_2
:
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
,
V4L2_MPEG_AUDIO_ENCODING_LAYER_2
);
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_AUDIO_L2_BITRATE
,
V4L2AudioL2Bitrate
(
p_sys
->
i_audio_bitmask
)
);
break
;
}
/* Audio mode - stereo or mono */
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_AUDIO_MODE
,
V4L2AudioMode
(
p_sys
->
i_audio_bitmask
)
);
/* See if the user wants any other audio feature */
if
(
(
p_sys
->
i_audio_bitmask
&
0x1ff00
)
!=
0
)
{
/* It would be possible to support the bits that represent:
* V4L2_CID_MPEG_AUDIO_MODE_EXTENSION
* V4L2_CID_MPEG_AUDIO_EMPHASIS
* V4L2_CID_MPEG_AUDIO_CRC
* but they are not currently used. Tell the user.
*/
msg_Err
(
p_access
,
"There were bits in pvr-audio-bitmask that were not used."
);
}
msg_Dbg
(
p_access
,
"Setting audio controls"
);
}
if
(
p_sys
->
i_keyint
!=
-
1
)
{
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_VIDEO_GOP_SIZE
,
p_sys
->
i_keyint
);
msg_Dbg
(
p_access
,
"Setting [%u] keyint = %u"
,
controls
.
count
-
1
,
p_sys
->
i_keyint
);
}
if
(
p_sys
->
i_bframes
!=
-
1
)
{
AddV4L2Ctrl
(
p_access
,
&
controls
,
V4L2_CID_MPEG_VIDEO_B_FRAMES
,
p_sys
->
i_bframes
);
msg_Dbg
(
p_access
,
"Setting [%u] bframes = %u"
,
controls
.
count
-
1
,
p_sys
->
i_bframes
);
}
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_EXT_CTRLS
,
&
controls
);
if
(
result
<
0
)
{
msg_Err
(
p_access
,
"Failed to write %u new capture card settings."
,
controls
.
error_idx
);
}
free
(
controls
.
controls
);
return
VLC_SUCCESS
;
}
#endif
/* HAVE_NEW_LINUX_VIDEODEV2_H */
/*****************************************************************************
* Open: open the device
*****************************************************************************/
...
...
@@ -214,10 +538,14 @@ static int Open( vlc_object_t * p_this )
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
access_sys_t
*
p_sys
;
char
*
psz_tofree
,
*
psz_parser
,
*
psz_device
,
*
psz_radio_device
;
char
*
psz_tofree
;
char
*
psz_parser
;
char
*
psz_device
=
NULL
;
vlc_value_t
val
;
struct
v4l2_capability
device_capability
;
int
result
;
//psz_device = calloc( strlen( "/dev/videox" ) + 1, 1
);
memset
(
&
device_capability
,
0
,
sizeof
(
struct
v4l2_capability
)
);
p_access
->
pf_read
=
Read
;
p_access
->
pf_block
=
NULL
;
...
...
@@ -232,6 +560,9 @@ static int Open( vlc_object_t * p_this )
/* create private access data */
p_sys
=
calloc
(
sizeof
(
access_sys_t
),
1
);
if
(
!
p_sys
)
return
VLC_ENOMEM
;
p_access
->
p_sys
=
p_sys
;
/* defaults values */
...
...
@@ -239,12 +570,12 @@ static int Open( vlc_object_t * p_this )
var_Create
(
p_access
,
"pvr-device"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_access
,
"pvr-device"
,
&
val
);
p
sz_device
=
val
.
psz_string
;
p
_sys
->
psz_videodev
=
val
.
psz_string
;
var_Create
(
p_access
,
"pvr-radio-device"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_access
,
"pvr-radio-device"
,
&
val
);
p
sz_radio_device
=
val
.
psz_string
;
p
_sys
->
psz_radiodev
=
val
.
psz_string
;
var_Create
(
p_access
,
"pvr-norm"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_access
,
"pvr-norm"
,
&
val
);
...
...
@@ -305,8 +636,10 @@ static int Open( vlc_object_t * p_this )
/* parse command line options */
psz_tofree
=
strdup
(
p_access
->
psz_path
);
psz_parser
=
psz_tofree
;
if
(
!
psz_tofree
)
return
VLC_ENOMEM
;
psz_parser
=
psz_tofree
;
if
(
*
psz_parser
)
{
for
(
;;
)
...
...
@@ -316,8 +649,9 @@ static int Open( vlc_object_t * p_this )
char
*
psz_parser_init
;
psz_parser
+=
strlen
(
"norm="
);
psz_parser_init
=
psz_parser
;
while
(
*
psz_parser
!=
':'
&&
*
psz_parser
!=
','
&&
*
psz_parser
!=
'\0'
)
while
(
(
*
psz_parser
!=
':'
)
&&
(
*
psz_parser
!=
','
)
&&
(
*
psz_parser
!=
'\0'
)
)
{
psz_parser
++
;
}
...
...
@@ -352,8 +686,12 @@ static int Open( vlc_object_t * p_this )
}
else
if
(
!
strncmp
(
psz_parser
,
"device="
,
strlen
(
"device="
)
)
)
{
psz_device
=
calloc
(
strlen
(
"/dev/videox"
)
+
1
,
1
);
sprintf
(
psz_device
,
"/dev/video%ld"
,
int
i_len
=
strlen
(
"/dev/videox"
);
psz_device
=
calloc
(
i_len
+
1
,
1
);
if
(
!
psz_device
)
return
VLC_ENOMEM
;
snprintf
(
psz_device
,
i_len
,
"/dev/video%ld"
,
strtol
(
psz_parser
+
strlen
(
"device="
),
&
psz_parser
,
0
)
);
}
...
...
@@ -427,8 +765,9 @@ static int Open( vlc_object_t * p_this )
char
*
psz_parser_init
;
psz_parser
+=
strlen
(
"bitratemode="
);
psz_parser_init
=
psz_parser
;
while
(
*
psz_parser
!=
':'
&&
*
psz_parser
!=
','
&&
*
psz_parser
!=
'\0'
)
while
(
(
*
psz_parser
!=
':'
)
&&
(
*
psz_parser
!=
','
)
&&
(
*
psz_parser
!=
'\0'
)
)
{
psz_parser
++
;
}
...
...
@@ -458,11 +797,16 @@ static int Open( vlc_object_t * p_this )
{
char
*
psz_parser_init
;
psz_parser_init
=
psz_parser
;
while
(
*
psz_parser
!=
':'
&&
*
psz_parser
!=
','
&&
*
psz_parser
!=
'\0'
)
while
(
(
*
psz_parser
!=
':'
)
&&
(
*
psz_parser
!=
','
)
&&
(
*
psz_parser
!=
'\0'
)
)
{
psz_parser
++
;
}
psz_device
=
calloc
(
psz_parser
-
psz_parser_init
+
1
,
1
);
if
(
!
psz_device
)
return
VLC_ENOMEM
;
strncpy
(
psz_device
,
psz_parser_init
,
psz_parser
-
psz_parser_init
);
}
...
...
@@ -472,66 +816,83 @@ static int Open( vlc_object_t * p_this )
break
;
}
}
free
(
psz_tofree
);
//give a default value to psz_device if none has been specified
if
(
psz_device
==
NULL
)
if
(
psz_device
)
{
psz_device
=
calloc
(
strlen
(
"/dev/videox"
)
+
1
,
1
);
strcpy
(
psz_device
,
"/dev/video0"
);
if
(
p_sys
->
psz_videodev
)
free
(
p_sys
->
psz_videodev
);
p_sys
->
psz_videodev
=
psz_device
;
}
free
(
psz_tofree
);
/* open the device */
if
(
(
p_sys
->
i_fd
=
open
(
psz_device
,
O_RDWR
)
)
<
0
)
p_sys
->
i_fd
=
open
(
p_sys
->
psz_videodev
,
O_RDWR
);
if
(
p_sys
->
i_fd
<
0
)
{
msg_Err
(
p_access
,
"
cannot open device (%s)
"
,
strerror
(
errno
)
);
free
(
p_sys
);
msg_Err
(
p_access
,
"
Cannot open device (%s).
"
,
strerror
(
errno
)
);
Close
(
VLC_OBJECT
(
p_access
)
);
return
VLC_EGENERIC
;
}
else
msg_Dbg
(
p_access
,
"Using video device: %s."
,
p_sys
->
psz_videodev
);
/* See what version of ivtvdriver is running */
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_QUERYCAP
,
&
device_capability
);
if
(
result
<
0
)
{
msg_Dbg
(
p_access
,
"using video device: %s"
,
psz_device
);
msg_Err
(
p_access
,
"unknown ivtv driver version in use"
);
Close
(
VLC_OBJECT
(
p_access
)
);
return
VLC_EGENERIC
;
}
free
(
psz_device
);
msg_Dbg
(
p_access
,
"ivtv driver version %02x.%02x.%02x"
,
(
device_capability
.
version
>>
16
)
&
0xff
,
(
device_capability
.
version
>>
8
)
&
0xff
,
(
device_capability
.
version
)
&
0xff
);
if
(
device_capability
.
version
>=
0x000800
)
{
/* Drivers > 0.8.0 use v4l2 API instead of IVTV ioctls */
msg_Dbg
(
p_access
,
"this driver uses the v4l2 API"
);
p_sys
->
b_v4l2_api
=
VLC_TRUE
;
}
else
{
p_sys
->
b_v4l2_api
=
VLC_FALSE
;
}
/* set the input */
if
(
p_sys
->
i_input
!=
-
1
)
{
if
(
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_INPUT
,
&
p_sys
->
i_input
)
<
0
)
{
msg_Warn
(
p_access
,
"VIDIOC_S_INPUT failed"
);
}
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_INPUT
,
&
p_sys
->
i_input
);
if
(
result
<
0
)
msg_Warn
(
p_access
,
"Failed to select the requested input pin."
);
else
{
msg_Dbg
(
p_access
,
"input set to: %d"
,
p_sys
->
i_input
);
}
msg_Dbg
(
p_access
,
"input set to: %d"
,
p_sys
->
i_input
);
}
/* set the video standard */
if
(
p_sys
->
i_standard
!=
V4L2_STD_UNKNOWN
)
{
if
(
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_STD
,
&
p_sys
->
i_standard
)
<
0
)
{
msg_Warn
(
p_access
,
"VIDIOC_S_STD failed"
);
}
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_STD
,
&
p_sys
->
i_standard
);
if
(
result
<
0
)
msg_Warn
(
p_access
,
"Failed to set the requested video standard."
);
else
{
msg_Dbg
(
p_access
,
"video standard set to: %x"
,
p_sys
->
i_standard
);
}
msg_Dbg
(
p_access
,
"video standard set to: %x"
,
p_sys
->
i_standard
);
}
/* set the picture size */
if
(
p_sys
->
i_width
!=
-
1
||
p_sys
->
i_height
!=
-
1
)
if
(
(
p_sys
->
i_width
!=
-
1
)
||
(
p_sys
->
i_height
!=
-
1
)
)
{
struct
v4l2_format
vfmt
;
memset
(
&
vfmt
,
0
,
sizeof
(
struct
v4l2_format
)
);
vfmt
.
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
ioctl
(
p_sys
->
i_fd
,
VIDIOC_G_FMT
,
&
vfmt
)
<
0
)
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_G_FMT
,
&
vfmt
);
if
(
result
<
0
)
{
msg_Warn
(
p_access
,
"
VIDIOC_G_FMT failed
"
);
msg_Warn
(
p_access
,
"
Failed to read current picture size.
"
);
}
else
{
...
...
@@ -545,9 +906,10 @@ static int Open( vlc_object_t * p_this )
vfmt
.
fmt
.
pix
.
height
=
p_sys
->
i_height
;
}
if
(
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_FMT
,
&
vfmt
)
<
0
)
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_FMT
,
&
vfmt
);
if
(
result
<
0
)
{
msg_Warn
(
p_access
,
"
VIDIOC_S_FMT failed
"
);
msg_Warn
(
p_access
,
"
Failed to set requested picture size.
"
);
}
else
{
...
...
@@ -562,24 +924,23 @@ static int Open( vlc_object_t * p_this )
{
int
i_fd
;
struct
v4l2_tuner
vt
;
vt
.
index
=
0
;
/* TODO: let the user choose the tuner */
memset
(
&
vt
.
reserved
,
0
,
sizeof
(
vt
.
reserved
)
);
if
(
p_sys
->
i_frequency
>=
pi_radio_range
[
0
]
&&
p_sys
->
i_frequency
<=
pi_radio_range
[
1
]
)
/* TODO: let the user choose the tuner */
memset
(
&
vt
,
0
,
sizeof
(
struct
v4l2_tuner
)
);
if
(
(
p_sys
->
i_frequency
>=
pi_radio_range
[
0
])
&&
(
p_sys
->
i_frequency
<=
pi_radio_range
[
1
])
)
{
if
(
(
p_sys
->
i_radio_fd
=
open
(
psz_radio_device
,
O_RDWR
)
)
<
0
)
p_sys
->
i_radio_fd
=
open
(
p_sys
->
psz_radiodev
,
O_RDWR
);
if
(
p_sys
->
i_radio_fd
<
0
)
{
msg_Err
(
p_access
,
"
cannot open radio device (%s)
"
,
msg_Err
(
p_access
,
"
Cannot open radio device (%s).
"
,
strerror
(
errno
)
);
close
(
p_sys
->
i_fd
);
free
(
p_sys
);
Close
(
VLC_OBJECT
(
p_access
)
);
return
VLC_EGENERIC
;
}
else
{
msg_Dbg
(
p_access
,
"using radio device: %s"
,
psz_radio_device
);
}
msg_Dbg
(
p_access
,
"using radio device: %s"
,
p_sys
->
psz_radiodev
);
i_fd
=
p_sys
->
i_radio_fd
;
}
else
...
...
@@ -588,19 +949,23 @@ static int Open( vlc_object_t * p_this )
p_sys
->
i_radio_fd
=
-
1
;
}
if
(
ioctl
(
i_fd
,
VIDIOC_G_TUNER
,
&
vt
)
<
0
)
result
=
ioctl
(
i_fd
,
VIDIOC_G_TUNER
,
&
vt
);
if
(
result
<
0
)
{
msg_Warn
(
p_access
,
"
VIDIOC_G_TUNER failed (%s)
"
,
msg_Warn
(
p_access
,
"
Failed to read tuner information (%s).
"
,
strerror
(
errno
)
);
}
else
{
struct
v4l2_frequency
vf
;
memset
(
&
vf
,
0
,
sizeof
(
struct
v4l2_frequency
)
);
vf
.
tuner
=
vt
.
index
;
if
(
ioctl
(
i_fd
,
VIDIOC_G_FREQUENCY
,
&
vf
)
<
0
)
result
=
ioctl
(
i_fd
,
VIDIOC_G_FREQUENCY
,
&
vf
);
if
(
result
<
0
)
{
msg_Warn
(
p_access
,
"
VIDIOC_G_FREQUENCY failed (%s)
"
,
msg_Warn
(
p_access
,
"
Failed to read tuner frequency (%s).
"
,
strerror
(
errno
)
);
}
else
...
...
@@ -610,9 +975,10 @@ static int Open( vlc_object_t * p_this )
else
vf
.
frequency
=
(
p_sys
->
i_frequency
*
16
+
500
)
/
1000
;
if
(
ioctl
(
i_fd
,
VIDIOC_S_FREQUENCY
,
&
vf
)
<
0
)
result
=
ioctl
(
i_fd
,
VIDIOC_S_FREQUENCY
,
&
vf
);
if
(
result
<
0
)
{
msg_Warn
(
p_access
,
"
VIDIOC_S_FREQUENCY failed (%s)
"
,
msg_Warn
(
p_access
,
"
Failed to set tuner frequency (%s).
"
,
strerror
(
errno
)
);
}
else
...
...
@@ -629,105 +995,51 @@ static int Open( vlc_object_t * p_this )
{
struct
v4l2_control
ctrl
;
memset
(
&
ctrl
,
0
,
sizeof
(
struct
v4l2_control
)
);
ctrl
.
id
=
V4L2_CID_AUDIO_VOLUME
;
ctrl
.
value
=
p_sys
->
i_volume
;
if
(
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_CTRL
,
&
ctrl
)
<
0
)
result
=
ioctl
(
p_sys
->
i_fd
,
VIDIOC_S_CTRL
,
&
ctrl
);
if
(
result
<
0
)
{
msg_Warn
(
p_access
,
"
VIDIOC_S_CTRL failed
"
);
msg_Warn
(
p_access
,
"
Failed to set the volume.
"
);
}
}
/* codec parameters */
if
(
p_sys
->
i_framerate
!=
-
1
||
p_sys
->
i_bitrate_mode
!=
-
1
||
p_sys
->
i_bitrate_peak
!=
-
1
||
p_sys
->
i_keyint
!=
-
1
||
p_sys
->
i_bframes
!=
-
1
||
p_sys
->
i_bitrate
!=
-
1
||
p_sys
->
i_audio_bitmask
!=
-
1
)
if
(
(
p_sys
->
i_framerate
!=
-
1
)
||
(
p_sys
->
i_bitrate_mode
!=
-
1
)
||
(
p_sys
->
i_bitrate_peak
!=
-
1
)
||
(
p_sys
->
i_keyint
!=
-
1
)
||
(
p_sys
->
i_bframes
!=
-
1
)
||
(
p_sys
->
i_bitrate
!=
-
1
)
||
(
p_sys
->
i_audio_bitmask
!=
-
1
)
)
{
struct
ivtv_ioctl_codec
codec
;
if
(
ioctl
(
p_sys
->
i_fd
,
IVTV_IOC_G_CODEC
,
&
codec
)
<
0
)
{
msg_Warn
(
p_access
,
"IVTV_IOC_G_CODEC failed"
);
}
else
if
(
p_sys
->
b_v4l2_api
)
{
if
(
p_sys
->
i_framerate
!=
-
1
)
#ifdef HAVE_NEW_LINUX_VIDEODEV2_H
result
=
ConfigureV4L2
(
p_access
);
if
(
result
!=
VLC_SUCCESS
)
{
switch
(
p_sys
->
i_framerate
)
{
case
30
:
codec
.
framerate
=
0
;
break
;
case
25
:
codec
.
framerate
=
1
;
break
;
default:
msg_Warn
(
p_access
,
"invalid framerate, reverting to 25"
);
codec
.
framerate
=
1
;
break
;
}
}
if
(
p_sys
->
i_bitrate
!=
-
1
)
{
codec
.
bitrate
=
p_sys
->
i_bitrate
;
}
if
(
p_sys
->
i_bitrate_peak
!=
-
1
)
{
codec
.
bitrate_peak
=
p_sys
->
i_bitrate_peak
;
}
if
(
p_sys
->
i_bitrate_mode
!=
-
1
)
{
codec
.
bitrate_mode
=
p_sys
->
i_bitrate_mode
;
msg_Err
(
p_access
,
"Failed configuring device"
);
Close
(
VLC_OBJECT
(
p_access
)
);
return
result
;
}
if
(
p_sys
->
i_audio_bitmask
!=
-
1
)
{
codec
.
audio_bitmask
=
p_sys
->
i_audio_bitmask
;
}
if
(
p_sys
->
i_keyint
!=
-
1
)
{
codec
.
framespergop
=
p_sys
->
i_keyint
;
}
if
(
p_sys
->
i_bframes
!=
-
1
)
{
codec
.
bframes
=
p_sys
->
i_bframes
;
}
if
(
ioctl
(
p_sys
->
i_fd
,
IVTV_IOC_S_CODEC
,
&
codec
)
<
0
)
{
msg_Warn
(
p_access
,
"IVTV_IOC_S_CODEC failed"
);
}
else
{
msg_Dbg
(
p_access
,
"Setting codec parameters to: framerate: %d, bitrate: %d/%d/%d"
,
codec
.
framerate
,
codec
.
bitrate
,
codec
.
bitrate_peak
,
codec
.
bitrate_mode
);
}
}
}
/* do a quick read */
#if 0
if ( p_sys->i_fd )
{
if ( read( p_sys->i_fd, psz_tmp, 1 ) )
{
msg_Dbg(p_input, "Could read byte from device");
#else
msg_Warn
(
p_access
,
"You have new ivtvdrivers, "
"but this vlc was built against an old v4l2 version."
);
#endif
}
else
{
msg_Warn(p_input, "Could not read byte from device");
result
=
ConfigureIVTV
(
p_access
);
if
(
result
!=
VLC_SUCCESS
)
{
Close
(
VLC_OBJECT
(
p_access
)
);
return
result
;
}
}
}
#endif
return
VLC_SUCCESS
;
}
...
...
@@ -738,11 +1050,17 @@ static int Open( vlc_object_t * p_this )
static
void
Close
(
vlc_object_t
*
p_this
)
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
access_sys_t
*
p_sys
=
(
access_sys_t
*
)
p_access
->
p_sys
;
close
(
p_sys
->
i_fd
);
msg_Err
(
p_this
,
"Called Close()"
);
if
(
p_sys
->
i_fd
!=
-
1
)
close
(
p_sys
->
i_fd
);
if
(
p_sys
->
i_radio_fd
!=
-
1
)
close
(
p_sys
->
i_radio_fd
);
if
(
p_sys
->
psz_videodev
)
free
(
p_sys
->
psz_videodev
);
if
(
p_sys
->
psz_radiodev
)
free
(
p_sys
->
psz_radiodev
);
free
(
p_sys
);
}
...
...
@@ -751,10 +1069,9 @@ static void Close( vlc_object_t * p_this )
*****************************************************************************/
static
int
Read
(
access_t
*
p_access
,
uint8_t
*
p_buffer
,
int
i_len
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
int
i_ret
;
access_sys_t
*
p_sys
=
(
access_sys_t
*
)
p_access
->
p_sys
;
struct
pollfd
ufd
;
int
i_ret
;
ufd
.
fd
=
p_sys
->
i_fd
;
ufd
.
events
=
POLLIN
;
...
...
@@ -773,7 +1090,7 @@ static int Read( access_t * p_access, uint8_t * p_buffer, int i_len )
if
(
i_ret
<
0
)
{
msg_Err
(
p_access
,
"
select error (%s)
"
,
strerror
(
errno
)
);
msg_Err
(
p_access
,
"
Select error (%s).
"
,
strerror
(
errno
)
);
return
-
1
;
}
...
...
@@ -839,7 +1156,7 @@ static int Control( access_t *p_access, int i_query, va_list args )
return
VLC_EGENERIC
;
default:
msg_Warn
(
p_access
,
"
unimplemented query in control
"
);
msg_Warn
(
p_access
,
"
Unimplemented query in control.
"
);
return
VLC_EGENERIC
;
}
...
...
modules/access/pvr/Modules.am
deleted
100644 → 0
View file @
a051951a
SOURCES_pvr = pvr.c videodev2.h
modules/access/pvr/videodev2.h
deleted
100644 → 0
View file @
a051951a
#ifndef __LINUX_VIDEODEV2_H
#define __LINUX_VIDEODEV2_H
/*
* Video for Linux Two
*
* Header file for v4l or V4L2 drivers and applications, for
* Linux kernels 2.2.x or 2.4.x.
*
* See http://bytesex.org/v4l/ for API specs and other
* v4l2 documentation.
*
* Author: Bill Dirks <bdirks@pacbell.net>
* Justin Schoeman
* et al.
*/
/*
* M I S C E L L A N E O U S
*/
/* Four-character-code (FOURCC) */
#define v4l2_fourcc(a,b,c,d)\
(((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24))
/*
* E N U M S
*/
enum
v4l2_field
{
V4L2_FIELD_ANY
=
0
,
/* driver can choose from none,
top, bottom, interlaced
depending on whatever it thinks
is approximate ... */
V4L2_FIELD_NONE
=
1
,
/* this device has no fields ... */
V4L2_FIELD_TOP
=
2
,
/* top field only */
V4L2_FIELD_BOTTOM
=
3
,
/* bottom field only */
V4L2_FIELD_INTERLACED
=
4
,
/* both fields interlaced */
V4L2_FIELD_SEQ_TB
=
5
,
/* both fields sequential into one
buffer, top-bottom order */
V4L2_FIELD_SEQ_BT
=
6
,
/* same as above + bottom-top order */
V4L2_FIELD_ALTERNATE
=
7
,
/* both fields alternating into
separate buffers */
};
#define V4L2_FIELD_HAS_TOP(field) \
((field) == V4L2_FIELD_TOP ||\
(field) == V4L2_FIELD_INTERLACED ||\
(field) == V4L2_FIELD_SEQ_TB ||\
(field) == V4L2_FIELD_SEQ_BT)
#define V4L2_FIELD_HAS_BOTTOM(field) \
((field) == V4L2_FIELD_BOTTOM ||\
(field) == V4L2_FIELD_INTERLACED ||\
(field) == V4L2_FIELD_SEQ_TB ||\
(field) == V4L2_FIELD_SEQ_BT)
#define V4L2_FIELD_HAS_BOTH(field) \
((field) == V4L2_FIELD_INTERLACED ||\
(field) == V4L2_FIELD_SEQ_TB ||\
(field) == V4L2_FIELD_SEQ_BT)
enum
v4l2_buf_type
{
V4L2_BUF_TYPE_VIDEO_CAPTURE
=
1
,
V4L2_BUF_TYPE_VIDEO_OUTPUT
=
2
,
V4L2_BUF_TYPE_VIDEO_OVERLAY
=
3
,
V4L2_BUF_TYPE_VBI_CAPTURE
=
4
,
V4L2_BUF_TYPE_VBI_OUTPUT
=
5
,
V4L2_BUF_TYPE_PRIVATE
=
0x80
,
};
enum
v4l2_ctrl_type
{
V4L2_CTRL_TYPE_INTEGER
=
1
,
V4L2_CTRL_TYPE_BOOLEAN
=
2
,
V4L2_CTRL_TYPE_MENU
=
3
,
V4L2_CTRL_TYPE_BUTTON
=
4
,
};
enum
v4l2_tuner_type
{
V4L2_TUNER_RADIO
=
1
,
V4L2_TUNER_ANALOG_TV
=
2
,
};
enum
v4l2_memory
{
V4L2_MEMORY_MMAP
=
1
,
V4L2_MEMORY_USERPTR
=
2
,
V4L2_MEMORY_OVERLAY
=
3
,
};
/* see also http://vektor.theorem.ca/graphics/ycbcr/ */
enum
v4l2_colorspace
{
/* ITU-R 601 -- broadcast NTSC/PAL */
V4L2_COLORSPACE_SMPTE170M
=
1
,
/* 1125-Line (US) HDTV */
V4L2_COLORSPACE_SMPTE240M
=
2
,
/* HD and modern captures. */
V4L2_COLORSPACE_REC709
=
3
,
/* broken BT878 extents (601, luma range 16-253 instead of 16-235) */
V4L2_COLORSPACE_BT878
=
4
,
/* These should be useful. Assume 601 extents. */
V4L2_COLORSPACE_470_SYSTEM_M
=
5
,
V4L2_COLORSPACE_470_SYSTEM_BG
=
6
,
/* I know there will be cameras that send this. So, this is
* unspecified chromaticities and full 0-255 on each of the
* Y'CbCr components
*/
V4L2_COLORSPACE_JPEG
=
7
,
/* For RGB colourspaces, this is probably a good start. */
V4L2_COLORSPACE_SRGB
=
8
,
};
struct
v4l2_rect
{
__s32
left
;
__s32
top
;
__s32
width
;
__s32
height
;
};
struct
v4l2_fract
{
__u32
numerator
;
__u32
denominator
;
};
/*
* D R I V E R C A P A B I L I T I E S
*/
struct
v4l2_capability
{
__u8
driver
[
16
];
/* i.e. "bttv" */
__u8
card
[
32
];
/* i.e. "Hauppauge WinTV" */
__u8
bus_info
[
32
];
/* "PCI:" + pci_dev->slot_name */
__u32
version
;
/* should use KERNEL_VERSION() */
__u32
capabilities
;
/* Device capabilities */
__u32
reserved
[
4
];
};
/* Values for 'capabilities' field */
#define V4L2_CAP_VIDEO_CAPTURE 0x00000001
/* Is a video capture device */
#define V4L2_CAP_VIDEO_OUTPUT 0x00000002
/* Is a video output device */
#define V4L2_CAP_VIDEO_OVERLAY 0x00000004
/* Can do video overlay */
#define V4L2_CAP_VBI_CAPTURE 0x00000010
/* Is a VBI capture device */
#define V4L2_CAP_VBI_OUTPUT 0x00000020
/* Is a VBI output device */
#define V4L2_CAP_RDS_CAPTURE 0x00000100
/* RDS data capture */
#define V4L2_CAP_TUNER 0x00010000
/* Has a tuner */
#define V4L2_CAP_AUDIO 0x00020000
/* has audio support */
#define V4L2_CAP_READWRITE 0x01000000
/* read/write systemcalls */
#define V4L2_CAP_ASYNCIO 0x02000000
/* async I/O */
#define V4L2_CAP_STREAMING 0x04000000
/* streaming I/O ioctls */
/*
* V I D E O I M A G E F O R M A T
*/
struct
v4l2_pix_format
{
__u32
width
;
__u32
height
;
__u32
pixelformat
;
enum
v4l2_field
field
;
__u32
bytesperline
;
/* for padding, zero if unused */
__u32
sizeimage
;
enum
v4l2_colorspace
colorspace
;
__u32
priv
;
/* private data, depends on pixelformat */
};
/* Pixel format FOURCC depth Description */
#define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R','G','B','1')
/* 8 RGB-3-3-2 */
#define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R','G','B','O')
/* 16 RGB-5-5-5 */
#define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R','G','B','P')
/* 16 RGB-5-6-5 */
#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R','G','B','Q')
/* 16 RGB-5-5-5 BE */
#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R','G','B','R')
/* 16 RGB-5-6-5 BE */
#define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B','G','R','3')
/* 24 BGR-8-8-8 */
#define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R','G','B','3')
/* 24 RGB-8-8-8 */
#define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B','G','R','4')
/* 32 BGR-8-8-8-8 */
#define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R','G','B','4')
/* 32 RGB-8-8-8-8 */
#define V4L2_PIX_FMT_GREY v4l2_fourcc('G','R','E','Y')
/* 8 Greyscale */
#define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y','V','U','9')
/* 9 YVU 4:1:0 */
#define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y','V','1','2')
/* 12 YVU 4:2:0 */
#define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y','U','Y','V')
/* 16 YUV 4:2:2 */
#define V4L2_PIX_FMT_UYVY v4l2_fourcc('U','Y','V','Y')
/* 16 YUV 4:2:2 */
#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4','2','2','P')
/* 16 YVU422 planar */
#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4','1','1','P')
/* 16 YVU411 planar */
#define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y','4','1','P')
/* 12 YUV 4:1:1 */
/* two planes -- one Y, one Cr + Cb interleaved */
#define V4L2_PIX_FMT_NV12 v4l2_fourcc('N','V','1','2')
/* 12 Y/CbCr 4:2:0 */
#define V4L2_PIX_FMT_NV21 v4l2_fourcc('N','V','2','1')
/* 12 Y/CrCb 4:2:0 */
/* The following formats are not defined in the V4L2 specification */
#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y','U','V','9')
/* 9 YUV 4:1:0 */
#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2')
/* 12 YUV 4:2:0 */
#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V')
/* 16 YUV 4:2:2 */
#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4')
/* 8 8-bit color */
/* compressed formats */
#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M','J','P','G')
/* Motion-JPEG */
#define V4L2_PIX_FMT_JPEG v4l2_fourcc('J','P','E','G')
/* JFIF JPEG */
#define V4L2_PIX_FMT_DV v4l2_fourcc('d','v','s','d')
/* 1394 */
#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G')
/* MPEG */
/* Vendor-specific formats */
#define V4L2_PIX_FMT_WNVA v4l2_fourcc('W','N','V','A')
/* Winnov hw compres */
/*
* F O R M A T E N U M E R A T I O N
*/
struct
v4l2_fmtdesc
{
__u32
index
;
/* Format number */
enum
v4l2_buf_type
type
;
/* buffer type */
__u32
flags
;
__u8
description
[
32
];
/* Description string */
__u32
pixelformat
;
/* Format fourcc */
__u32
reserved
[
4
];
};
#define V4L2_FMT_FLAG_COMPRESSED 0x0001
/*
* T I M E C O D E
*/
struct
v4l2_timecode
{
__u32
type
;
__u32
flags
;
__u8
frames
;
__u8
seconds
;
__u8
minutes
;
__u8
hours
;
__u8
userbits
[
4
];
};
/* Type */
#define V4L2_TC_TYPE_24FPS 1
#define V4L2_TC_TYPE_25FPS 2
#define V4L2_TC_TYPE_30FPS 3
#define V4L2_TC_TYPE_50FPS 4
#define V4L2_TC_TYPE_60FPS 5
/* Flags */
#define V4L2_TC_FLAG_DROPFRAME 0x0001
/* "drop-frame" mode */
#define V4L2_TC_FLAG_COLORFRAME 0x0002
#define V4L2_TC_USERBITS_field 0x000C
#define V4L2_TC_USERBITS_USERDEFINED 0x0000
#define V4L2_TC_USERBITS_8BITCHARS 0x0008
/* The above is based on SMPTE timecodes */
/*
* C O M P R E S S I O N P A R A M E T E R S
*/
#if 0
/* ### generic compression settings don't work, there is too much
* ### codec-specific stuff. Maybe reuse that for MPEG codec settings
* ### later ... */
struct v4l2_compression
{
__u32 quality;
__u32 keyframerate;
__u32 pframerate;
__u32 reserved[5];
};
#endif
struct
v4l2_jpegcompression
{
int
quality
;
int
APPn
;
/* Number of APP segment to be written,
* must be 0..15 */
int
APP_len
;
/* Length of data in JPEG APPn segment */
char
APP_data
[
60
];
/* Data in the JPEG APPn segment. */
int
COM_len
;
/* Length of data in JPEG COM segment */
char
COM_data
[
60
];
/* Data in JPEG COM segment */
__u32
jpeg_markers
;
/* Which markers should go into the JPEG
* output. Unless you exactly know what
* you do, leave them untouched.
* Inluding less markers will make the
* resulting code smaller, but there will
* be fewer aplications which can read it.
* The presence of the APP and COM marker
* is influenced by APP_len and COM_len
* ONLY, not by this property! */
#define V4L2_JPEG_MARKER_DHT (1<<3)
/* Define Huffman Tables */
#define V4L2_JPEG_MARKER_DQT (1<<4)
/* Define Quantization Tables */
#define V4L2_JPEG_MARKER_DRI (1<<5)
/* Define Restart Interval */
#define V4L2_JPEG_MARKER_COM (1<<6)
/* Comment segment */
#define V4L2_JPEG_MARKER_APP (1<<7)
/* App segment, driver will
* allways use APP0 */
};
/*
* M E M O R Y - M A P P I N G B U F F E R S
*/
struct
v4l2_requestbuffers
{
__u32
count
;
enum
v4l2_buf_type
type
;
enum
v4l2_memory
memory
;
__u32
reserved
[
2
];
};
struct
v4l2_buffer
{
__u32
index
;
enum
v4l2_buf_type
type
;
__u32
bytesused
;
__u32
flags
;
enum
v4l2_field
field
;
struct
timeval
timestamp
;
struct
v4l2_timecode
timecode
;
__u32
sequence
;
/* memory location */
enum
v4l2_memory
memory
;
union
{
__u32
offset
;
unsigned
long
userptr
;
}
m
;
__u32
length
;
__u32
reserved
[
2
];
};
/* Flags for 'flags' field */
#define V4L2_BUF_FLAG_MAPPED 0x0001
/* Buffer is mapped (flag) */
#define V4L2_BUF_FLAG_QUEUED 0x0002
/* Buffer is queued for processing */
#define V4L2_BUF_FLAG_DONE 0x0004
/* Buffer is ready */
#define V4L2_BUF_FLAG_KEYFRAME 0x0008
/* Image is a keyframe (I-frame) */
#define V4L2_BUF_FLAG_PFRAME 0x0010
/* Image is a P-frame */
#define V4L2_BUF_FLAG_BFRAME 0x0020
/* Image is a B-frame */
#define V4L2_BUF_FLAG_TIMECODE 0x0100
/* timecode field is valid */
/*
* O V E R L A Y P R E V I E W
*/
struct
v4l2_framebuffer
{
__u32
capability
;
__u32
flags
;
/* FIXME: in theory we should pass something like PCI device + memory
* region + offset instead of some physical address */
void
*
base
;
struct
v4l2_pix_format
fmt
;
};
/* Flags for the 'capability' field. Read only */
#define V4L2_FBUF_CAP_EXTERNOVERLAY 0x0001
#define V4L2_FBUF_CAP_CHROMAKEY 0x0002
#define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004
#define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008
/* Flags for the 'flags' field. */
#define V4L2_FBUF_FLAG_PRIMARY 0x0001
#define V4L2_FBUF_FLAG_OVERLAY 0x0002
#define V4L2_FBUF_FLAG_CHROMAKEY 0x0004
struct
v4l2_clip
{
struct
v4l2_rect
c
;
struct
v4l2_clip
*
next
;
};
struct
v4l2_window
{
struct
v4l2_rect
w
;
enum
v4l2_field
field
;
__u32
chromakey
;
struct
v4l2_clip
*
clips
;
__u32
clipcount
;
void
*
bitmap
;
};
/*
* C A P T U R E P A R A M E T E R S
*/
struct
v4l2_captureparm
{
__u32
capability
;
/* Supported modes */
__u32
capturemode
;
/* Current mode */
struct
v4l2_fract
timeperframe
;
/* Time per frame in .1us units */
__u32
extendedmode
;
/* Driver-specific extensions */
__u32
readbuffers
;
/* # of buffers for read */
__u32
reserved
[
4
];
};
/* Flags for 'capability' and 'capturemode' fields */
#define V4L2_MODE_HIGHQUALITY 0x0001
/* High quality imaging mode */
#define V4L2_CAP_TIMEPERFRAME 0x1000
/* timeperframe field is supported */
struct
v4l2_outputparm
{
__u32
capability
;
/* Supported modes */
__u32
outputmode
;
/* Current mode */
struct
v4l2_fract
timeperframe
;
/* Time per frame in seconds */
__u32
extendedmode
;
/* Driver-specific extensions */
__u32
writebuffers
;
/* # of buffers for write */
__u32
reserved
[
4
];
};
/*
* I N P U T I M A G E C R O P P I N G
*/
struct
v4l2_cropcap
{
enum
v4l2_buf_type
type
;
struct
v4l2_rect
bounds
;
struct
v4l2_rect
defrect
;
struct
v4l2_fract
pixelaspect
;
};
struct
v4l2_crop
{
enum
v4l2_buf_type
type
;
struct
v4l2_rect
c
;
};
/*
* A N A L O G V I D E O S T A N D A R D
*/
typedef
__u64
v4l2_std_id
;
/* one bit for each */
#define V4L2_STD_PAL_B ((v4l2_std_id)0x00000001)
#define V4L2_STD_PAL_B1 ((v4l2_std_id)0x00000002)
#define V4L2_STD_PAL_G ((v4l2_std_id)0x00000004)
#define V4L2_STD_PAL_H ((v4l2_std_id)0x00000008)
#define V4L2_STD_PAL_I ((v4l2_std_id)0x00000010)
#define V4L2_STD_PAL_D ((v4l2_std_id)0x00000020)
#define V4L2_STD_PAL_D1 ((v4l2_std_id)0x00000040)
#define V4L2_STD_PAL_K ((v4l2_std_id)0x00000080)
#define V4L2_STD_PAL_M ((v4l2_std_id)0x00000100)
#define V4L2_STD_PAL_N ((v4l2_std_id)0x00000200)
#define V4L2_STD_PAL_Nc ((v4l2_std_id)0x00000400)
#define V4L2_STD_PAL_60 ((v4l2_std_id)0x00000800)
#define V4L2_STD_NTSC_M ((v4l2_std_id)0x00001000)
#define V4L2_STD_NTSC_M_JP ((v4l2_std_id)0x00002000)
#define V4L2_STD_SECAM_B ((v4l2_std_id)0x00010000)
#define V4L2_STD_SECAM_D ((v4l2_std_id)0x00020000)
#define V4L2_STD_SECAM_G ((v4l2_std_id)0x00040000)
#define V4L2_STD_SECAM_H ((v4l2_std_id)0x00080000)
#define V4L2_STD_SECAM_K ((v4l2_std_id)0x00100000)
#define V4L2_STD_SECAM_K1 ((v4l2_std_id)0x00200000)
#define V4L2_STD_SECAM_L ((v4l2_std_id)0x00400000)
/* ATSC/HDTV */
#define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000)
#define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000)
/* some common needed stuff */
#define V4L2_STD_PAL_BG (V4L2_STD_PAL_B |\
V4L2_STD_PAL_B1 |\
V4L2_STD_PAL_G)
#define V4L2_STD_PAL_DK (V4L2_STD_PAL_D |\
V4L2_STD_PAL_D1 |\
V4L2_STD_PAL_K)
#define V4L2_STD_PAL (V4L2_STD_PAL_BG |\
V4L2_STD_PAL_DK |\
V4L2_STD_PAL_H |\
V4L2_STD_PAL_I)
#define V4L2_STD_NTSC (V4L2_STD_NTSC_M |\
V4L2_STD_NTSC_M_JP)
#define V4L2_STD_SECAM (V4L2_STD_SECAM_B |\
V4L2_STD_SECAM_D |\
V4L2_STD_SECAM_G |\
V4L2_STD_SECAM_H |\
V4L2_STD_SECAM_K |\
V4L2_STD_SECAM_K1 |\
V4L2_STD_SECAM_L)
#define V4L2_STD_525_60 (V4L2_STD_PAL_M |\
V4L2_STD_PAL_60 |\
V4L2_STD_NTSC)
#define V4L2_STD_625_50 (V4L2_STD_PAL |\
V4L2_STD_PAL_N |\
V4L2_STD_PAL_Nc |\
V4L2_STD_SECAM)
#define V4L2_STD_UNKNOWN 0
#define V4L2_STD_ALL (V4L2_STD_525_60 |\
V4L2_STD_625_50)
struct
v4l2_standard
{
__u32
index
;
v4l2_std_id
id
;
__u8
name
[
24
];
struct
v4l2_fract
frameperiod
;
/* Frames, not fields */
__u32
framelines
;
__u32
reserved
[
4
];
};
/*
* V I D E O I N P U T S
*/
struct
v4l2_input
{
__u32
index
;
/* Which input */
__u8
name
[
32
];
/* Label */
__u32
type
;
/* Type of input */
__u32
audioset
;
/* Associated audios (bitfield) */
__u32
tuner
;
/* Associated tuner */
v4l2_std_id
std
;
__u32
status
;
__u32
reserved
[
4
];
};
/* Values for the 'type' field */
#define V4L2_INPUT_TYPE_TUNER 1
#define V4L2_INPUT_TYPE_CAMERA 2
/* field 'status' - general */
#define V4L2_IN_ST_NO_POWER 0x00000001
/* Attached device is off */
#define V4L2_IN_ST_NO_SIGNAL 0x00000002
#define V4L2_IN_ST_NO_COLOR 0x00000004
/* field 'status' - analog */
#define V4L2_IN_ST_NO_H_LOCK 0x00000100
/* No horizontal sync lock */
#define V4L2_IN_ST_COLOR_KILL 0x00000200
/* Color killer is active */
/* field 'status' - digital */
#define V4L2_IN_ST_NO_SYNC 0x00010000
/* No synchronization lock */
#define V4L2_IN_ST_NO_EQU 0x00020000
/* No equalizer lock */
#define V4L2_IN_ST_NO_CARRIER 0x00040000
/* Carrier recovery failed */
/* field 'status' - VCR and set-top box */
#define V4L2_IN_ST_MACROVISION 0x01000000
/* Macrovision detected */
#define V4L2_IN_ST_NO_ACCESS 0x02000000
/* Conditional access denied */
#define V4L2_IN_ST_VTR 0x04000000
/* VTR time constant */
/*
* V I D E O O U T P U T S
*/
struct
v4l2_output
{
__u32
index
;
/* Which output */
__u8
name
[
32
];
/* Label */
__u32
type
;
/* Type of output */
__u32
audioset
;
/* Associated audios (bitfield) */
__u32
modulator
;
/* Associated modulator */
v4l2_std_id
std
;
__u32
reserved
[
4
];
};
/* Values for the 'type' field */
#define V4L2_OUTPUT_TYPE_MODULATOR 1
#define V4L2_OUTPUT_TYPE_ANALOG 2
#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
/*
* C O N T R O L S
*/
struct
v4l2_control
{
__u32
id
;
__s32
value
;
};
/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
struct
v4l2_queryctrl
{
__u32
id
;
enum
v4l2_ctrl_type
type
;
__u8
name
[
32
];
/* Whatever */
__s32
minimum
;
/* Note signedness */
__s32
maximum
;
__s32
step
;
__s32
default_value
;
__u32
flags
;
__u32
reserved
[
2
];
};
/* Used in the VIDIOC_QUERYMENU ioctl for querying menu items */
struct
v4l2_querymenu
{
__u32
id
;
__u32
index
;
__u8
name
[
32
];
/* Whatever */
__u32
reserved
;
};
/* Control flags */
#define V4L2_CTRL_FLAG_DISABLED 0x0001
#define V4L2_CTRL_FLAG_GRABBED 0x0002
/* Control IDs defined by V4L2 */
#define V4L2_CID_BASE 0x00980900
/* IDs reserved for driver specific controls */
#define V4L2_CID_PRIVATE_BASE 0x08000000
#define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0)
#define V4L2_CID_CONTRAST (V4L2_CID_BASE+1)
#define V4L2_CID_SATURATION (V4L2_CID_BASE+2)
#define V4L2_CID_HUE (V4L2_CID_BASE+3)
#define V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5)
#define V4L2_CID_AUDIO_BALANCE (V4L2_CID_BASE+6)
#define V4L2_CID_AUDIO_BASS (V4L2_CID_BASE+7)
#define V4L2_CID_AUDIO_TREBLE (V4L2_CID_BASE+8)
#define V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9)
#define V4L2_CID_AUDIO_LOUDNESS (V4L2_CID_BASE+10)
#define V4L2_CID_BLACK_LEVEL (V4L2_CID_BASE+11)
#define V4L2_CID_AUTO_WHITE_BALANCE (V4L2_CID_BASE+12)
#define V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13)
#define V4L2_CID_RED_BALANCE (V4L2_CID_BASE+14)
#define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE+15)
#define V4L2_CID_GAMMA (V4L2_CID_BASE+16)
#define V4L2_CID_WHITENESS (V4L2_CID_GAMMA)
/* ? Not sure */
#define V4L2_CID_EXPOSURE (V4L2_CID_BASE+17)
#define V4L2_CID_AUTOGAIN (V4L2_CID_BASE+18)
#define V4L2_CID_GAIN (V4L2_CID_BASE+19)
#define V4L2_CID_HFLIP (V4L2_CID_BASE+20)
#define V4L2_CID_VFLIP (V4L2_CID_BASE+21)
#define V4L2_CID_HCENTER (V4L2_CID_BASE+22)
#define V4L2_CID_VCENTER (V4L2_CID_BASE+23)
#define V4L2_CID_LASTP1 (V4L2_CID_BASE+24)
/* last CID + 1 */
/*
* T U N I N G
*/
struct
v4l2_tuner
{
__u32
index
;
__u8
name
[
32
];
enum
v4l2_tuner_type
type
;
__u32
capability
;
__u32
rangelow
;
__u32
rangehigh
;
__u32
rxsubchans
;
__u32
audmode
;
__s32
signal
;
__s32
afc
;
__u32
reserved
[
4
];
};
struct
v4l2_modulator
{
__u32
index
;
__u8
name
[
32
];
__u32
capability
;
__u32
rangelow
;
__u32
rangehigh
;
__u32
txsubchans
;
__u32
reserved
[
4
];
};
/* Flags for the 'capability' field */
#define V4L2_TUNER_CAP_LOW 0x0001
#define V4L2_TUNER_CAP_NORM 0x0002
#define V4L2_TUNER_CAP_STEREO 0x0010
#define V4L2_TUNER_CAP_LANG2 0x0020
#define V4L2_TUNER_CAP_SAP 0x0020
#define V4L2_TUNER_CAP_LANG1 0x0040
/* Flags for the 'rxsubchans' field */
#define V4L2_TUNER_SUB_MONO 0x0001
#define V4L2_TUNER_SUB_STEREO 0x0002
#define V4L2_TUNER_SUB_LANG2 0x0004
#define V4L2_TUNER_SUB_SAP 0x0004
#define V4L2_TUNER_SUB_LANG1 0x0008
/* Values for the 'audmode' field */
#define V4L2_TUNER_MODE_MONO 0x0000
#define V4L2_TUNER_MODE_STEREO 0x0001
#define V4L2_TUNER_MODE_LANG2 0x0002
#define V4L2_TUNER_MODE_SAP 0x0002
#define V4L2_TUNER_MODE_LANG1 0x0003
struct
v4l2_frequency
{
__u32
tuner
;
enum
v4l2_tuner_type
type
;
__u32
frequency
;
__u32
reserved
[
8
];
};
/*
* A U D I O
*/
struct
v4l2_audio
{
__u32
index
;
__u8
name
[
32
];
__u32
capability
;
__u32
mode
;
__u32
reserved
[
2
];
};
/* Flags for the 'capability' field */
#define V4L2_AUDCAP_STEREO 0x00001
#define V4L2_AUDCAP_AVL 0x00002
/* Flags for the 'mode' field */
#define V4L2_AUDMODE_AVL 0x00001
struct
v4l2_audioout
{
__u32
index
;
__u8
name
[
32
];
__u32
capability
;
__u32
mode
;
__u32
reserved
[
2
];
};
/*
* D A T A S E R V I C E S ( V B I )
*
* Data services API by Michael Schimek
*/
struct
v4l2_vbi_format
{
__u32
sampling_rate
;
/* in 1 Hz */
__u32
offset
;
__u32
samples_per_line
;
__u32
sample_format
;
/* V4L2_PIX_FMT_* */
__s32
start
[
2
];
__u32
count
[
2
];
__u32
flags
;
/* V4L2_VBI_* */
__u32
reserved
[
2
];
/* must be zero */
};
/* VBI flags */
#define V4L2_VBI_UNSYNC (1<< 0)
#define V4L2_VBI_INTERLACED (1<< 1)
/*
* A G G R E G A T E S T R U C T U R E S
*/
/* Stream data format
*/
struct
v4l2_format
{
enum
v4l2_buf_type
type
;
union
{
struct
v4l2_pix_format
pix
;
// V4L2_BUF_TYPE_VIDEO_CAPTURE
struct
v4l2_window
win
;
// V4L2_BUF_TYPE_VIDEO_OVERLAY
struct
v4l2_vbi_format
vbi
;
// V4L2_BUF_TYPE_VBI_CAPTURE
__u8
raw_data
[
200
];
// user-defined
}
fmt
;
};
/* Stream type-dependent parameters
*/
struct
v4l2_streamparm
{
enum
v4l2_buf_type
type
;
union
{
struct
v4l2_captureparm
capture
;
struct
v4l2_outputparm
output
;
__u8
raw_data
[
200
];
/* user-defined */
}
parm
;
};
/*
* I O C T L C O D E S F O R V I D E O D E V I C E S
*
*/
#define VIDIOC_QUERYCAP _IOR ('V', 0, struct v4l2_capability)
#define VIDIOC_RESERVED _IO ('V', 1)
#define VIDIOC_ENUM_FMT _IOWR ('V', 2, struct v4l2_fmtdesc)
#define VIDIOC_G_FMT _IOWR ('V', 4, struct v4l2_format)
#define VIDIOC_S_FMT _IOWR ('V', 5, struct v4l2_format)
#if 0
#define VIDIOC_G_COMP _IOR ('V', 6, struct v4l2_compression)
#define VIDIOC_S_COMP _IOW ('V', 7, struct v4l2_compression)
#endif
#define VIDIOC_REQBUFS _IOWR ('V', 8, struct v4l2_requestbuffers)
#define VIDIOC_QUERYBUF _IOWR ('V', 9, struct v4l2_buffer)
#define VIDIOC_G_FBUF _IOR ('V', 10, struct v4l2_framebuffer)
#define VIDIOC_S_FBUF _IOW ('V', 11, struct v4l2_framebuffer)
#define VIDIOC_OVERLAY _IOWR ('V', 14, int)
#define VIDIOC_QBUF _IOWR ('V', 15, struct v4l2_buffer)
#define VIDIOC_DQBUF _IOWR ('V', 17, struct v4l2_buffer)
#define VIDIOC_STREAMON _IOW ('V', 18, int)
#define VIDIOC_STREAMOFF _IOW ('V', 19, int)
#define VIDIOC_G_PARM _IOWR ('V', 21, struct v4l2_streamparm)
#define VIDIOC_S_PARM _IOW ('V', 22, struct v4l2_streamparm)
#define VIDIOC_G_STD _IOR ('V', 23, v4l2_std_id)
#define VIDIOC_S_STD _IOW ('V', 24, v4l2_std_id)
#define VIDIOC_ENUMSTD _IOWR ('V', 25, struct v4l2_standard)
#define VIDIOC_ENUMINPUT _IOWR ('V', 26, struct v4l2_input)
#define VIDIOC_G_CTRL _IOWR ('V', 27, struct v4l2_control)
#define VIDIOC_S_CTRL _IOW ('V', 28, struct v4l2_control)
#define VIDIOC_G_TUNER _IOWR ('V', 29, struct v4l2_tuner)
#define VIDIOC_S_TUNER _IOW ('V', 30, struct v4l2_tuner)
#define VIDIOC_G_AUDIO _IOWR ('V', 33, struct v4l2_audio)
#define VIDIOC_S_AUDIO _IOW ('V', 34, struct v4l2_audio)
#define VIDIOC_QUERYCTRL _IOWR ('V', 36, struct v4l2_queryctrl)
#define VIDIOC_QUERYMENU _IOWR ('V', 37, struct v4l2_querymenu)
#define VIDIOC_G_INPUT _IOR ('V', 38, int)
#define VIDIOC_S_INPUT _IOWR ('V', 39, int)
#define VIDIOC_G_OUTPUT _IOR ('V', 46, int)
#define VIDIOC_S_OUTPUT _IOWR ('V', 47, int)
#define VIDIOC_ENUMOUTPUT _IOWR ('V', 48, struct v4l2_output)
#define VIDIOC_G_AUDOUT _IOWR ('V', 49, struct v4l2_audioout)
#define VIDIOC_S_AUDOUT _IOW ('V', 50, struct v4l2_audioout)
#define VIDIOC_G_MODULATOR _IOWR ('V', 54, struct v4l2_modulator)
#define VIDIOC_S_MODULATOR _IOW ('V', 55, struct v4l2_modulator)
#define VIDIOC_G_FREQUENCY _IOWR ('V', 56, struct v4l2_frequency)
#define VIDIOC_S_FREQUENCY _IOW ('V', 57, struct v4l2_frequency)
#define VIDIOC_CROPCAP _IOR ('V', 58, struct v4l2_cropcap)
#define VIDIOC_G_CROP _IOWR ('V', 59, struct v4l2_crop)
#define VIDIOC_S_CROP _IOW ('V', 60, struct v4l2_crop)
#define VIDIOC_G_JPEGCOMP _IOR ('V', 61, struct v4l2_jpegcompression)
#define VIDIOC_S_JPEGCOMP _IOW ('V', 62, struct v4l2_jpegcompression)
#define VIDIOC_QUERYSTD _IOR ('V', 63, v4l2_std_id)
#define VIDIOC_TRY_FMT _IOWR ('V', 64, struct v4l2_format)
#define BASE_VIDIOC_PRIVATE 192
/* 192-255 are private */
#ifdef __KERNEL__
/*
*
* V 4 L 2 D R I V E R H E L P E R A P I
*
* Some commonly needed functions for drivers (v4l2-common.o module)
*/
#include <linux/fs.h>
/* Video standard functions */
extern
unsigned
int
v4l2_video_std_fps
(
struct
v4l2_standard
*
vs
);
extern
int
v4l2_video_std_construct
(
struct
v4l2_standard
*
vs
,
int
id
,
char
*
name
);
/* Compatibility layer interface */
typedef
int
(
*
v4l2_kioctl
)(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
void
*
arg
);
int
v4l_compat_translate_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
int
cmd
,
void
*
arg
,
v4l2_kioctl
driver_ioctl
);
/* names for fancy debug output */
extern
char
*
v4l2_field_names
[];
extern
char
*
v4l2_type_names
[];
extern
char
*
v4l2_ioctl_names
[];
#endif
/* __KERNEL__ */
#endif
/* __LINUX_VIDEODEV2_H */
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
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