在使用NPAPI时,您可以控制两个函数:WriteReady和写。这基本上是一个数据推送模型。
但是,我需要实现对新文件格式的支持。我使用的库接受以下源模型的任何具体子类(简化的c++代码):
struct compressed_source {
virtual int read(char *buf, int num_bytes) = 0;
}这个模型在处理文件* (C)或套接字(BSD)和其他文件时很容易实现,因为它们符合拉数据模型。但是,我不知道如何从NPAPI push模型中完全填充这个拉出模型。
据我所知,我无法在::read(char *, size_t)的具体实现中明确地调用::read(char *, size_t)。
这里的解决方案是什么?
编辑:
我不想增加太多的细节,以避免混淆的答案。仅供参考,我想要构建一个OpenJPEG/NPAPI插件。OpenJPEG是一个巨大的库,底层的JPEG 2000实现确实需要一个拉数据模型来允许对海量图像的精细访问(例如:由于低级别的索引信息,100000×100000图像的特定子区域)。换句话说,我真的需要一个拉数据模型插件接口。
发布于 2014-07-11 18:01:28
预加载文件
嗯,预加载整个文件总是一个可行的选择,但通常不是一个好的选项。从您的其他问题中,我认为所讨论的文件/下载可能相当大,因此避免网络通信可能是个好主意,因此预装文件并不是一种真正的选择。
黑进图书馆
如果您使用的是一些开放源码库,那么您可能可以在库中实现一个push API,或者直接实现当前的拉API。
或者你可以完全靠自己来实现。IIRC你试图解码一些图像格式,而且图像格式通常很容易从零开始实现。
通过阻塞线程来实现阻塞读取
您可以将图像解码内容放入一个新线程,当没有足够的缓冲数据来立即完成read时,请执行阻塞等待数据接收线程(在NPAPI情况下的主线程),直到它指示缓冲区再次填满为止。这本质上就是生产者/消费者问题。
当然,您首先需要选择如何使用线程和同步原语(一个库,如C++11 std::thread、Boost线程、低级线程和/或Windows线程等等)。互联网上有大量关于SO/SE的相关SO问题,以及大量的文章/帖子/讨论/教程等。
https://stackoverflow.com/questions/24700457
复制相似问题