47 lines
1.5 KiB
Markdown
47 lines
1.5 KiB
Markdown
# eplayer demo - FB+视频共存问题
|
||
|
||
## 问题与根因
|
||
|
||
FB 和视频无法共存:`compress(TRUE)` 下 render 阻塞,`compress(FALSE)` 下视频返回 VO_BUSY。
|
||
|
||
根因: `rootfs_overlay/qua/ko/loadko.sh` 中 `insmod fhfb.ko fbc=0` 禁用了 FB 压缩,且 `fhfb.ko` 是旧版不支持 fbc。
|
||
|
||
## 修改点
|
||
|
||
### 内核层
|
||
|
||
1. 替换 fhfb.ko — 用 SDK 新版替换 `rootfs_overlay/qua/ko/fhfb.ko`(旧版 md5:`96d321` → 新版 md5:`58050d`)
|
||
2. loadko.sh 启用 fbc — `fbc=0` → `fbc=3000`,`vram0_size=4000`,`fhfb0_fbc=1`
|
||
|
||
### 应用层
|
||
|
||
3. e_logger.c — 修复 `log_print` 死锁(持有 mutex 后调用 `log_init` 再次加锁)
|
||
4. fbdev_10xd.c — `compress(TRUE)` 前加载 `bk.rgba` 全屏铺底 + `tag.rgba` 底部 alpha 叠加
|
||
5. fbdev.c — 跳过 LVGL memcpy,仅做挖洞 + render
|
||
6. main.c — 视频区域改为顶部,LVGL root 设为透明
|
||
|
||
## 关键时序
|
||
|
||
mmap → 写入图片 → compress(TRUE) → VO enable → show(TRUE) → render → 挖洞 → 播视频
|
||
|
||
> 图片必须在 `compress(TRUE)` 之前写入 FB buffer。
|
||
|
||
## 素材
|
||
|
||
素材需预转换(PNG/JPG → raw BGRA):
|
||
|
||
python3 -c "
|
||
from PIL import Image
|
||
import struct
|
||
img = Image.open('/path/to/bk1.jpg').convert('RGBA')
|
||
print(f'Size: {img.size}')
|
||
with open('/path/to/bk1.rgba', 'wb') as f:
|
||
for y in range(img.height):
|
||
for x in range(img.width):
|
||
r, g, b, a = img.getpixel((x, y))
|
||
f.write(struct.pack('BBBB', b, g, r, a))
|
||
print('Done')
|
||
"
|
||
|
||
> 设备上 crc32 与 zlib 冲突,无法用 libpng,需预转换 raw 格式。
|