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  for (int i = 0; i < n; i++)
366  v4l2_munmap(s->buf_data[i].start, s->buf_data[i].len);
367  av_freep(&s->buf_data);
368 }
369 
371 {
372  int i, res;
373  struct video_data *s = ctx->priv_data;
374  struct v4l2_requestbuffers req = {
375  .type = s->buf_type,
376  .count = desired_video_buffers,
377  .memory = V4L2_MEMORY_MMAP
378  };
379 
380  if (v4l2_ioctl(s->fd, VIDIOC_REQBUFS, &req) < 0) {
381  res = AVERROR(errno);
382  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_REQBUFS): %s\n", av_err2str(res));
383  return res;
384  }
385 
386  if (req.count < 2) {
387  av_log(ctx, AV_LOG_ERROR, "Insufficient buffer memory\n");
388  return AVERROR(ENOMEM);
389  }
390  s->buffers = req.count;
391  s->buf_data = av_malloc_array(s->buffers, sizeof(struct buf_data));
392  if (!s->buf_data) {
393  av_log(ctx, AV_LOG_ERROR, "Cannot allocate buffer data\n");
394  return AVERROR(ENOMEM);
395  }
396 
397  for (i = 0; i < req.count; i++) {
398  unsigned int buf_length, buf_offset;
399  struct v4l2_plane planes[VIDEO_MAX_PLANES];
400  struct v4l2_buffer buf = {
401  .type = s->buf_type,
402  .index = i,
403  .memory = V4L2_MEMORY_MMAP,
404  .m.planes = s->multiplanar ? planes : NULL,
405  .length = s->multiplanar ? VIDEO_MAX_PLANES : 0,
406  };
407  if (v4l2_ioctl(s->fd, VIDIOC_QUERYBUF, &buf) < 0) {
408  res = AVERROR(errno);
409  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYBUF): %s\n", av_err2str(res));
410  goto fail;
411  }
412 
413  if (s->multiplanar) {
414  if (buf.length != 1) {
415  av_log(ctx, AV_LOG_ERROR, "multiplanar only supported when buf.length == 1\n");
416  res = AVERROR_PATCHWELCOME;
417  goto fail;
418  }
419  buf_length = buf.m.planes[0].length;
420  buf_offset = buf.m.planes[0].m.mem_offset;
421  } else {
422  buf_length = buf.length;
423  buf_offset = buf.m.offset;
424  }
425 
426  s->buf_data[i].len = buf_length;
427  if (s->frame_size > 0 && s->buf_data[i].len < s->frame_size) {
429  "buf_data[%d].len = %d < expected frame size %d\n",
430  i, buf_length, s->frame_size);
431  res = AVERROR(ENOMEM);
432  goto fail;
433  }
434  s->buf_data[i].start = v4l2_mmap(NULL, buf_length,
435  PROT_READ | PROT_WRITE, MAP_SHARED,
436  s->fd, buf_offset);
437 
438  if (s->buf_data[i].start == MAP_FAILED) {
439  res = AVERROR(errno);
440  av_log(ctx, AV_LOG_ERROR, "mmap: %s\n", av_err2str(res));
441  goto fail;
442  }
443  }
444 
445  return 0;
446 
447 fail:
448  mmap_free(s, i);
449  return res;
450 }
451 
452 static int enqueue_buffer(struct video_data *s, struct v4l2_buffer *buf)
453 {
454  int res = 0;
455 
456  if (v4l2_ioctl(s->fd, VIDIOC_QBUF, buf) < 0) {
457  res = AVERROR(errno);
458  av_log(NULL, AV_LOG_ERROR, "ioctl(VIDIOC_QBUF): %s\n", av_err2str(res));
459  } else {
460  atomic_fetch_add(&s->buffers_queued, 1);
461  }
462 
463  return res;
464 }
465 
466 static void mmap_release_buffer(void *opaque, uint8_t *data)
467 {
468  struct v4l2_plane planes[VIDEO_MAX_PLANES];
469  struct v4l2_buffer buf = { 0 };
470  struct buf_desc *buf_descriptor = opaque;
471  struct video_data *s = buf_descriptor->s;
472 
473  buf.type = s->buf_type;
474  buf.memory = V4L2_MEMORY_MMAP;
475  buf.index = buf_descriptor->index;
476  buf.m.planes = s->multiplanar ? planes : NULL;
477  buf.length = s->multiplanar ? VIDEO_MAX_PLANES : 0;
478  av_free(buf_descriptor);
479 
480  enqueue_buffer(s, &buf);
481 }
482 
483 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
484 static int64_t av_gettime_monotonic(void)
485 {
486  return av_gettime_relative();
487 }
488 #endif
489 
491 {
492  struct video_data *s = ctx->priv_data;
493  int64_t now;
494 
495  now = av_gettime();
496  if (s->ts_mode == V4L_TS_ABS &&
497  ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE) {
498  av_log(ctx, AV_LOG_INFO, "Detected absolute timestamps\n");
499  s->ts_mode = V4L_TS_CONVERT_READY;
500  return 0;
501  }
502 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
503  if (ctx->streams[0]->avg_frame_rate.num) {
504  now = av_gettime_monotonic();
505  if (s->ts_mode == V4L_TS_MONO2ABS ||
506  (ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE)) {
507  AVRational tb = {AV_TIME_BASE, 1};
509  av_log(ctx, AV_LOG_INFO, "Detected monotonic timestamps, converting\n");
510  /* microseconds instead of seconds, MHz instead of Hz */
511  s->timefilter = ff_timefilter_new(1, period, 1.0E-6);
512  if (!s->timefilter)
513  return AVERROR(ENOMEM);
514  s->ts_mode = V4L_TS_CONVERT_READY;
515  return 0;
516  }
517  }
518 #endif
519  av_log(ctx, AV_LOG_ERROR, "Unknown timestamps\n");
520  return AVERROR(EIO);
521 }
522 
524 {
525  struct video_data *s = ctx->priv_data;
526 
527  if (s->ts_mode) {
528  int r = init_convert_timestamp(ctx, *ts);
529  if (r < 0)
530  return r;
531  }
532 #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
533  if (s->timefilter) {
534  int64_t nowa = av_gettime();
535  int64_t nowm = av_gettime_monotonic();
536  ff_timefilter_update(s->timefilter, nowa, nowm - s->last_time_m);
537  s->last_time_m = nowm;
538  *ts = ff_timefilter_eval(s->timefilter, *ts - nowm);
539  }
540 #endif
541  return 0;
542 }
543 
545 {
546  struct video_data *s = ctx->priv_data;
547  struct v4l2_plane planes[VIDEO_MAX_PLANES];
548  struct v4l2_buffer buf = {
549  .type = s->buf_type,
550  .memory = V4L2_MEMORY_MMAP,
551  .m.planes = s->multiplanar ? planes : NULL,
552  .length = s->multiplanar ? VIDEO_MAX_PLANES : 0,
553  };
554  struct timeval buf_ts;
555  unsigned int bytesused;
556  int res;
557 
558  pkt->size = 0;
559 
560  /* FIXME: Some special treatment might be needed in case of loss of signal... */
561  while ((res = v4l2_ioctl(s->fd, VIDIOC_DQBUF, &buf)) < 0 && (errno == EINTR));
562  if (res < 0) {
563  if (errno == EAGAIN)
564  return AVERROR(EAGAIN);
565 
566  res = AVERROR(errno);
567  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_DQBUF): %s\n",
568  av_err2str(res));
569  return res;
570  }
571 
572  buf_ts = buf.timestamp;
573 
574  if (buf.index >= s->buffers) {
575  av_log(ctx, AV_LOG_ERROR, "Invalid buffer index received.\n");
576  return AVERROR(EINVAL);
577  }
578  atomic_fetch_add(&s->buffers_queued, -1);
579  // always keep at least one buffer queued
580  av_assert0(atomic_load(&s->buffers_queued) >= 1);
581 
582  bytesused = s->multiplanar ? buf.m.planes[0].bytesused : buf.bytesused;
583 
584 #ifdef V4L2_BUF_FLAG_ERROR
585  if (buf.flags & V4L2_BUF_FLAG_ERROR) {
587  "Dequeued v4l2 buffer contains corrupted data (%d bytes).\n",
588  bytesused);
589  bytesused = 0;
590  } else
591 #endif
592  {
593  /* CPIA is a compressed format and we don't know the exact number of bytes
594  * used by a frame, so set it here as the driver announces it. */
596  s->frame_size = bytesused;
597 
598  if (s->frame_size > 0 && bytesused != s->frame_size) {
600  "Dequeued v4l2 buffer contains %d bytes, but %d were expected. Flags: 0x%08X.\n",
601  bytesused, s->frame_size, buf.flags);
602  bytesused = 0;
603  }
604  }
605 
606  /* Image is at s->buf_data[buf.index].start */
607  if (atomic_load(&s->buffers_queued) == FFMAX(s->buffers / 8, 1)) {
608  /* when we start getting low on queued buffers, fall back on copying data */
609  res = av_new_packet(pkt, bytesused);
610  if (res < 0) {
611  av_log(ctx, AV_LOG_ERROR, "Error allocating a packet.\n");
612  enqueue_buffer(s, &buf);
613  return res;
614  }
615  memcpy(pkt->data, s->buf_data[buf.index].start, bytesused);
616 
617  res = enqueue_buffer(s, &buf);
618  if (res) {
620  return res;
621  }
622  } else {
623  struct buf_desc *buf_descriptor;
624 
625  pkt->data = s->buf_data[buf.index].start;
626  pkt->size = bytesused;
627 
628  buf_descriptor = av_malloc(sizeof(struct buf_desc));
629  if (!buf_descriptor) {
630  /* Something went wrong... Since av_malloc() failed, we cannot even
631  * allocate a buffer for memcpying into it
632  */
633  av_log(ctx, AV_LOG_ERROR, "Failed to allocate a buffer descriptor\n");
634  enqueue_buffer(s, &buf);
635 
636  return AVERROR(ENOMEM);
637  }
638  buf_descriptor->index = buf.index;
639  buf_descriptor->s = s;
640 
642  buf_descriptor, 0);
643  if (!pkt->buf) {
644  av_log(ctx, AV_LOG_ERROR, "Failed to create a buffer\n");
645  enqueue_buffer(s, &buf);
646  av_freep(&buf_descriptor);
647  return AVERROR(ENOMEM);
648  }
649  }
650  pkt->pts = buf_ts.tv_sec * INT64_C(1000000) + buf_ts.tv_usec;
652 
653  return pkt->size;
654 }
655 
657 {
658  struct video_data *s = ctx->priv_data;
659  enum v4l2_buf_type type;
660  int i, res;
661 
662  for (i = 0; i < s->buffers; i++) {
663  struct v4l2_plane planes[VIDEO_MAX_PLANES];
664  struct v4l2_buffer buf = {
665  .type = s->buf_type,
666  .index = i,
667  .memory = V4L2_MEMORY_MMAP,
668  .m.planes = s->multiplanar ? planes : NULL,
669  .length = s->multiplanar ? VIDEO_MAX_PLANES : 0,
670  };
671 
672  if (v4l2_ioctl(s->fd, VIDIOC_QBUF, &buf) < 0) {
673  res = AVERROR(errno);
674  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QBUF): %s\n",
675  av_err2str(res));
676  return res;
677  }
678  }
679  atomic_store(&s->buffers_queued, s->buffers);
680 
681  type = s->buf_type;
682  if (v4l2_ioctl(s->fd, VIDIOC_STREAMON, &type) < 0) {
683  res = AVERROR(errno);
684  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_STREAMON): %s\n",
685  av_err2str(res));
686  return res;
687  }
688 
689  return 0;
690 }
691 
692 static void mmap_close(struct video_data *s)
693 {
694  enum v4l2_buf_type type;
695 
696  type = s->buf_type;
697  /* We do not check for the result, because we could
698  * not do anything about it anyway...
699  */
700  v4l2_ioctl(s->fd, VIDIOC_STREAMOFF, &type);
701  mmap_free(s, s->buffers);
702 }
703 
705 {
706  struct video_data *s = ctx->priv_data;
707  struct v4l2_standard standard = { 0 };
708  struct v4l2_streamparm streamparm = { 0 };
709  struct v4l2_fract *tpf;
710  AVRational framerate_q = { 0 };
711  int i, ret;
712 
713  if (s->framerate &&
714  (ret = av_parse_video_rate(&framerate_q, s->framerate)) < 0) {
715  av_log(ctx, AV_LOG_ERROR, "Could not parse framerate '%s'.\n",
716  s->framerate);
717  return ret;
718  }
719 
720  if (s->standard) {
721  if (s->std_id) {
722  ret = 0;
723  av_log(ctx, AV_LOG_DEBUG, "Setting standard: %s\n", s->standard);
724  /* set tv standard */
725  for (i = 0; ; i++) {
726  standard.index = i;
727  if (v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) {
728  ret = AVERROR(errno);
729  break;
730  }
731  if (!av_strcasecmp(standard.name, s->standard))
732  break;
733  }
734  if (ret < 0) {
735  av_log(ctx, AV_LOG_ERROR, "Unknown or unsupported standard '%s'\n", s->standard);
736  return ret;
737  }
738 
739  if (v4l2_ioctl(s->fd, VIDIOC_S_STD, &standard.id) < 0) {
740  ret = AVERROR(errno);
741  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_STD): %s\n", av_err2str(ret));
742  return ret;
743  }
744  } else {
746  "This device does not support any standard\n");
747  }
748  }
749 
750  /* get standard */
751  if (v4l2_ioctl(s->fd, VIDIOC_G_STD, &s->std_id) == 0) {
752  tpf = &standard.frameperiod;
753  for (i = 0; ; i++) {
754  standard.index = i;
755  if (v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) {
756  ret = AVERROR(errno);
757  if (ret == AVERROR(EINVAL)
758 #ifdef ENODATA
759  || ret == AVERROR(ENODATA)
760 #endif
761  ) {
762  tpf = &streamparm.parm.capture.timeperframe;
763  break;
764  }
765  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMSTD): %s\n", av_err2str(ret));
766  return ret;
767  }
768  if (standard.id == s->std_id) {
770  "Current standard: %s, id: %"PRIx64", frameperiod: %d/%d\n",
771  standard.name, (uint64_t)standard.id, tpf->numerator, tpf->denominator);
772  break;
773  }
774  }
775  } else {
776  tpf = &streamparm.parm.capture.timeperframe;
777  }
778 
779  streamparm.type = s->buf_type;
780  if (v4l2_ioctl(s->fd, VIDIOC_G_PARM, &streamparm) < 0) {
781  ret = AVERROR(errno);
782  av_log(ctx, AV_LOG_WARNING, "ioctl(VIDIOC_G_PARM): %s\n", av_err2str(ret));
783  } else if (framerate_q.num && framerate_q.den) {
784  if (streamparm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) {
785  tpf = &streamparm.parm.capture.timeperframe;
786 
787  av_log(ctx, AV_LOG_DEBUG, "Setting time per frame to %d/%d\n",
788  framerate_q.den, framerate_q.num);
789  tpf->numerator = framerate_q.den;
790  tpf->denominator = framerate_q.num;
791 
792  if (v4l2_ioctl(s->fd, VIDIOC_S_PARM, &streamparm) < 0) {
793  ret = AVERROR(errno);
794  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_PARM): %s\n",
795  av_err2str(ret));
796  return ret;
797  }
798 
799  if (framerate_q.num != tpf->denominator ||
800  framerate_q.den != tpf->numerator) {
802  "The driver changed the time per frame from "
803  "%d/%d to %d/%d\n",
804  framerate_q.den, framerate_q.num,
805  tpf->numerator, tpf->denominator);
806  }
807  } else {
809  "The driver does not permit changing the time per frame\n");
810  }
811  }
812  if (tpf->denominator > 0 && tpf->numerator > 0) {
813  ctx->streams[0]->avg_frame_rate.num = tpf->denominator;
814  ctx->streams[0]->avg_frame_rate.den = tpf->numerator;
816  } else
817  av_log(ctx, AV_LOG_WARNING, "Time per frame unknown\n");
818 
819  return 0;
820 }
821 
823  enum AVPixelFormat pix_fmt,
824  int *width,
825  int *height,
826  uint32_t *desired_format,
827  enum AVCodecID *codec_id)
828 {
829  int ret, i;
830 
831  *desired_format = ff_fmt_ff2v4l(pix_fmt, ctx->video_codec_id);
832 
833  if (*desired_format) {
834  ret = device_init(ctx, width, height, *desired_format);
835  if (ret < 0) {
836  *desired_format = 0;
837  if (ret != AVERROR(EINVAL))
838  return ret;
839  }
840  }
841 
842  if (!*desired_format) {
846  av_log(ctx, AV_LOG_DEBUG, "Trying to set codec:%s pix_fmt:%s\n",
848  (char *)av_x_if_null(av_get_pix_fmt_name(ff_fmt_conversion_table[i].ff_fmt), "none"));
849 
850  *desired_format = ff_fmt_conversion_table[i].v4l2_fmt;
851  ret = device_init(ctx, width, height, *desired_format);
852  if (ret >= 0)
853  break;
854  else if (ret != AVERROR(EINVAL))
855  return ret;
856  *desired_format = 0;
857  }
858  }
859 
860  if (*desired_format == 0) {
861  av_log(ctx, AV_LOG_ERROR, "Cannot find a proper format for "
862  "codec '%s' (id %d), pixel format '%s' (id %d)\n",
864  (char *)av_x_if_null(av_get_pix_fmt_name(pix_fmt), "none"), pix_fmt);
865  ret = AVERROR(EINVAL);
866  }
867  }
868 
869  *codec_id = ff_fmt_v4l2codec(*desired_format);
870  if (*codec_id == AV_CODEC_ID_NONE)
871  av_assert0(ret == AVERROR(EINVAL));
872  return ret;
873 }
874 
875 static int v4l2_read_probe(const AVProbeData *p)
876 {
877  if (av_strstart(p->filename, "/dev/video", NULL))
878  return AVPROBE_SCORE_MAX - 1;
879  return 0;
880 }
881 
883 {
884  struct video_data *s = ctx->priv_data;
885  AVStream *st;
886  int res = 0;
887  uint32_t desired_format;
890  struct v4l2_input input = { 0 };
891 
893  if (!st)
894  return AVERROR(ENOMEM);
895 
896 #if CONFIG_LIBV4L2
897  /* silence libv4l2 logging. if fopen() fails v4l2_log_file will be NULL
898  and errors will get sent to stderr */
899  if (s->use_libv4l2)
900  v4l2_log_file = fopen("/dev/null", "w");
901 #endif
902 
903  s->fd = device_open(ctx, ctx->url);
904  if (s->fd < 0)
905  return s->fd;
906 
907  if (s->channel != -1) {
908  /* set video input */
909  av_log(ctx, AV_LOG_DEBUG, "Selecting input_channel: %d\n", s->channel);
910  if (v4l2_ioctl(s->fd, VIDIOC_S_INPUT, &s->channel) < 0) {
911  res = AVERROR(errno);
912  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_INPUT): %s\n", av_err2str(res));
913  goto fail;
914  }
915  } else {
916  /* get current video input */
917  if (v4l2_ioctl(s->fd, VIDIOC_G_INPUT, &s->channel) < 0) {
918  res = AVERROR(errno);
919  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_INPUT): %s\n", av_err2str(res));
920  goto fail;
921  }
922  }
923 
924  /* enum input */
925  input.index = s->channel;
926  if (v4l2_ioctl(s->fd, VIDIOC_ENUMINPUT, &input) < 0) {
927  res = AVERROR(errno);
928  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMINPUT): %s\n", av_err2str(res));
929  goto fail;
930  }
931  s->std_id = input.std;
932  av_log(ctx, AV_LOG_DEBUG, "Current input_channel: %d, input_name: %s, input_std: %"PRIx64"\n",
933  s->channel, input.name, (uint64_t)input.std);
934 
935  if (s->list_format) {
936  list_formats(ctx, s->list_format);
937  res = AVERROR_EXIT;
938  goto fail;
939  }
940 
941  if (s->list_standard) {
943  res = AVERROR_EXIT;
944  goto fail;
945  }
946 
947  avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
948 
949  if (s->pixel_format) {
950  const AVCodecDescriptor *desc = avcodec_descriptor_get_by_name(s->pixel_format);
951 
952  if (desc)
953  ctx->video_codec_id = desc->id;
954 
955  pix_fmt = av_get_pix_fmt(s->pixel_format);
956 
957  if (pix_fmt == AV_PIX_FMT_NONE && !desc) {
958  av_log(ctx, AV_LOG_ERROR, "No such input format: %s.\n",
959  s->pixel_format);
960 
961  res = AVERROR(EINVAL);
962  goto fail;
963  }
964  }
965 
966  if (!s->width && !s->height) {
967  struct v4l2_format fmt = { .type = s->buf_type };
968 
970  "Querying the device for the current frame size\n");
971  if (v4l2_ioctl(s->fd, VIDIOC_G_FMT, &fmt) < 0) {
972  res = AVERROR(errno);
973  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_FMT): %s\n",
974  av_err2str(res));
975  goto fail;
976  }
977 
978  s->width = fmt.fmt.pix.width;
979  s->height = fmt.fmt.pix.height;
981  "Setting frame size to %dx%d\n", s->width, s->height);
982  }
983 
984  res = device_try_init(ctx, pix_fmt, &s->width, &s->height, &desired_format, &codec_id);
985  if (res < 0)
986  goto fail;
987 
988  /* If no pixel_format was specified, the codec_id was not known up
989  * until now. Set video_codec_id in the context, as codec_id will
990  * not be available outside this function
991  */
994 
995  if ((res = av_image_check_size(s->width, s->height, 0, ctx)) < 0)
996  goto fail;
997 
998  s->pixelformat = desired_format;
999 
1000  if ((res = v4l2_set_parameters(ctx)) < 0)
1001  goto fail;
1002 
1003  st->codecpar->format = ff_fmt_v4l2ff(desired_format, codec_id);
1004  if (st->codecpar->format != AV_PIX_FMT_NONE)
1005  s->frame_size = av_image_get_buffer_size(st->codecpar->format,
1006  s->width, s->height, 1);
1007 
1008  if ((res = mmap_init(ctx)) ||
1009  (res = mmap_start(ctx)) < 0)
1010  goto fail;
1011 
1012  s->top_field_first = first_field(s);
1013 
1015  st->codecpar->codec_id = codec_id;
1017  st->codecpar->codec_tag =
1019  else if (codec_id == AV_CODEC_ID_H264) {
1021  }
1022  if (desired_format == V4L2_PIX_FMT_YVU420)
1023  st->codecpar->codec_tag = MKTAG('Y', 'V', '1', '2');
1024  else if (desired_format == V4L2_PIX_FMT_YVU410)
1025  st->codecpar->codec_tag = MKTAG('Y', 'V', 'U', '9');
1026  st->codecpar->width = s->width;
1027  st->codecpar->height = s->height;
1028  if (st->avg_frame_rate.den)
1029  st->codecpar->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
1030 
1031  return 0;
1032 
1033 fail:
1034  v4l2_close(s->fd);
1035  return res;
1036 }
1037 
1039 {
1040  int res;
1041 
1042  if ((res = mmap_read_frame(ctx, pkt)) < 0) {
1043  return res;
1044  }
1045 
1046  return pkt->size;
1047 }
1048 
1050 {
1051  struct video_data *s = ctx->priv_data;
1052 
1053  if (atomic_load(&s->buffers_queued) != s->buffers)
1054  av_log(ctx, AV_LOG_WARNING, "Some buffers are still owned by the caller on "
1055  "close.\n");
1056 
1057  mmap_close(s);
1058 
1059  ff_timefilter_destroy(s->timefilter);
1060  v4l2_close(s->fd);
1061  return 0;
1062 }
1063 
1064 static int v4l2_is_v4l_dev(const char *name)
1065 {
1066  return !strncmp(name, "video", 5) ||
1067  !strncmp(name, "radio", 5) ||
1068  !strncmp(name, "vbi", 3) ||
1069  !strncmp(name, "v4l-subdev", 10);
1070 }
1071 
1073 {
1074  struct video_data *s = ctx->priv_data;
1075  DIR *dir;
1076  struct dirent *entry;
1077  int ret = 0;
1078 
1079  if (!device_list)
1080  return AVERROR(EINVAL);
1081 
1082  dir = opendir("/dev");
1083  if (!dir) {
1084  ret = AVERROR(errno);
1085  av_log(ctx, AV_LOG_ERROR, "Couldn't open the directory: %s\n", av_err2str(ret));
1086  return ret;
1087  }
1088  while ((entry = readdir(dir))) {
1089  AVDeviceInfo *device = NULL;
1090  struct v4l2_capability cap;
1091  int fd = -1, size;
1092  char device_name[256];
1093 
1094  if (!v4l2_is_v4l_dev(entry->d_name))
1095  continue;
1096 
1097  size = snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name);
1098  if (size >= sizeof(device_name)) {
1099  av_log(ctx, AV_LOG_ERROR, "Device name too long.\n");
1100  ret = AVERROR(ENOSYS);
1101  break;
1102  }
1103 
1104  if ((fd = device_open(ctx, device_name)) < 0)
1105  continue;
1106 
1107  if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
1108  ret = AVERROR(errno);
1109  av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n", av_err2str(ret));
1110  goto fail;
1111  }
1112 
1113  device = av_mallocz(sizeof(AVDeviceInfo));
1114  if (!device) {
1115  ret = AVERROR(ENOMEM);
1116  goto fail;
1117  }
1118  device->device_name = av_strdup(device_name);
1119  device->device_description = av_strdup(cap.card);
1120  if (!device->device_name || !device->device_description) {
1121  ret = AVERROR(ENOMEM);
1122  goto fail;
1123  }
1124 
1125  if ((ret = av_dynarray_add_nofree(&device_list->devices,
1126  &device_list->nb_devices, device)) < 0)
1127  goto fail;
1128 
1129  v4l2_close(fd);
1130  continue;
1131 
1132  fail:
1133  if (device) {
1134  av_freep(&device->device_name);
1135  av_freep(&device->device_description);
1136  av_freep(&device);
1137  }
1138  v4l2_close(fd);
1139  break;
1140  }
1141  closedir(dir);
1142  return ret;
1143 }
1144 
1145 #define OFFSET(x) offsetof(struct video_data, x)
1146 #define DEC AV_OPT_FLAG_DECODING_PARAM
1147 
1148 static const AVOption options[] = {
1149  { "standard", "set TV standard, used only by analog frame grabber", OFFSET(standard), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC },
1150  { "channel", "set TV channel, used only by frame grabber", OFFSET(channel), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, INT_MAX, DEC },
1151  { "video_size", "set frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
1152  { "pixel_format", "set preferred pixel format", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
1153  { "input_format", "set preferred pixel format (for raw video) or codec name", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
1154  { "framerate", "set frame rate", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
1155 
1156  { "list_formats", "list available formats and exit", OFFSET(list_format), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, DEC, .unit = "list_formats" },
1157  { "all", "show all available formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_ALLFORMATS }, 0, INT_MAX, DEC, .unit = "list_formats" },
1158  { "raw", "show only non-compressed formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_RAWFORMATS }, 0, INT_MAX, DEC, .unit = "list_formats" },
1159  { "compressed", "show only compressed formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_COMPFORMATS }, 0, INT_MAX, DEC, .unit = "list_formats" },
1160 
1161  { "list_standards", "list supported standards and exit", OFFSET(list_standard), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, DEC, .unit = "list_standards" },
1162  { "all", "show all supported standards", OFFSET(list_standard), AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, DEC, .unit = "list_standards" },
1163 
1164  { "timestamps", "set type of timestamps for grabbed frames", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, DEC, .unit = "timestamps" },
1165  { "ts", "set type of timestamps for grabbed frames", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, DEC, .unit = "timestamps" },
1166  { "default", "use timestamps from the kernel", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_DEFAULT }, 0, 2, DEC, .unit = "timestamps" },
1167  { "abs", "use absolute timestamps (wall clock)", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_ABS }, 0, 2, DEC, .unit = "timestamps" },
1168  { "mono2abs", "force conversion from monotonic to absolute timestamps", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_MONO2ABS }, 0, 2, DEC, .unit = "timestamps" },
1169  { "use_libv4l2", "use libv4l2 (v4l-utils) conversion functions", OFFSET(use_libv4l2), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
1170  { NULL },
1171 };
1172 
1173 static const AVClass v4l2_class = {
1174  .class_name = "V4L2 indev",
1175  .item_name = av_default_item_name,
1176  .option = options,
1177  .version = LIBAVUTIL_VERSION_INT,
1179 };
1180 
1182  .p.name = "video4linux2,v4l2",
1183  .p.long_name = NULL_IF_CONFIG_SMALL("Video4Linux2 device grab"),
1184  .p.flags = AVFMT_NOFILE,
1185  .p.priv_class = &v4l2_class,
1186  .priv_data_size = sizeof(struct video_data),
1188  .read_header = v4l2_read_header,
1189  .read_packet = v4l2_read_packet,
1190  .read_close = v4l2_read_close,
1191  .get_device_list = v4l2_get_device_list,
1192 };
ff_v4l2_demuxer
const FFInputFormat ff_v4l2_demuxer
Definition: v4l2.c:1181
flags
const SwsFlags flags[]
Definition: swscale.c:72
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:433
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:53
v4l2_class
static const AVClass v4l2_class
Definition: v4l2.c:1173
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:704
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:595
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:370
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:61
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:224
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
The width of the video frame in pixels.
Definition: codec_par.h:143
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:578
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:466
init_convert_timestamp
static int init_convert_timestamp(AVFormatContext *ctx, int64_t ts)
Definition: v4l2.c:490
v4l2_read_close
static int v4l2_read_close(AVFormatContext *ctx)
Definition: v4l2.c:1049
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:875
V4L_COMPFORMATS
#define V4L_COMPFORMATS
Definition: v4l2.c:59
AVPacket::size
int size
Definition: packet.h:596
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:1146
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
planes
static const struct @585 planes[]
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:588
mmap_close
static void mmap_close(struct video_data *s)
Definition: v4l2.c:692
v4l2_is_v4l_dev
static int v4l2_is_v4l_dev(const char *name)
Definition: v4l2.c:1064
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
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:1148
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:1145
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:1072
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:523
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:83
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:882
mmap_start
static int mmap_start(AVFormatContext *ctx)
Definition: v4l2.c:656
AVCodecParameters::format
int format
Definition: codec_par.h:94
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:57
AVPacket
This structure stores compressed data.
Definition: packet.h:572
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:1038
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:99
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
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:452
mmap_read_frame
static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
Definition: v4l2.c:544
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:822