linuxV4L2驅(qū)動(dòng)_第1頁(yè)
linuxV4L2驅(qū)動(dòng)_第2頁(yè)
linuxV4L2驅(qū)動(dòng)_第3頁(yè)
linuxV4L2驅(qū)動(dòng)_第4頁(yè)
linuxV4L2驅(qū)動(dòng)_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一.什么是video4linuxVideo4linux2(簡(jiǎn)稱(chēng)V4L2),是linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動(dòng)。V4L2較V4L有較大的改動(dòng),并已成為2.6的標(biāo)準(zhǔn)接口,函蓋videodvbFM.,多數(shù)驅(qū)動(dòng)都在向V4I2遷移。更好地了解V4L2先從應(yīng)用入手,然后再深入到內(nèi)核中結(jié)合物理設(shè)備/接口的規(guī)范實(shí)現(xiàn)相應(yīng)的驅(qū)動(dòng)。V4L2采用流水線的方式,操作更簡(jiǎn)單直觀,基本遵循打開(kāi)視頻設(shè)備、設(shè)置格式、處理數(shù)據(jù)、關(guān)閉設(shè)備,更多的具體操作通過(guò)ioctl函數(shù)來(lái)實(shí)現(xiàn)。在Linux中,視頻設(shè)備是設(shè)備文件,可以像訪問(wèn)普通文件一樣對(duì)其進(jìn)行讀寫(xiě),攝像頭在/dev/videoO下。二、一般操作流程(視頻設(shè)備):打開(kāi)設(shè)備文件。i

2、ntfdopen(/dev/videoO,O_RDR);取得設(shè)備的capability,看看設(shè)備具有什么功能,比如是否具有視頻輸入,或者音頻輸入輸出等。VIDIOC_QUERYCAP,structv4l2_capability選擇視頻輸入,一個(gè)視頻設(shè)備可以有多個(gè)視頻輸入。VIDIOC_S_INPUT,structv4l2_input設(shè)置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個(gè)包括寬度和高度等。VIDIOC_S_STD,VIDIOC_S_FMT,structv4l2_std_id,structv4l2_format向驅(qū)動(dòng)申請(qǐng)幀緩沖,一般不超過(guò)5個(gè)。structv4l2_reque

3、stbuffers將申請(qǐng)到的幀緩沖映射到用戶空間,這樣就可以直接操作采集到的幀了,而不必去復(fù)制。mmap將申請(qǐng)到的幀緩沖全部入隊(duì)列,以便存放采集到的數(shù)據(jù).VIDIOC_QBUF,structv4l2_buffer開(kāi)始視頻的采集。VIDIOC_STREAMON出隊(duì)列以取得已采集數(shù)據(jù)的幀緩沖,取得原始采集數(shù)據(jù)。VIDIOC_DQBUF將緩沖重新入隊(duì)列尾,這樣可以循環(huán)采集。VIDIOC_QBUF停止視頻的采集。VIDIOC_STREAMOFF關(guān)閉視頻設(shè)備。close(fd);三、常用的結(jié)構(gòu)體(參見(jiàn)/usr/include/linux/videodev2.h):structv4l2_requestbu

4、ffersreqbufs;/向驅(qū)動(dòng)申請(qǐng)幀緩沖的請(qǐng)求,里面包含申請(qǐng)的個(gè)數(shù)structv4l2_capabilitycap;/這個(gè)設(shè)備的功能,比如是否是視頻輸入設(shè)備structv4l2_inputinput;/視頻輸入structv4l2_standardstd;視頻的制式,比如PAL,NTSCstructv4l2_formatfmt;幀的格式,比如寬度,高度等structv4l2_bufferbuf;代表驅(qū)動(dòng)中的一幀v4l2_std_idstdid;/視頻制式,例如:V4L2_STD_PAL_Bstructv4l2_queryctrlquery;/查詢的控制structv4l2_controlc

