Edit online

硬件解码对接

7 Jun 2024
Read time: 1 minute(s)

lv_img_decoder_t 注册

我们通过 t 来注册硬件解码器接口,主要实现了三个接口:

函数 说明
aic_decoder_info 获取图片宽、高、图片格式信息
aic_decoder_open 申请解码输出 buffer,硬件解码输出
aic_decoder_close 释放硬件解码资源(包括输出 buffer)
注册解码器过程。
void aic_dec_create()
{
    lv_img_decoder_t *aic_dec = lv_img_decoder_create();

    /* init frame info lists */
    mpp_list_init(&buf_list);
    lv_img_decoder_set_info_cb(aic_dec, aic_decoder_info);
    lv_img_decoder_set_open_cb(aic_dec, aic_decoder_open);
    lv_img_decoder_set_close_cb(aic_dec, aic_decoder_close);
}

绘制函数 decoded 需要的解码后数据,需要通过注册解码器回调去获取, 这是我们默认的图片处理流程:


draw_img_decoded

1. draw_img_decoded
  • 采用此流程需要额外申请一块解码 buffer,占用内存增加

  • 缓存解码后的 buffer,下次再显示同样的 image,不用重复解码,加快 UI 加载速度

当绘制函数为 img 的时候,硬件解码在函数 img 内部,无需注册解码回调函数,我们默认不采用此方法, 当在内存受限的场景下,可以评估此方法是否可满足场景需求。


draw_img

2. draw_img
  • 采用此流程无需额外申请解码 buffer,直接解码到绘制 buffer

  • 当需要进行 blending 的时候,此方法不可行

  • 每次都要重新对 image 解码,速度不如 draw_img_decoded

  • 当硬件解码不支持裁剪的时进行局部更新,此方法不可行

图片 cache 机制

  1. 采用 t 提供的接口注册的解码器可以采用 LVGL 内部的图片缓冲机制, 在 h 中宏定义 LV_IMG_CACHE_DEF_SIZE 为 1 的时候,表示打开图片缓冲机制, 当 SIZE 为 0 的时候,图片缓冲机制关闭。

  2. 通过 void lv_img_cache_set_size(uint16_t entry_cnt)来设置缓冲的图片张数,图片以张数为单位进行缓存。

  3. 当图片缓存到设置的最大张数的时候,如果需要新的缓存,图片缓存机制内部会进行图片缓存价值的判断, 例如:如果某一张图片解码的时间比较久,或者某一张图片使用的更频繁,那么这种图片的缓存价值打分会更高, 优先缓存这些缓存价值更高的图片。

如果一些图片的读取时间或者解码时间比较长,采用图片缓存机制可以提升 UI 流畅性