Skip to main content

AD100四路视频解码播放使用说明文档

一 概述

AD100 四路视频解码播放,是指同时在一个界面上播放四路视频,实现四路解码的功能。该功能采用快速启动方案,使用spl+rtos+kernel+app,即通过spl加载rtos,然后 rtos 去解压kernel, 初始化 lcd, 显⽰ logo, 等这三个任务完成后, 就会回到spl,然后启动 kernel, kernel 启动才会去启动 app. 这⾥的 lcd 初始化完成后, 在 kernel 阶段就不会再次初始化, 减少驱动安装的时间.

二 配置及编译

根据实际情况使用IConfigTool工具配置lcd, linux和rtos的屏幕相关配置必须保持一致 (lcd设备、背光设备),fb驱动与默认背光亮度继承rtos

配置文件ad100_evb_multi_decode_nor_defconfig

2.1 spl配置

uboot配置

kenny@kenny-MS-7B89:~/source/linux_ad100_source/build$ grep -nr "uboot" configs/ad100_evb_multi_decode_nor_defconfig
3:APP_uboot_toolchain_dir=../tools/toolchains/mips-gcc720-uclibc09332
4:APP_uboot_dir=../bootloader/uboot-x2000
5:APP_uboot_config=ad100_uImage_multi_decode_sfc_nor

查找/Linux工程目录/bootloader/uboot-x2000/boards.cfg内的ad100_uImage_multi_decode_sfc_nor

ad100_uImage_multi_decode_sfc_nor     mips     xburst2    ad100_base       ingenic    ad100   ad100_base:AD100N_DDR,SPL_SFC_NOR,ENV_IS_IN_SFC,MTD_SFCNOR,SPL_PARAMS_FIXER,SPL_OS_BOOT,NOR_SPL_BOOT_OS,RMEM_MB=10,LCD_MEM_MB=8,QUICK_START,LPJ="11935744"

LCD_MEM_MB的值是屏幕显示需要的内存, 计算方法:

lcd为720p的屏幕, 并且fb0为0,fb1为1,旋转为1,所以总共为2个buffer

720 ×1280 × 4 x 2 = 7372800 (lcd的内存是按ARGB的32位申请的,因此需要乘4) + 2k lcd描述符

2.2 rtos配置

以配置文件ad100_evb_v10_multi_decode_nor_defconfig为例

linux接管rtos_lcd内存, 继承rtos fb配置

AD100四路视频解码播放使用说明文档.assets/01.png

2024-08-06_10-57

2024-08-06_17-42

2024-08-06_11-09

2024-08-06_11-12

如上⾯linux分配的LCD_MEM_MB=8, 则对应的值为 0x800000. 固件加载的地址计算公式为:0x80000000 + ddr_size - rtos_size

ad100 的 ddr_size 为 64MB, 则固件加载的地址为 0x80000000 + 0x4000000 - 0x800000 =0x83800000

U-Boot SPL 2013.07-00207-gf5ecb77fb (Aug 05 2024 - 17:08:32)
V1.0.0 <2024/06/25>
ERROR EPC 80019244
CPA_CPAPCR:0320490d
CPM_CPMPCR:0320490d
CPM_CPEPCR:0190510d
CPM_CPCCR:9a073310
DDR clk rate 600000000
DDR: M14F5121632A type is : DDR2
DDR_PAR of eFuse: 00000000 00000000
AD100 InnoPhy skew Settings...
GD25Q256DYIG 00c84019 00c84019
[0.000084] gpio: VDDIO_SD(PD00~PD05) = 3.3V
[0.000251] pwm clk rate 400000000
[0.003792] lcd_mem left 0xba000 bytes //LCD_MEM剩余内存
[0.004183] sfc_nor: find chip:GD25Q256DYIG id:0xc84019
[0.005330] vendor init...
[0.006084] get logo partition information fail!
[0.006247] now use default logo

背光配置

2024-08-06_11-21

修改完成配置后保存.

在/rtos工程目录/freertos/vendor/vendor.c内, 修改代码如下:

#include <stdio.h>
#include "../example/driver/quick_boot_logo_and_load_split_uimage_example.c"
void vendor_init(void *arg)
{
printf("vendor init...\n");
quick_boot_logo_and_load_kernel(arg);
}

example/driver/quick_boot_logo_and_load_split_uimage_example.c 文件内容如下:

fb0_handle = fb_open("fb0"); 修改为 fb0_handle = fb_open("fb1");

编译rtos系统:

bhu@bhu-PC:~/rtos/freertos$ source build/envsetup.sh
bhu@bhu-PC:~/rtos/freertos$ make ad100_evb_v10_multi_decode_nor_defconfig
bhu@bhu-PC:~/rtos/freertos$ make

2.3 linux 配置

2024-08-06_11-40

