視頻應用可以通過兩種方式從V4L2驅動申請buffer
1. USERPTR, 顧名思義是用戶空間指針的意思,應用層負責分配需要的內存空間,然后以指針的形式傳遞給V4L2驅動層,V4L2驅動會把capture的內容保存到指針所指的空間
一般來說,應用層需要確保這個內存空間物理上是連續的(IPU處理單元的需求),在android系統可以通過PMEM驅動來分配大塊的連續物理內存。應用層在不需要的時候要負責釋放申請的PMEM內存。
2. MMAP方式,內存映射模式,應用調用VIDIOC_REQBUFS ioctl分配設備buffers,參數標識需要的數目和類型。這個ioctl也可以用來改變buffers的數據以及釋放分配的內存,當然這個內存空間一般也是連續的。在應用空間能夠訪問這些物理地址之前,必須調用mmap函數把這些物理空間映射為用戶虛擬地址空間。
虛擬地址空間是通過munmap函數釋放的; 而物理內存的釋放是通過VIDIOC_REQBUFS來實現的(設置參數buf count為(0)),物理內存的釋放是實現特定的,mx51 v4l2是在關閉設備時進行釋放的。
所以二者都是申請連續的物理內存,只是申請和釋放的方式不同