攝像頭v4l2採集中的mmap

用法:
buffers[i].start = (unsigned char *)mmap(NULL,
cam->buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
cam->fd,
cam->buf.m.offset);
我的理解:將攝像頭看做一個大一點的傳感器,它能採集到值,那麼我們應用層通過攝像頭文件描述符可以read內核驅動層的數據,數據從內核態轉爲用戶態有一個copy_to_user過程,使用read這樣頻繁、大量的讀取圖像數據,就會進行大量的數據拷貝,如果使用mmap,即將內核空間一段內存區域映射到用戶空間,我們可以直接讀取這段空間的圖像數據而不必進行拷貝。
那麼這個過程是攝像頭是如何知道將採集的圖像放到映射區域的呢?
看mmap之前調用的函數:
—請求攝像頭驅動分配內存,所以內存位於內核空間
ioctl(cam->fd, VIDIOC_REQBUFS, &cam->reqbuf)
—查詢已經分配的視頻緩衝區的相關信息,包括視頻緩衝區的使用狀態、在內核空間的偏移地址、緩衝區長度等。
ioctl(cam->fd, VIDIOC_QUERYBUF, &cam->buf)
看過這兩個函數的調用,一切就明朗了,先申請緩衝區,假設申請4個緩衝區,緩衝區處於內核空間,再利用4次循環,分別獲取每個緩衝區的相關信息。利用獲取的每個緩衝區的長度、在內核空間(內核空間、用戶控件均是內存的一段)的偏移地址來進行映射到用戶空間。
這裏寫圖片描述

順便記錄一下VIDIOC_QBUF :
投放一個空的視頻緩衝區到視頻緩衝區輸入隊列中,成功,則指定的視頻緩衝區進入視頻輸入隊列,在啓動視頻設備拍攝圖像時,相應的視頻數據被保存到視頻輸入隊列相應的視頻緩衝區中。

發佈了38 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章