0

使用 NPAPI 时,您可以控制两个函数:NPP_WriteReadyNPP_Write。这基本上是一个数据推送模型。

但是我需要实现对新文件格式的支持。我正在使用的库采用以下源模型的任何具体子类(简化的 c++ 代码):

struct compressed_source {
  virtual int read(char *buf, int num_bytes) = 0;
}

在处理 FILE* (C) 或套接字 (BSD) 和其他 (s) 时,此模型很容易实现,因为它们符合数据模型。但是,我看不到如何从 NPAPI推送模型中填充此拉取模型。

据我了解,我无法NPP_Write在我的具体实现中明确调用::read(char *, size_t).

这里的解决方案是什么?

编辑:

我不想添加太多细节以避免混淆答案。仅供参考,我想构建一个 OpenJPEG/NPAPI 插件。OpenJPEG是一个庞大的库,底层的 JPEG 2000 实现确实需要一个拉数据模型来允许对大量图像进行精细访问(例如:由于低级索引信息,100000 x 100000 图像的特定子区域)。换句话说,我真的需要一个拉数据模型插件接口。

4

1 回答 1

1

预加载文件

好吧,预加载整个文件始终是一个可行的选项,但通常不是一个好的选项。从您的其他问题中,我收集到有问题的文件/下载可能相当大,因此避免网络流量可能是一个好主意,因此预加载文件并不是一个真正的选择。

破解图书馆

如果您正在使用一些开源库,您可能能够直接在库中实现推送 API 或替代当前的拉取 API。

或者你可以完全自己实现。您正在尝试解码某些图像格式的 IIRC,并且图像格式通常很容易从头开始实现。

通过阻塞线程实现阻塞读取

您可以将图像解码的东西放入一个新线程中,并且每当没有足够的缓冲数据来read立即完成 a 时,对数据接收线程(在 NPAPI 的情况下为主线程)进行阻塞等待,直到它指示缓冲区足够再次充满。这本质上是生产者/消费者问题

当然,您首先需要选择如何使用线程和同步原语(诸如 C++11 之类的库std::thread、Boost 线程、低级 pthread 和/或 Windows 线程等)。互联网上有大量关于 SO/SE 的相关 SO 问题和大量文章/帖子/讨论/教程等。

于 2014-07-11T18:01:28.500 回答