DM6467之视频采集(Linux)下MMAP
做dsp6467是在linux下做視頻采集,僅ARM端
一共有三種視頻采集方式:
1)使用read、write方式:直接使用 read 和 write 函數(shù)進(jìn)行讀寫。這種方式最簡單,但是這種方式會(huì)在用戶空間和內(nèi)核空間不斷拷貝數(shù)據(jù) ,同時(shí)在用戶空間和內(nèi)核空間占用 了 大量內(nèi)存,效率不高。
2)內(nèi)存映射方式(mmap):把設(shè)備里的內(nèi)存映射到應(yīng)用程序中的內(nèi)存控件,直接處理設(shè)備內(nèi)存,這是一種有效的方式。上面的mmap函數(shù)就是使用這種方式。
3)用戶指針模式:內(nèi)存由用戶空間的應(yīng)用程序分配,并把地址傳遞到內(nèi)核中的驅(qū)動(dòng)程序,然后由 v4l2 驅(qū)動(dòng)程序直接將數(shù)據(jù)填充到用戶空間的內(nèi)存中。這點(diǎn)需要在v4l2_requestbuffers里將memory字段設(shè)置成V4L2_MEMORY_USERPTR。
第一種方式效率是最低的,后面兩種方法都能提高執(zhí)行的效率,但是對(duì)于mmap 方式,文檔中有這樣一句描述 –Remember the buffers are allocated in physical memory, as opposed to virtual memory which can be swapped out to disk。 Applications should free the buffers as soon as possible with the munmap () function 。(使用mmap方法的時(shí)候,buffers相當(dāng)于是在內(nèi)核空間中分配的,這種情況下,這些buffer是不能被交換到虛擬內(nèi)存中,雖然這種方法不怎么影響讀寫效率,但是它一直占用著內(nèi)核空間中的內(nèi)存,當(dāng)系統(tǒng)的內(nèi)存有限的時(shí)候,如果同時(shí)運(yùn)行有大量的進(jìn)程,則對(duì)系統(tǒng)的整體性能會(huì)有一定的影響。)
所以,對(duì)于三種視頻采集方式的選擇,推薦的順序是 userptr 、 mmap 、 read-write 。當(dāng)使用 mmap 或 userptr 方式的時(shí)候,有一個(gè)環(huán)形緩沖隊(duì)列的概念,這個(gè)隊(duì)列中,有 n 個(gè) buffer ,驅(qū)動(dòng)程序采集到的視頻幀數(shù)據(jù),就是存儲(chǔ)在每個(gè) buffer 中。在每次用 VIDIOC_DQBUF 取出一個(gè) buffer ,并且處理完數(shù)據(jù)后,一定要用 VIDIOC_QBUF 將這個(gè) buffer 再次放回到環(huán)形緩沖隊(duì)列中。環(huán)形緩沖隊(duì)列,也使得這兩種視頻采集方式的效率高于直接 read/write 。
但在用mmap是要注意關(guān)閉線程是才可訪問 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的DM6467之视频采集(Linux)下MMAP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]微信小程序安全浅析
- 下一篇: LINUX framebuffer