5、ontrol;/具體控制的值四、細(xì)節(jié)打開(kāi)視頻設(shè)備在V4L2中,視頻設(shè)備被看做一個(gè)文件。使用open函數(shù)打開(kāi)這個(gè)設(shè)備:/用非阻塞模式打開(kāi)攝像頭設(shè)備intcameraFd;cameraFd=open(/dev/videoO,O_RDWR|O_NONBLOCK,0);/如果用阻塞模式打開(kāi)攝像頭設(shè)備,上述代碼變?yōu)椋?cameraFd=open(/dev/video0,O_RDWR,0);應(yīng)用程序能夠使用阻塞模式或非阻塞模式打開(kāi)視頻設(shè)備,如果使用非阻塞模式調(diào)用視頻設(shè)備,即使尚未捕獲到信息,驅(qū)動(dòng)依舊會(huì)把緩存(DQBUFF)里的東西返回給應(yīng)用程序。設(shè)定屬性及采集方式打開(kāi)視頻設(shè)備后,可以設(shè)置該視頻設(shè)備的屬性,

6、例如裁剪、縮放等。這一步是可選的。在Linux編程中,一般使用ioctl函數(shù)來(lái)對(duì)設(shè)備的I/O通道進(jìn)行管理:intioctl(intfd,unsignedlongint_request,./*args*/);在進(jìn)行V4L2開(kāi)發(fā)中,常用的命令標(biāo)志符如下(someareoptional):VIDIOC_REQBUFS:分配內(nèi)存VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的數(shù)據(jù)緩存轉(zhuǎn)換成物理地址VIDIOC_QUERYCAP:查詢驅(qū)動(dòng)功能VIDIOC_ENUM_FMT:獲取當(dāng)前驅(qū)動(dòng)支持的視頻格式VIDIOC_S_FMT:設(shè)置當(dāng)前驅(qū)動(dòng)的頻捕獲格式VIDIOC_G_FMT:讀取當(dāng)前

7、驅(qū)動(dòng)的頻捕獲格式VIDIOC_TRY_FMT:驗(yàn)證當(dāng)前驅(qū)動(dòng)的顯示格式VIDIOC_CROPCAP:查詢驅(qū)動(dòng)的修剪能力VIDIOC_S_CROP:設(shè)置視頻信號(hào)的邊框VIDIOC_G_CROP:讀取視頻信號(hào)的邊框VIDIOC_QBUF:把數(shù)據(jù)從緩存中讀取出來(lái)VIDIOC_DQBUF:把數(shù)據(jù)放回緩存隊(duì)列VIDIOC_STREAMON:開(kāi)始視頻顯示函數(shù)VIDIOC_STREAMOFF:結(jié)束視頻顯示函數(shù)VIDIOC_QUERYSTD:檢查當(dāng)前視頻設(shè)備支持的標(biāo)準(zhǔn),例如PAL或NTSC。2.1檢查當(dāng)前視頻設(shè)備支持的標(biāo)準(zhǔn)在亞洲,一般使用PAL(720X576)制式的攝像頭,而歐洲一般使用NTSC(720X48

8、0),使用VIDIOC_QUERYSTD來(lái)檢測(cè):v4l2_std_idstd;doret=ioctl(fd,VIDIOC_QUERYSTD,&std);while(ret=-1&errno=EAGAIN);switch(std)caseV4L2_STD_NTSC:/caseV4L2_STD_PAL:/2.2設(shè)置視頻捕獲格式當(dāng)檢測(cè)完視頻設(shè)備支持的標(biāo)準(zhǔn)后,還需要設(shè)定視頻捕獲格式,結(jié)構(gòu)如下:structv4l2_formatfmt;memset(&fmt,0,sizeof(fmt);fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width=720;

9、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)return-1;v4l2_format結(jié)構(gòu)如下:structv4l2_formatenumv4l2_buf_typetype;/數(shù)據(jù)流類(lèi)型,必須永遠(yuǎn)是V4L2_BUF_TYPE_VIDEO_CAPTUREunionstructv4l2_pix_formatpix;structv4l2_windowwin;structv

