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 ...