我的月经贴博客该更新了!!!已经有许多博文需要补了!
去年开始的jpeg解码项目,中间停止更新了大半年时间,上个月想起这事还没完工,就又做了更多兼容性和性能上的改进,目前终于接近尾声了。有需要参考的可以进去下载。
为了便于阅读,有必要从下面几点展开本博文:
1.为什么写这篇博文?
一来是对前期忙活事情的总结,二来是向感兴趣人们的介绍我的实现,三来为x264学习做一些铺垫性工作。
在此,要感谢一个台湾同仁提供的示范(由R语言编译)和说明,没有他的demo,我的这个demo也无法完工。因为解码过程是个漫漫长路,中间一步出错了,后面都会累积出错。
jpeg_tutorial由于是R语言这种小众语言编写,可能很多人学习道路停止在环境搭建上,因此我上传了编译后的可执行文件(jpeg_tutorial.exe),你可以拿来直接执行,来对照我的解码器JpegDecoder。
2.参考来源包括哪些?
2.1 TinyJpeg——一个小巧、精简的jpeg解码器,代码量非常少。参考其中的huffman解码时,被其算法绕进去了,因此放弃,导致自己实现huffman解码的冲动,于是有了这个MiniJpegDecoder解码器。
2.2 jpeg_tutorial——一个台湾同仁用Rust语言实现的jpeg解码器。由于R语言不懂,无法阅读源码,只使用了编译构建出的可执行文件进行对照验证。
2.3 libjpeg/libjpeg-turbo——被其众多文件所吓倒,放弃参考。
3.1 由jpeg文件解码并保存为yuv文件(重采样为yuv444_3plane,或yuv420_3plane,或nv21格式)。
3.2 通过dump开关来检查每一步生成结果(例如各分量的量化表、huffman表,huffman解码结果、DPCM和RLC逆变换/反量化/逆ZigZag变换/IDCT2/逆零偏置,以及yuv格式转换)。
3.3 jpeg格式支持格式,包括四种:yuv444采样(MCU大小为8x8,各一个Y/U/V分量block)、yuv420(MCU大小为16x16,包括4个Y分量和各一个U/V分量的block)、两种YUV矩形采样(MCU大小为16x8或8x16,两个Y分量和各一个U/V分量block)
3.4 纯软件解码,未使用x86的MMX的多媒体指令集,因此速度较慢。
3.5 小范围验证,可以解码8成以上的jpg文件。
4.如何使用?
4.1 该解码器开发环境为win10+mingw32。移植到linux环境需要修改Makefile。
4.2 编译由两步组成:utils库编译和JpegDecoder编译,前者生成libcodec_utils.so,后者依赖前者生成可执行文件JpegDecoder。