V4L2的開發手冊
在做v4l2的開發的時候, 可以使用v4l2-ctl
命令協助調試和軟件開發。 關于linux多媒體開發可以參考鏈接:https://www.linuxtv.org/wiki/index.php/Main_Page
關于v4l2的api接口開發可以參考:https://linuxtv.org/docs.php
在linux下開發,可以借助ffmplay命令或者YUViewer軟件進行讀取顯示。
基于V4l2進行圖像讀取
進行圖像格式配置
請求緩沖
配置mmap內存映射
填寫緩沖下標并加入緩沖隊列
啟動視頻流
彈出隊列里就緒的緩沖
v4l2 中會將申請的緩沖加入到緩沖列表里面,通過下標來指示當前的緩沖標識, 將緩沖加入隊列的時候, 必須要注明下標的值。 將緩沖彈出隊列的時候, 下標會通過驅動賦值傳遞給用戶。 v4l2 有mmap,pointer, dma buf等方法進行讀取圖像加速。 比如內存映射就可以有效地避免代碼在用戶態和內核態來回切換, 直接將設備文件的句柄偏移映射到用戶態的地址。 v4l2 支持mplane 多圖層開發, 常見的YUV格式, 通過uv的不同組合方式,可以分為nv12,nv21等多種圖像格式, Y表示亮度層, U表示色度層, V表示濃度層。 在V4l2下進行多圖層開發的時候, 務必要重點學習struct v4l2_plane
, 其中, v4l2_plane.m.planes
指針的內存, 需要由用戶進行開辟和釋放。 在調試v4l2的時候, 可以通過打印errno
變量來獲取當前V4L2的api接口執行失敗的返回值。 在調用芯片廠商的算子IP時, 需要理解Stride的概念, 即跨距, 該值大于等于圖像的原有寬度, 用戶加速內存讀取和算子計算。 用算子IP進行加速的時候, 會涉及虛擬地址和真實地址的概念。 操作系統里面代碼能訪問的,基本就是虛擬地址, 可以有效防止內存崩潰。 但是, 當我們需要傳遞數據給硬件IP, 如IVE,NPU等核心的時候, 就必須得傳遞真實地址給硬件。
v4l2常用的指令
v4l2-ctl -d /dev/video11 --stream-mmap //fps
v4l2-ctl -d /dev/video11 --set-fmt-video=width=352,height=288,pixelformat=NV12 --stream-mmap=3 --stream-skip=3 --stream-to=./output.yuv --stream-count=10 --stream-poll
v4l2-ctl --list-formats-ext --device /dev/video11v4l2-ctl --list-devicesbuild.sh clean media && build.sh media.v4l2-ctl -d /dev/video12 --infov4l2-ctl -d /dev/video12 --get-fmt-video --verbose
v4l2-ctl -d /dev/video11 --set-fmt-video=width=352,height=289,pixelformat=NV12 --verbose//配置攝像頭參數,比如幀率和曝光時間,但是瑞芯微的僅能在ISP中通過3A server配置。
v4l2-ctl -d /dev/video11 --list-ctrlspixelformat = v4l2_fourcc
ffplay -f rawvideo -pixel_format nv12 -video_size 320x240 ./output.yuv # gray 播放灰度視頻
YUView
media-ctl -p -d /dev/media1 //列出所有設備entity name和node name(char device)。
entity name: mainpath
node name: /dev/video11* |--mainpath----[wrap]--------->enc(or ddr)* | |->mainpath_4x4sampling--->ddr*output->|->bypasspath----------------->ddr* | |->bypasspath_4x4sampling->ddr* |->selfpath------------------->ddr* |->lumapath------------------->ddr------------------------
insmod ./oem/usr/ko/rve.ko
rk_rve_sample_test 1