之前調試MXC V4L2驅動一直沒有注意到output/mxc_v4l2_output.c這個檔案,因為capture/*.c已經提供了still capture, stream capture, 以及overlay,所以沒仔細的去看mxc_v4l2_output.c提供的功能,直到前幾天負責維護overlay hal的同事提出開啟了overlay hal /dev/video16這個裝置節點,才讓我跟到這個檔案中
先從/dev/video0 和video16說起:
MXC V4L2產生了三個裝置節點, /dev/radio0 /dev/video0以及/dev/video16, /dev/radio0就不討論了,項目中沒接觸到。
/dev/video0是mxc_v4l2_capture驅動建立的裝置節點, 而/dev/video16是mxc_v4l2_output驅動建立的裝置節點。
/dev/video0節點既可用於capture又可用來overlay,
而/dev/video16完全是為push mode overlay模式服務的,所謂push mode模式(以下幾行純屬臆測):應用通過stream capture從/dev/video0 dequeue到映像buffer資料,然後把這個指標再傳給/dev/video16(當然是通過VIDIOC_Q_BUF),output 模組會直接將queue進來的buffer直接輸出到framebuffer,這就完成了Overlay功能
push mode overlay和 /dev/video0支援的直接overlay的區別是, push mode overlay需要應用空間參與資料的處理,使用者空間參與的代價就是cpu佔用率,好處是用空間有機會接觸到每一幀傳送到 framebuffer的資料。而直接overlay是你啟動overlay後,所有資料直接從camera流動到framebuffer, 中間沒有任何機會接觸資料,只能在frame buffer這裡截獲資料,速度是真快。(先到這裡吧,有任務)
push mode模式的另外一個好處是,就是你可以使用USB camera, 對camera進行處理顯示
output裝置支援多個輸出,分別為DISP3 FG, DISP3 BG, DISP3 BG - DI1
DISP3 FG: 是FG overlay,用來顯示video
DISP3 BG: 主顯示,用來顯示UI介面
DISP3 BG - DI1: TVOUT,用來顯示CVBS輸出資料
程式碼分析