這兩天接到乙個同學的專案,v4l2+qt顯示的,我v4l2先用c語言調出來了,下面是幾篇文章我的筆記
首先是在網上找到的v4l2程式設計框架,
v4l2應用程式框架
v4l2
較v4l
有較大的改動,並已成為
2.6的標準介面,函蓋
video/dvb/fm...
,多數驅動都在向
v4l2
遷移。更好地了解
v4l2
先從應用入手,然後再深入到核心中結合物理裝置/介面的規範實現相應的驅動。本文先就
v4l2
camera
方面的應用框架。
v4l2
ioctl
函式來實現。
在v4l2
open
函式開啟這個裝置:
//dqbuff用非阻塞模式開啟攝像頭裝置
int
camerafd
;camerafd
= open
("/dev/video0"
, o_rdwr
| o_nonblock
, 0);
// 如果用阻塞模式開啟攝像頭裝置,上述**變為:
//camerafd = open("/dev/video0", o_rdwr, 0);
)裡的東西返回給應用程式。
linux
程式設計中,一般使用
ioctl
函式來對裝置的
i/o通道進行管理:
int在進行ioctl
(int
__fd
, unsigned long int
__request
, .../*args*/) ;
v4l2
開發中,常用的命令標誌符如下
(some are optional)
:在亞洲,一般使用
pal(
720x576
)制式的攝像頭,而歐洲一般使用
ntsc
(720x480
),使用
vidioc_querystd
來檢測:
v4l2_std_id std;do
while
(ret
== -1 &&
errno
== eagain
);switch
(std
)
struct
v4l2_format fmt
;
memset( &fmt
, 0,
sizeof
(fmt
) );
fmt.
type
= v4l2_buf_type_video_capture
;fmt
.fmt
.pix
.width
= 720
;fmt
.fmt
.pix
.height
= 576
;fmt
.fmt
.pix
.pixelformat
= v4l2_pix_fmt_yuyv
;fmt
.fmt
.pix
.field
= v4l2_field_interlaced
;if
(ioctl(fd
, vidioc_s_fmt
, &fmt
) == -1)
v4l2_format
結構如下:
struct
v4l2_format
fmt;};
struct
v4l2_pix_format
;
2.3分配記憶體
struct使用v4l2_requestbuffersreq
;if
(ioctl(fd
, vidioc_reqbufs
, &req
) == -1)
v4l2_requestbuffers
結構如下:
struct
v4l2_requestbuffers
;
vidioc_reqbufs
,我們獲取了
req.count
個快取,下一步通過呼叫
vidioc_querybuf
命令來獲取這些快取的位址,然後使用
mmap
函式轉換成應用程式中的絕對位址,最後把這段快取放入快取佇列:
typedef struct作業系統一般把系統使用的記憶體劃分成使用者空間和核心空間,分別由應用程式管理和作業系統管理。應用程式可以直接訪問記憶體的位址,而核心空間存放的是供核心訪問的**和資料,使用者不能直接訪問。videobuffer
videobuffer
;videobuffer
*buffers
= calloc
( req
.count
, sizeof
(*buffers
) );
struct
v4l2_bufferbuf
;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
) //
放入快取佇列
if (
ioctl(fd
, vidioc_qbuf
, &buf
) == -1)
}
v4l2
捕獲的資料,最初是存放在核心空間的,這意味著使用者不能直接訪問該段記憶體,必須通過某些手段來轉換位址。
一共有:使用
read
、write
方式;記憶體對映方式和使用者指標模式。
read
、write
方式,在使用者空間和核心空間不斷拷貝資料,占用了大量使用者記憶體空間,效率不高。
記憶體對映方式:把裝置裡的記憶體對映到應用程式中的記憶體控制項,直接處理裝置記憶體,這是一種有效的方式。上面的
mmap
函式就是使用這種方式。
使用者指標模式:記憶體片段由應用程式自己分配。這點需要在
v4l2_requestbuffers
裡將memory
字段設定成
v4l2_memory_userptr。
v4l2
有乙個資料快取,存放
req.count
數量的快取資料。資料快取採用
fifo
ioctl
命令,vidioc_dqbuf
和vidioc_qbuf
:
structv4l2_buffer buf
;memset(&buf,0,
sizeof
(buf
));buf.type=v4l2_buf_type_video_capture
;buf.memory=v4l2_memory_mmap
;buf.index
=0;//
));buf.type=v4l2_buf_type_video_capture
;buf.memory=v4l2_memory_mmap
;buf.index
=0;//
最後就是關閉了 close(fd)就行
V4L2程式設計
include include include include include include include include include include typedef struct buftype buftype user buf int n buffer 0 開啟攝像頭裝置 int ope...
V4L2 程式設計
v4l2程式設計 1.定義 2.工作流程 開啟裝置 檢查和設定裝置屬性 設定幀格式 設定一種輸入輸出方法 緩衝區管理 迴圈獲取資料 關閉裝置。3.裝置的開啟和關閉 include int open const char device name,int flags include int close ...
V4L2程式設計 轉
前言 目前正在忙於arm 平台的linux 應用程式的開發 其實是剛剛起步學習啦 底層的東西不用考慮了,開發板子提供了 nand bootloader 和linux 2.6 的原始碼,而且都編譯好了。自己編譯的 bootloader 可以用,但是 linux 編譯後,檔案很大,暫且就用人家編譯的系統...