2

pwm背光值继承rtos, 配置需要和rtos保持一致

2024-08-06_11-45

修改lvgl播放器相关的代码,由于我把4路视频的源文件放在U盘下,所以修改下面的文件:

本文档测试的视频的分辨率是640×360,h264格式。

mp4转h264格式的方法参考如下:

ffmpeg -i input.mp4 -c:v libx264 -x264-params "bframes=0" -r 25 -s 640x360 -an output.h264

其中:

  • -i input.mp4:指定输入的 MP4 文件。
    -c:v libx264:选择 H.264 编码器(libx264)。
    -x264-params "bframes=0":设置编码时不使用 B 帧。
    -r 25:将帧率设置为 25 帧/秒。
    -s 640x360:设置输出视频的分辨率为 640x360。
    -an:不包含音频轨道(如果需要保留音频,可以去掉这个选项)。
    output.h264:指定输出文件名和格式。

    上面命令会将输入的 MP4 文件转换为不包含 B 帧、分辨率为 640x360、帧率为 25 帧/秒的 H.264 文件。

U盘的文件路径和名称要跟下面一样

#ifdef APP_lvgl_demo_ilock2_multi_zlink
char src_name[][64] = {
[0] = {"zlink:0"},
[1] = {"zlink:0"},
[2] = {"zlink:0"},
[3] = {"zlink:0"},
};

#else
//char src_name[][64] = {
// [0] = {"/usr/data/1_360p.h264"},
// [1] = {"/usr/data/2_360p.h264"},
// [2] = {"/usr/data/3_360p.h264"},
// [3] = {"/usr/data/4_360p.h264"},
//};

//U盘的文件路径
char src_name[][64] = { //Read video from USB flash drive
[0] = {"/tmp/mass_storage/sda1/video/1_360p.h264"},
[1] = {"/tmp/mass_storage/sda1/video/2_360p.h264"},
[2] = {"/tmp/mass_storage/sda1/video/3_360p.h264"},
[3] = {"/tmp/mass_storage/sda1/video/4_360p.h264"},
};

#endif

编译Linux系统:

bhu@bhu-PC:~/ad100/build$ make ad100_evb_multi_decode_nor_defconfig
bhu@bhu-PC:~/ad100/build$ make

三 烧录

本开发板nor flash为64MB, 根据flash大小自行调节分区大小

7

分区表配置如下, 在烧录工具分区内分配一块rtos分区:

2024-08-06_11-52

rtos分区烧录/rtos工程目录/freertos/zero.bin文件, kernel分区烧录/linux工程目录/build/output/uImage_split文件, 烧录成功后板子上电显示logo后启动Linux.

2024-08-06_11-53

四 运行和效果

运行的Log如下:

