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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源文本挖掘引擎:情感分析|API接口|可私有化部署

中文的表达方式五花八门&#xff0c;比如成语、俗语、还有那些让人哭笑不得的双关语&#xff0c;这些都让情感分析变得复杂。再者&#xff0c;中文里头的情感表达很多时候得看上下文&#xff0c;一句话放在不同的情景里&#xff0c;意思可能就大相径庭了。 中文里面的否定和讽…

openGauss学习笔记-245 openGauss性能调优-SQL调优-典型SQL调优点-算子级调优

文章目录 openGauss学习笔记-245 openGauss性能调优-SQL调优-典型SQL调优点-算子级调优245.1 算子级调优245.1.1 算子级调优介绍245.1.2 算子级调优示例 openGauss学习笔记-245 openGauss性能调优-SQL调优-典型SQL调优点-算子级调优 SQL调优是一个不断分析与尝试的过程&#x…

Vector Magic:矢量图像转换神器,轻松驾驭Mac与Win双平台

在数字化时代&#xff0c;图像已经成为我们生活和工作中不可或缺的一部分。无论是设计师、艺术家&#xff0c;还是普通用户&#xff0c;都对图像质量有着极高的要求。而矢量图像&#xff0c;以其清晰度高、可无限放大的特点&#xff0c;逐渐受到广大用户的青睐。今天&#xff0…

长安链正式发布三周年,技术更迭支撑产业变革

导语&#xff1a; 2024年1月27日长安链正式发布三周年&#xff0c;开源社区借开年之际与大家一同回顾长安链三年来的技术发展历程&#xff0c;每一个里程碑的建设都得益于与长安链同行的合作伙伴与开发者&#xff0c;希望在2024年可以共同携手继往开来&#xff0c;为数字经济发…

2024腾龙杯web签到题-初识jwt(签到:这是一个登录页面)

什么是 jwt? 它是 JSON Web Token 的缩写&#xff0c;是一个开放标准&#xff0c;定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息&#xff0c;该信息可以被验证和信任&#xff0c;因为它是数字签名的。它就是一种认证机制&#xff0c;…

Kotlin: 协程的四种启动模式(CoroutineStart)

点击查看CoroutineStart英文文档 创建协程的三种方式 runBlocking 运行一个协程并且会阻塞当前线程&#xff0c;直到它完成。launch 启动一个新的协程&#xff0c;不会阻塞当前线程&#xff0c;并且返回一个Job&#xff0c;可以取消。async async和await是两个函数&#xff0c…

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序&#xff1f; 1、找到并打开要添加的小程序&#xff1b; 2、打开小程序后&#xff0c;点击右上角的「…」 3、点击后底部弹窗更多选项&#xff0c;请找到并点击「添加到我的小程序」&#xff1b; 4、添加成功后&#xff0c;就可以在首页下拉我的…

Elasticsearch:使用 OpenAI、LangChain 和 Streamlit 的基于 LLM 的 PDF 摘要器和 Q/A 应用程序

嘿&#xff01; 您是否曾经感觉自己被淹没在信息的海洋中&#xff1f; 有这么多的书要读&#xff0c;而时间却这么少&#xff0c;很容易就会超负荷&#xff0c;对吧&#xff1f; 但猜猜怎么了&#xff1f; 你可以使用大型语言模型创建自定义聊天机器人&#xff0c;该模型可以帮…

CTF题型 Http请求走私总结Burp靶场例题

CTF题型 Http请求走私总结&靶场例题 文章目录 CTF题型 Http请求走私总结&靶场例题HTTP请求走私HTTP请求走私漏洞原理分析为什么用前端服务器漏洞原理界定标准界定长度 重要!!!实验环境前提POST数据包结构必要结构快速判断Http请求走私类型时间延迟CL-TETE-CL 练习例题C…

深入解析分布式ID生成机制

一、概述 背景&#xff1a;随着数据库数据量的增长, 基于性能原因需要进行分库分表&#xff0c;分库分表会导致主键ID重复问题。 特点&#xff1a; 全局唯一性[必须];趋势递增[非必须]。由于互联网大部分采用Mysql的Innodb引擎,因此保持有序主键ID有利于insert的效率;单调递增…

KKVIEW远程: TODESK退出了还能远程吗

Todesk退出了还能远程吗 当我们谈论Todesk或其他远程桌面软件时&#xff0c;一个经常被提及的问题是&#xff1a;当我退出Todesk后&#xff0c;是否仍然可以远程访问我的计算机&#xff1f;为了回答这个问题&#xff0c;我们首先需要了解Todesk的工作原理和远程访问的基本条件…

【视觉语言大模型+LLaVA1.0】大语言模型视觉助手(视觉指令调优)GPT4-Vision丐版

官方资源汇总&#xff1a; 项目主页 || https://huggingface.co/liuhaotian 23.04.LLaVA1.论文: Large Language and Vision Assistant&#xff08;Visual Instruction Tuning) 23.10 LLaVA-1.5论文: Improved Baselines with Visual Instruction Tuning 23.11 LLaVA-Plus项目&…

李畑受邀出席第20届“韩国品牌大奖”颁奖典礼

2024年3月14日&#xff0c;第20届“韩国品牌大奖”颁奖典礼在韩国国家新闻中心举行。李畑女士受邀出席&#xff0c;和与会嘉宾一同见证这一年度盛事。 “韩国品牌大奖”是由政府主管的品牌奖项&#xff0c;旨在奖励在品牌经营方面作出突出贡献的企业和机构。该奖项依据公信力&a…

1.python安装

1.检查是否已经安装python 打开cmd 输入 python --version查看是否有返回版本,没有返回则环境变量未设置好,或者未安装 2.下载安转python https://www.python.org/downloads/windows/ 勾选配置环境变量路径 安装成功

外贸网站常用的wordpress模板

零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jianzhanpress.com/?p4912 WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建w…

Java使用itextpdf往pdf中插入图片

引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version> </dependency>java代码 import cn.hutool.extra.qrcode.QrCodeUtil; import com.itextpdf.text.*; i…

UE5中各类型的英文名称缩写(直接用于文件前缀)

真正开发项目时用到的素材文件是相当巨量的&#xff0c;在资产中查找时由于不区分文件夹&#xff0c;因此查找是比较头疼的&#xff0c;所以很多同类型的文件名命名时要加入缩写。 本文提供初学者内容包中的缩写&#xff0c;并会在此后陆续加入自定义的缩写&#xff08;本部分…

抖音视频批量提取软件|无水印视频下载

抖音视频批量提取软件&#xff0c;让您高效下载精彩内容&#xff01; 您是否经常需要下载抖音视频&#xff0c;但传统的下载方式繁琐且低效&#xff1f;别担心&#xff0c;我们为您提供了一款强大而智能的抖音视频批量提取软件&#xff0c;让您轻松实现下载无水印的精彩内容&am…

【好书推荐2】AI提示工程实战:从零开始利用提示工程学习应用大语言模型

【好书推荐2】AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型 写在最前面AI辅助研发方向一&#xff1a;AI辅助研发的技术进展方向二&#xff1a;行业应用案例方向三&#xff1a;面临的挑战与机遇方向四&#xff1a;未来趋势预测方向五&#xff1a;与法规的…

深入理解模板进阶:掌握C++模板的高级技巧

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…