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

本文主要是介绍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 usageffgo update:   update ffgoffgo version:  get versionffgo cmdlist:  get support cmd listffgo [cmd]:    run cmd in cmd listroot@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 0mm1920x1080     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 0mm800x1280      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/1Subdevice #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/1Subdevice #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 #0Name:                                  ARM PlatformVersion:                               OpenCL 1.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3Device #0Name:                                Mali-T860Type:                                GPUVersion:                             OpenCL 1.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3Global memory size:                  1 GB 935 MB 460 kBLocal memory size:                   32 kBMax work group size:                 256Max 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 suffixdefault 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 00:   none1:   vertical mirror2:   horizontal mirror90:  90 degree180: 180 degree270: 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);

这篇关于3.3 RK3399项目开发实录-板载Ubuntu系统的使用(wulianjishu666)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/825192

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p