1. 介绍

Ubuntu 使用手册是针对 Firefly 官方发布的 Ubuntu 系统固件特性所编写,适用于 Ubuntu Desktop 与 Minimal 系统,部分与 UI 显示相关的介绍,只针对 Desktop 系统。

_images/Ubuntu_Desktop1.jpg

Ubuntu Desktop 系统特点如下:

  • 桌面环境采用 LXDE,Lubuntu + Firefly 定制主题,简洁美观。(Ubuntu 20.04 采用 LXQt)

  • Xserver 使用 GPU + RGA 进行 2D 加速,运行流畅,占用 CPU 资源少。

  • 针对嵌入式平台,精简系统服务。

  • 提供基于 Arm Mali GPU 的 OpenGL、OpenCL 支持。

  • 提供基于 Rockchip VPU + Mpp 的视频硬编解码支持。

  • 适配 QT、Docker、Electron 等开发框架。

  • 提供一系列接口,以操作板载资源设备。

  • 系统采用 overlayfs 文件系统,支持导出 rootfs,二次打包,恢复出厂设置等功能。

Ubuntu Minimal 系统特点如下:

  • 没有桌面环境,占用资源少,在简化网络管理之后,只需 40M 内存。

  • 针对嵌入式平台,精简系统服务。

  • 适配 QT、Docker、Electron 等开发框架。

  • 提供一系列接口,以操作板载资源设备。

  • 系统采用 overlayfs 文件系统,支持导出 rootfs,二次打包,恢复出厂设置等功能。

2. 显示版本信息

  • ffgo

通过 Firefly 提供的 ffgo 命令可以方便的查看固件信息,便于开发者调试以及定位问题。

当用户需要向 Firefly 反馈信息时,需要附上 ffgo version 显示的版本信息。

root@firefly:~# ffgo
Usage:
         ffgo :         show this usage
         ffgo update:   update ffgo
         ffgo version:  get version
         ffgo cmdlist:  get support cmd list
         ffgo [cmd]:    run cmd in cmd list

root@firefly:~# ffgo update
update success
root@firefly:~# ffgo version
OS:      Ubuntu 18.04.5 LTS
MODEL:   Firefly RK3566-ROC-PC HDMI(Linux)
FIREFLY: v2.04-1-g618089a
DATE:    20210316-1035
KERNEL:  Linux version 4.19.172 (liaoxt@tchip16) (gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05), GNU ld (Linaro_Binutils-2017.05) 2.27.0.20161019) #107 SMP Mon Apr 19 09:01:32

4. 多屏与旋转

屏幕的旋转、多个屏幕的位置摆放、拓展与复制等,均可在系统的显示设置中修改

设置的名称一般叫做“Monitor Settings”或者“Display”

如果使用了触摸屏,多屏显示或旋转时可能会出现问题,下面介绍解决方法:

  • 画面旋转了但触摸还是原来的方向

需要将触摸也旋转过来,首先使用xinput命令查看输入设备

root@firefly:~# xinput 
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                        id=4    [slave  pointer  (2)]
⎜   ↳ PixArt USB Optical Mouse                          id=7    [slave  pointer  (2)]
⎜   ↳ himax-touchscreen                                 id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                       id=5    [slave  keyboard (3)]
    ↳ adc-keys                                          id=6    [slave  keyboard (3)]
    ↳ rk805 pwrkey                                      id=8    [slave  keyboard (3)]
    ↳ fe6e0030.pwm                                      id=9    [slave  keyboard (3)]
    ↳ himax-touchscreen                                 id=11   [slave  keyboard (3)]

Virtual core pointer中可以看到触摸屏设备是himax-touchscreen,id 为 10

然后修改/etc/X11/xorg.conf.d/05-touchscreen.conf为以下内容:

Section "InputClass"
        Identifier "ff_touchscreen"
        MatchProduct "himax-touchscreen"
        Driver "libinput"
        Option "CalibrationMatrix" "1 0 0 0 1 0 0 0 1"
EndSection

Identifier 是名称,可以随意起一个

MatchProduct 需要设置为刚才找到的触摸屏设备名称

重点是 Option “CalibrationMatrix”

正常情况下是"1 0 0 0 1 0 0 0 1"
向左旋转 90 度则应该设置为"0 -1 1 1 0 0 0 0 1"
向右旋转 90 度则应该设置为"0 1 0 -1 0 1 0 0 1"
上下颠倒(旋转 180 度)则应该设置为"-1 0 1 0 -1 1 0 0 1"

