一、概述
为了达到快速启动的要求,EarlyAPP 被放到 FreeRTOS ,在 X9H Safety R5 上运行。X9H 拥有独立启动,独立供电,独立外设的 Safety R5,X9H 还有独特的 DC/DP 显示分离的架构,辅以核间通信,使得 EarlyAPP 的实现非常简单直接。
本文主要介绍开机动画(Boot Animation)的拼接显示,因为只有 bootanimation 是贯穿所有的屏幕,同时可以适应不同分辨率的屏幕,所以可能会与其他 EarlyAPP 造成冲突,SDK 中主要利用多线程的机制来解决这个冲突。 SemiDrive X9H SDK 里面的 MJPEG 视频分辨率为 5760*720,名为 splash_5760×700_high_quality_3s.mjpeg,同时在三个 1920*720 屏幕显示,视频本身的制作形成从左至右贯穿动画的效果,但本文主要使用两个 1280*800 分辨率的屏幕,所以制作一个名为 learning_2560_800.mjpeg 的视频。
EarlyAPP 工作在不同的屏幕的 DC 图层。以下是在 SDK 中缺省的配置。
二、使用环境
硬件:SemiDrive SD003_X9H REF_A03 DEMO Board
软件:X9 PTG3.9
三、安装 FFmjpeg 工具
由于开机动画支持的是 MJPEG 格式的视频,所以我们需要安装可以 FFmjpeg 这个工具,方便我们替换官方提供的视频,从而可以实现定制化开机动画动画的效果。
1、下载软件包
命令:wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz
2、解压软件包
命令:
xz -d ffmpeg-git-amd64-static.tar.xz
tar -xvf ffmpeg-git-amd64-static.tar
cd ffmpeg-git-20220302-amd64-static/
3、命令使用
这里只是介绍最简单的视频mp4 格式和 mjpeg 格式 的转换,关于对视频处理更加多样化的命令使用请自行查询。
Mp4 转 MJPEG
命令:./ffmjpeg -i xxx.mp4 xxx.mjpeg
Mjpeg 转 MP4
命令:./ffmjpeg -i xxx.mjpeg xxx.mp4
四、代码配置
1、更换/增加视频源
由于官方 SDK 提供在视频分辨率为 5760*720 的视频,但这次我们仅用到两个屏幕,为了更加直观,所以我们需要更换视频,视频名称为 learning_2560_800.mjpeg,使其视频内容全部呈现在两个屏幕。
路径:/buildsystem/rtos/freertos_safetyos/res/early_app/BootAnimation
2、软件同步替换视频
路径: rtos/freertos_safetyos/application/early_app/BootAnimation/inc/animation_config.h
#define ANIMATION_FPS 25 #define BA_NUMBER 1
//static const char *BA_PATH[BA_NUMBER] = {"early_app/BootAnimation/splash_5760x720_high_quality_3s.mjpeg"}; //static const char *BA_PATH[BA_NUMBER] = {"early_app/BootAnimation/test_2560_800.mjpeg"}; //static const char *BA_PATH[BA_NUMBER] = {"early_app/BootAnimation/2560_mul2_watermark.mjpeg"}; static const char *BA_PATH[BA_NUMBER] = {"early_app/BootAnimation/learning_2560_800.mjpeg"}; #define FA_PATH "early_app/BootAnimation/fast_audio_pcm.bin" #define TU_PATH "early_app/BootAnimation/turn_pcm.bin" #define WA_PATH "early_app/BootAnimation/warning_pcm.bin" #endif |
3、代码拼接显示修改
路径:rtos/freertos_safetyos/application/early_app/BootAnimation/inc/ba_config.h
_frame_element 的结构体定义如下,res_id 是源 id ,dst_id 是目标 id,也就是要显示的屏幕 id ,prect_t 位置,x/y 代表屏幕左上角坐标,w/h 分别是长和宽;当 src 的某个屏与 dst 的某个屏分辨率一致时,直接播放;如果分辨率不一致,会进行缩放操作后再播放;设置的 M 个屏的动画会依次贯穿到 N 个屏上,其贯穿方式类似默认播放。
typedef struct { int x; int y; int w; int h; } prect_t;
typedef struct _frame_element { uint32_t res_id; prect_t src_rect; uint32_t dst_id; prect_t dst_rect; uint32_t bScale; } frame_element_t;
#define MAX_SRCDST_PAIR 6
#if defined (TARGET_X9H_ICL02) static frame_element_t frame_element[] = { {0, {0, 0, 1920, 720}, 0, {0, 0, 1920, 720}}, {0, {1920, 0, 1920, 720}, 1, {344, 0, 1920, 720}}, {0, {3840, 0, 1920, 720}, 2, {0, 0, 1920, 720}}, {0, {0, 0, 0, 0}, 3, {0, 0, 1920, 720}}, }; #elif defined(TARGET_X9U_B) static frame_element_t frame_element[] = { {0, {0, 0, 1920, 720}, 0, {0, 0, 1920, 720}}, {0, {1920, 0, 1920, 720}, 1, {0, 0, 1920, 720}}, {0, {3840, 0, 1920, 720}, 2, {0, 0, 1920, 720}}, }; #else /* static frame_element_t frame_element[] = { {0, {0, 0, 1920, 720}, 0, {0, 0, 1920, 720}}, {0, {1920, 0, 1920, 720}, 1, {0, 0, 1920, 720}}, {0, {3840, 0, 1920, 720}, 2, {0, 0, 1920, 720}}, {0, {0, 0, 0, 0}, 3, {0, 0, 1920, 720}}, }; */ static frame_element_t frame_element[] = { {0, {0, 0, 1280, 800}, 0, {0, 0, 1280, 800}}, {0, {1280, 0, 1280, 800}, 1, {0, 0, 1280, 800}}, {0, {0, 0, 0, 0}, 2, {0, 0, 1280, 800}}, {0, {0, 0, 0, 0}, 3, {0, 0, 1280, 800}}, }; #endif |
五、效果展示
至此,SemiDrive X9H 的开机动画拼接显示到此结束。
接下来将会更新更多关于 SemiDrive X9H 的相关文章,感兴趣的可以在评论区评论或关注我。
六、参考文档
- 《 SemiDrive_X9_EarlyAPP描述1.pdf 》
- 《 SemiDrive_X9_Display应用指南》
评论