42 #define V4L_ALLFORMATS  3 
   43 #define V4L_RAWFORMATS  1 
   44 #define V4L_COMPFORMATS 2 
   49 #define V4L_TS_DEFAULT  0 
   59 #define V4L_TS_MONO2ABS 2 
   66 #define V4L_TS_CONVERT_READY V4L_TS_DEFAULT 
   93     int (*
open_f)(
const char *file, 
int oflag, ...);
 
   96     int (*
ioctl_f)(
int fd, 
unsigned long int request, ...);
 
  110     struct v4l2_capability cap;
 
  115 #define SET_WRAPPERS(prefix) do {       \ 
  116     s->open_f   = prefix ## open;       \ 
  117     s->close_f  = prefix ## close;      \ 
  118     s->dup_f    = prefix ## dup;        \ 
  119     s->ioctl_f  = prefix ## ioctl;      \ 
  120     s->read_f   = prefix ## read;       \ 
  121     s->mmap_f   = prefix ## mmap;       \ 
  122     s->munmap_f = prefix ## munmap;     \ 
  136 #define v4l2_open   s->open_f 
  137 #define v4l2_close  s->close_f 
  138 #define v4l2_dup    s->dup_f 
  139 #define v4l2_ioctl  s->ioctl_f 
  140 #define v4l2_read   s->read_f 
  141 #define v4l2_mmap   s->mmap_f 
  142 #define v4l2_munmap s->munmap_f 
  156     if (
v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
 
  164            fd, cap.capabilities);
 
  166     if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
 
  172     if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
 
  174                "The device does not support the streaming I/O method.\n");
 
  187                        uint32_t pixelformat)
 
  190     struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
 
  193     fmt.fmt.pix.width = *
width;
 
  194     fmt.fmt.pix.height = *
height;
 
  195     fmt.fmt.pix.pixelformat = pixelformat;
 
  196     fmt.fmt.pix.field = V4L2_FIELD_ANY;
 
  203     if ((*width != fmt.fmt.pix.width) || (*height != fmt.fmt.pix.height)) {
 
  205                "The V4L2 driver changed the video from %dx%d to %dx%d\n",
 
  206                *width, *height, fmt.fmt.pix.width, fmt.fmt.pix.height);
 
  207         *width = fmt.fmt.pix.width;
 
  208         *height = fmt.fmt.pix.height;
 
  211     if (pixelformat != fmt.fmt.pix.pixelformat) {
 
  213                "The V4L2 driver changed the pixel format " 
  214                "from 0x%08X to 0x%08X\n",
 
  215                pixelformat, fmt.fmt.pix.pixelformat);
 
  219     if (fmt.fmt.pix.field == V4L2_FIELD_INTERLACED) {
 
  221                "The V4L2 driver is using the interlaced mode\n");
 
  236     if (std & V4L2_STD_NTSC)
 
  242 #if HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 
  246     struct v4l2_frmsizeenum vfse = { .pixel_format = pixelformat };
 
  248     while(!
v4l2_ioctl(s->
fd, VIDIOC_ENUM_FRAMESIZES, &vfse)) {
 
  250         case V4L2_FRMSIZE_TYPE_DISCRETE:
 
  252                    vfse.discrete.width, vfse.discrete.height);
 
  254         case V4L2_FRMSIZE_TYPE_CONTINUOUS:
 
  255         case V4L2_FRMSIZE_TYPE_STEPWISE:
 
  257                    vfse.stepwise.min_width,
 
  258                    vfse.stepwise.max_width,
 
  259                    vfse.stepwise.step_width,
 
  260                    vfse.stepwise.min_height,
 
  261                    vfse.stepwise.max_height,
 
  262                    vfse.stepwise.step_height);
 
  272     struct v4l2_fmtdesc vfd = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
 
  280         if (!(vfd.flags & V4L2_FMT_FLAG_COMPRESSED) &&
 
  284                    fmt_name ? fmt_name : 
"Unsupported",
 
  286         } 
