目录
1. 简介
1)vvas_xfilter
vvas_xfilter 是一个基于 GStreamer 框架的过滤器插件,继承自 GstBaseTransform。它的主要作用是接收输入数据,对其进行处理,然后输出处理后的数据。由于它继承了 GstBaseTransform,它可以轻松地集成到 GStreamer 的处理管道中。vvas_xfilter 的作用包括:
- 数据处理:vvas_xfilter 可以对输入的数据进行各种处理操作,例如图像或视频的滤波、转换等。
- 灵活集成:由于它基于 GStreamer 框架,可以与其他 GStreamer 元素无缝集成,构建复杂的多媒体处理管道。
- 硬件加速:在某些实现中,vvas_xfilter 可以利用硬件加速功能来提高处理效率。
2)基础设施插件与自定义插件
vvas_xfilter 属于基础设施插件,是通用插件之一,通过与 kernel 对应的加速软件库公开的一组 API 与 kernel 交互。基础设施插件抽象了 GStreamer 框架的核心/通用功能(例如:caps 协商和缓冲区管理)。
有些特定功能,如视频解码器、编码器、元附加器等,其要求不同,并且很难使用高度简化和通用的基础设施插件框架以优化的方式实现。因此,这些功能是使用自定义插件来实现的。
2. 代码分析
代码的源文件可在如下路径中查看:
<VVAS/vvas-gst-plugins/sys/filter/gstvvas_xfilter.c>
此处分析其关键部分。
2.1 连接与集成
vvas_xfilter 插件需要被集成到 GStreamer 框架中,能够在 GStreamer 管道中作为一个过滤器元素使用,以下代码实现了这个功能:
// <VVAS/vvas-gst-plugins/sys/filter/gstvvas_xfilter.c>
static gboolean vvas_xfilter_init (GstVvas_XFilter * self) {
// 下载xclbin文件
vvas_xrt_download_xclbin (self->priv->xclbin_loc, self->priv->dev_handle, &self->priv->xclbinId);
}
static gboolean gst_vvas_xfilter_start (GstBaseTransform * trans) {
// 解析 root 配置文件
find_kernel_lib_symbols (self, priv->kernel); // call four core APIs
}
static gboolean find_kernel_lib_symbols (GstVvas_XFilter * self, Vvas_XFilter * kernel) {
// 加载sw_lib
priv->kernel.lib_fd = dlopen (priv->kernel.lib_path, RTLD_LAZY); // 打开 so 并映射 Core API
kernel->kernel_init_func = (VVASKernelInit )dlsym (kernel->lib_fd, "xlnx_kernel_init" );
kernel->kernel_start_func = (VVASKernelStartFunc )dlsym (kernel->lib_fd, "xlnx_kernel_start" );
kernel->kernel_done_func = (VVASKernelDoneFunc )dlsym (kernel->lib_fd, "xlnx_kernel_done" );
kernel->kernel_deinit_func = (VVASKernelDeInit )dlsym (kernel->lib_fd, "xlnx_kernel_deinit");
}
…
gst_element_register (…, vvas_xfilter,…); // 注册gst插件
GST_PLUGIN_DEFINE (…, vvas_xfilter,…);
1)插件初始化:
在 vvas_xfilter_init 函数中,下载并加载 xclbin 文件,这是 FPGA 加速所需的二进制文件。
2)插件启动:
在 gst_vvas_xfilter_start 函数中,解析配置文件并调用 find_kernel_lib_symbols 函数来加载内核库和获取核心 API 函数指针。
3)加载内核库:
find_kernel_lib_symbols 函数使用 dlopen 和 dlsym 加载共享库文件并获取内核函数指针,这些函数用于初始化、启动、完成和反初始化(可以类比为析构)内核。
4)注册插件:
使用 gst_element_register 函数将 vvas_xfilter 注册为 GStreamer 插件。
使用 GST_PLUGIN_DEFINE 宏定义插件信息,使 GStreamer 能够识别和使用该插件。
2.2 关键4个API Kernel
以 smartcam 这个项目为例,其关键4个 API Kernel 实现代码在如下路径:
<smartcam-xlnx_rel_v2022.1/src/vvas_airender.cpp>
代码会生成 swlib,Shared Object (*.so),供给 vvas_xfilte r插件调用。
其主要实现的代码,整理在此:
// Four Core APIs
// <smartcam-xlnx_rel_v2022.1/src/vvas_airender.cpp>
intvvas_classification_is_allowed (char *cls_name, vvas_xoverlaypriv * kpriv);
void convert_rgb_to_yuv_clrs (color clr, unsigned char *y, unsigned short *uv);
bool get_label_text (GstInferenceClassification * c, vvas_xoverlaypriv * kpriv, char *label_string);
static gboolean overlay_node_foreach (GNode * node, gpointer kpriv_ptr);
static void fps_overlay(gpointer kpriv_ptr);
int32_t xlnx_kernel_init (VVASKernel * handle);
uint32_t xlnx_kernel_deinit (VVASKernel * handle);
uint32_t xlnx_kernel_start (VVASKernel * handle, int start, VVASFrame * input[…], VVASFrame * output[…]);
int32_t xlnx_kernel_done (VVASKernel * handle);
2.3 结构关系
上图为我总结的 vvas_xfilter 与 GStreamer 插件相关的文件和模块的层级关系。
- Plugin: vas_xmultisrc:
在 GST Plugins 框内的第一层,包含一个模块 “Plugin: vas_xmultisrc”。
- swlib: Shared Object (*.so):
第二层包含一个模块 “swlib: Shared Object (*.so)”,与 “Plugin: vas_xmultisrc” 相关联。
Source Files:
在 “swlib” 模块下的第三层,有两个源文件:
<smartcam-xlnx_rel_v2022.1/src/vvas_airender.cpp>
<smartcam-xlnx_rel_v2022.1/src/vvas_dpuinfer.cpp>
- hw_kernel_accel:
在 “swlib” 模块下的另一层,标记为 “hw_kernel_accel”。
这些层级关系展示了 GStreamer 插件、共享库、源文件和硬件加速内核之间的结构和相互关系。
3. 总结
- vvas_xfilter 是 GStreamer 的一个通用插件。
- 基础设施插件具备通用的4个接口。
- 在4个 API Kernel 中,实现自己的硬件加速内核。
- 从底层理解 GStreamer 与 vvas_xfilter 的结构关系。