10、4l2_vbi_formatvbi;_u8raw_data200;fmt;structv4l2_pix_format_u32width;/寬,必須是16的倍數(shù)_u32height;/高,必須是16的倍數(shù)_u32pixelformat;/視頻數(shù)據(jù)存儲(chǔ)類(lèi)型,例如是YUV4:2:2還是RGBenumv4l2fieldfield;_u32bytesperline;_u32sizeimage;enumv4l2_colorspacecolorspace;_u32priv;2.3分配內(nèi)存接下來(lái)可以為視頻捕獲分配內(nèi)存:structv4l2_requestbuffersreq;if(ioctl(fd,VIDIO

11、C_REQBUFS,&req)=-1)return-1;v4l2_requestbuffers結(jié)構(gòu)如下:structv4l2_requestbuffers_u32count;/緩存數(shù)量,也就是說(shuō)在緩存隊(duì)列里保持多少?gòu)堈掌琫numv4l2_buf_typetype;/數(shù)據(jù)流類(lèi)型,必須永遠(yuǎn)是V4L2_BUF_TYPE_VIDEO_CAPTUREenumv4l2_memorymemory;/V4L2_MEMORY_MMAP或V4L2_MEMORY_USERPTR_u32reserved2;2.4獲取并記錄緩存的物理空間使用VIDIOC_REQBUFS,我們獲取了req.count個(gè)緩存,下一步通過(guò)調(diào)

12、用VIDIOC_QUERYBUF命令來(lái)獲取這些緩存的地址,然后使用mmap函數(shù)轉(zhuǎn)換成應(yīng)用程序中的絕對(duì)地址,最后把這段緩存放入緩存隊(duì)列:typedefstructVideoBuffervoid*start;size_tlength;VideoBuffer;VideoBuffer*buffers=calloc(req.count,sizeof(*buffers);structv4l2_bufferbuf;for(numBufs=0;numBufsreq.count;numBufs+)memset(&buf,0,sizeof(buf);buf.type=V4L2_BUF_TYPE_VIDEO_CAP

13、TURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=numBufs;/讀取緩存if(ioctl(fd,VIDIOC_QUERYBUF,&buf)=-1)return-1;buffersnumBufs.length=buf.length;/轉(zhuǎn)換成相對(duì)地址buffersnumBufs.start=mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffersnumBufs.start=MAP_FAILED)return-1;/放入緩存隊(duì)列if(ioctl(fd,VID

14、IOC_QBUF,&buf)=-1)return-1;2.5視頻采集方式操作系統(tǒng)一般把系統(tǒng)使用的內(nèi)存劃分成用戶空間和內(nèi)核空間,分別由應(yīng)用程序管理和操作系統(tǒng)管理。應(yīng)用程序可以直接訪問(wèn)內(nèi)存的地址,而內(nèi)核空間存放的是供內(nèi)核訪問(wèn)的代碼和數(shù)據(jù),用戶不能直接訪問(wèn)。V4I2捕獲的數(shù)據(jù),最初是存放在內(nèi)核空間的,這意味著用戶不能直接訪問(wèn)該段內(nèi)存,必須通過(guò)某些手段來(lái)轉(zhuǎn)換地址。一共有三種視頻采集方式:使用read、write方式;內(nèi)存映射方式和用戶指針模式。read、write方式,在用戶空間和內(nèi)核空間不斷拷貝數(shù)據(jù),占用了大量用戶內(nèi)存空間,效率不高。內(nèi)存映射方式:把設(shè)備里的內(nèi)存映射到應(yīng)用程序中的內(nèi)存控件,直接處理設(shè)

15、備內(nèi)存,這是一種有效的方式。上面的mmap函數(shù)就是使用這種方式。用戶指針模式:內(nèi)存片段由應(yīng)用程序自己分配。這點(diǎn)需要在v4I2_requestbuffers里將memory字段設(shè)置成V4L2_MEMORY_USERPTR。2.6處理采集數(shù)據(jù)V4L2有一個(gè)數(shù)據(jù)緩存,存放req.count數(shù)量的緩存數(shù)據(jù)。數(shù)據(jù)緩存采用FIFO的方式,當(dāng)應(yīng)用程序調(diào)用緩存數(shù)據(jù)時(shí),緩存隊(duì)列將最先采集到的視頻數(shù)據(jù)緩存送出,并重新采集一張視頻數(shù)據(jù)。這個(gè)過(guò)程需要用到兩個(gè)ioctl命令,VIDIOC_DQBUF和VIDIOC_QBUF:structv4I2_bufferbuf;memset(&buf,0,sizeof(buf);buf.type=V4L2_BUF_T

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論