V4L2 API及資料結構

2021-07-28 19:17:28 字數 2801 閱讀 5190

1、常用的結構體在核心目錄include/linux/videodev2.h中定義

struct v4l2_requestbuffers  //申請幀緩衝,對應命令vidioc_reqbufs

struct v4l2_format          //幀的格式,對應命令vidioc_g_fmt、vidioc_s_fmt等

struct v4l2_buffer          //驅動中的一幀影象快取,對應命令vidioc_querybuf

2、常用的ioctl介面命令也在include/linux/videodev2.h中定義

vidioc_reqbufs             //分配記憶體

vidioc_querybuf         //把vidioc_reqbufs中分配的資料快取轉換成實體地址

vidioc_querycap         //查詢驅動功能

vidioc_s_fmt            //設定當前驅動的頻捕獲格式

vidioc_g_fmt            //讀取當前驅動的頻捕獲格式

vidioc_try_fmt          //驗證當前驅動的顯示格式

vidioc_cropcap          //查詢驅動的修剪能力

vidioc_qbuf             //把資料從快取中讀取出來

vidioc_dqbuf            //把資料放回快取佇列

3、操作流程

v4l2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所以在使用時需要參考驅動原始碼,或仔細閱讀驅動提供者

的使用說明。

下面列舉出一種操作的流程,供參考。

3.1  開啟裝置檔案

int fd = open(devicename,mode);

// devicename:/dev/video0、/dev/video1 ……

// mode:o_rdwr [| o_nonblock]

3.2  取得裝置的capability

struct v4l2_capability capability;

int ret = ioctl(fd, vidioc_querycap, &capability);

struct v4l2_input input;

……      //初始化input

int ret = ioctl(fd, vidioc_querycap, &input);

v4l2_std_id std;

do while (ret == -1 && errno == eagain);

switch (std)

struct v4l2_format fmt;

fmt.type = v4l2_buf_type_video_output;

fmt.fmt.pix.pixelformat = v4l2_pix_fmt_uyvy;

fmt.fmt.pix.height      = height;

fmt.fmt.pix.width       = width;

fmt.fmt.pix.field       = v4l2_field_interlaced;

ret = ioctl(fd, vidioc_s_fmt, &fmt);

if(ret)

3.6  向驅動申請幀快取

struct v4l2_requestbuffers req;

if (ioctl(fd, vidioc_reqbufs, &req) == -1) 

3.7  獲取每個快取的資訊,並mmap到使用者空間

typedef struct videobuffer 

videobuffer;

videobuffer* buffers = calloc( req.count, sizeof(*buffers) );  //申請 req.count 個記憶體

struct v4l2_buffer buf;

for (numbufs = 0; numbufs < req.count; numbufs++)  //對映所有的快取

buffers[numbufs].length = buf.length; 

// 轉換成相對位址

buffers[numbufs].start = mmap(null, buf.length, prot_read | prot_write, map_shared, fd, buf.m.offset);

if (buffers[numbufs].start == map_failed) 

}int buf_type= v4l2_buf_type_video_capture;

int ret = ioctl(fd, vidioc_streamon, &buf_type);

3.9  取出fifo快取中已經取樣的幀快取

struct v4l2_buffer buf;

memset(&buf,0,sizeof(buf));

buf.type=v4l2_buf_type_video_capture;

buf.memory=v4l2_memory_mmap;

buf.index=0;     //此值由下面的ioctl返回

if (ioctl(fd, vidioc_dqbuf, &buf) == -1)

3.10  將剛剛處理完的緩衝重新入佇列尾,這樣可以迴圈採集

if (ioctl(fd, vidioc_qbuf, &buf) == -1) 

int ret = ioctl(fd, vidioc_streamoff, &buf_type);

close(fd);

V4L2 API及資料結構

1 常用的結構體在核心目錄include linux videodev2.h中定義 structv4l2 requestbuffers 申請幀緩衝,對應命令vidioc reqbufs structv4l2 format 幀的格式,對應命令vidioc g fmt vidioc s fmt等 str...

V4L2 API及資料結構

1 常用的結構體在核心目錄include linux videodev2.h中定義 2 常用的ioctl介面命令也在include linux videodev2.h中定義 3 操作流程 v4l2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所...

v4l2的結構體之v4l2 device

乙個硬體裝置可能包含多個子裝置,比如乙個電視卡除了有capture裝置,可能還有vbi裝置或者fm tunner。而v4l2 device就是所有這些裝置的根節點,負責管理所有的子裝置,可將該抽象為soc的資料採集器,如csi mipi isp等soc的控制器。struct v4l2 device ...