【LibRaw】原始图像解码库介绍(十一)——C++ API之输入层抽象

输入层抽象

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 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);

猜你喜欢

转载自blog.csdn.net/Mr_sandman1994/article/details/80896819
今日推荐