|
|
void Showjpg(unsigned int x, unsigned int y, const char *p, uint16_t *displaybuf)
{
FIL file;
FRESULT fr;
UINT br;
uint8_t *jpeg_data = JPEG_Decoder_Buff; // 指向预分配的 SDRAM 输入缓冲
UINT jpeg_size;
jpeg_outset_t jpeg_outset;
jfif_info_t jfif_info;
// --- 1. 加载 JPEG 文件 ---
fr = f_open(&file, p, FA_READ);
if (fr != FR_OK) {
LOG_INFO("Open failed: %s\n", p);
return;
}
jpeg_size = f_size(&file);
fr = f_read(&file, jpeg_data, jpeg_size, &br);
f_close(&file);
if (fr != FR_OK || br != jpeg_size) {
LOG_INFO("Read failed!\n");
return;
}
// 解析 JFIF 信息时应传递正确的数据长度
if(jfif_parse(jpeg_data, jpeg_size, &jfif_info) != 0) {
LOG_INFO("JFIF parse failed!\n");
return;
}
jpeg_outset.format = JPEG_OUT_RGB565;
jpeg_outset.dither = 0;
jpeg_outset.RGBAddr = (uint32_t)JPEG_Decoder_Buff2;
// 使用实际解析得到的宽高进行解码
JPEG_Decode(JPEG, &jfif_info, &jpeg_outset);
while(JPEG_DecodeBusy(JPEG)) __NOP();
// 3. 复制到 framebuffer,考虑行偏移
uint16_t *fb = (uint16_t *)displaybuf;
uint16_t *src = (uint16_t *)JPEG_Decoder_Buff2;
uint16_t *dst = fb + y * 800 + x;
for(int i = 0; i < jfif_info.Height; i++) { // 使用从 JFIF 解析出的高度
memcpy(dst, src, jfif_info.Width * sizeof(uint16_t)); // 使用宽度*每个像素的字节数
src += jfif_info.Width; // 移动到下一行的开始
dst += 800; // 目标 buffer 中的下一行开始位置,根据屏幕宽度调整
}
}这是代码,jpeg的缓冲区和显示的缓冲区不是同一块,怀疑是屏幕显示过程中,解码占用大量的sdram的带宽导致屏幕抖动,有人知道如何解决吗
|
|