執行人: liangchingyun
./fb.c
中使用 remap_vmalloc_range()
等函式需要加上:
加上後即可成功編譯。#38
注意用語: device 是「裝置」
640x480
,像素格式rgb24
)
1/1
)
/dev/vcamctl
)
idx 從 1 開始
idx 從 1 開始
查看圖片格式
調整 vcam 輸出格式
將圖片寫入虛擬攝影機的 framebuffer 裝置。
Pixel Format :
'YUYV'
對應到yuyv422
使用 VLC 查看輸出
無法開啟 VLC,可能因為我是用遠端連線,待測試。改存成圖片來確認虛擬攝影機內容:
得到以下畫面,代表 framebuffer 中沒有資料。
改成寫入 framebuffer 時馬上擷取:
得到正確的圖:
./Makefile
理解:
使用 vcam-util
來確認 video 裝置的名稱:
對 vcam 做測試,顯示所有程式皆通過:
使用 kmodleak 來追蹤記憶體洩漏。
編譯後,執行:
在另一個終端機掛載及卸載 vcam 模組:
卸載後 kmodleak 會自動停止,並產生報告:
結果顯示有 13 個沒有被釋放掉的記憶體配置,其中一個為 32768 bytes。
適度整理之前的報告內容,針對 Linux v6.8+,探討 V4L2 和 Linux framebuffer
RGBA: red, green, blue, alpha。其中 alpha 代表透明度。
用 32 位元的無號整數來表達
用 16 位元的無號整數來表達(Red: 5 bits / Green: 6 bits / Blue: 5 bits)
效率很高,每個像素只需要 2 bytes,因此很常被使用。
將 RGB565 格式的 ui.bin
轉換成 RGB888 格式的 ui.rgb
假設某像素為
1111100000011111
,r
的變換:
& 0xF800
–>1111100000000000
>> 11
–>11111
<< 3
–>11111000
,補足 8 位元
2.10 YUV Formats: 以使用的位元個數區分
電視使用的標準。Y 代表亮度,U、V 代表彩度。原因是人眼對亮度較敏感,需給予較大的頻寬。其與 RGB 之間的關係為:
一種影像壓縮格式,其中每一訊框圖像都分別使用JPEG編碼。
只單獨的對某一訊框進行壓縮,而不考慮影像畫面中不同訊框之間的變化。因此壓縮率不高,但處理成本較低。
使用 Graphviz 重新製圖並嵌入到 HackMD 筆記頁面
使用 V4l2 框架以及 Linux Frambuffer API
運作流程:將資料寫入虛擬 Frambuffer 中,影片播放程式可以透過 /dev/videoX 來播放影片
Linux 下關於視訊設備的驅動框架,支援的設備有:
兩種角度來看 V4L2 框架
類似畫布
Frambuffer: RAM 中的一段連續記憶體,CPU 或 GPU 會把要顯示的影像放到 Framebuffer 中,讓 Display 裝置顯示。
使用 Graphviz 重新製圖並嵌入到 HackMD 筆記頁面
Linux 有提供 Framebuffer 的 API 框架,使用者可以透過 API 對 Framebuffer 進行操作,也可以使用該框架做一個須你的 Framebuffer。
framebuffer 為輸入!
MP4 → framebuffer → vcam 的 /dev/video1 (可被擷取) → VLC / MPlayer
Problem:
在其版本上無法成功編譯
Solution:
class_create(owner, name)
–> class_create(name)
struct vb2_queue
的 member 名稱: min_buffers_needed
–> min_queued_buffers
struct fb_info
的方式: info->flags = FBINFO_FLAG_DEFAULT;
–> fb_data->info = framebuffer_alloc(0, &dev->vdev.dev);
確認後,提交 pull request,注意要讓舊的 Linux 核心也能編譯 vcam 核心模組。
提交 pull request
DMA-BUF (Direct Memory Access Buffer) : 允許在不同裝置間共享的 buffer。
查詢關鍵字:
在 vb2_queue.io_modes
中啟用 VB2_DMABUF
新增操作函式
修改 buffer 的 memory type:
vb2_queue.mem_ops
原指定為 vb2_vmalloc_memops
,但 vmalloc 的記憶體不能拿去 DMA, 無法支援 DMABUF。
reference?
改為 vb2_dma_contig_memops
載入模組
測試程式