本人所开发的MiniJpegDecoder项目,主要分为两层,一层是底层依赖库,另一层是包含jpeg解码逻辑的应用层。git
其实,分三层的话结构更为合理:底层库+解码库+应用层。但因为目前没时间维护这个库,等何时空闲了再优化一下结构吧。github
今天介绍的主要是两层结构的底层库——libcodec_utils.so。网络
1. 源码组成函数
源码树结构以下:工具
utils$ tree
.
|-- ABitReader.cpp
|-- AString.cpp
|-- DataSource.cpp
|-- FileSource.cpp
|-- Makefile
`-- types_def.cpp优化
须要说明的是,这几个cpp文件都是来源于Android SDK,位于framesworks/av/media目录下。spa
2. 各模块说明code
ABitReader——一个按二进制位读写/查询数据的工具,例如读取2bit二进制位,或者跳过3bit,或者查询当前读的bit位置的offset。接口
AString——一个用于字符操做的工具,例如追加/插入字符串,或查找某个子字符串。开发
DataSource——FileSource的父类,用于抽象读取数据的接口。
FileSource——读本地文件的工具,是对open/read系统调用的一层抽象,未使用fopen/fread的标准C库函数。
types_def——64位整形数据转换为网络字节序。
3. 为何增长加这个底层库?
JpegDecoder模块做为高层模块,指望从本地文件中,按位读取数据再去解码,重点是处理解码逻辑,而不但愿看到底层细节处理操做,例如
从文件中如何读若干Bytes数据,再一个个bit位的逻辑操做。所以使用了这些底层子模块,去实现按bit位读取、跳若干bit位、查询当前位在文件中
的offset等底层细节问题。
即高层模块只处理高层的业务逻辑,底层只处理底层的业务逻辑,避免眉毛鼻子一把抓。
底层只负责读文件数据,按bit位方式拿数据。
4. 有无替代方案?
在作这个h264_tools工具时,找到了x264实现的按bit位读取数据的模块——bs_read,这个应该是更简洁和高效一些吧。