Video On Rockchip Linux Platform

Rockchip在Linux上的Video框架采用的是Gstreamer, 关于这些基础信息,建议点击以下连接。

  • http://opensource.rock-chips.com/wiki_Mpp  
  • https://github.com/rockchip-linux/mpp  
  • https://github.com/rockchip-linux/gstreamer-rockchip

Mpp是我们用的最底层的解码库, 他负责接受packet, 解析nal,slice这些。
Gstreamer是提供给应用程序使用的接口,使用起来你只需要配置好gstreamer的pipeline,就什么不用关心了,不过要再上面加功能也比较麻烦,你不能从你的应用程序外面对图像做具体的操作,只能发送控制信息,如果要对图片做操作,比如旋转,截取之类的,都需要在pipeline上做。
FFmpeg在Rockchip Linux上也有社区的实现,也是基于mpp, “FFmpeg”。 虽然这个也是挺好用的,但是如果你要选择这个的话,需要你对这个整套的机制比较熟悉,因为ffmpeg不像gstreamer会做很多的事情,你需要自己去control。 不要期待说xxx支持ffmpeg,我替换一个rk的ffmpeg,整个流程就通了。 事实上,buffer管理拷贝,显示这些全部是需要折腾的。
BTW,这个FFMepg的社区实现是LibreELEC的人搞的,他们为了给Kodi使用,如果你们的工程是基于kodi做的,可以base他们的来用。

test

rk-rootfs-build有测试用的脚本和命令 (不要问export DISPLAY=:0.0 是干嘛用的。。。。)

不用urbin或者playbin的话,也可以用这样的手动指定的方式

gst-launch-1.0  filesrc location=/1.mkv ! matroskademux  ! queue !  h264parse ! mppvideodec ! kmssink

显示fps

fpsdisplaysink video-sink=kmssink signal-fps-measurements=true text-overlay=false --gst-debug=fpsdisplaysink:6

display

Display是要注意的问题。 一般显示有几种:

  • CPU拷贝显示
  • GPU拷贝显示
  • DRM零拷贝显示

从性能上说,越后面越好,第一种大概720p就不行了,第二种最多1080p 50fps,第三种基本就是硬件极限的性能。
那对应我们gstreamer上,哪个是哪个呢

| cpu | ximagesink, xvimagesink, glimagesink(x11), qtsink(x11) | 
| gpu | waylandsink, glimagesink , qtsink | 
| drm | kmssink, rkximagesink, waylandsink| 

一些注意事项:

  • glmagesink(x11), qtsink(x11), x11下任何的gpu拷贝其实是cpu拷贝 ,另外wayland上的qtvideowidget也是cpu拷贝,要qml才不是
  • kmssink,不兼容x11,wayland,也就是只能全关掉的情况下用
  • rkxiamgesink, 其实就是kmssink的x11兼容版,但是还是有问题,就是一直overlay,on top, 你没办法在上面画界面
  • waylandsink是好东西,默认情况下走drm,如果有东西在上面,就自动切到gpu,但是缺点还在开发中,可能有比较多藏着的问题

一般来说,如果你们的应用不需要4k,那就用qtsink,不带x11和wayland(qt有自己的逻辑),就是纯gpu拷贝,兼容性和性能都很好。
如果要4k,另外视频不被遮挡,那就用rkximagesink。
如果又要4k,又要遮挡,那就用waylandsink,不过需要提前和rk确认下情况。  

qt

用gstreamer开发最方便的当时是qt了,用起来很方便,默认的qtsink也很好用。 如果你要在qt里面更改sink,那么修改QT_GSTREAMER_WIDGET_VIDEOSINK和QT_GSTREAMER_WINDOW_VIDEOSINK就好了

export QT_GSTREAMER_WIDGET_VIDEOSINK=waylandsink
export QT_GSTREAMER_WINDOW_VIDEOSINK=waylandsink

QT_GSTREAMER_WIDGET_VIDEOSINK是给videowidget类用的,QT_GSTREAMER_WINDOW_VIDEOSINK是给qml的video用的。 (注:这里有误,实际上qt videowidget不支持wayland窗口系统,这里换waylandsink会出错的,只能是x11下换rkximagesink,我简单的改了下逻辑想让waylandsink和videowidget配合,但是看起来问题很多。在QTBUG上也没看到有人提,还得等有空的时候自己改改看) 要注意如果是qmlvideo要换sink的话。。显示的偏移可能会出问题,具体会根据代码不同而不同。

Written on May 4, 2017