else if (vfd.flags & V4L2_FMT_FLAG_COMPRESSED &&
 
  290                    desc ? desc->
name : 
"Unsupported",
 
  296 #ifdef V4L2_FMT_FLAG_EMULATED 
  297         if (vfd.flags & V4L2_FMT_FLAG_EMULATED)
 
  300 #if HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 
  301         list_framesizes(ctx, vfd.pixelformat);
 
  311     struct v4l2_standard standard;
 
  316     for (standard.index = 0; ; standard.index++) {
 
  327                standard.index, (uint64_t)standard.id, standard.name);
 
  335     struct v4l2_requestbuffers req = {
 
  336         .type   = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 
  338         .memory = V4L2_MEMORY_MMAP
 
  364     for (i = 0; i < req.count; i++) {
 
  365         struct v4l2_buffer buf = {
 
  366             .type   = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 
  368             .memory = V4L2_MEMORY_MMAP
 
  379                    "buf_len[%d] = %d < expected frame size %d\n",
 
  384                                PROT_READ | PROT_WRITE, MAP_SHARED,
 
  385                                s->
fd, buf.m.offset);
 
  413     struct v4l2_buffer buf = { 0 };
 
  414     struct buff_data *buf_descriptor = opaque;
 
  417     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  418     buf.memory = V4L2_MEMORY_MMAP;
 
  419     buf.index = buf_descriptor->
index;
 
  425 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC) 
  426 static int64_t av_gettime_monotonic(
void)
 
  439         ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * 
AV_TIME_BASE) {
 
  444 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC) 
  446         now = av_gettime_monotonic();
 
  448             (ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * 
AV_TIME_BASE)) {
 
  474 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC) 
  477         int64_t nowm = av_gettime_monotonic();
 
  489     struct v4l2_buffer buf = {
 
  490         .type   = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 
  491         .memory = V4L2_MEMORY_MMAP
 
  498     while ((res = 
v4l2_ioctl(s->
fd, VIDIOC_DQBUF, &buf)) < 0 && (errno == EINTR));
 
  517 #ifdef V4L2_BUF_FLAG_ERROR 
  518     if (buf.flags & V4L2_BUF_FLAG_ERROR) {
 
  520                "Dequeued v4l2 buffer contains corrupted data (%d bytes).\n",
 
  533                    "Dequeued v4l2 buffer contains %d bytes, but %d were expected. Flags: 0x%08X.\n",
 
  560         pkt->
size     = buf.bytesused;
 
  563         if (!buf_descriptor) {
 
  572         buf_descriptor->
index = buf.index;
 
  573         buf_descriptor->
s     = 
s;
 
  584     pkt->
pts = buf.timestamp.tv_sec * INT64_C(1000000) + buf.timestamp.tv_usec;
 
  593     enum v4l2_buf_type 
type;
 
  596     for (i = 0; i < s->
buffers; i++) {
 
  597         struct v4l2_buffer buf = {
 
  598             .type   = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 
  600             .memory = V4L2_MEMORY_MMAP
 
  612     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  625     enum v4l2_buf_type 
type;
 
  628     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  633     for (i = 0; i < s->
buffers; i++) {
 
  643     struct v4l2_standard standard = { 0 };
 
  644     struct v4l2_streamparm streamparm = { 0 };
 
  645     struct v4l2_fract *tpf;
 
  675             if (
v4l2_ioctl(s->
fd, VIDIOC_S_STD, &standard.id) < 0) {
 
  682                    "This device does not support any standard\n");
 
  688         tpf = &standard.frameperiod;
 
  698                     tpf = &streamparm.parm.capture.timeperframe;
 
  704             if (standard.id == s->
std_id) {
 
  706                        "Current standard: %s, id: %"PRIx64
", frameperiod: %d/%d\n",
 
  707                        standard.name, (uint64_t)standard.id, tpf->numerator, tpf->denominator);
 
  712         tpf = &streamparm.parm.capture.timeperframe;
 
  715     streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
  716     if (
v4l2_ioctl(s->
fd, VIDIOC_G_PARM, &streamparm) < 0) {
 
  719     } 
else if (framerate_q.
num && framerate_q.
den) {
 
  720         if (streamparm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) {
 
  721             tpf = &streamparm.parm.capture.timeperframe;
 
  724                    framerate_q.
den, framerate_q.
num);
 
  725             tpf->numerator   = framerate_q.
den;
 
  726             tpf->denominator = framerate_q.
num;
 
  728             if (
v4l2_ioctl(s->
fd, VIDIOC_S_PARM, &streamparm) < 0) {
 
  735             if (framerate_q.
num != tpf->denominator ||
 
  736                 framerate_q.
den != tpf->numerator) {
 
  738                        "The driver changed the time per frame from " 
  740                        framerate_q.
den, framerate_q.
num,
 
  741                        tpf->numerator, tpf->denominator);
 
  745                    "The driver does not permit changing the time per frame\n");
 
  748     if (tpf->denominator > 0 && tpf->numerator > 0) {
 
  762                            uint32_t *desired_format,
 
  769     if (*desired_format) {
 
  770         ret = 
device_init(ctx, width, height, *desired_format);
 
  778     if (!*desired_format) {
 
  787                 ret = 
device_init(ctx, width, height, *desired_format);
 
  790                 else if (ret != 
AVERROR(EINVAL))
 
  796         if (*desired_format == 0) {
 
  798                    "codec '%s' (id %d), pixel format '%s' (id %d)\n",
 
  822     uint32_t desired_format;
 
  825     struct v4l2_input input = { 0 };
 
  835         v4l2_log_file = fopen(
"/dev/null", 
"w");
 
  867     av_log(ctx, 
AV_LOG_DEBUG, 
"Current input_channel: %d, input_name: %s, input_std: %"PRIx64
"\n",
 
  868            s->
channel, input.name, (uint64_t)input.std);
 
  902         struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
 
  905                "Querying the device for the current frame size\n");
 
  913         s->
width  = fmt.fmt.pix.width;
 
  914         s->
height = fmt.fmt.pix.height;
 
  916                "Setting frame size to %dx%d\n", s->
width, s->
height);
 
  956     if (desired_format == V4L2_PIX_FMT_YVU420)
 
  958     else if (desired_format == V4L2_PIX_FMT_YVU410)
 
  974 #if FF_API_CODED_FRAME && FF_API_LAVF_AVCTX 
  987 #if FF_API_CODED_FRAME && FF_API_LAVF_AVCTX 
 1015     return !strncmp(name, 
"video", 5) ||
 
 1016            !strncmp(name, 
"radio", 5) ||
 
 1017            !strncmp(name, 
"vbi", 3) ||
 
 1018            !strncmp(name, 
"v4l-subdev", 10);
 
 1025     struct dirent *entry;
 
 1027     struct v4l2_capability cap;
 
 1033     dir = opendir(
"/dev");
 
 1039     while ((entry = readdir(dir))) {
 
 1088 #define OFFSET(x) offsetof(struct video_data, x) 
 1089 #define DEC AV_OPT_FLAG_DECODING_PARAM 
 1093     { 
"channel",      
"set TV channel, used only by frame grabber",               
OFFSET(channel),      
AV_OPT_TYPE_INT,    {.i64 = -1 },  -1, INT_MAX, 
DEC },
 
 1099     { 
"list_formats", 
"list available formats and exit",                          
OFFSET(list_format),  
AV_OPT_TYPE_INT,    {.i64 = 0 },  0, INT_MAX, 
DEC, 
"list_formats" },
 
 1104     { 
"list_standards", 
"list supported standards and exit",                      
OFFSET(list_standard), 
AV_OPT_TYPE_INT,   {.i64 = 0 },  0, 1, 
DEC, 
"list_standards" },
 
 1105     { 
"all",            
"show all supported standards",                           
OFFSET(list_standard), 
AV_OPT_TYPE_CONST, {.i64 = 1 },  0, 0, 
DEC, 
"list_standards" },
 
 1107     { 
"timestamps",   
"set type of timestamps for grabbed frames",                
OFFSET(ts_mode),      
AV_OPT_TYPE_INT,    {.i64 = 0 }, 0, 2, 
DEC, 
"timestamps" },
 
 1108     { 
"ts",           
"set type of timestamps for grabbed frames",                
OFFSET(ts_mode),      
AV_OPT_TYPE_INT,    {.i64 = 0 }, 0, 2, 
DEC, 
"timestamps" },
 
 1112     { 
"use_libv4l2",  
"use libv4l2 (v4l-utils) conversion functions",             
OFFSET(use_libv4l2),  
AV_OPT_TYPE_BOOL,   {.i64 = 0}, 0, 1, 
DEC },
 
 1125     .
name           = 
"video4linux2,v4l2",
 
int(* open_f)(const char *file, int oflag,...)
Structure describes basic parameters of the device. 
#define avpriv_atomic_int_add_and_fetch
#define AVERROR_INVALIDDATA
Invalid data found when processing input. 
static enum AVPixelFormat pix_fmt
This structure describes decoded (raw) audio or video data. 
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate. 
ptrdiff_t const GLvoid * data
ssize_t(* read_f)(int fd, void *buffer, size_t n)
char * device_description
human friendly name 
static int device_init(AVFormatContext *ctx, int *width, int *height, uint32_t pixelformat)
#define AV_LOG_WARNING
Something somehow does not look correct. 
#define LIBAVUTIL_VERSION_INT
char * pixel_format
Set by a private option. 
char * device_name
device name, format depends on device 
enum AVCodecID codec_id
Specific type of the encoded data (the codec used). 
static int enqueue_buffer(struct video_data *s, struct v4l2_buffer *buf)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static int device_try_init(AVFormatContext *ctx, enum AVPixelFormat pix_fmt, int *width, int *height, uint32_t *desired_format, enum AVCodecID *codec_id)
static void list_formats(AVFormatContext *ctx, int type)
uint32_t ff_fmt_ff2v4l(enum AVPixelFormat pix_fmt, enum AVCodecID codec_id)
double ff_timefilter_eval(TimeFilter *self, double delta)
Evaluate the filter at a specified time. 
const struct fmt_map ff_fmt_conversion_table[]
volatile int buffers_queued
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled. 
#define V4L_TS_ABS
Autodetect the kind of timestamps returned by the kernel and convert to absolute (wall clock) timesta...
Opaque type representing a time filter state. 
static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
static int init_convert_timestamp(AVFormatContext *ctx, int64_t ts)
unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt)
Return a value representing the fourCC code associated to the pixel format pix_fmt, or 0 if no associated fourCC code can be found. 
enum AVStreamParseType need_parsing
static int v4l2_read_header(AVFormatContext *ctx)
static int mmap_start(AVFormatContext *ctx)
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file. 
AVStream ** streams
A list of all streams in the file. 
static const int desired_video_buffers
int flags
Flags modifying the (de)muxer behaviour. 
static int v4l2_is_v4l_dev(const char *name)
static double av_q2d(AVRational a)
Convert an AVRational to a double. 
#define AV_LOG_VERBOSE
Detailed information. 
int interlaced_frame
The content of the picture is interlaced. 
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array. 
#define V4L_TS_DEFAULT
Return timestamps to the user exactly as returned by the kernel. 
static int v4l2_set_parameters(AVFormatContext *ctx)
static int device_open(AVFormatContext *ctx)
enum AVCodecID video_codec_id
Forced video codec_id. 
static int first_field(const struct video_data *s)
#define V4L_TS_CONVERT_READY
Once the kind of timestamps returned by the kernel have been detected, the value of the timefilter (N...
int64_t bit_rate
The average bitrate of the encoded data (in bits per second). 
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL. 
static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_list)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers. 
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values. 
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align)
Return the size in bytes of the amount of data required to store an image with the given parameters...
AVCodecID
Identify the syntax and semantics of the bitstream. 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
#define avpriv_atomic_int_get
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static const AVOption options[]
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers. 
enum AVMediaType codec_type
General type of the encoded data. 
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored. 
AVBufferRef * av_buffer_create(uint8_t *data, int size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array. 
AVDeviceInfo ** devices
list of autodetected devices 
static const uint8_t offset[127][2]
AVRational avg_frame_rate
Average framerate. 
#define V4L_TS_MONO2ABS
Assume kernel timestamps are from the monotonic clock and convert to absolute timestamps. 
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
char filename[1024]
input or output filename 
#define AV_TIME_BASE
Internal time base represented as integer. 
static void list_standards(AVFormatContext *ctx)
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare. 
static int convert_timestamp(AVFormatContext *ctx, int64_t *ts)
static void mmap_close(struct video_data *s)
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted. 
int list_format
Set by a private option. 
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec. 
int64_t av_gettime(void)
Get the current time in microseconds. 
#define SET_WRAPPERS(prefix)
#define AV_LOG_INFO
Standard information. 
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter. 
char * av_strdup(const char *s)
Duplicate a string. 
void av_packet_unref(AVPacket *pkt)
Wipe the packet. 
Describe the class of an AVClass context structure. 
static int v4l2_read_close(AVFormatContext *ctx)
Rational number (pair of numerator and denominator). 
const char * name
Name of the codec described by this descriptor. 
offset must point to two consecutive integers 
This structure contains the data a format has to probe a file. 
int list_standard
Set by a private option. 
static int mmap_init(AVFormatContext *ctx)
This struct describes the properties of a single codec described by an AVCodecID. ...
static const AVClass v4l2_class
static int v4l2_read_packet(AVFormatContext *ctx, AVPacket *pkt)
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point. 
AVCodec * avcodec_find_decoder_by_name(const char *name)
Find a registered decoder with the specified name. 
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str. 
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter. 
#define FF_DISABLE_DEPRECATION_WARNINGS
char * framerate
Set by a private option. 
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values. 
enum AVCodecID ff_fmt_v4l2codec(uint32_t v4l2_fmt)
#define FF_ENABLE_DEPRECATION_WARNINGS
int top_field_first
If the content is interlaced, is top field displayed first. 
void * priv_data
Format private data. 
enum AVPixelFormat ff_fmt_v4l2ff(uint32_t v4l2_fmt, enum AVCodecID codec_id)
AVInputFormat ff_v4l2_demuxer
static void mmap_release_buffer(void *opaque, uint8_t *data)
AVCodecParameters * codecpar
#define av_malloc_array(a, b)
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC). 
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name. 
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown. 
int(* munmap_f)(void *_start, size_t length)
static int v4l2_read_probe(AVProbeData *p)
#define MKTAG(a, b, c, d)
AVRational r_frame_rate
Real base framerate of the stream. 
int nb_devices
number of autodetected devices 
AVPixelFormat
Pixel format. 
This structure stores compressed data. 
int(* ioctl_f)(int fd, unsigned long int request,...)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...