3.3 RK3399项目开发实录-板载Ubuntu系统的使用(wulianjishu666)

嵌入式物联网常用90款传感器开发例程。链接:https://pan.baidu.com/s/1oisHMZXDzKqa4EspY83V-A?pwd=o5f4

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

3. 更换设备开机和桌面 LOGO

  • 开机 LOGO

开机 LOGO 是存放在 SDK/kernel 里面的,修改完之后重新编译 kernel。

linux-sdk/kernel/logo.bmp
linux-sdk/kernel/logo_kernel.bmp

注意:logo.bmp 与 logo_kernel.bmp 应为一样的图片。

  • 桌面 LOGO

以下为 Ubuntu 18.04 LXDE 桌面,在更换 LOGO 后重启系统:

/usr/share/lubuntu/
├── images
│   └── lubuntu-ff-logo.png             # 桌面左上角的小图标
└── wallpapers
    └── firefly-default-wallpaper.png   # 桌面壁纸

Ubuntu 20.04 桌面系统直接在桌面设置更换即可。

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. 硬件支持

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

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

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 下的 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文件读入及裸流等文件读入

    • Memory Reader: 支持从内存读取数据

  • 处理单元 VP:

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

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

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

    • AacDec: aac音频解码和播放

    • AacEnc: aac音频编码

  • 输出单元 VO:

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

    • Renderer Video: 使用gles渲染视频,基于libx11窗口显示,可扩展其他窗口显示

    • RTSP Server:

    • RTMP Server: 支持推流

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

  • pybind11

    • ff_pymedia: 创建vi、vo、vp等的c++代码的Python绑定,以提供python调用vi、vo、vp等c++模块的python接口

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

14.2. 编译测试

# 获取源码
git clone https://gitlab.com/firefly-linux/ffmedia_release

# 安装所需环境
apt install gcc g++ make cmake
apt install -y libasound2-dev libopencv-dev libdrm-dev libfdk-aac-dev

# 如果需要编译python接口库,并系统默认python是3.8,则安装3.8的软件包
apt install -y python3.8-dev python3.8-venv

# 编译
cd ff_media
mkdir build; cd build
cmake ../
make

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

Firefly FFMedia: v2.1.2
./demo: invalid option -- 'h'
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
-x, --x11display             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
--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, or raw stream files depending on the file name suffix
                               default disabled. e.g. -m out.mp4 | -m out.mkv | -m out.yuv
-M, --filemaxframe           Set the maximum number of frames that can be saved. The default number is unlimited
-s, --sync                   Enable synchronization module, default disabled. Enable the default audio.
                               e.g. -s | --sync=video | --sync=abs
-A, --aplay                  Enable play audio, default disabled. e.g. --aplay plughw:3,0
-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

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/478671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

适用于智能语音小家电的语音ic类型有哪些?

适用于智能语音小家电的语音ic类型有哪些&#xff1f; 1. 语音播放芯片&#xff1a;这种芯片主要用于实现语音提示和报警功能。例如&#xff0c;当按下某个按钮时&#xff0c;它可以发出语音提醒&#xff0c;或者在出现故障时发出报警声音。这种芯片的应用非常广泛&#xff0…

Halcon 条码读取

一维码读取 create_bar_code_model 创建条码读取器的模板 set_bar_code_param 配置解码方式 find_bar_code 读取条码 clear_bar_code_model 清除条码匹配模板 * 1.创建条码读取器的模板 * 参数一&#xff1a;通用参数的名称&#xff0c;针对条形码模型进行调整。默认值为空 * 参…

Java实用经验总结

前言&#xff1a;以下为笔者在工作中总结的好用且简洁代码的经验 文章目录 1、多判断代替if2、通配符替换内容&#xff08;常见于邮件、短信等模版&#xff09;3、spring获取bean对象4、动态获取nacos配置5、优雅校验请求入参 1、多判断代替if 针对多个是和否的问题&#xff0…

如何安装和卸载SFP光模块

SFP光模块的安装和拆卸是简单直接的过程。然而&#xff0c;任何非标准操作都可能导致隐式损坏甚至永久故障。您需要参考及时更新的光模块的数据表或用户手册&#xff0c;以熟悉其特性和锁定机制。 准备工作 常见事项 拆卸和插入SFP光模块可能会缩短其使用寿命&#xff0c;因…

搜索二维矩阵

题目链接 搜索二维矩阵 题目描述 注意点 每行中的整数从左到右按非严格递增顺序排列每行的第一个整数大于前一行的最后一个整数1 < matrix.length, matrix[0].length < 100 解答思路 先二分查找找到target所处的行&#xff0c;找到行后再二分查找找到target所处的列…

