tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

VIDIOC_REQBUFS and video_stream



gstreamer's v4l2src fails with

  Buffer pool activation failed

This can be traced to VIDIOC_REQBUFS (2 mmap buffers) returning EBUSY
in video_stream_setup_bufs:
https://nxr.netbsd.org/xref/src/sys/dev/video.c#2315

  2310      /* Ensure that all allocated buffers are queued and not under
  2311       * userspace control. */
  2312      for (i = 0; i < vs->vs_nbufs; ++i) {
  2313          if (!(vs->vs_buf[i]->vb_buf->flags & V4L2_BUF_FLAG_QUEUED)) {
  2314              mutex_exit(&vs->vs_lock);
  2315              return EBUSY;
  2316          }
  2317      }

Further up in video.c is an explanation is what is meant to happen:

   151      /* Video samples may exist in different locations.  Initially,
   152       * samples are queued into the ingress queue.  The driver
   153       * grabs these in turn and fills them with video data.  Once
   154       * filled, they are moved to the egress queue.  Samples are
   155       * dequeued either by user with MMAP method or, with READ
   156       * method, videoread() works from the fist sample in the
   157       * ingress queue without dequeing.  In the first case, the
   158       * user re-queues the buffer when finished, and videoread()
   159       * does the same when all data has been read.  The sample now
   160       * returns to the ingress queue. */

The VIDIOC_REQBUFS man page says:

  Memory mapped buffers are located in device memory and must be
  allocated with this ioctl before they can be mapped into the
  application's address space.

AFAICT the first thing gstreamer must do is call VIDIOC_REQBUFS?
Afterwards read on /dev/video? might call video_stream_enqueue to
set V4L2_BUF_FLAG_QUEUED. But then VIDIOC_REQBUFS will always fail?

("Initially, samples are queued into the ingress queue." by what?)

Thoughts?

Cheers,

Patrick


Home | Main Index | Thread Index | Old Index