U-Boot SPL 2013.07-00207-gf5ecb77fb (Aug 06 2024 - 14:28:19)
V1.0.0 <2024/06/25>
ERROR EPC 80019244
CPA_CPAPCR:0320490d
CPM_CPMPCR:0320490d
CPM_CPEPCR:0190510d
CPM_CPCCR:9a073310
DDR clk rate 600000000
DDR: M14F5121632A type is : DDR2
DDR_PAR of eFuse: 00000000 00000000
AD100 InnoPhy skew Settings...
GD25Q256DYIG 00c84019 00c84019
[0.000083] gpio: VDDIO_SD(PD00~PD05) = 3.3V
[0.000251] pwm clk rate 400000000
[0.003791] lcd_mem left 0xba000 bytes
[0.004183] sfc_nor: find chip:GD25Q256DYIG id:0xc84019
[0.005332] vendor init...
[0.006084] get logo partition information fail!
[0.006246] now use default logo
[ 0.000000] Linux version 5.10.186+ (kenny@kenny-MS-7B89) (mips-linux-gnu-gcc (Ingenic MIPS uClibc Tools R5.1.12 Default_xburst2_uclibc0.9.33.2 2024.05-31 01:36:32) 7.2.0, GNU ld (GNU Binutils) 2.27) #27 SMP PREEMPT Tue Aug 6 14:37:04 CST 2024
[ 0.000000] CPU0 RESET ERROR PC:80019244
[ 0.000000] [<80019244>] 0x80019244
[ 0.000000] printk: bootconsole [early0] enabled
[ 0.000000] CPU0 revision is: 00132000 (Ingenic XBurst II)
[ 0.000000] FPU revision is: 00f32000
[ 0.000000] MSA revision is: 00002000
[ 0.000000] OF: fdt: No chosen node found, continuing without
[ 0.000000] MIPS: machine is ingenic,ad100
[ 0.000000] Failed to initialize '/core-ost@0x12000000': 75
[ 0.000000] timer_probe: no matching timers found
[ 0.000000] ingenic-dma 13660000.dma: IRQ pdmam not found
[ 0.000000] ingenic-dma 13420000.dma: IRQ pdmam not found
[ 0.028868] mtd: partition "userdata" is out of reach -- disabled
mount: mounting devpts on /dev/pts failed: No such device
Starting mdev... OK
[ 0.755308] md_ingenic,sdhci md_ingenic,sdhci.1: card insert manually
/
[ 0.791007] Too few erase blocks (0)
mount: mounting /dev/mtdblock4 on /usr/data/ failed: Invalid argument
mount jffs2 error, try mount again
Floating point exception
[ 0.803458] Too few erase blocks (0)
mount: mounting /dev/mtdblock4 on /usr/data/ failed: Invalid argument
mount jffs2 error again
/
Starting network: OK
# mass_storage insert!
nalu_demuxing: need parse h264 data size[4613717]
nalu_demuxing: need parse h264 data size[3719731]
nalu_demuxing: need parse h264 data size[4613717]
nalu_demuxing: need parse h264 data size[3501294]
get_video_param w[640] h[360] fps[29]
[ 10.035805] max available: 12451840
[ 10.036108] min available: 12451840
get_video_param w[640] h[360] fps[25]
[ 10.037747] min available: 11395072
[ 10.038036] min available: 11276288
[ 10.038330] min available: 11038720
[ 10.038671] min available: 10919936
[ 10.040672] min available: 10788864
get_video_param w[640] h[360] fps[29]
[ 10.043805] min available: 9732096
[ 10.044058] min available: 9613312
[ 10.044345] min available: 9375744
[ 10.044587] min available: 9256960
get_video_param w[640] h[360] fps[30]
[ 10.046684] min available: 9125888
[ 10.047249] min available: 9117696
[ 10.047258] min available: 8998912
[ 10.047704] min available: 7712768
[ 10.048016] min available: 7593984
[ 10.048975] min available: 7462912
[ 10.051397] min available: 6406144
[ 10.059483] min available: 6287360
[ 10.061679] min available: 6049792
[ 10.062305] min available: 5931008
[ 10.069010] min available: 5922816
[ 10.069500] min available: 5804032
[ 10.069864] min available: 5566464
[ 10.070234] min available: 5447680
[ 10.073282] min available: 5439488
[ 10.073794] min available: 5320704
[ 10.074164] min available: 5083136
[ 10.074462] min available: 4964352
[ 10.077073] min available: 4956160
[ 10.077376] min available: 4837376
[ 10.078164] min available: 4599808
[ 10.078174] min available: 4481024
[ 10.081470] min available: 4472832
[ 10.081748] min available: 4354048
[ 10.082005] min available: 4116480
[ 10.082269] min available: 3997696
[ 10.092206] min available: 3989504
[ 10.092506] min available: 3870720
[ 10.092770] min available: 3633152
[ 10.093018] min available: 3514368
[ 10.099610] min available: 3506176
[ 10.099890] min available: 3387392
[ 10.100450] min available: 3149824
[ 10.100952] min available: 3031040
[ 10.109682] min available: 3022848
[ 10.109976] min available: 2904064
[ 10.110638] min available: 2666496
[ 10.110881] min available: 2547712
[ 10.114947] min available: 2539520
[ 10.115247] min available: 2420736
[ 10.115505] min available: 2183168
[ 10.115753] min available: 2064384
[ 10.122995] min available: 2056192
[ 10.123533] min available: 1937408
[ 10.124202] min available: 1699840
[ 10.124786] min available: 1581056
[ 10.133613] min available: 1572864
[ 10.134138] min available: 1454080
[ 10.134381] min available: 1216512
[ 10.134613] min available: 1097728
[ 10.150274] min available: 1089536
[ 10.150569] min available: 970752
[ 10.150873] min available: 733184
[ 10.151322] min available: 614400
[ 10.158976] min available: 606208
[ 10.159511] min available: 487424
[ 10.159766] min available: 249856
[ 10.160067] min available: 131072 //解码器剩余预留内存
not first ctrler

具体rmem的定义和使用参考sdk下 /doc/开发使用说明/预留内存使用说明文档/ad100/ad100预留内存使用说明文档.pdf

cat /proc/rmem 

rmem info:
alloc_addr alloc_size
0x82e00000 131072
0x82e20000 131072
0x82e40000 3686400
0x831c4000 3686400

free_addr free_size
0x83548000 2850816

total_size:10485760 alloc_size:7634944 free_size:2850816 dma_alloc_count:0
#

烧录固件以后,U盘放好上面的四个视频文件,插入到开发板上,然后按RST-KEY按键,开机后会自动进入lvgl界面,点击界面上的监控按钮,就可以同时显示出U盘上的4路视频效果。

效果如下:

2024-08-06_15-02