主要内容
本章主要讲解libva架构在intel平台的相关内容。包括vaapi的使用,以及调用intel驱动的相关简介。libva属于标准库,但是对于各个芯片厂商来说都有自己的后端驱动,intel是i915和iHD,相关库和驱动如下:
i965驱动属于老版本的va驱动,而iHD是比较新的va驱动
以下 以libva2.6版本以及i965驱动为例进行讲解。对于libva如何使用后端驱动可以参考libva源码讲解。
libva架构
#mermaid-svg-TJcvCHPTq4vxinz4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TJcvCHPTq4vxinz4 .error-icon{fill:#552222;}#mermaid-svg-TJcvCHPTq4vxinz4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TJcvCHPTq4vxinz4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TJcvCHPTq4vxinz4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TJcvCHPTq4vxinz4 .marker.cross{stroke:#333333;}#mermaid-svg-TJcvCHPTq4vxinz4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TJcvCHPTq4vxinz4 p{margin:0;}#mermaid-svg-TJcvCHPTq4vxinz4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 .cluster-label text{fill:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 .cluster-label span{color:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 .cluster-label span p{background-color:transparent;}#mermaid-svg-TJcvCHPTq4vxinz4 .label text,#mermaid-svg-TJcvCHPTq4vxinz4 span{fill:#333;color:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 .node rect,#mermaid-svg-TJcvCHPTq4vxinz4 .node circle,#mermaid-svg-TJcvCHPTq4vxinz4 .node ellipse,#mermaid-svg-TJcvCHPTq4vxinz4 .node polygon,#mermaid-svg-TJcvCHPTq4vxinz4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TJcvCHPTq4vxinz4 .rough-node .label text,#mermaid-svg-TJcvCHPTq4vxinz4 .node .label text,#mermaid-svg-TJcvCHPTq4vxinz4 .image-shape .label,#mermaid-svg-TJcvCHPTq4vxinz4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-TJcvCHPTq4vxinz4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TJcvCHPTq4vxinz4 .rough-node .label,#mermaid-svg-TJcvCHPTq4vxinz4 .node .label,#mermaid-svg-TJcvCHPTq4vxinz4 .image-shape .label,#mermaid-svg-TJcvCHPTq4vxinz4 .icon-shape .label{text-align:center;}#mermaid-svg-TJcvCHPTq4vxinz4 .node.clickable{cursor:pointer;}#mermaid-svg-TJcvCHPTq4vxinz4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TJcvCHPTq4vxinz4 .arrowheadPath{fill:#333333;}#mermaid-svg-TJcvCHPTq4vxinz4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TJcvCHPTq4vxinz4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TJcvCHPTq4vxinz4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TJcvCHPTq4vxinz4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TJcvCHPTq4vxinz4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TJcvCHPTq4vxinz4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TJcvCHPTq4vxinz4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TJcvCHPTq4vxinz4 .cluster text{fill:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 .cluster span{color:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TJcvCHPTq4vxinz4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TJcvCHPTq4vxinz4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-TJcvCHPTq4vxinz4 .icon-shape,#mermaid-svg-TJcvCHPTq4vxinz4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TJcvCHPTq4vxinz4 .icon-shape p,#mermaid-svg-TJcvCHPTq4vxinz4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TJcvCHPTq4vxinz4 .icon-shape rect,#mermaid-svg-TJcvCHPTq4vxinz4 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TJcvCHPTq4vxinz4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TJcvCHPTq4vxinz4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TJcvCHPTq4vxinz4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} APP调用va库函数
va库函数调用后端厂商va驱动
驱动使用DRM库函数
库函数使用DRM库内核驱动drm.ko
DRM内核驱动使用intel内部函数进行操作
DRM内驱动操作硬件
每一层说明如下:
| 层次 | 说明 |
|---|---|
| APP层 | 应用程序,或者成熟的硬件解码框架,如ffmpeg,gstramer,或者自己使用va库直接编写的程序,这一层主要是使用va库函数 |
| va库层 | 标准的va库函数,作为硬件解码标准。与intel的va标准对应的还有AMD的vdpau |
| va应用驱动层 | va的后端驱动,一般在/usr/lib/x86_64-linux-gnu/dri下,intel是i965_video_drv.so |
| drm应用库层 | 在/usr/lib/x86_64-linux-gnu/drm下,有很多库基础库为libdrm.so,还有各个平台的库如libdrm_amdgpu.so,libdrm_intel.so等 |
| drm内核驱动层 | drm.ko,在某个内核镜像的模块库中,由于系统镜像内核版本可能存在多个,所以可能在多个文件夹下都存在drm.ko,如/lib/modules/5.4.0-109-generic/kernel/drivers/gpu/drm/,同时在/sys/modules/drm下还有drm相关信息的文件节点,如parameter文件夹下的debug文件,可以改变drm的调试等级。使用modinfo drm可以查看相关信息。 |
| 显卡硬件层 | 硬件层,不做讲解 |
i965 与 iHD 驱动对比
Intel 在 VA-API 上先后提供了两套后端驱动:老牌的 i965(intel-vaapi-driver)与新一代的 iHD(media-driver)。两者在库文件名、源码仓库、平台覆盖、格式支持与显示后端上都有明显差异,对比如下:
| 对比项 | i965 驱动 | iHD 驱动 |
|---|---|---|
| 驱动库文件名 | i965_drv_video.so(安装于 /usr/lib/x86_64-linux-gnu/dri/) |
iHD_drv_video.so(安装于 /usr/lib/x86_64-linux-gnu/dri/) |
| 对应源码仓库 | intel/intel-vaapi-driver | intel/media-driver |
| 支持的平台代际 | 主要覆盖 Gen4 ~ Gen9 及部分 Gen9.5 平台,如 G45、Ironlake、Sandy Bridge、Ivy Bridge、Haswell、Broadwell、Skylake、Kaby Lake、Coffee Lake 等 | 面向 Gen9 及更新的平台,如 Skylake、Kaby Lake、Coffee Lake、Ice Lake、Tiger Lake、Rocket Lake、Alder Lake、DG1、Arc 独显等 |
| 支持的 RT format | YUV420、YUV420_10BPP、YUV422、YUV444、YUV411、YUV400、RGB32 | YUV420、YUV420_10BPP、YUV422、YUV444、YUV400、RGB32 等,并额外支持 P010 等 10bit 高动态格式 |
| 支持的编码格式 | MPEG-2、VC-1、H.264、JPEG、VP8、HEVC(部分平台)、VP9(部分平台) | H.264、HEVC(含 Main10)、VP9、AV1(Gen12+ 解码)、JPEG、MPEG-2 等,编码能力覆盖 H.264/HEVC/AV1 |
| 是否支持 Wayland 显示 | 支持,但需编译时开启 HAVE_VA_WAYLAND,实际使用中 vaPutSurface 仅支持 X11,Wayland 下通常走 dmabuf 导出 |
原生支持 Wayland,配合 libva-wayland 可直接在 Wayland 合成器下完成显示 |
| 维护状态 | 已进入维护模式,新特性基本停止开发,仅做必要修复 | 官方主推的活跃驱动,持续跟进新平台与新格式 |
选型建议
- 老平台(Gen9 以前,如 Haswell、Broadwell 等):只能选 i965,iHD 并不覆盖这些代际的硬件,强行使用会出现初始化失败或功能缺失。
- 新平台(Gen9 及以后,尤其是 Ice Lake、Tiger Lake、Alder Lake、Arc 独显):优先使用 iHD,它对新格式(HEVC Main10、AV1 等)和新显示后端(Wayland)的支持更完整,性能与稳定性也更好。
- 需要 Wayland 原生显示 :选 iHD;若必须用 i965,则建议通过 dmabuf/DRM PRIME 导出 surface,交给合成器自行合成,而不是依赖
vaPutSurface。 - 需要 AV1 或 10bit HEVC 编解码:选 iHD,i965 在这些格式上支持有限甚至缺失。
- 存量系统或依赖 i965 私有行为的老应用:可继续使用 i965,但应规划向 iHD 迁移。
实际部署时,可通过环境变量 LIBVA_DRIVER_NAME 指定后端,例如 LIBVA_DRIVER_NAME=iHD 或 LIBVA_DRIVER_NAME=i965,再用 vainfo 确认当前加载的驱动与支持的 profile/entrypoint。