SemiDrive X9H 开机动画拼接显示

一、概述

为了达到快速启动的要求,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 中缺省的配置。

EarlyAPP 显示配置  

二、使用环境

硬件: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应用指南》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论