WEB开发网
开发学院手机开发Android 开发 Android jpeglib库在内存中实现解码 阅读

Android jpeglib库在内存中实现解码

 2010-09-10 00:39:00 来源:WEB开发网   
核心提示:desired));JMETHOD(void, term_source, (j_decompress_ptr cinfo));};可以看出source manager对象可以注册多个回调函数来对数据进行读写,在看jdatasrc.c中的代码:typedef struct {struct jpeg_source_mgr
desired));

JMETHOD(void, term_source, (j_decompress_ptr cinfo));

};

可以看出source manager对象可以注册多个回调函数来对数据进行读写。在看jdatasrc.c中的代码:

typedef struct {

struct jpeg_source_mgr pub; /* public fields */

FILE * infile; /* source stream */

JOCTET * buffer; /* start of buffer */

boolean start_of_file; /* have we gotten any data yet? */

} my_source_mgr;

该文件为jpeglib的source manger初始化和管理的地方。上面的数据结构是内部使用的源数据。可以看出其源数据只支持文件输入(infile变量),并提供缓存功能(buffer变量)。

其对source manager初始化的接口定义子jpeglib.h中,定义如下:

EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));

通过这个接口我们可以看出它的source manager只能接收文件作为输入。该函数的实现在jdatasrc.c文件中。

为了支持内存jpeg数据输入,我的设计是在jdatasrc.c中实现一个新的接口来初始化jpeglib的source manger对象。并完成注册其读写的回调函数给source manager。

说干就干,首先我们需要让source manager对象支持内存数据。修改my_source_mgr数据结构如下:

typedef struct{

UINT8* img_buffer;

UINT32 buffer_size;

UINT32 pos;

}BUFF_JPG;

/* Expanded data source object for stdio input */

typedef struct {

struct jpeg_source_mgr pub; /* public fields */

union{

BUFF_JPG jpg; /* jpeg image buffer */

VFS_FILE * infile; /* source stream */

};

JOCTET * buffer; /* start of buffer */

boolean start_of_file; /* have we gotten any data yet? */

} my_source_mgr;

可以看出我们通过union来支持内存数据(jpg变量)或者文件输入。因为需要负责读写必须要标识出当前内存读写的位置,所以必须要在BUFF_JPG数据结构中定义pos变量。

下一步我们需要实现读写内存jpeg数据的回调函数了。经过分析对文件数据读写的回调函数,发现我们只需要实现jpeg_source_mgr数据结构中的fill_input_buffer回调函数就可以了,其他的回调函数可以延用对文件读取的回调函数。在jdatasrc.c文件中,定义回调函数如下:

上一页  1 2 3 4 5  下一页

Tags:Android jpeglib 内存

编辑录入:coldstar [复制链接] [打 印]
赞助商链接