如果有多个触摸屏,在文件中添加多个 InputClass 即可

保存文件后重启生效

  • 触摸一个屏幕但结果却反馈到了另一个屏幕

这是因为触摸输入和屏幕输出没有匹配,首先同样用xinput查看输入设备,假设依然是himax-touchscreen,id 10

再使用xrandr命令查看显示设备:

root@firefly:~# xrandr
Screen 0: minimum 320 x 200, current 2720 x 1280, maximum 8192 x 8192
HDMI-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1920x1080     60.00*+  59.94  
   1920x1080i    60.00    59.94  
   ......
   ......
   800x600       60.32  
   720x480       60.00    60.00    59.94    59.94    59.94  
DSI-1 connected 800x1280+1920+0 (normal left inverted right x axis y axis) 0mm x 0mm
   800x1280      59.98*+

可以看到有两个屏幕,HDMI-1 和 DSI-1,而himax-touchscreen就是 DSI-1,然后进行映射,执行:

xinput map-to-output 10 DSI-1

10 就是himax-touchscreen的 id,将它映射到 DSI-1 上

此时查看触摸是否正常,确认无误后创建一个新文件/etc/X11/Xsession.d/90-touchscreen-map,将映射命令写入这个文件来持久化设置

5. 恢复出厂设置

Firefly Ubuntu 支持恢复出厂设置。

注意,此出厂设置表示恢复为设备最后一次升级固件之后的初始状态。

root@firefly:~# recovery
Usage: update <option>

Options are:
        ota | update [path]:
                update firmware, if no path, use default path
                "/userdata/update.img"
                "/sdcard/update.img"
        factory | reset:
                reset to factory

使用 recovery reset 可以恢复到出厂设置。

6. 开机自启动程序

Firefly Ubuntu18.04 Desktop 可以使用以下方法设置开机自启动程序,不过需要注意操作权限和当前环境变量:

$ vim /home/firefly/.config/lxsession/Lubuntu/autostart
@/bin/mkdir /home/firefly/ssddd

每个命令使用 @ 开头,以上面的例子为例会创建 /home/firefly/ssddd 目录。

Firefly Ubuntu20.04 Desktop 中,在 LXQt 主菜单中依次点击 Preferences > LXQt Setings > Session Settings,在弹出的窗口中点击 Autostart 页面来添加自启动程序

也可以直接在 /etc/xdg/autostart/ 文件夹下直接添加需要自启动程序的 .desktop 文件

7. 使用root登录系统界面

  • autologin-user=root

root@firefly:~# cat /etc/lightdm/lightdm.conf.d/20-autologin.conf
[Seat:*]
user-session=Lubuntu
autologin-user=root

8. 屏幕键盘

官方的 Ubuntu 系统中自带屏幕键盘,可以在菜单栏中点击打开: _images/onboard.jpg

9. 声音配置

设备一般都有 2 个或以上的音频设备。常见的是耳机和 HDMI 这两个设备的音频输出。下面是音频设置的例子,供用户参考。

9.1. 从命令行指定音频设备

系统自带的音频文件在 /usr/share/sound/alsa/ 目录中,播放前请先查看声卡设备:

