2016-02-12 3 views
0
s->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
s->buf.memory = V4L2_MEMORY_MMAP; 

Должен признаться, что я не знаком с API-интерфейсом V4L2. Я встречаюсь в двух вышеперечисленных строках, первый - для создания типа буфера, вторая строка - передать указателю выделенной памяти видеоустройства в буфер.(V4L2) Что делают эти 2 строки?

Проблема в том, что я не знаю, правильно ли я предполагаю, и мне нужно, чтобы кто-то подробно объяснил, как работает вторая линия.

ответ

0

Во второй строке указывается, как будет использоваться буфер. Правовые значения:

Таблица 3.5. перечисление v4l2_memory

V4L2_MEMORY_MMAP 1 The buffer is used for memory mapping I/O. 
V4L2_MEMORY_USERPTR 2 The buffer is used for user pointer I/O. 
V4L2_MEMORY_OVERLAY 3 [Not Yet Implemented] 
V4L2_MEMORY_DMABUF 4 The buffer is used for DMA shared buffer I/O. 

код вы включили фактически не выделять буферы. Вот несколько более полный фрагмент кода, показывающийIN буферов:

CLEAR(req); 
    req.count = 2; 
    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
    req.memory = V4L2_MEMORY_MMAP; 
    xioctl(fd, VIDIOC_REQBUFS, &req); 

    buffers = calloc(req.count, sizeof(*buffers)); 
    for (n_buffers = 0; n_buffers < req.count; ++n_buffers) { 
      CLEAR(buf); 

      buf.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
      buf.memory  = V4L2_MEMORY_MMAP; 
      buf.index  = n_buffers; 

      xioctl(fd, VIDIOC_QUERYBUF, &buf); 

      buffers[n_buffers].length = buf.length; 
      buffers[n_buffers].start = v4l2_mmap(NULL, buf.length, 
          PROT_READ | PROT_WRITE, MAP_SHARED, 
          fd, buf.m.offset); 

      if (MAP_FAILED == buffers[n_buffers].start) { 
        perror("mmap"); 
        exit(EXIT_FAILURE); 
      } 
    }