Java毕业设计-基于springboot开发的数码论坛系统设计与实现-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户后台管理模块 四、毕设内容和源代码获取总结 **Java毕业设计-基于springboot开发的数码论…

计算平均分 javascript

养成好习惯&#xff1a;先写注释再写代码 基础版&#xff1a;直接写逻辑&#xff08;平均分总和/个数&#xff09; // 求平均分 var scores [60, 55, 80, 33, 75, 100]; // 求和,相除 var sum 0; var avg;for (var i 0; i < 6; i) {sum scores[i]; }avg sum / 6; con…

Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1.)

检查下根目录下的 build.gradle 配置 , 是否只配置了 jcenter 仓库 &#xff0c;加上 google()mavenCentral() 重新编译试一下

Mybatis 的知识学习

准备&#xff1a; maven&#xff1a;https://mvnrepository.com/ mybatis: MyBatis中文网 1.mybatis的定义 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBati…

CTF入门学习籽料(非常详细)零基础入门到精通,收藏这一篇就够了!(文末自取)

前言&#xff1a; 从2019年10月开始接触CTF&#xff0c;学习了sql注入、文件包含等web知识点&#xff0c;但都是只知道知识点却实用不上&#xff0c;后来在刷CTF题才发现知识点的使用方法&#xff0c;知道在哪里使用&#xff0c;哪里容易出漏洞&#xff0c;可是在挖src漏洞中还…

TRM推出1年后,都给客户带来了哪些改变?

就在一年前&#xff0c;用友大易推出了ATSTRM全新人才配置平台&#xff0c;成为国内首家将TRM&#xff08;人才关系管理&#xff09;理念融入ATS&#xff08;招聘管理系统&#xff09;的企业服务厂商。 谈及TRM这一理念的出炉&#xff0c;用友网络副总裁、用友大易联合创始人石…

【云呐】办公资产盘点报告总结怎么写

办公资产盘点报告总结应该清晰、简洁地总结盘点过程、结果和相关问题。以下是一种写作办公资产盘点报告总结的常见结构和要点&#xff1a;  盘点目的&#xff1a;简要说明盘点的目的和背景&#xff0c;例如为了确保资产的准确性、管理资产风险或制定更好的资产管理策略等。 …

面向对象的三大特性-----封装、继承、多态(Java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

TCP协议——三次握手和四次挥手

文章目录 1. 示意图2. 三次握手3. 四次挥手4. 三次和四次问题4.1 为什么三次握手4.2 为什么四次挥手 5. 状态变化实验5.1 三次握手实验5.2 四次挥手实验 1. 示意图 Tips&#xff1a; 不管是握手还是挥手&#xff0c;发送的都是完整的TCP报头&#xff0c;这不过这些标记位被设置…

各类主流电商API商品采集接口的权限控制和功能权限控制

主流电商平台的API接口类型 参数说明 通用参数说明 url说明 /平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京东等&#xff0c; API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,测试key:test_api_keysecret:调用secret,测试secret:(不用填写…

正信晟锦:多年不联系的好友借钱怎么办

多年不见的老友突然出现&#xff0c;带着迫切的求助信息——借钱。面对这样的请求&#xff0c;我们该如何应对? 当一个多年未联络的朋友突然出现请求借款时&#xff0c;这确实是一个棘手的问题。一方面&#xff0c;我们可能对旧日友情存有怀念与不舍;另一方面&#xff0c;时间…

[项目前置]如何用webbench进行压力测试

测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具&#xff0c;它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容&#xff1a; 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是&#xff0c;创建指定数…

Apache DolphinScheduler 社区开启讲师招募,赶快加入吧!

随着Apache DolphinScheduler在全球范围内的快速发展&#xff0c;我们的用户群体和社区活动也在不断扩大。 为了进一步丰富我们的社区内容&#xff0c;分享更多有价值的知识和经验&#xff0c;我们诚挚地邀请您加入我们&#xff0c;成为Apache DolphinScheduler社区的分享嘉宾。…

美团2023年财报:全年营收2767亿元,即时配送订单219亿笔

3月22日&#xff0c;美团(股票代码:3690.HK)发布2023年第四季度及全年业绩。公司各项业务继续取得稳健增长&#xff0c;全年营收2767亿元(人民币&#xff0c;下同)&#xff0c;同比增长26%&#xff0c;经营利润134亿元。 本年度&#xff0c;美团继续围绕“零售科技”战略&…

springboot网站开发解决图片存储问题,前端无法访问解决办法

最近使用springboot开发网站的时候&#xff0c;遇到了一个图片存储问题&#xff0c;我之前的方法是&#xff0c;把证书图片存在项目的static目录下面&#xff0c;这样的话&#xff0c;打包发布到远程服务器后&#xff0c;虽然可以正常展示已经打包封装好的内容&#xff0c;但是…