root@firefly:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: rockchiphdmi [rockchip,hdmi], device 0: fe400000.i2s-i2s-hifi i2s-hifi-0 [fe400000.i2s-i2s-hifi i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: rockchiprk809co [rockchip,rk809-codec], device 0: fe410000.i2s-rk817-hifi rk817-hifi-0 [fe410000.i2s-rk817-hifi rk817-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

然后指定声卡播放音频,其中声卡 card1 的设备 0 对应的是耳机口,card0 的设备 0 对应的是 HDMI。一般播放音频命令是 aplay -Dhw:0,0 Fornt_Center.wav,但系统自带的音频文件是单声道的,所以为了防止播放失败,可以按照下面的命令进行播放:

#选择耳机口输出音频文件
root@firefly:/usr/share/sounds/alsa# aplay -Dplughw:1,0 Front_Center.wav
Playing WAVE 'Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

#选择 HDMI 输出音频文件
root@firefly:/usr/share/sounds/alsa# aplay -Dplughw:0,0 Front_Center.wav
Playing WAVE 'Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

9.2. 在图形界面中选择音频设备

在图形界面中,播放准备好的音频文件,然后点击声音图标,打开 Sound Setting,选择到 Configuration 。可以看到两个声卡设备,例如设置为 HDMI 输出音频,则把 HDMI 的声卡设备选择为 Output,另一个声卡设置为 Off。(如果 HDMI 无声或者声音小,可以试试按 HDMI 屏上的物理按键调高音量)

_images/sound_setting.jpg

10. 串口

设备上的串口分两种,一种是普通串口,另外一种是通过转换芯片把SPI转换而成的串口。转换而成的串口和普通串口功能完全一致但是需要注意它们的设备文件名是不一样的。下面是两者的区别:

# 普通串口
root@firefly:~# ls /dev/ttyS*
ttyS0  ttyS1  ttyS2  ttyS3

# SPI转串口
root@firefly:~# ls /dev/ttysWK*
ttysWK0  ttysWK1  ttysWK2  ttysWK3

10.1. 设置波特率

ttyS4 为例,查看串口波特率命令:

root@firefly:~# stty -F /dev/ttyS4
speed 9600 baud; line = 0;
-brkint -imaxbel

设置波特率命令:

# 设置波特率为 115200
root@firefly:~# stty -F /dev/ttyS4 ospeed 115200 ispeed 115200 cs8

# 查看确认是否已经修改
root@firefly:~# stty -F /dev/ttyS4
speed 115200 baud; line = 0;
-brkint -imaxbel
root@firefly:~#

10.2. 关闭回显

在做环回收发测试的时候回显功能会影响到我们的测试结果,所以在环回测试或者其他特殊情况下需要关闭回显。以下是关闭回显的命令:

# 关闭回显示
root@firefly:~# stty -F /dev/ttyS4 -echo -echoe -echok

# 查看所有功能的配置,检查是否已经关闭。“-” 号代表该功能已经关闭
root@firefly:~# stty -F /dev/ttyS4 -a | grep echo
isig icanon iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

10.3. 发送接收原始数据

在实际应用中实际发送数据和我们希望发送的数据可能存在差别,例如多了回车或者其他特殊字符。利用 stty 可以把发送接收设置成 raw 模式确保发送接收的是原始数据,以下是设置命令:

root@firefly:~# stty -F /dev/ttyS4 raw

10.4. 工作模式

串口有 2 种工作模式分别是中断模式和 DMA 模式。

10.4.1. 中断模式

内核默认把串口配置成中断模式所以不需要做任何修改。中断模式下传输速率比较快但是在传大量数据的时候很容易丢包或者出错,所以当数据量比较大的时候请不要使用中断模式。

10.4.2. DMA 模式

DMA 模式主要是传输大量数据的时候使用。内核会为串口提供一个缓存空间接收数据来尽量降低串口传输的丢包率。

注意: 缓存空间限默认大小为 8K 如果一次传输超过缓存大小就会丢包,所以使用 DMA 模式的话需要发送端需要分包发送。

设备树文件配置

&uart4 {
        status = "okay";
+       dmas = <&dmac_peri 8>, <&dmac_peri 9>;
+       dma-names = "tx", "rx";
};

DMA 模式并不能提高传输速率,相反因为需要缓存,传输速率会有所下降,所以如果不是需要传输大量数据的话不要使用 DMA 模式。

10.5. 流控

不管是中断模式还有 DMA 模式都无法保证数据传输万无一失,因为长时间传输大量数据的时候 DDR、CPU 变频或者占用率过高都可能导致上层处理数据不及时导致丢包,这个时候就需要是用流控了。流控分两种,一种是软件流控另一种为硬件流控,下面只介绍硬件流控的使用。

10.5.1. 硬件支持

硬件流控需要有硬件支持,设备的串口 CTXRTX 脚需要和远端设备相连。

注意: 设备不是所有串口都支持硬件流控,请先从原理图上确认硬件是否支持。

10.5.2. 设备树文件配置

  • RK3568:

uart3: serial@ff1b0000 {
        compatible = "rockchip,rk3568-uart", "snps,dw-apb-uart";
        reg = <0x0 0xff1b0000 0x0 0x100>;
        clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
        clock-names = "baudclk", "apb_pclk";
        interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH 0>;
        reg-shift = <2>;
        reg-io-width = <4>;
        pinctrl-names = "default";
+       pinctrl-0 = <&uart3_xfer &uart3_cts &uart3_rts>;
        status = "disabled";
};
  • RK3399:

uart3: serial@ff1b0000 {
        compatible = "rockchip,rk3399-uart", "snps,dw-apb-uart";
        reg = <0x0 0xff1b0000 0x0 0x100>;
        clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
        clock-names = "baudclk", "apb_pclk";
        interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH 0>;
        reg-shift = <2>;
        reg-io-width = <4>;
        pinctrl-names = "default";
+       pinctrl-0 = <&uart3_xfer &uart3_cts &uart3_rts>;
        status = "disabled";
};
  • RK3288:

uart4: serial@ff1c0000 {
        compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
        reg = <0x0 0xff1c0000 0x0 0x100>;
        interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
        reg-shift = <2>;
        reg-io-width = <4>;
        clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
        clock-names = "baudclk", "apb_pclk";
        pinctrl-names = "default";
-       pinctrl-0 = <&uart4_xfer>;
+       pinctrl-0 = <&uart4_xfer &uart4_cts &uart4_rts>;
        status = "disabled";
};

10.5.3. 应用层设置

上层也需要打开流控的设置,这里介绍 stty 如何打开流控,如果你使用的是其他应用程序请从应用中打开流控。

# 打开流控
root@firefly:~# stty -F /dev/ttyS4 crtscts

# 检测流控是否打开,“-” 号代表该功能已经关闭
root@firefly:~# stty -F /dev/ttyS4 -a | grep crtscts
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal crtscts

11. 视频硬件编解码支持

RK3568/RK3566/RK3399/RK3288 集成的 VPU 具有优秀的视频编解码能力,Mpp 是 Rockchip 为 VPU 提供的一套视频编解码的 api, 并且基于 mpp。Rockchip 提供了一套 gstreamer 的编解码插件。用户可以根据自己的需求,基于 gstreamer 来做视频编解码的应用,或者直接调用 mpp,来实现硬件的编解码加速。

系统提供了一个测试视频文件,位于 /usr/local/test.mp4,测试文件为 1080P, 24Fps, H264 编码, Mp4 格式。

可以通过一下几种方式,验证和开发视频编解码相关应用。

11.1. Gstreamer

  • Ubuntu 16.04 下,gstreamer 已经安装在 /opt/ 目录下。

  • Ubuntu 18.04 和 20.04 下,gstreamer 已经安装到系统中。

/usr/local/bin/h264dec.sh 测试硬件 H264 解码。

/usr/local/bin/h264enc.sh 测试硬件 H264 编码。

用户可以参照这两个脚本,配置自己的 gstreamer 应用。

11.2. Mpv

系统提供的Mpv播放器,可以直接调用 rkmpp 解码插件。

11.3. FFmpeg

FFmpeg 对于 Rockchip 暂时只支持通过 Mpp 实现硬件解码,暂时没有硬件编码的支持。

Firefly Ubuntu 已经安装了 FFmpeg,用户可以直接使用。

  • 确认rkmpp解码器

$ ffmpeg -decoders | grep "rkmpp"

 V..... h264_rkmpp           h264 (rkmpp) (codec h264)
 V..... hevc_rkmpp           hevc (rkmpp) (codec hevc)
 V..... vp8_rkmpp            vp8 (rkmpp) (codec vp8)
 V..... vp9_rkmpp            vp9 (rkmpp) (codec vp9)
  • 测试命令

$ ffmpeg -y -c:v h264_rkmpp -i /usr/local/test.mp4 -an output.yuv

特别注意: FFmpeg h264_rkmpp 解码获得的是 AV_PIX_FMT_DRM_PRIME,也就是 DRM 帧数据,如果是基于 drm 显示,可以直接输出帧,否则,需要用 hwdownload 进行转换。

更多内容可以参考 FFmpeg 官网

11.4. Mpp

  • Ubunut 系统下, mpp 相关dev包都已经安装到系统中。

    更多相关资料,可参考 linux-sdk/docs/Linux/Multimedia 下的相关文档。

12. OpenGL-ES

RK3568/RK3566/RK3399/RK3288 支持 OpenGL ES1.1/2.0/3.0/3.1。

Firefly Ubuntu 已经提供了完整的 OpenGL-ES 支持。

  • 测试命令

$ sudo test_glmark2_normal.sh
  • webGL 支持

在 Chromium 浏览器中, 在地址栏输入:chrome://gpu 可以查看 chromium 下硬件加速的支持。

注意:

  1. EGL 是用arm 平台上 OpenGL 针对 x window system 的扩展,功能等效于 x86-64 下的 glx 库。

  2. 由于 Xorg 使用的 Driver modesettings 默认会加载 libglx.so (禁用 glx 会导致某些通过检测 glx 环境的应用启动失败),libglx.so 会搜索系统中的 dri 实现库。但是 RK3568/RK3566/RK3399/RK3288 Xorg 2D 加速是直接基于 DRM 实现, 并未实现 dri 库,所以启动过程中,libglx.so 会报告如下的错误。

    (EE) AIGLX error: dlopen of /usr/lib/aarch64-linux-gnu/dri/rockchip_dri.so failed
    

    这个对系统运行没有任何影响,不需要处理。

  3. 基于同样的道理,某些应用启动过程中,也会报告如下错误,不用处理,对应用的运行不会造成影响。

    libGL error: unable to load driver: rockchip_dri.so
    libGL error: driver pointer missing
    libGL error: failed to load driver: rockchip
    
  4. Firefly 之前发布的某些版本的 Ubuntu 软件,默认关闭了加载 libglx.so,在某些情况下,运行某些应用程序会出现下述错误:

    GdkGLExt-WARNING **: Window system doesn't support OpenGL.

    修正的方法如下:

    删除 /etc/X11/xorg.conf.d/20-modesetting.conf 中一下三行配置。

    Section "Module"
         Disable     "glx"
    EndSection
    

13. OpenCL

Firefly Ubuntu 已经添加了 opencl1.2 支持,可以运行系统内置的 clinfo 获取平台 opencl 相关参数。

firefly@firefly:~$ clinfo
Platform #0
 Name:                                  ARM Platform
 Version:                               OpenCL 1.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3

 Device #0
   Name:                                Mali-T860
   Type:                                GPU
   Version:                             OpenCL 1.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3
   Global memory size:                  1 GB 935 MB 460 kB
   Local memory size:                   32 kB
   Max work group size:                 256
   Max work item sizes:                 (256, 256, 256)
…

14. FFMedia

14.1. 介绍

ffmedia是一套基于Rockchip Mpp/RGA开发的视频编解码框架,并支持音频aac编解码。 ffmedia一共包含以下单元

  • 输入源单元 VI:

    • Camera: 支持UVC, Mipi CSI

    • RTSP Client: 支持tcp、udp和多播协议

    • RTMP Client: 支持拉流和推流

    • File Reader:支持mkv、mp4、flv、ts、ps文件及裸流等文件读入

    • Memory Reader:支持内存数据读入

    • Alsa Capture: 音频采集

  • 处理单元 VP:

    • MppDec: 视频解码,支持H264,H265,MJpeg

    • MppEnc: 视频编码,支持H264,H265,MJpeg

    • RGA:图像合成,缩放,裁剪,格式转换

    • AacDec: aac音频解码

    • AacEnc: aac音频编码

    • Inference: rknn模型推理

  • 输出单元 VO:

    • DRM Display: 基于libdrm的显示模块

    • Renderer Video: 使用gles渲染视频,基于libx11窗口显示

    • RTSP Server: 支持tcp和udp推流

    • RTMP Server: 支持推流

    • File Writer: 支持mkv、mp4、flv、ts、ps文件封装及裸流等文件保存

    • Alsa PlayBack: 音频播放

    • GB28181 Client: 支持视频点播

源码仓库:https://gitlab.com/firefly-linux/ffmedia_release

14.2. 编译测试

# 获取适用于arm64环境ffmedia仓库
git clone https://gitlab.com/firefly-linux/ffmedia_release
# 获取适用于armhf环境ffmedia仓库
git clone https://gitlab.com/firefly-linux/ffmedia_release -b armhf

# 参考仓库下的demo/Readme.md 安装所需环境

# 编译
cd ffmedia_release
mkdir build
cd build
cmake ../
make

# 运行 demo
## 直接运行 demo 可以查看帮助信息

$: ./demo
Firefly FFMedia: v2.3.2
INFO: ff_media: usage: Usage: ./demo <Input source> [Options]

Options:
-i, --input                  Input image size
-o, --output                 Output image size, default same as input
-a, --inputfmt               Input image format, default MJPEG
-b, --outputfmt              Output image format, default NV12
-c, --count                  Instance count, default 1
-d, --drmdisplay             Drm display, set display plane, set 0 to auto find plane, default disabled
    --connector              Set drm display connector, default 0 to auto find connector
-x, --x11                    X11 window displays, render the video using opengl. default disabled
-z, --zpos                   Drm display plane zpos, default auto select
-e, --encodetype             Encode encode, set encode type, default disabled
-f, --file                   Enable save source output data to file, set filename, default disabled
-p, --port                   Enable push stream, default rtsp stream, set push port, depend on encode enabled, default disabled
    --push_type              Set push stream type, default rtsp. e.g. --push_type rtmp
    --rtmp_url               Set the rtmp client push address. e.g. --rtmp_url rtmp://xxx
--rtsp_transport             Set the rtsp transport type, default udp.
                               e.g. --rtsp_transport tcp | --rtsp_transport multicast
-m, --enmux                  Enable save encode data to file. Enable package as mp4, mkv, flv, ts, ps or raw stream files, muxer type depends on the filename suffix.
                               default disabled. e.g. -m out.mp4 | -m out.mkv | -m out.yuv
-s, --sync                   Enable synchronization module, default disabled. Enable the default audio.
                               e.g. -s | --sync=video | --sync=abs
--audio                      Enable audio, default disabled.
--aplay                      Enable play audio, default disabled. e.g. --aplay plughw:3,0
--arecord                    Enable record audio, default disabled. e.g. --arecord plughw:3,0
-l, --loop                   Loop reads the media file.
--gb28181_user_id            Enable gb28181 client, default disabled. set user id
--gb28181_server_id          Set the server id of gb28181 client
--gb28181_server_ip          Set the server ip of gb28181 client
--gb28181_server_port        Set the server port of gb28181 client
-r, --rotate                 Image rotation degree, default 0
                               0:   none
                               1:   vertical mirror
                               2:   horizontal mirror
                               90:  90 degree
                               180: 180 degree
                               270: 270 degree

## 示范:输入是分辨率为 1080p 的 rtsp 摄像头,把解码图像缩放为 720p 并且旋转 90 度,输出到显示器上。
./demo rtsp://admin:firefly123@168.168.2.143 -o 1280x720 -d 0 -r 90

# 更多使用示例参考仓库下的demo/Readme.md

15. RGA

Firefly Ubuntu 已经添加了 RGA 支持 , 本文针对用户态接口librga进行说明。

15.1. 获取版本信息

root@firefly:/usr/lib/aarch64-linux-gnu# strings librga.so |grep rga_api |grep version

15.2. 使用流程说明

申请内存空间->输入图片数据->获取buffer_handle->包装buffer_handle->操作图片数据->输出图片数据

15.3. 申请内存空间的三种方法

  • molloc

    • 函数原型:void *malloc(size_t size)

    • 优点:简单,方便,兼容性好

    • 缺点:速度慢

  • dma_buf_alloc

    • 函数原型: int dma_buf_alloc(const char *path, size_t size, int *fd, void **va)

    • 优点:内存共享,共享节点在/dev/dma_heap/* 速度快

    • 缺点:只能申请4G以下的内存

  • drm_buf_alloc

    • 函数原型:void *drm_buf_alloc(int TexWidth, int TexHeight, int bpp, int *fd, int *handle, size_t *actual_size, int flags=0)

    • 优点:内存共享,速度快

    • 缺点:需要额外安装libdrm库

15.4. 操作图片数据的接口

    //图像拷贝(copy)
    imcopy(rga_buffer_t src,rga_buffer_t dst);
    //图像缩放(resize)
    imresize(rga_buffer_t src,rga_buffer_t dst);
    //图像剪切(corp)
    imcrop(rga_buffer_t src,rga_buffer_t dst,im_rect im_src_rect);
    //图像旋转(rotate 90/180/270)
    imrotate(rga_buffer_t src,rga_buffer_t dst,RgaRotate rotation);
    //图像翻转(flip=H/V)
    imflip(rga_buffer_t src,rga_buffer_t dst,IM_USAGE FLIP);
    //图像平移(translate)
    imtranslate(rga_buffer_t src,rga_buffer_t dst,int x,int y);
    //图像融合(blend)
    imblend(rga_buffer_t src,rga_buffer_t dst);
    //图像不同的色彩空间进行转换(cvtcolor)
    imcvtcolor(rga_buffer_t src,rga_buffer_t dst,int src_format,int dst_format);
    //图像填充(fill=blue/green/red)
    imfill(rga_buffer_t dst,im_rect im_dst_rect, 1);