本人所開發的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,這個應該是更簡潔和高效一些吧。