libva之ffavdemo分析

ffavdemo 代码库实现了一个基于FFmpeg和VAAPI的硬件加速视频解码与渲染框架,主要用于演示视频解码与渲染的完整硬件加速流程。支持多种渲染后端(X11、DRM、EGL),适应不同显示环境。包含视频处理过滤器,可进行格式转换和调整。提供RTSP客户端功能,支持从网络流接收并解码视频。使用多线程处理渲染和用户输入,确保流畅的播放体验。

​其核心功能包括:

  • 视频解码:通过 VA-API 调用 GPU 的硬件解码能力(如 H.264/HEVC 等格式)。
  • 帧处理:支持对解码后的帧进行格式转换、缩放等后处理操作。
  • 渲染输出:将处理后的视频帧渲染到屏幕或导出为图像文件

1、程序文件分析

  • ffmpeg_utils.c:包含FFmpeg与VAAPI之间的转换工具函数。

ffmpeg_to_vaapi_profile():将FFmpeg的编解码器ID和Profile转换为VAProfile。

ffmpeg_to_vaapi_pix_fmt()和vaapi_to_ffmpeg_pix_fmt():像素格式转换。

vaapi_to_ffmpeg_error():将VA状态码转换为FFmpeg错误码。

结构体ffva_pix_fmt_map用于映射像素格式。

  • ffvademo.c:主程序,展示如何使用FFmpeg和VAAPI进行视频解码和渲染。

main()函数初始化显示、解码器、渲染器,并处理视频帧。

支持不同的渲染后端(DRM、X11、EGL)和内存类型。

多线程处理用户输入(如退出命令)。

  • ffvadisplay.c:管理VA显示连接,支持DRM和X11后端。

ffva_display_new()创建显示对象,ffva_display_free()释放资源。

包含不同显示类型的初始化(如DRM打开设备节点,X11连接X服务器)。

  • ffvafilter.c:视频处理过滤器,使用VA的视频处理管道(VPP)进行后处理。

ffva_filter_new()初始化过滤器,ffva_filter_process()应用处理。

支持格式转换、裁剪、缩放等操作。

  • ffvarenderer.c:渲染器抽象基类,定义通用接口。

ffva_renderer_put_surface()提交表面进行渲染。

子类(如DRM、X11、EGL)实现具体的渲染逻辑。

  • ffvarenderer_drm.c:DRM渲染器实现,但目前似乎未完整实现渲染逻辑。主要处理与KMS(Kernel Mode Setting)的交互。
  • ffvarenderer_egl.c:使用EGL和OpenGL ES进行渲染,支持DMA-BUF导入。创建EGL上下文,管理纹理和着色器,处理YUV到RGB的转换。
  • ffvarenderer_x11.c:X11渲染器实现,创建X窗口并处理事件。

window_create()创建X窗口,处理窗口事件(如关闭)。

renderer_put_surface()使用X11的API进行图像渲染。

  • ffvasurface.c:管理VA表面的结构,初始化和释放表面资源。

ffva_surface_init()初始化表面信息。

  • vaapi_utils.c:VAAPI工具函数,处理VA配置、上下文、表面和缓冲区的生命周期。

va_create_buffer()创建并映射VA缓冲区。

  • ffvadecoder.c:FFmpeg与VAAPI集成的解码器实现。

vaapi_init_decoder()初始化VA解码器,创建配置和表面。

vaapi_acquire_surface()和vaapi_release_surface()管理解码后的帧表面。

  • ffvartsp.hh和相关代码:RTSP客户端实现,处理媒体流的接收和解包。

2、流程分析

  • 解码流程:通过ffvadecoder中的VAAPI解码器将视频数据解码为VA表面。
  • 渲染流程:渲染器(如X11、EGL)将VA表面转换为适合显示的格式并呈现。
  • 格式转换:ffmpeg_utils中的函数处理编解码器Profile和像素格式的转换。
  • 错误处理:将VAAPI错误转换为FFmpeg错误码,便于统一处理。
  • 网络流支持:RTSP客户端接收流媒体,解码后送入渲染管道。

3、ffavdemo.c分析

先来看看这个程序支持那些参数。

  • -x, --window-width=WIDTH:设置窗口的宽度,参数类型为整数,默认值为 0。
  • -y, --window-height=HEIGHT :设置窗口的高度,参数类型为整数,默认值为 0
  • -r, --renderer=TYPE:选择特定的渲染器,参数类型为字符串,默认值根据编译选项而定(可能是 x11)。支持的渲染器类型有 drm、x11、egl。
  • -m, --mem-type=TYPE:设置VA缓冲区导出的内存类型,参数类型为字符串,默认值根据编译选项而定(可能是 auto)。支持的内存类型有 dma_buf、gem_buf、mesa_image、mesa_texture。
  • -f, --format=FORMAT:设置输出像素格式,参数类型为 AVPixelFormat,默认值为 none。

程序基本流程图如下:

4、程序测试

* 播放一个采用MP4格式的H.264视频

$ ffvademo /path/to/video.mp4

* 播放一个VC-1视频,并将输出转换为I420格式

$ ffvademo -f yuv420p /path/to/video.wmv

* 播放一个采用MP4格式的H.264视频,并使用EGL/GLESv2进行渲染

$ ffvademo -r egl -f argb /path/to/video.mp4

相关推荐
ℳ₯㎕ddzོꦿ࿐5 天前
告别延迟:HLS (m3u8) 实时转 FLV 全栈方案实战
视频编解码
霜雪i6 天前
ISP模式
视频编解码·h.266
CheungChunChiu6 天前
视频编解码与 GOP 结构详解
linux·视频编解码
深圳市友昊天创科技有限公司10 天前
友昊天创推出8K ,4K 120Hz 100米延长器方案
音视频·实时音视频·视频编解码
深圳市友昊天创科技有限公司10 天前
ASM4242 雷电扩展坞 CV4242 PCIE扩展坞
音视频·实时音视频·视频编解码
深圳市友昊天创科技有限公司10 天前
友昊天创推出延长器方案GSV5600+HDBase VS010**/VS100**
音视频·实时音视频·视频编解码
TEL1892462247714 天前
IT6227:USB-C(DP Alt 模式)及电源传输控制器 内置 4 通道 DP 1.4 转 HDMI 2.1 转换器
音视频·实时音视频·视频编解码
小咖自动剪辑17 天前
视频去水印与去字幕教程:免费去水印软件与去字幕工具推荐
人工智能·音视频·实时音视频·视频编解码
TEL1892462247718 天前
IT6225B:USB-C(DP Alt 模式)及电源传输控制器 内置双通道 DP 1.4 转 HDMI 2.0 转换器
音视频·实时音视频·视频编解码
小脑斧要动脑19 天前
视频编解码开发工具合集
视频编解码