FFmpeg
v4l2.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000,2001 Fabrice Bellard
3  * Copyright (c) 2006 Luca Abeni
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Video4Linux2 grab interface
25  *
26  * Part of this file is based on the V4L2 video capture example
27  * (http://linuxtv.org/downloads/v4l-dvb-apis/capture-example.html)
28  *
29  * Thanks to Michael Niedermayer for providing the mapping between
30  * V4L2_PIX_FMT_* and AV_PIX_FMT_*
31  */
32 
33 #include <stdatomic.h>
34 
35 #include "libavutil/avassert.h"
36 #include "libavutil/avstring.h"
37 #include "libavutil/imgutils.h"
38 #include "libavutil/mem.h"
39 #include "libavutil/parseutils.h"
40 #include "libavutil/pixdesc.h"
41 #include "libavutil/time.h"
42 #include "libavcodec/avcodec.h"
43 #include "libavcodec/codec_desc.h"
44 #include "libavformat/demux.h"
45 #include "libavformat/internal.h"
46 #include "avdevice.h"
47 #include "timefilter.h"
48 #include "v4l2-common.h"
49 #include <dirent.h>
50 
51 #if CONFIG_LIBV4L2
52 #include <libv4l2.h>
53 #endif
54 
55 static const int desired_video_buffers = 256;
56 
57 #define V4L_ALLFORMATS 3
58 #define V4L_RAWFORMATS 1
59 #define V4L_COMPFORMATS 2
60 
61 /**
62  * Return timestamps to the user exactly as returned by the kernel
63  */
64 #define V4L_TS_DEFAULT 0
65 /**
66  * Autodetect the kind of timestamps returned by the kernel and convert to
67  * absolute (wall clock) timestamps.
68  */
69 #define V4L_TS_ABS 1
70 /**
71  * Assume kernel timestamps are from the monotonic clock and convert to
72  * absolute timestamps.
73  */
74 #define V4L_TS_MONO2ABS 2
75 
76 /**
77  * Once the kind of timestamps returned by the kernel have been detected,
78  * the value of the timefilter (NULL or not) determines whether a conversion
79  * takes place.
80  */
81 #define V4L_TS_CONVERT_READY V4L_TS_DEFAULT
82 
83 struct buf_data {
84  void *start;
85  unsigned int len;
86 };
87 
88 struct video_data {
89  AVClass *class;
90  int fd;
91  int pixelformat; /* V4L2_PIX_FMT_* */
92  int width, height;
96  int ts_mode;
99 
101  enum v4l2_buf_type buf_type;
102 
103  int buffers;
106  char *standard;
107  v4l2_std_id std_id;
108  int channel;
109  char *pixel_format; /**< Set by a private option. */
110  int list_format; /**< Set by a private option. */
111  int list_standard; /**< Set by a private option. */
112  char *framerate; /**< Set by a private option. */
113 
115  int (*open_f)(const char *file, int oflag, ...);
116  int (*close_f)(int fd);
117  int (*dup_f)(int fd);
118 #if HAVE_IOCTL_POSIX
119  int (*ioctl_f)(int fd, int request, ...);
120 #else
121  int (*ioctl_f)(int fd, unsigned long int request, ...);
122 #endif
123  ssize_t (*read_f)(int fd, void *buffer, size_t n);
124  void *(*mmap_f)(void *start, size_t length, int prot, int flags, int fd, int64_t offset);
125  int (*munmap_f)(void *_start, size_t length);
126 };
127 
128 struct buf_desc {
129  struct video_data *s;
130  int index;
131 };
132 
133 static int device_open(AVFormatContext *ctx, const char* device_path)
134 {
135  struct video_data *s = ctx->priv_data;
136  struct v4l2_capability cap;
137  int fd;
138  int err;
139  int flags = O_RDWR;
140 
141 #define SET_WRAPPERS(prefix) do { \
142  s->open_f = prefix ## open; \
143  s->close_f = prefix ## close; \
144  s->dup_f = prefix ## dup; \
145  s->ioctl_f = prefix ## ioctl; \
146  s->read_f = prefix ## read; \
147  s->mmap_f = prefix ## mmap; \
148  s->munmap_f = prefix ## munmap; \
149 } while (0)
150 
151  if (s->use_libv4l2) {
152 #if CONFIG_LIBV4L2
153  SET_WRAPPERS(v4l2_);
154 #else
155  av_log(ctx, AV_LOG_ERROR, "libavdevice is not built with libv4l2 support.\n");
156  return AVERROR(EINVAL);
157 #endif
158  } else {
159  SET_WRAPPERS();
160  }
161 
162 #define v4l2_open s->open_f
163 #define v4l2_close s->close_f
164 #define v4l2_dup s->dup_f
165 #define v4l2_ioctl s->ioctl_f
166 #define v4l2_read s->read_f
167 #define v4l2_mmap s->mmap_f
168 #define v4l2_munmap s->munmap_f
169 
170  if (ctx->flags & AVFMT_FLAG_NONBLOCK) {
171  flags |= O_NONBLOCK;
172  }
173 
174  fd = v4l2_open(device_path, flags, 0);
175  if (fd < 0) {
176  err = AVERROR(errno);
177  av_log(ctx, AV_LOG_ERROR, "Cannot open video device %s: %s\n",
178  device_path, av_err2str(err));
179  return err;
180  }
181 
182  if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
183  err = AVERROR(errno);
184  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n",
185  av_err2str(err));
186  goto fail;
187  }
188 
189  av_log(ctx, AV_LOG_VERBOSE, "fd:%d capabilities:%x\n",
190  fd, cap.capabilities);
191 
192  if (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) {
193  s->multiplanar = 0;
194  s->buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
195  } else if (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE) {
196  s->multiplanar = 1;
197  s->buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
198  } else {
199  av_log(ctx, AV_LOG_ERROR, "Not a video capture device.\n");
200  err = AVERROR(ENODEV);
201  goto fail;
202  }
203 
204  if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
206  "The device does not support the streaming I/O method.\n");
207  err = AVERROR(ENOSYS);
208  goto fail;
209  }
210 
211  return fd;
212 
213 fail:
214  v4l2_close(fd);
215  return err;
216 }
217 
218 static int device_init(AVFormatContext *ctx, int *width, int *height,
219  uint32_t pixelformat)
220 {
221  struct video_data *s = ctx->priv_data;
222  struct v4l2_format fmt = { .type = s->buf_type };
223  int res = 0;
224 
225  fmt.fmt.pix.width = *width;
226  fmt.fmt.pix.height = *height;
227  fmt.fmt.pix.pixelformat = pixelformat;
228  fmt.fmt.pix.field = V4L2_FIELD_ANY;
229 
230  /* Some drivers will fail and return EINVAL when the pixelformat
231  is not supported (even if type field is valid and supported) */
232  if (v4l2_ioctl(s->fd, VIDIOC_S_FMT, &fmt) < 0)
233  res = AVERROR(errno);
234 
235  if ((*width != fmt.fmt.pix.width) || (*height != fmt.fmt.pix.height)) {
237  "The V4L2 driver changed the video from %dx%d to %dx%d\n",
238  *width, *height, fmt.fmt.pix.width, fmt.fmt.pix.height);
239  *width = fmt.fmt.pix.width;
240  *height = fmt.fmt.pix.height;
241  }
242 
243  if (pixelformat != fmt.fmt.pix.pixelformat) {
245  "The V4L2 driver changed the pixel format "
246  "from 0x%08X to 0x%08X\n",
247  pixelformat, fmt.fmt.pix.pixelformat);
248  res = AVERROR(EINVAL);
249  }
250 
251  if (fmt.fmt.pix.field == V4L2_FIELD_INTERLACED) {
253  "The V4L2 driver is using the interlaced mode\n");
254  s->interlaced = 1;
255  }
256 
257  return res;
258 }
259 
260 static int first_field(const struct video_data *s)
261 {
262  int res;
263  v4l2_std_id std;
264 
265  res = v4l2_ioctl(s->fd, VIDIOC_G_STD, &std);
266  if (res < 0)
267  return 0;
268  if (std & V4L2_STD_NTSC)
269  return 0;
270 
271  return 1;
272 }
273 
274 #if HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE
275 static void list_framesizes(AVFormatContext *ctx, uint32_t pixelformat)
276 {
277  const struct video_data *s = ctx->priv_data;
278  struct v4l2_frmsizeenum vfse = { .pixel_format = pixelformat };
279 
280  while(!v4l2_ioctl(s->fd, VIDIOC_ENUM_FRAMESIZES, &vfse)) {
281  switch (vfse.type) {
282  case V4L2_FRMSIZE_TYPE_DISCRETE:
283  av_log(ctx, AV_LOG_INFO, " %ux%u",
284  vfse.discrete.width, vfse.discrete.height);
285  break;
286  case V4L2_FRMSIZE_TYPE_CONTINUOUS:
287  case V4L2_FRMSIZE_TYPE_STEPWISE:
288  av_log(ctx, AV_LOG_INFO, " {%u-%u, %u}x{%u-%u, %u}",
289  vfse.stepwise.min_width,
290  vfse.stepwise.max_width,
291  vfse.stepwise.step_width,
292  vfse.stepwise.min_height,
293  vfse.stepwise.max_height,
294  vfse.stepwise.step_height);
295  }
296  vfse.index++;
297  }
298 }
299 #endif
300 
302 {
303  const struct video_data *s = ctx->priv_data;
304  struct v4l2_fmtdesc vfd = { .type = s->buf_type };
305 
306  while(!v4l2_ioctl(s->fd, VIDIOC_ENUM_FMT, &vfd)) {
307  enum AVCodecID codec_id = ff_fmt_v4l2codec(vfd.pixelformat);
308  enum AVPixelFormat pix_fmt = ff_fmt_v4l2ff(vfd.pixelformat, codec_id);
309 
310  vfd.index++;
311 
312  if (!(vfd.flags & V4L2_FMT_FLAG_COMPRESSED) &&
313  type & V4L_RAWFORMATS) {
314  const char *fmt_name = av_get_pix_fmt_name(pix_fmt);
315  av_log(ctx, AV_LOG_INFO, "Raw : %11s : %20s :",
316  fmt_name ? fmt_name : "Unsupported",
317  vfd.description);
318  } else if (vfd.flags & V4L2_FMT_FLAG_COMPRESSED &&
319  type & V4L_COMPFORMATS) {
321  av_log(ctx, AV_LOG_INFO, "Compressed: %11s : %20s :",
322  desc ? desc->name : "Unsupported",
323  vfd.description);
324  } else {
325  continue;
326  }
327 
328 #ifdef V4L2_FMT_FLAG_EMULATED
329  if (vfd.flags & V4L2_FMT_FLAG_EMULATED)
330  av_log(ctx, AV_LOG_INFO, " Emulated :");
331 #endif
332 #if HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE
333  list_framesizes(ctx, vfd.pixelformat);
334 #endif
335  av_log(ctx, AV_LOG_INFO, "\n");
336  }
337 }
338 
340 {
341  int ret;
342  struct video_data *s = ctx->priv_data;
343  struct v4l2_standard standard;
344 
345  if (s->std_id == 0)
346  return;
347 
348  for (standard.index = 0; ; standard.index++) {
349  if (v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) {
350  ret = AVERROR(errno);
351  if (ret == AVERROR(EINVAL)) {
352  break;
353  } else {
354  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMSTD): %s\n", av_err2str(ret));
355  return;
356  }
357  }
358  av_log(ctx, AV_LOG_INFO, "%2d, %16"PRIx64", %s\n",
359  standard.index, (uint64_t)standard.id, standard.name);
360  }
361 }
362 
363 static void mmap_free(struct video_data *s, int n)
364 {
365  while (--n > 0) {
366  v4l2_munmap(s->buf_data[n].start, s->buf_data[n].len);
367  }
368  av_freep(&s->buf_data);
369 }
370 
372 {
373  int i, res;
374  struct video_data *s = ctx->priv_data;
375  struct v4l2_requestbuffers req = {
376  .type = s->buf_type,
377  .count = desired_video_buffers,
378  .memory = V4L2_MEMORY_MMAP
379  };
380 
381  if (v4l2_ioctl(s->fd, VIDIOC_REQBUFS, &req) < 0) {
382  res = AVERROR(errno);
383  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_REQBUFS): %s\n", av_err2str(res));
384  return res;
385  }
386 
387  if (req.count < 2) {
388  av_log(ctx, AV_LOG_ERROR, "Insufficient buffer memory\n");
389  return AVERROR(ENOMEM);
390  }
391  s->buffers = req.count;
392  s->buf_data = av_malloc_array(s->buffers, sizeof(struct buf_data));
393  if (!s->buf_data) {
394  av_log(ctx, AV_LOG_ERROR, "Cannot allocate buffer data\n");
395  return AVERROR(ENOMEM);
396  }
397 
398  for (i = 0; i < req.count; i++) {
399  unsigned int buf_length, buf_offset;
400  struct v4l2_plane planes[VIDEO_MAX_PLANES];
401  struct v4l2_buffer buf = {
402  .type = s->buf_type,
403  .index = i,
404  .memory = V4L2_MEMORY_MMAP,
405  .m.planes = s->multiplanar ? planes : NULL,
406  .length = s->multiplanar ? VIDEO_MAX_PLANES : 0,
407  };
408  if (v4l2_ioctl(s->fd, VIDIOC_QUERYBUF, &buf) < 0) {
409  res = AVERROR(errno);
410  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYBUF): %s\n", av_err2str(res));
411  goto fail;
412  }
413 
414  if (s->multiplanar) {
415  if (buf.length != 1) {
416  av_log(ctx, AV_LOG_ERROR, "multiplanar only supported when buf.length == 1\n");
417  res = AVERROR_PATCHWELCOME;
418  goto fail;
419  }
420  buf_length = buf.m.planes[0].length;
421  buf_offset = buf.m.planes[0].m.mem_offset;
422  } else {
423  buf_length = buf.length;
424  buf_offset = buf.m.offset;
425  }
426 
427  s->buf_data[i].len = buf_length;
428  if (s->frame_size > 0 && s->buf_data[i].len < s->frame_size) {
430  "buf_data[%d].len = %d < expected frame size %d\n",
431  i, buf_length, s->frame_size);
432  res = AVERROR(ENOMEM);
433  goto fail;
434  }
435  s->buf_data[i].start = v4l2_mmap(NULL, buf_length,
436  PROT_READ | PROT_WRITE, MAP_SHARED,
437  s->fd, buf_offset);
438 
439  if (s->buf_data[i].start == MAP_FAILED) {
440  res = AVERROR(errno);
441  av_log(ctx, AV_LOG_ERROR, "mmap: %s\n", av_err2str(res));
442  goto fail;
443  }
444  }
445 
446  return 0;
447 
448 fail:
449  mmap_free(s, i);
450  return res;
451 }
452 
453 static int enqueue_buffer(struct video_data *s, struct v4l2_buffer *buf)
454 {
455  int res = 0;
456 
457  if (v4l2_ioctl(s->fd, VIDIOC_QBUF, buf) < 0) {
458  res = AVERROR(errno);
459  av_log(NULL, AV_LOG_ERROR, "ioctl(VIDIOC_QBUF): %s\n", av_err2str(res));
460  } else {
461  atomic_fetch_add(&s->buffers_queued, 1);
462  }
463 
464  return res;
465 }
466 
467 static void mmap_release_buffer(void *opaque, uint8_t *data)
468 {
469  struct v4l2_plane planes[VIDEO_MAX_PLANES];
470  struct v4l2_buffer buf = { 0 };
471  struct buf_desc *buf_descriptor = opaque;
472  struct video_data *s = buf_descriptor->s;
473 
474  buf.type = s->buf_type;
475  buf.memory = V4L2_MEMORY_MMAP;
476  buf.index = buf_descriptor->index;
477  buf.m.planes = s->multiplanar ? planes : NULL;
478  buf.length = s->multiplanar ? VIDEO_MAX_PLANES : 0;
479  av_free(buf_descriptor);
480 
481  enqueue_buffer(s, &buf);
482 }
483 
484 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
485 static int64_t av_gettime_monotonic(void)
486 {
487  return av_gettime_relative();
488 }
489 #endif
490 
492 {
493  struct video_data *s = ctx->priv_data;
494  int64_t now;
495 
496  now = av_gettime();
497  if (s->ts_mode == V4L_TS_ABS &&
498  ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE) {
499  av_log(ctx, AV_LOG_INFO, "Detected absolute timestamps\n");
500  s->ts_mode = V4L_TS_CONVERT_READY;
501  return 0;
502  }
503 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
504  if (ctx->streams[0]->avg_frame_rate.num) {
505  now = av_gettime_monotonic();
506  if (s->ts_mode == V4L_TS_MONO2ABS ||
507  (ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE)) {
508  AVRational tb = {AV_TIME_BASE, 1};
510  av_log(ctx, AV_LOG_INFO, "Detected monotonic timestamps, converting\n");
511  /* microseconds instead of seconds, MHz instead of Hz */
512  s->timefilter = ff_timefilter_new(1, period, 1.0E-6);
513  if (!s->timefilter)
514  return AVERROR(ENOMEM);
515  s->ts_mode = V4L_TS_CONVERT_READY;
516  return 0;
517  }
518  }
519 #endif
520  av_log(ctx, AV_LOG_ERROR, "Unknown timestamps\n");
521  return AVERROR(EIO);
522 }
523 
525 {
526  struct video_data *s = ctx->priv_data;
527 
528  if (s->ts_mode) {
529  int r = init_convert_timestamp(ctx, *ts);
530  if (r < 0)
531  return r;
532  }
533 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
534  if (s->timefilter) {
535  int64_t nowa = av_gettime();
536  int64_t nowm = av_gettime_monotonic();
537  ff_timefilter_update(s->timefilter, nowa, nowm - s->last_time_m);
538  s->last_time_m = nowm;
539  *ts = ff_timefilter_eval(s->timefilter, *ts - nowm);
540  }
541 #endif
542  return 0;
543 }
544 
546 {
547  struct video_data *s = ctx->priv_data;
548  struct v4l2_plane planes[VIDEO_MAX_PLANES];
549  struct v4l2_buffer buf = {
550  .type = s->buf_type,
551  .memory = V4L2_MEMORY_MMAP,
552  .m.planes = s->multiplanar ? planes : NULL,
553  .length = s->multiplanar ? VIDEO_MAX_PLANES : 0,
554  };
555  struct timeval buf_ts;
556  unsigned int bytesused;
557  int res;
558 
559  pkt->size = 0;
560 
561  /* FIXME: Some special treatment might be needed in case of loss of signal... */
562  while ((res = v4l2_ioctl(s->fd, VIDIOC_DQBUF, &buf)) < 0 && (errno == EINTR));
563  if (res < 0) {
564  if (errno == EAGAIN)
565  return AVERROR(EAGAIN);
566 
567  res = AVERROR(errno);
568  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_DQBUF): %s\n",
569  av_err2str(res));
570  return res;
571  }
572 
573  buf_ts = buf.timestamp;
574 
575  if (buf.index >= s->buffers) {
576  av_log(ctx, AV_LOG_ERROR, "Invalid buffer index received.\n");
577  return AVERROR(EINVAL);
578  }
579  atomic_fetch_add(&s->buffers_queued, -1);
580  // always keep at least one buffer queued
581  av_assert0(atomic_load(&s->buffers_queued) >= 1);
582 
583  bytesused = s->multiplanar ? buf.m.planes[0].bytesused : buf.bytesused;
584 
585 #ifdef V4L2_BUF_FLAG_ERROR
586  if (buf.flags & V4L2_BUF_FLAG_ERROR) {
588  "Dequeued v4l2 buffer contains corrupted data (%d bytes).\n",
589  bytesused);
590  bytesused = 0;
591  } else
592 #endif
593  {
594  /* CPIA is a compressed format and we don't know the exact number of bytes
595  * used by a frame, so set it here as the driver announces it. */
597  s->frame_size = bytesused;
598 
599  if (s->frame_size > 0 && bytesused != s->frame_size) {
601  "Dequeued v4l2 buffer contains %d bytes, but %d were expected. Flags: 0x%08X.\n",
602  bytesused, s->frame_size, buf.flags);
603  bytesused = 0;
604  }
605  }
606 
607  /* Image is at s->buf_data[buf.index].start */
608  if (atomic_load(&s->buffers_queued) == FFMAX(s->buffers / 8, 1)) {
609  /* when we start getting low on queued buffers, fall back on copying data */
610  res = av_new_packet(pkt, bytesused);
611  if (res < 0) {
612  av_log(ctx, AV_LOG_ERROR, "Error allocating a packet.\n");
613  enqueue_buffer(s, &buf);
614  return res;
615  }
616  memcpy(pkt->data, s->buf_data[buf.index].start, bytesused);
617 
618  res = enqueue_buffer(s, &buf);
619  if (res) {
621  return res;
622  }
623  } else {
624  struct buf_desc *buf_descriptor;
625 
626  pkt->data = s->buf_data[buf.index].start;
627  pkt->size = bytesused;
628 
629  buf_descriptor = av_malloc(sizeof(struct buf_desc));
630  if (!buf_descriptor) {
631  /* Something went wrong... Since av_malloc() failed, we cannot even
632  * allocate a buffer for memcpying into it
633  */
634  av_log(ctx, AV_LOG_ERROR, "Failed to allocate a buffer descriptor\n");
635  enqueue_buffer(s, &buf);
636 
637  return AVERROR(ENOMEM);
638  }
639  buf_descriptor->index = buf.index;
640  buf_descriptor->s = s;
641 
643  buf_descriptor, 0);
644  if (!pkt->buf) {
645  av_log(ctx, AV_LOG_ERROR, "Failed to create a buffer\n");
646  enqueue_buffer(s, &buf);
647  av_freep(&buf_descriptor);
648  return AVERROR(ENOMEM);
649  }
650  }
651  pkt->pts = buf_ts.tv_sec * INT64_C(1000000) + buf_ts.tv_usec;
653 
654  return pkt->size;
655 }
656 
658 {
659  struct video_data *s = ctx->priv_data;
660  enum v4l2_buf_type type;
661  int i, res;
662 
663  for (i = 0; i < s->buffers; i++) {
664  struct v4l2_plane planes[VIDEO_MAX_PLANES];
665  struct v4l2_buffer buf = {
666  .type = s->buf_type,
667  .index = i,
668  .memory = V4L2_MEMORY_MMAP,
669  .m.planes = s->multiplanar ? planes : NULL,
670  .length = s->multiplanar ? VIDEO_MAX_PLANES : 0,
671  };
672 
673  if (v4l2_ioctl(s->fd, VIDIOC_QBUF, &buf) < 0) {
674  res = AVERROR(errno);
675  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QBUF): %s\n",
676  av_err2str(res));
677  return res;
678  }
679  }
680  atomic_store(&s->buffers_queued, s->buffers);
681 
682  type = s->buf_type;
683  if (v4l2_ioctl(s->fd, VIDIOC_STREAMON, &type) < 0) {
684  res = AVERROR(errno);
685  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_STREAMON): %s\n",
686  av_err2str(res));
687  return res;
688  }
689 
690  return 0;
691 }
692 
693 static void mmap_close(struct video_data *s)
694 {
695  enum v4l2_buf_type type;
696 
697  type = s->buf_type;
698  /* We do not check for the result, because we could
699  * not do anything about it anyway...
700  */
701  v4l2_ioctl(s->fd, VIDIOC_STREAMOFF, &type);
702  mmap_free(s, s->buffers);
703 }
704 
706 {
707  struct video_data *s = ctx->priv_data;
708  struct v4l2_standard standard = { 0 };
709  struct v4l2_streamparm streamparm = { 0 };
710  struct v4l2_fract *tpf;
711  AVRational framerate_q = { 0 };
712  int i, ret;
713 
714  if (s->framerate &&
715  (ret = av_parse_video_rate(&framerate_q, s->framerate)) < 0) {
716  av_log(ctx, AV_LOG_ERROR, "Could not parse framerate '%s'.\n",
717  s->framerate);
718  return ret;
719  }
720 
721  if (s->standard) {
722  if (s->std_id) {
723  ret = 0;
724  av_log(ctx, AV_LOG_DEBUG, "Setting standard: %s\n", s->standard);
725  /* set tv standard */
726  for (i = 0; ; i++) {
727  standard.index = i;
728  if (v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) {
729  ret = AVERROR(errno);
730  break;
731  }
732  if (!av_strcasecmp(standard.name, s->standard))
733  break;
734  }
735  if (ret < 0) {
736  av_log(ctx, AV_LOG_ERROR, "Unknown or unsupported standard '%s'\n", s->standard);
737  return ret;
738  }
739 
740  if (v4l2_ioctl(s->fd, VIDIOC_S_STD, &standard.id) < 0) {
741  ret = AVERROR(errno);
742  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_STD): %s\n", av_err2str(ret));
743  return ret;
744  }
745  } else {
747  "This device does not support any standard\n");
748  }
749  }
750 
751  /* get standard */
752  if (v4l2_ioctl(s->fd, VIDIOC_G_STD, &s->std_id) == 0) {
753  tpf = &standard.frameperiod;
754  for (i = 0; ; i++) {
755  standard.index = i;
756  if (v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) {
757  ret = AVERROR(errno);
758  if (ret == AVERROR(EINVAL)
759 #ifdef ENODATA
760  || ret == AVERROR(ENODATA)
761 #endif
762  ) {
763  tpf = &streamparm.parm.capture.timeperframe;
764  break;
765  }
766  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMSTD): %s\n", av_err2str(ret));
767  return ret;
768  }
769  if (standard.id == s->std_id) {
771  "Current standard: %s, id: %"PRIx64", frameperiod: %d/%d\n",
772  standard.name, (uint64_t)standard.id, tpf->numerator, tpf->denominator);
773  break;
774  }
775  }
776  } else {
777  tpf = &streamparm.parm.capture.timeperframe;
778  }
779 
780  streamparm.type = s->buf_type;
781  if (v4l2_ioctl(s->fd, VIDIOC_G_PARM, &streamparm) < 0) {
782  ret = AVERROR(errno);
783  av_log(ctx, AV_LOG_WARNING, "ioctl(VIDIOC_G_PARM): %s\n", av_err2str(ret));
784  } else if (framerate_q.num && framerate_q.den) {
785  if (streamparm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) {
786  tpf = &streamparm.parm.capture.timeperframe;
787 
788  av_log(ctx, AV_LOG_DEBUG, "Setting time per frame to %d/%d\n",
789  framerate_q.den, framerate_q.num);
790  tpf->numerator = framerate_q.den;
791  tpf->denominator = framerate_q.num;
792 
793  if (v4l2_ioctl(s->fd, VIDIOC_S_PARM, &streamparm) < 0) {
794  ret = AVERROR(errno);
795  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_PARM): %s\n",
796  av_err2str(ret));
797  return ret;
798  }
799 
800  if (framerate_q.num != tpf->denominator ||
801  framerate_q.den != tpf->numerator) {
803  "The driver changed the time per frame from "
804  "%d/%d to %d/%d\n",
805  framerate_q.den, framerate_q.num,
806  tpf->numerator, tpf->denominator);
807  }
808  } else {
810  "The driver does not permit changing the time per frame\n");
811  }
812  }
813  if (tpf->denominator > 0 && tpf->numerator > 0) {
814  ctx->streams[0]->avg_frame_rate.num = tpf->denominator;
815  ctx->streams[0]->avg_frame_rate.den = tpf->numerator;
817  } else
818  av_log(ctx, AV_LOG_WARNING, "Time per frame unknown\n");
819 
820  return 0;
821 }
822 
824  enum AVPixelFormat pix_fmt,
825  int *width,
826  int *height,
827  uint32_t *desired_format,
828  enum AVCodecID *codec_id)
829 {
830  int ret, i;
831 
832  *desired_format = ff_fmt_ff2v4l(pix_fmt, ctx->video_codec_id);
833 
834  if (*desired_format) {
835  ret = device_init(ctx, width, height, *desired_format);
836  if (ret < 0) {
837  *desired_format = 0;
838  if (ret != AVERROR(EINVAL))
839  return ret;
840  }
841  }
842 
843  if (!*desired_format) {
847  av_log(ctx, AV_LOG_DEBUG, "Trying to set codec:%s pix_fmt:%s\n",
849  (char *)av_x_if_null(av_get_pix_fmt_name(ff_fmt_conversion_table[i].ff_fmt), "none"));
850 
851  *desired_format = ff_fmt_conversion_table[i].v4l2_fmt;
852  ret = device_init(ctx, width, height, *desired_format);
853  if (ret >= 0)
854  break;
855  else if (ret != AVERROR(EINVAL))
856  return ret;
857  *desired_format = 0;
858  }
859  }
860 
861  if (*desired_format == 0) {
862  av_log(ctx, AV_LOG_ERROR, "Cannot find a proper format for "
863  "codec '%s' (id %d), pixel format '%s' (id %d)\n",
865  (char *)av_x_if_null(av_get_pix_fmt_name(pix_fmt), "none"), pix_fmt);
866  ret = AVERROR(EINVAL);
867  }
868  }
869 
870  *codec_id = ff_fmt_v4l2codec(*desired_format);
871  if (*codec_id == AV_CODEC_ID_NONE)
872  av_assert0(ret == AVERROR(EINVAL));
873  return ret;
874 }
875 
876 static int v4l2_read_probe(const AVProbeData *p)
877 {
878  if (av_strstart(p->filename, "/dev/video", NULL))
879  return AVPROBE_SCORE_MAX - 1;
880  return 0;
881 }
882 
884 {
885  struct video_data *s = ctx->priv_data;
886  AVStream *st;
887  int res = 0;
888  uint32_t desired_format;
891  struct v4l2_input input = { 0 };
892 
894  if (!st)
895  return AVERROR(ENOMEM);
896 
897 #if CONFIG_LIBV4L2
898  /* silence libv4l2 logging. if fopen() fails v4l2_log_file will be NULL
899  and errors will get sent to stderr */
900  if (s->use_libv4l2)
901  v4l2_log_file = fopen("/dev/null", "w");
902 #endif
903 
904  s->fd = device_open(ctx, ctx->url);
905  if (s->fd < 0)
906  return s->fd;
907 
908  if (s->channel != -1) {
909  /* set video input */
910  av_log(ctx, AV_LOG_DEBUG, "Selecting input_channel: %d\n", s->channel);
911  if (v4l2_ioctl(s->fd, VIDIOC_S_INPUT, &s->channel) < 0) {
912  res = AVERROR(errno);
913  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_INPUT): %s\n", av_err2str(res));
914  goto fail;
915  }
916  } else {
917  /* get current video input */
918  if (v4l2_ioctl(s->fd, VIDIOC_G_INPUT, &s->channel) < 0) {
919  res = AVERROR(errno);
920  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_INPUT): %s\n", av_err2str(res));
921  goto fail;
922  }
923  }
924 
925  /* enum input */
926  input.index = s->channel;
927  if (v4l2_ioctl(s->fd, VIDIOC_ENUMINPUT, &input) < 0) {
928  res = AVERROR(errno);
929  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMINPUT): %s\n", av_err2str(res));
930  goto fail;
931  }
932  s->std_id = input.std;
933  av_log(ctx, AV_LOG_DEBUG, "Current input_channel: %d, input_name: %s, input_std: %"PRIx64"\n",
934  s->channel, input.name, (uint64_t)input.std);
935 
936  if (s->list_format) {
937  list_formats(ctx, s->list_format);
938  res = AVERROR_EXIT;
939  goto fail;
940  }
941 
942  if (s->list_standard) {
944  res = AVERROR_EXIT;
945  goto fail;
946  }
947 
948  avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
949 
950  if (s->pixel_format) {
951  const AVCodecDescriptor *desc = avcodec_descriptor_get_by_name(s->pixel_format);
952 
953  if (desc)
954  ctx->video_codec_id = desc->id;
955 
956  pix_fmt = av_get_pix_fmt(s->pixel_format);
957 
958  if (pix_fmt == AV_PIX_FMT_NONE && !desc) {
959  av_log(ctx, AV_LOG_ERROR, "No such input format: %s.\n",
960  s->pixel_format);
961 
962  res = AVERROR(EINVAL);
963  goto fail;
964  }
965  }
966 
967  if (!s->width && !s->height) {
968  struct v4l2_format fmt = { .type = s->buf_type };
969 
971  "Querying the device for the current frame size\n");
972  if (v4l2_ioctl(s->fd, VIDIOC_G_FMT, &fmt) < 0) {
973  res = AVERROR(errno);
974  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_FMT): %s\n",
975  av_err2str(res));
976  goto fail;
977  }
978 
979  s->width = fmt.fmt.pix.width;
980  s->height = fmt.fmt.pix.height;
982  "Setting frame size to %dx%d\n", s->width, s->height);
983  }
984 
985  res = device_try_init(ctx, pix_fmt, &s->width, &s->height, &desired_format, &codec_id);
986  if (res < 0)
987  goto fail;
988 
989  /* If no pixel_format was specified, the codec_id was not known up
990  * until now. Set video_codec_id in the context, as codec_id will
991  * not be available outside this function
992  */
995 
996  if ((res = av_image_check_size(s->width, s->height, 0, ctx)) < 0)
997  goto fail;
998 
999  s->pixelformat = desired_format;
1000 
1001  if ((res = v4l2_set_parameters(ctx)) < 0)
1002  goto fail;
1003 
1004  st->codecpar->format = ff_fmt_v4l2ff(desired_format, codec_id);
1005  if (st->codecpar->format != AV_PIX_FMT_NONE)
1006  s->frame_size = av_image_get_buffer_size(st->codecpar->format,
1007  s->width, s->height, 1);
1008 
1009  if ((res = mmap_init(ctx)) ||
1010  (res = mmap_start(ctx)) < 0)
1011  goto fail;
1012 
1013  s->top_field_first = first_field(s);
1014 
1016  st->codecpar->codec_id = codec_id;
1018  st->codecpar->codec_tag =
1020  else if (codec_id == AV_CODEC_ID_H264) {
1022  }
1023  if (desired_format == V4L2_PIX_FMT_YVU420)
1024  st->codecpar->codec_tag = MKTAG('Y', 'V', '1', '2');
1025  else if (desired_format == V4L2_PIX_FMT_YVU410)
1026  st->codecpar->codec_tag = MKTAG('Y', 'V', 'U', '9');
1027  st->codecpar->width = s->width;
1028  st->codecpar->height = s->height;
1029  if (st->avg_frame_rate.den)
1030  st->codecpar->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
1031 
1032  return 0;
1033 
1034 fail:
1035  v4l2_close(s->fd);
1036  return res;
1037 }
1038 
1040 {
1041  int res;
1042 
1043  if ((res = mmap_read_frame(ctx, pkt)) < 0) {
1044  return res;
1045  }
1046 
1047  return pkt->size;
1048 }
1049 
1051 {
1052  struct video_data *s = ctx->priv_data;
1053 
1054  if (atomic_load(&s->buffers_queued) != s->buffers)
1055  av_log(ctx, AV_LOG_WARNING, "Some buffers are still owned by the caller on "
1056  "close.\n");
1057 
1058  mmap_close(s);
1059 
1060  ff_timefilter_destroy(s->timefilter);
1061  v4l2_close(s->fd);
1062  return 0;
1063 }
1064 
1065 static int v4l2_is_v4l_dev(const char *name)
1066 {
1067  return !strncmp(name, "video", 5) ||
1068  !strncmp(name, "radio", 5) ||
1069  !strncmp(name, "vbi", 3) ||
1070  !strncmp(name, "v4l-subdev", 10);
1071 }
1072 
1074 {
1075  struct video_data *s = ctx->priv_data;
1076  DIR *dir;
1077  struct dirent *entry;
1078  int ret = 0;
1079 
1080  if (!device_list)
1081  return AVERROR(EINVAL);
1082 
1083  dir = opendir("/dev");
1084  if (!dir) {
1085  ret = AVERROR(errno);
1086  av_log(ctx, AV_LOG_ERROR, "Couldn't open the directory: %s\n", av_err2str(ret));
1087  return ret;
1088  }
1089  while ((entry = readdir(dir))) {
1090  AVDeviceInfo *device = NULL;
1091  struct v4l2_capability cap;
1092  int fd = -1, size;
1093  char device_name[256];
1094 
1095  if (!v4l2_is_v4l_dev(entry->d_name))
1096  continue;
1097 
1098  size = snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name);
1099  if (size >= sizeof(device_name)) {
1100  av_log(ctx, AV_LOG_ERROR, "Device name too long.\n");
1101  ret = AVERROR(ENOSYS);
1102  break;
1103  }
1104 
1105  if ((fd = device_open(ctx, device_name)) < 0)
1106  continue;
1107 
1108  if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
1109  ret = AVERROR(errno);
1110  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n", av_err2str(ret));
1111  goto fail;
1112  }
1113 
1114  device = av_mallocz(sizeof(AVDeviceInfo));
1115  if (!device) {
1116  ret = AVERROR(ENOMEM);
1117  goto fail;
1118  }
1119  device->device_name = av_strdup(device_name);
1120  device->device_description = av_strdup(cap.card);
1121  if (!device->device_name || !device->device_description) {
1122  ret = AVERROR(ENOMEM);
1123  goto fail;
1124  }
1125 
1126  if ((ret = av_dynarray_add_nofree(&device_list->devices,
1127  &device_list->nb_devices, device)) < 0)
1128  goto fail;
1129 
1130  v4l2_close(fd);
1131  continue;
1132 
1133  fail:
1134  if (device) {
1135  av_freep(&device->device_name);
1136  av_freep(&device->device_description);
1137  av_freep(&device);
1138  }
1139  v4l2_close(fd);
1140  break;
1141  }
1142  closedir(dir);
1143  return ret;
1144 }
1145 
1146 #define OFFSET(x) offsetof(struct video_data, x)
1147 #define DEC AV_OPT_FLAG_DECODING_PARAM
1148 
1149 static const AVOption options[] = {
1150  { "standard", "set TV standard, used only by analog frame grabber", OFFSET(standard), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC },
1151  { "channel", "set TV channel, used only by frame grabber", OFFSET(channel), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, INT_MAX, DEC },
1152  { "video_size", "set frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
1153  { "pixel_format", "set preferred pixel format", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
1154  { "input_format", "set preferred pixel format (for raw video) or codec name", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
1155  { "framerate", "set frame rate", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
1156 
1157  { "list_formats", "list available formats and exit", OFFSET(list_format), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, DEC, .unit = "list_formats" },
1158  { "all", "show all available formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_ALLFORMATS }, 0, INT_MAX, DEC, .unit = "list_formats" },
1159  { "raw", "show only non-compressed formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_RAWFORMATS }, 0, INT_MAX, DEC, .unit = "list_formats" },
1160  { "compressed", "show only compressed formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_COMPFORMATS }, 0, INT_MAX, DEC, .unit = "list_formats" },
1161 
1162  { "list_standards", "list supported standards and exit", OFFSET(list_standard), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, DEC, .unit = "list_standards" },
1163  { "all", "show all supported standards", OFFSET(list_standard), AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, DEC, .unit = "list_standards" },
1164 
1165  { "timestamps", "set type of timestamps for grabbed frames", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, DEC, .unit = "timestamps" },
1166  { "ts", "set type of timestamps for grabbed frames", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, DEC, .unit = "timestamps" },
1167  { "default", "use timestamps from the kernel", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_DEFAULT }, 0, 2, DEC, .unit = "timestamps" },
1168  { "abs", "use absolute timestamps (wall clock)", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_ABS }, 0, 2, DEC, .unit = "timestamps" },
1169  { "mono2abs", "force conversion from monotonic to absolute timestamps", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_MONO2ABS }, 0, 2, DEC, .unit = "timestamps" },
1170  { "use_libv4l2", "use libv4l2 (v4l-utils) conversion functions", OFFSET(use_libv4l2), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
1171  { NULL },
1172 };
1173 
1174 static const AVClass v4l2_class = {
1175  .class_name = "V4L2 indev",
1176  .item_name = av_default_item_name,
1177  .option = options,
1178  .version = LIBAVUTIL_VERSION_INT,
1180 };
1181 
1183  .p.name = "video4linux2,v4l2",
1184  .p.long_name = NULL_IF_CONFIG_SMALL("Video4Linux2 device grab"),
1185  .p.flags = AVFMT_NOFILE,
1186  .p.priv_class = &v4l2_class,
1187  .priv_data_size = sizeof(struct video_data),
1189  .read_header = v4l2_read_header,
1190  .read_packet = v4l2_read_packet,
1191  .read_close = v4l2_read_close,
1192  .get_device_list = v4l2_get_device_list,
1193 };
ff_v4l2_demuxer
const FFInputFormat ff_v4l2_demuxer
Definition: v4l2.c:1182
flags
const SwsFlags flags[]
Definition: swscale.c:72
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:432
TimeFilter
Opaque type representing a time filter state.
Definition: timefilter.c:34
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
entry
#define entry
Definition: aom_film_grain_template.c:66
atomic_store
#define atomic_store(object, desired)
Definition: stdatomic.h:85
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
video_data::channel
int channel
Definition: v4l2.c:108
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
v4l2_class
static const AVClass v4l2_class
Definition: v4l2.c:1174
buf_desc::s
struct video_data * s
Definition: v4l2.c:129
atomic_fetch_add
#define atomic_fetch_add(object, operand)
Definition: stdatomic.h:137
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
v4l2_set_parameters
static int v4l2_set_parameters(AVFormatContext *ctx)
Definition: v4l2.c:705
AVDeviceInfo::device_name
char * device_name
device name, format depends on device
Definition: avdevice.h:334
int64_t
long long int64_t
Definition: coverity.c:34
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:208
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: codec_id.h:65
AVDeviceInfoList::nb_devices
int nb_devices
number of autodetected devices
Definition: avdevice.h:345
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1331
AVPacket::data
uint8_t * data
Definition: packet.h:588
buf_data
Definition: v4l2.c:83
video_data::buffers
int buffers
Definition: v4l2.c:103
AVOption
AVOption.
Definition: opt.h:429
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:833
video_data::interlaced
int interlaced
Definition: v4l2.c:94
data
const char data[16]
Definition: mxf.c:149
mmap_init
static int mmap_init(AVFormatContext *ctx)
Definition: v4l2.c:371
atomic_int
intptr_t atomic_int
Definition: stdatomic.h:55
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AVFormatContext::video_codec_id
enum AVCodecID video_codec_id
Forced video codec_id.
Definition: avformat.h:1467
video_data::ioctl_f
int(* ioctl_f)(int fd, unsigned long int request,...)
Definition: v4l2.c:121
video_data::width
int width
Definition: v4l2.c:92
ff_fmt_ff2v4l
uint32_t ff_fmt_ff2v4l(enum AVPixelFormat pix_fmt, enum AVCodecID codec_id)
Definition: v4l2-common.c:79
ff_fmt_conversion_table
const struct fmt_map ff_fmt_conversion_table[]
Definition: v4l2-common.c:21
avcodec_pix_fmt_to_codec_tag
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,...
Definition: raw.c:31
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:781
ff_timefilter_eval
double ff_timefilter_eval(TimeFilter *self, double delta)
Evaluate the filter at a specified time.
Definition: timefilter.c:92
fail
#define fail()
Definition: checkasm.h:223
AVSTREAM_PARSE_FULL_ONCE
@ AVSTREAM_PARSE_FULL_ONCE
full parsing and repack of the first frame only, only implemented for H.264 currently
Definition: avformat.h:592
ff_fmt_v4l2codec
enum AVCodecID ff_fmt_v4l2codec(uint32_t v4l2_fmt)
Definition: v4l2-common.c:109
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
video_data::framerate
char * framerate
Set by a private option.
Definition: v4l2.c:112
AVRational::num
int num
Numerator.
Definition: rational.h:59
ff_timefilter_new
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter.
Definition: timefilter.c:50
video_data::buf_data
struct buf_data * buf_data
Definition: v4l2.c:105
video_data::use_libv4l2
int use_libv4l2
Definition: v4l2.c:114
AVDeviceInfoList::devices
AVDeviceInfo ** devices
list of autodetected devices
Definition: avdevice.h:344
video_data::close_f
int(* close_f)(int fd)
Definition: v4l2.c:116
video_data::frame_size
int frame_size
Definition: v4l2.c:93
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
buf_desc::index
int index
Definition: v4l2.c:130
device_init
static int device_init(AVFormatContext *ctx, int *width, int *height, uint32_t pixelformat)
Definition: v4l2.c:218
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: codec_desc.h:38
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:98
video_data::buffers_queued
atomic_int buffers_queued
Definition: v4l2.c:104
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1414
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
video_data::last_time_m
int64_t last_time_m
Definition: v4l2.c:98
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
buf_data::len
unsigned int len
Definition: v4l2.c:85
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
v4l2-common.h
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
atomic_load
#define atomic_load(object)
Definition: stdatomic.h:93
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
E
#define E
Definition: avdct.c:34
video_data::ts_mode
int ts_mode
Definition: v4l2.c:96
buf_desc
Definition: v4l2.c:128
v4l2_ioctl
#define v4l2_ioctl
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:571
framerate
float framerate
Definition: av1_levels.c:29
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
video_data::std_id
v4l2_std_id std_id
Definition: v4l2.c:107
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
timefilter.h
video_data::fd
int fd
Definition: v4l2.c:90
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
period
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without period
Definition: writing_filters.txt:89
AV_OPT_TYPE_IMAGE_SIZE
@ AV_OPT_TYPE_IMAGE_SIZE
Underlying C type is two consecutive integers.
Definition: opt.h:303
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AV_CODEC_ID_CPIA
@ AV_CODEC_ID_CPIA
Definition: codec_id.h:265
v4l2_open
#define v4l2_open
ff_fmt_v4l2ff
enum AVPixelFormat ff_fmt_v4l2ff(uint32_t v4l2_fmt, enum AVCodecID codec_id)
Definition: v4l2-common.c:95
parseutils.h
V4L_RAWFORMATS
#define V4L_RAWFORMATS
Definition: v4l2.c:58
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
fmt_map::v4l2_fmt
uint32_t v4l2_fmt
Definition: v4l2-common.h:44
options
Definition: swscale.c:45
video_data::height
int height
Definition: v4l2.c:92
time.h
AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT
@ AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT
Definition: log.h:42
video_data::open_f
int(* open_f)(const char *file, int oflag,...)
Definition: v4l2.c:115
v4l2_close
#define v4l2_close
test::name
const char * name
Definition: idctdsp.c:36
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
device_open
static int device_open(AVFormatContext *ctx, const char *device_path)
Definition: v4l2.c:133
mmap_release_buffer
static void mmap_release_buffer(void *opaque, uint8_t *data)
Definition: v4l2.c:467
init_convert_timestamp
static int init_convert_timestamp(AVFormatContext *ctx, int64_t ts)
Definition: v4l2.c:491
v4l2_read_close
static int v4l2_read_close(AVFormatContext *ctx)
Definition: v4l2.c:1050
video_data::buf_type
enum v4l2_buf_type buf_type
Definition: v4l2.c:101
list_formats
static void list_formats(AVFormatContext *ctx, int type)
Definition: v4l2.c:301
v4l2_read_probe
static int v4l2_read_probe(const AVProbeData *p)
Definition: v4l2.c:876
V4L_COMPFORMATS
#define V4L_COMPFORMATS
Definition: v4l2.c:59
AVPacket::size
int size
Definition: packet.h:589
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
height
#define height
Definition: dsp.h:89
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
AVFormatContext::url
char * url
input or output URL.
Definition: avformat.h:1379
size
int size
Definition: twinvq_data.h:10344
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:468
AVDeviceInfo
Structure describes basic parameters of the device.
Definition: avdevice.h:333
avdevice.h
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
DEC
#define DEC
Definition: v4l2.c:1147
av_image_get_buffer_size
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.
Definition: imgutils.c:466
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
video_data::pixelformat
int pixelformat
Definition: v4l2.c:91
v4l2_mmap
#define v4l2_mmap
av_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:36
buf_data::start
void * start
Definition: v4l2.c:84
AVDeviceInfo::device_description
char * device_description
human friendly name
Definition: avdevice.h:335
fmt_map::codec_id
enum AVCodecID codec_id
Definition: v4l2-common.h:43
input
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some input
Definition: filter_design.txt:172
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
avpriv_stream_set_need_parsing
void avpriv_stream_set_need_parsing(AVStream *st, enum AVStreamParseType type)
Definition: demux_utils.c:38
video_data::timefilter
TimeFilter * timefilter
Definition: v4l2.c:97
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:406
av_parse_video_rate
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate.
Definition: parseutils.c:181
ff_timefilter_destroy
void ff_timefilter_destroy(TimeFilter *self)
Free all resources associated with the filter.
Definition: timefilter.c:66
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
mmap_close
static void mmap_close(struct video_data *s)
Definition: v4l2.c:693
v4l2_is_v4l_dev
static int v4l2_is_v4l_dev(const char *name)
Definition: v4l2.c:1065
AVCodecParameters::height
int height
Definition: codec_par.h:135
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
v4l2_munmap
#define v4l2_munmap
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
options
static const AVOption options[]
Definition: v4l2.c:1149
ff_timefilter_update
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter.
Definition: timefilter.c:76
demux.h
OFFSET
#define OFFSET(x)
Definition: v4l2.c:1146
V4L_TS_CONVERT_READY
#define V4L_TS_CONVERT_READY
Once the kind of timestamps returned by the kernel have been detected, the value of the timefilter (N...
Definition: v4l2.c:81
AVFMT_FLAG_NONBLOCK
#define AVFMT_FLAG_NONBLOCK
Do not block when reading packets from input.
Definition: avformat.h:1417
v4l2_get_device_list
static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_list)
Definition: v4l2.c:1073
avcodec.h
V4L_TS_MONO2ABS
#define V4L_TS_MONO2ABS
Assume kernel timestamps are from the monotonic clock and convert to absolute timestamps.
Definition: v4l2.c:74
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
video_data::read_f
ssize_t(* read_f)(int fd, void *buffer, size_t n)
Definition: v4l2.c:123
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
video_data
Definition: v4l2.c:88
AVDeviceInfoList
List of devices.
Definition: avdevice.h:343
video_data::top_field_first
int top_field_first
Definition: v4l2.c:95
av_get_pix_fmt
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:3388
V4L_ALLFORMATS
#define V4L_ALLFORMATS
Definition: v4l2.c:57
av_dynarray_add_nofree
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition: mem.c:315
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
video_data::list_format
int list_format
Set by a private option.
Definition: v4l2.c:110
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
video_data::list_standard
int list_standard
Set by a private option.
Definition: v4l2.c:111
convert_timestamp
static int convert_timestamp(AVFormatContext *ctx, int64_t *ts)
Definition: v4l2.c:524
video_data::pixel_format
char * pixel_format
Set by a private option.
Definition: v4l2.c:109
video_data::munmap_f
int(* munmap_f)(void *_start, size_t length)
Definition: v4l2.c:125
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:878
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
av_gettime
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
SET_WRAPPERS
#define SET_WRAPPERS(prefix)
desc
const char * desc
Definition: libsvtav1.c:82
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
video_data::standard
char * standard
Definition: v4l2.c:106
mem.h
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
v4l2_read_header
static int v4l2_read_header(AVFormatContext *ctx)
Definition: v4l2.c:883
mmap_start
static int mmap_start(AVFormatContext *ctx)
Definition: v4l2.c:657
AVCodecParameters::format
int format
Definition: codec_par.h:92
mmap_free
static void mmap_free(struct video_data *s, int n)
Definition: v4l2.c:363
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
list_standards
static void list_standards(AVFormatContext *ctx)
Definition: v4l2.c:339
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FFInputFormat
Definition: demux.h:66
v4l2_read_packet
static int v4l2_read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: v4l2.c:1039
imgutils.h
video_data::dup_f
int(* dup_f)(int fd)
Definition: v4l2.c:117
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
video_data::multiplanar
int multiplanar
Definition: v4l2.c:100
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
V4L_TS_DEFAULT
#define V4L_TS_DEFAULT
Return timestamps to the user exactly as returned by the kernel.
Definition: v4l2.c:64
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3888
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
avstring.h
av_image_check_size
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...
Definition: imgutils.c:318
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
width
#define width
Definition: dsp.h:89
avcodec_descriptor_get_by_name
const AVCodecDescriptor * avcodec_descriptor_get_by_name(const char *name)
Definition: codec_desc.c:3903
planes
static const struct @584 planes[]
codec_desc.h
first_field
static int first_field(const struct video_data *s)
Definition: v4l2.c:260
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
snprintf
#define snprintf
Definition: snprintf.h:34
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1291
V4L_TS_ABS
#define V4L_TS_ABS
Autodetect the kind of timestamps returned by the kernel and convert to absolute (wall clock) timesta...
Definition: v4l2.c:69
channel
channel
Definition: ebur128.h:39
av_x_if_null
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition: avutil.h:311
av_get_pix_fmt_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.
Definition: pixdesc.c:3376
enqueue_buffer
static int enqueue_buffer(struct video_data *s, struct v4l2_buffer *buf)
Definition: v4l2.c:453
mmap_read_frame
static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
Definition: v4l2.c:545
desired_video_buffers
static const int desired_video_buffers
Definition: v4l2.c:55
device_try_init
static int device_try_init(AVFormatContext *ctx, enum AVPixelFormat pix_fmt, int *width, int *height, uint32_t *desired_format, enum AVCodecID *codec_id)
Definition: v4l2.c:823