输入层抽象
class LibRaw_abstract_datastream - 抽象RAW读取接口
LibRaw通过调用从LibRaw_abstract_datastream派生的C ++对象的(虚拟)方法来读取RAW数据。此C ++类不实现任何读取,但定义要调用的接口。调用基类方法总是会导致错误。
LibRaw_abstract_datastream类方法
对象验证
- virtual int valid()
- 检查输入数据流的有效性。在有效流上返回1,如果在无效输入参数上创建数据流,则返回0(文件流的文件名错误,依此类推)。
流读取和定位
这组方法实现了文件对象(FILE *)语义。
- virtual int read(void * ptr,size_t size,size_t nmemb)
- 类似于fread(ptr,size,nmemb,file)。
- virtual int seek(off_t o,int whence)
- 类似于fseek(file,o,whence)。
- virtual int tell(
- 与ftell(文件)类似。
- virtual int get_char()
- 与getc(file)/ fgetc(file)类似。
- virtual char * gets(char * s,int n)
- 与fgets(s,n,file)类似。
- virtual int eof()
- 与feof(文件)类似。
- virtual int scanf_one(const char * fmt,void * val)
- fscanf(file,fmt,val)的简化变体:format string总是包含一个要读取的参数。因此,不需要变量args调用,只传递一个指向数据的指针。
- virtual int jpeg_src(void * p);
-
初始化传递为* p的j_decompress_ptr对象中的读取结构。libjpeg使用此对象从datastream读取JPEG数据。
错误时返回-1,成功时返回0。
- virtual void * make_jas_stream();
-
创建LibJasper输入流(用于JPEG2000解码)。
成功时在错误或数据指针上返回NULL。
其他方法
这组方法包括几个补充呼叫。这些调用用于临时切换到另一个数据流(文件和/或内存缓冲区)。
- virtual const char * fname()
-
如果datastream对象知道它,则返回打开文件的名称(例如,使用
LibRaw_file_datastream
)。文件名用于:
- 错误通知回调;
- 在需要时生成带有元数据的JPEG文件的文件名(即具有'Diag RAW hack'的摄像机)。
- virtual int subfile_open(const char * fn)
-
此调用临时切换输入到文件
fn
。成功时返回0,错误时返回错误代码。
用于从外部JPEG文件读取元数据的功能(在具有“Diag RAW hack”的摄像机上)。
此调用未针对 LibRaw_buffer_datastream 实现,因此在使用缓冲区数据流时无法进行外部JPEG处理。
这个功能应该在实际的输入类中实现,基类调用总是返回错误。
可以在libraw / libraw_datastream.h文件中的 LibRaw_file_datastream 实现中找到工作实现示例。 - virtual void subfile_close()
- 此调用将输入流从临时打开文件切换回主数据流。
- virtual int tempbuffer_open(void * buf,size_t size)
-
这个调用临时切换输入到从buf创建的
LibRaw_buffer_datastream
对象。索尼加密的元数据解析器需要此方法。
这个调用在基类(LibRaw_abstract_datastream)中实现,不需要在派生类中重新实现。
在实现从基本LibRaw_abstract_datastream派生的数据流时,临时数据流的可能活动需要非常准确的编程。请参阅下文了解更多详情。 - virtual void tempbuffer_close()
- 此调用开关从临时数据流返回到主流。此调用在基础 LibRaw_abstract_datastream 类中实现。
LibRaw中包含派生的输入类
LibRaw发行版中有三个“标准”输入类:
- LibRaw_file_datastream实现来自文件的输入(在文件系统中)。
- LibRaw_bigfile_datastream I / O较慢,但支持大于2Gb的文件。
- LibRaw_buffer_datastream实现内存缓冲区的输入。
LibRaw C ++接口用户可以实现自己的输入类,并通过LibRaw :: open_datastream调用使用它们。要求和实施细节如下所述。
class LibRaw_file_datastream - 文件输入接口
此类实现来自文件的输入。
班级方法:
- LibRaw_file_datastream(const char * fname)
-
此构造函数从文件fname创建
LibRaw_file_datastream
对象。不幸的是,C ++构造函数无法返回错误。因此,如果传递了错误的文件名(例如,不存在的文件),则将对象创建为无效(valid()调用返回零)。
所有其他类方法如上所述。
此类实现所有可能的方法,包括fname()和subfile_open()。
class LibRaw_bigfile_datastream - 文件输入接口
此类实现来自文件的输入。
班级方法:
- LibRaw_bigfile_datastream(const char * fname)
-
此构造函数从文件fname创建
LibRaw_bigfile_datastream
对象。不幸的是,C ++构造函数无法返回错误。因此,如果传递了错误的文件名(例如,不存在的文件),则将对象创建为无效(valid()调用返回零)。
文件和bigfile数据流之间的区别在于类名:bigfile one支持所有支持的系统上的大文件(超过2Gb)。文件一使用streambuf接口,在许多系统上限制为2Gb。
所有其他类方法如上所述。
此类实现所有可能的方法,包括fname()和subfile_open()。
class LibRaw_buffer_datastream - 内存缓冲区输入接口
此类实现内存缓冲区的输入。
班级方法:
- LibRaw_buffer_datastream(void * buffer,size_t bsize)
-
此构造函数从大小为bsize的
缓冲区
创建数据流对象。不可能验证指针是否通过,因此仅针对0和-1检查缓冲区地址。
所有其他类方法如上所述。
此类不实现fname()和subfile_open()调用,因此无法进行外部JPEG元数据解析。
拥有数据流派生类
要创建自己的读取接口,LibRaw用户应该使用所有读取方法实现从LibRaw_abstract_datastream派生的C ++类。
LibRaw标准实现可以用作参考。有关详细信息,请参阅libraw / libraw_datastream.h文件(所有标准LibRaw输入类仅使用内联函数实现)。
子流字段:辅助输入流
在基数LibRaw_abstract_datastream类中定义的子流字段需要一些额外的注释。输入切换到临时缓冲区(用于索尼元数据处理)时使用此字段。不幸的是,现在有理想的C ++方法将这个功能隐藏到基类内部。因此,派生类中的任何读取调用都应该包括这样的1行语句:
int method(... args ...){if(substream)return substream-> method(... args ...)。例如:
virtual int eof() { if(substream)return substream-> eof(); .... virtual int scanf_one(const char * fmt,void * val) { if(substream)return substream-> scanf_one(fmt,val);