1. 說明
由于項(xiàng)目性能優(yōu)化需求需要將原來的虛擬相機(jī)進(jìn)行性能優(yōu)化,包括CPU和內(nèi)存使用率,根據(jù)之前的實(shí)現(xiàn)方式使用ffmpeg將視頻資源解碼YUYV數(shù)據(jù)寫入V4l2loopback驅(qū)動(dòng),系統(tǒng)framework從驅(qū)動(dòng)讀取對(duì)應(yīng)數(shù)據(jù)傳遞給APP。
2. 需求說明
數(shù)據(jù)傳遞流程 videoFile -> ffmpeg -> 解碼YUYV 然后進(jìn)行旋轉(zhuǎn)裁剪 -> v4l
系統(tǒng)framework 從 v4l讀取數(shù)據(jù),轉(zhuǎn)換RGB 然后傳遞給APP。
這中間有多次對(duì)視頻數(shù)據(jù)的拷貝以及轉(zhuǎn)換,次過程消耗了大量的CPU與內(nèi)存。為此需要減少拷貝或這使用硬件加速。
3. 實(shí)現(xiàn)方式
由于設(shè)備使用的是rockchip 硬件,支持DMA/RGA,由此聯(lián)想到讓ffmpeg解碼視頻直接輸出DMA ,然后直接將DMA fd寫入v4l ,v4l 將寫入的fd 轉(zhuǎn)換成dmabuf,當(dāng)framework從v4l讀取數(shù)據(jù)時(shí)v4l將dmabuf映射一個(gè)dma fd再傳遞給framework,framework獲取到該fd后可直接使用RGA進(jìn)行硬件加速裁剪旋轉(zhuǎn)等操作。此過程對(duì)比之前少了多次原始視頻數(shù)據(jù)的拷貝,對(duì)原始視頻數(shù)據(jù)的轉(zhuǎn)換也用上了硬件加速,經(jīng)過測(cè)試CPU使用率從之前的40%降到了4%,極大的提升了性能,內(nèi)存使用從之前的7%將到了0.1%。
可惜官方v4l2loopback 并不支持dma,故此需要對(duì)驅(qū)動(dòng)進(jìn)行擴(kuò)展。
官方地址:https://github.com/v4l2loopback/v4l2loopback
擴(kuò)展DMA后的地址:https://github.com/LucasDevelop/V4l2loopback_dma
該擴(kuò)展是基于官方v0.12.7版本,如需兼容最新官方版本請(qǐng)自行移植。具體擴(kuò)展的代碼可以與官方代碼進(jìn)行對(duì)比,這里也不再描述。具體原理如前面所說,支持v4l傳入dmafd然后轉(zhuǎn)換dmabuf 再輸出dmafd.
注意:官方版本的ffmpeg是不支持直接輸出dma 數(shù)據(jù)的,需要使用rockchip提供的ffmpeg,這個(gè)不是本博客的重點(diǎn),不深入。