autopccopy 发表于 2024-9-20 13:21:29

只需3.5K RAM 的嵌入式:TJpgDec - 微型 JPEG 解压缩器!TFT伴侣

TJpgDec - 微型 JPEG 解压缩器


TJpgDec 是一个通用的 JPEG 图像解压缩器模块,针对小型嵌入式系统进行了高度优化。它以非常低的内存消耗工作,因此可以集成到微型微控制器中,例如 A VR、8051、P IC、Z 80、Cort ex-M 0 等。

特征· 平台独立。用普通 C (C99) 编写。· 易于使用的主模式操作。· 完全可重入架构。· 8/16 位和 32 位 MCU 的可配置优化级别。· 非常小的内存占用:o 3.5K 字节的 RAM 用于独立于图像尺寸的工作区。o 3.5-8.5K 字节的 ROM 用于文本和常量。· 输出格式:o 像素格式:RGB888、RGB565 或灰度可预配置。o 缩放比例:减压时可选择 1/1、1/2、1/4 或 1/8。应用界面有两个 API 函数可以分析和解压缩 JPEG 图像。· jd_prepare - 准备 JPEG 图像的解压缩· jd_decomp - 执行 JPEG 图像的解压缩输入输出功能为了输入 JPEG 数据并输出解压缩的图像,TJpgDec 需要两个用户定义的 I/O 函数。这些是在解压过程中从 TJpgDec 模块回调的。· Input Funciotn - 从输入流中读取 JPEG 数据· Output Function——将解压后的图片输出到目标对象资源TJpgDec 模块是为教育、研究和开发而开放的免费软件。您可以不受任何限制地为个人项目或商业产品使用、修改和/或重新分发它,并由您负责。

autopccopy 发表于 2024-9-20 13:33:10


AI8051U-34K256

希望哪位大佬、群友可以移植到STC的单片机中(资源足够),那真是彩屏TFT的伴侣啊。
原来一张320x240的QVGA图片要150K, 必须使用外部FLASH或TF, 但现在只需15K就可以了。
压缩到10分之一,而且解码速度很快,配合DMA刷屏同时解码下一张,视频级展示不是梦!

@tzz1983 @浦江一水 @大明狐 @电子DIY小家 @芯征程 @zhangshiwei 等等高手
{:4_165:}

soma 发表于 2024-9-20 16:53:39

keil好像不支持c99吧,估计要发点时间去改吧

health 发表于 2024-9-21 02:25:15

这个应该没什么难度吧?本身就是专为低资源单片机优化设计的,直接拖过来编译就行。

一点小问题顺手就改了。
“data”是C51/C251的关键词,不能作为变量名,把所有叫data的变量都改个名。

另外就是下面这俩函数,用函数指针调用的。
size_t (*infunc)(JDEC*, uint8_t*, size_t);
int (*outfunc)(JDEC*,void*,JRECT*);

由于C51/C251对函数传递参数的方式不同于通用C,通用C是用堆栈传递参数,而C51是采用固定地址传递参数。优先用寄存器传递,寄存器放不下才用固定地址传递。
由于是指针函数动态调用,所有不适用固定地址传递,只能采用寄存器传递有限数量的参数。
上面那俩函数的参数超出寄存器容量了,放不下,所以编译报错了。
解决办法有几种:
1. 直接调用函数,不用函数指针调用。
2. 使用全局变量代替参数传递。
3. 参数里面的指针加上存储器类型指示,通用指针一个占4字节,带存储类型的指针占2字节,这样所有参数就能全放入寄存器了。
4. 俩函数加上 reentrant 声明,强制使用堆栈传递参数。
根据个人喜好,任选一种方案均可。

liuzonggong 发表于 2024-9-21 07:01:23

autopccopy 发表于 2024-9-20 13:33
AI8051U-34K256

希望哪位大佬、群友可以移植到STC的单片机中(资源足够),那真是彩屏TFT的伴侣啊。


stc太慢不能显示视频。

health 发表于 2024-9-21 15:24:13

主要问题还是内存太小了,解码出来的数据没地方放,只能一边解码一边送显示设备。拉帘式显示效果。
或者采用非常小的图,内存才能放的下。

health 发表于 2024-9-23 09:02:16

简单测试了一下,TJpgDec源码尽量不动,为使编译通过,仅修改:data变量名称,输入输出接口函数加reentrant。
手里没有带液晶的板子,显示数据通过CPU直接输出到GPIO接VGA显示器。
VGA显示只取了RGB数据的8位,所以颜色失真严重。
[刷屏是通过CPU连续写GPIO实现,大部分时间CPU都被占用,只有在行回扫和场回扫期间CPU能短暂处理解码任务,
CPU用于解码大约只剩一层功力。测试例子中解压120*120的JPG图像大约耗时1秒。
下面是实际运行效果,由于上述原因,本测试不代表8051实际能力。如果采用TFT液晶显示的话,RGB565图像质量会更好,
且CPU有更多时间用于处理解码任务,速度也会更快。


原始图片


soma 发表于 2024-9-23 09:57:38

health 发表于 2024-9-23 09:02
简单测试了一下,TJpgDec源码尽量不动,为使编译通过,仅修改:data变量名称,输入输出接口函数加reentrant ...

这个GIF图片表现出来有怪怪的

health 发表于 2024-9-23 13:06:15

soma 发表于 2024-9-23 09:57
这个GIF图片表现出来有怪怪的
是指哪个方面怪怪的?
这个是GIF图片在电脑上转换成JPG格式,
在8051上解压后的RGB565数据,简单截断了8位来显示,
所以颜色质量会劣化很多。
帧率1fps也是有点慢。

autopccopy 发表于 2024-9-23 19:12:47

health 发表于 2024-9-23 09:02
简单测试了一下,TJpgDec源码尽量不动,为使编译通过,仅修改:data变量名称,输入输出接口函数加reentrant ...
楼主威武。我也在调试这个中,由于不熟悉修改,可否发个修改后的工程或源码上来?谢谢。

另:这个动图gif,我之前也想拿来在ai8051u实验箱作“视频级”动图播放使用,哈哈。(另一个是彩色版的坏苹果){:lol:}

151
页: [1] 2
查看完整版本: 只需3.5K RAM 的嵌入式:TJpgDec - 微型 JPEG 解压缩器!TFT伴侣