如何为 libva 加速元件处理显示的3点差异!
2008-10-12 01:02
141 查看
通常,gstreamer 管道是一个数据处理链,其中有一个源元件创建(读取)数据,还有一个接收器元件使用这些数据(或者将这些数据显示到屏幕或输出到扬声器);另外,在源元件和接收器元件之间还有各种过滤器元件,这些过滤器元件既有 sink pad,又有 src
pab。
视频解码器是一种常见的过滤器,它从上游(分离器/分流器)接收数据,并将数据发送到视频接收器(通常为
x-image-sink)。但是,当存在某种硬件加速机制时,情况稍有不同(对于 libva 而言尤其如此)。在这种情况下,一般使用 libva 来处理最终渲染
(vaPutImage),但下游过滤器/接收器元件(在典型的 gstreamer 管道中)“需要”来自视频过滤器的数据。如何消除这种差异呢? 在此,我有 3 个建议:
/*
* Map data store of the buffer into the client's address space
* vaCreateBuffer() needs to be called with "data" set to NULL before
* calling vaMapBuffer()
*/
VAStatus vaMapBuffer (
VADisplay dpy,
VABufferID buf_id, /* in */
void **pbuf /* out */
);
/*
* After client making changes to a mapped data store, it needs to
* "Unmap" it to let the server know that the data is ready to be
* consumed by the server
*/
VAStatus vaUnmapBuffer (
VADisplay dpy,
VABufferID buf_id /* in */
);
·
客户端(插件)可以通过 vaMapBuffer 访问解码数据,如果您将数据重新复制到 userspace/video-filter-element,那么对 gstreamer 的影响很小——所有其他元件都能照常工作。但是,您肯定会因为执行内存复制而损害性能(这里执行了复制操作,之后还可能针对视频接收器元件再次执行)。
·
客户端(插件)可以通过 vaMapBuffer 访问解码数据,在此我们不进行复制,但之后的过滤器/接收器元件应该知道这是一个 vaImage 缓冲器,而不是常见的数据缓冲器(是否需要?)。在接收器元件使用该缓冲器之后,我们可以通过 vaUnmapBuffer 将缓冲器重新释放到 library/libva。 但是,我认为从 vaBuffer 到 gfx framebuffer 可能存在捷径。当您尝试走捷径时,也会损害性能。
·
如果下游过滤器元件对 vaImage 没有太大的影响,我们可以修改 x-image-sink,使其使用 vaPutImage 来显示图像。
此假设有没有例外情况? 可以通过 vaPutImage2() 执行缩放。
无论如何,我们将首先尝试第一种方式。
这违背了 gstreamer 基础结构的常识。我们需要在视频-过滤器-解码器内部进行缩放、颜色转换和本机窗口处理。 这增加了模块的复杂性。
在粗略地浏览 ximagesink.c 之后,我有了一些基本的想法:
可以使用 gst_ximagesink_get_times() 处理计时。
向回调处理程序注册 gst_ximagesink_show_frame:
2156: gstbasesink_class->preroll =
GST_DEBUG_FUNCPTR (gst_ximagesink_show_frame);
2157: gstbasesink_class->render = GST_DEBUG_FUNCPTR
(gst_ximagesink_show_frame);
我假设杂波可以处理 VAImageID 而不是 gst 的数据缓冲器。
这样我们就可以提供杂波视频接收器 VAImageID,并且使 gst 数据缓冲器处于闲置状态。杂波视频接收器将访问
libva 以显示图像 (vaPutImage)。我们让 vaPutImage2 执行缩放。
还有差异吗?不确定。我们应该使杂波视频接收器的源 pad 成为动态 pad 以改进兼容性吗?
本文译自Intel Moblin.org社区
更多内容,请点击“Moblin技术”专区
pab。
视频解码器是一种常见的过滤器,它从上游(分离器/分流器)接收数据,并将数据发送到视频接收器(通常为
x-image-sink)。但是,当存在某种硬件加速机制时,情况稍有不同(对于 libva 而言尤其如此)。在这种情况下,一般使用 libva 来处理最终渲染
(vaPutImage),但下游过滤器/接收器元件(在典型的 gstreamer 管道中)“需要”来自视频过滤器的数据。如何消除这种差异呢? 在此,我有 3 个建议:
从library/libva/video-memory 拷回解码数据
这可能损害性能,但却是最简单的方式。/*
* Map data store of the buffer into the client's address space
* vaCreateBuffer() needs to be called with "data" set to NULL before
* calling vaMapBuffer()
*/
VAStatus vaMapBuffer (
VADisplay dpy,
VABufferID buf_id, /* in */
void **pbuf /* out */
);
/*
* After client making changes to a mapped data store, it needs to
* "Unmap" it to let the server know that the data is ready to be
* consumed by the server
*/
VAStatus vaUnmapBuffer (
VADisplay dpy,
VABufferID buf_id /* in */
);
·
客户端(插件)可以通过 vaMapBuffer 访问解码数据,如果您将数据重新复制到 userspace/video-filter-element,那么对 gstreamer 的影响很小——所有其他元件都能照常工作。但是,您肯定会因为执行内存复制而损害性能(这里执行了复制操作,之后还可能针对视频接收器元件再次执行)。
·
客户端(插件)可以通过 vaMapBuffer 访问解码数据,在此我们不进行复制,但之后的过滤器/接收器元件应该知道这是一个 vaImage 缓冲器,而不是常见的数据缓冲器(是否需要?)。在接收器元件使用该缓冲器之后,我们可以通过 vaUnmapBuffer 将缓冲器重新释放到 library/libva。 但是,我认为从 vaBuffer 到 gfx framebuffer 可能存在捷径。当您尝试走捷径时,也会损害性能。
·
如果下游过滤器元件对 vaImage 没有太大的影响,我们可以修改 x-image-sink,使其使用 vaPutImage 来显示图像。
此假设有没有例外情况? 可以通过 vaPutImage2() 执行缩放。
无论如何,我们将首先尝试第一种方式。
将视频过滤器更改为视频接收器
既然 libva 能够处理图片显示,为什么不让它完成此项工作呢?那样,我们的视频过滤器元件就将更改为视频接收器元件——在视频-解码器-过滤器元件的后面将不需要其他过滤器元件和接收器元件。这违背了 gstreamer 基础结构的常识。我们需要在视频-过滤器-解码器内部进行缩放、颜色转换和本机窗口处理。 这增加了模块的复杂性。
在粗略地浏览 ximagesink.c 之后,我有了一些基本的想法:
可以使用 gst_ximagesink_get_times() 处理计时。
向回调处理程序注册 gst_ximagesink_show_frame:
2156: gstbasesink_class->preroll =
GST_DEBUG_FUNCPTR (gst_ximagesink_show_frame);
2157: gstbasesink_class->render = GST_DEBUG_FUNCPTR
(gst_ximagesink_show_frame);
杂波视频接收器
我们必须考虑杂波在此框架中的角色,它是 moblin 2.0 的目标视频接收器。我假设杂波可以处理 VAImageID 而不是 gst 的数据缓冲器。
这样我们就可以提供杂波视频接收器 VAImageID,并且使 gst 数据缓冲器处于闲置状态。杂波视频接收器将访问
libva 以显示图像 (vaPutImage)。我们让 vaPutImage2 执行缩放。
还有差异吗?不确定。我们应该使杂波视频接收器的源 pad 成为动态 pad 以改进兼容性吗?
本文译自Intel Moblin.org社区
更多内容,请点击“Moblin技术”专区
相关文章推荐
- 如何处理libva加速元件的显示:(vaPutImage)(1)
- 如何处理libva加速元件的显示:(vaPutImage)(2)-将视频过滤器更改为视频接收器
- AD的PCB界面下如何全部显示或隐藏元件数值
- 如何处理xencenter中无法显示vm的performance信息
- 如何通过jd-gui反编译后使用BCCompare比较源码忽略不重要差异时不显示红色
- 花生壳已经激活了,但是在诊断显示“花生壳未激活,设置A记录”如何处理
- 如何在Web Part 中方便的进行错误处理和错误信息的显示?
- Eclipse中与CVS相连的工程中的文件,不显示版本信息时,如何处理(重启Eclipse)!
- 技巧24:如何处理空列表的显示
- 在七牛上传之后如何自己自定义上传完成处理并在页面显示。
- 分页中如何处理第一次加载记录列表默认显示第一页的记录
- 【Android】Glide 如何获取 bitmap 来进行再处理(比如处理长图的显示)
- Altium Designer中如何仅显示顶层的元件和顶层布线
- 如何处理wordpress首页不显示指定分类文章
- TERSUS画画一样开发软件 显示相关处理元件介绍-对象的行为元件
- datagrid中的内容一显示就没有了,不知道如何处理,请教高人啊
- 如何加速Oracle大批量数据处理
- 程桌面进行远程管理服务器遇到远程桌面登陆服务器后显示黑屏,或无法显示桌面,如何处理?
- 如何在施工物料管理Web系统中处理大量数据并显示
- 教你如何处理加速电脑速度(转载)