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| 

用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

要注意如果是qmlvideo要换sink的话。。显示的偏移可能会出问题,具体会根据代码不同而不同。 如果要换sink,就用videowidget,不换,就用qmlideo。 因为videowidget不换

(注:实际上qtmultimedia不支持wayland窗口系统,这里换waylandsink会出错的,只能是x11下换rkximagesink,我简单的改了下逻辑想让waylandsink和videowidget配合,但是看起来问题很多。在QTBUG上也没看到有人提,还得等有空的时候自己改改看)

Written on May 4, 2017