0

我正在使用 libjpeg 解码 jpeg 文件。解码大图像时,用户可能会切换到另一个 jpeg 文件,那么 libjpeg 是否支持解码中断?非常感谢!

4

3 回答 3

2

Libjpeg 具有I/O 暂停功能。所以是的,您可以暂停编码/解码过程(稍后再恢复),或者干脆中断它(以后不想继续)。

您可以向 libjpeg 提供自定义的输入例程(通过设置jpeg_source_mgr结构),然后使用 libjpeg 提供的I/O Suspension

引用 libjpeg 文档,暂停非常简单:

对于解压缩暂停,使用仅返回 FALSE 的 fill_input_buffer() 例程(可能在错误恢复期间除外,如下所述)。这将导致解压器返回给它的调用者,并指示已发生暂停。

暂停可能发生在早期阶段(例如调用 时jpeg_read_header)。同样来自文档:

这可能发生在四个地方:

jpeg_read_header(): will return JPEG_SUSPENDED.
jpeg_start_decompress(): will return FALSE, rather than its usual TRUE.
jpeg_read_scanlines(): will return the number of scanlines already completed (possibly 0).
jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE.

暂停实现了一些回溯,以便提供一种“恢复”编码/解码过程的方法。它可能很昂贵(我对此一无所知),因此您可以对其进行测试以查看它是否符合您的需求。

于 2011-12-12T23:52:21.857 回答
1

我不确定我是否理解您的问题。

据我记得你做了通常的样板,然后你开始通过迭代jpeg_start_decompress()阅读这些行。jpeg_read_scanlines()如果您需要取消操作,请跳出读取扫描线的循环。
如果您需要更好的响应能力,请分小块阅读。

于 2009-10-21T02:35:17.093 回答
0

你的问题真的不是:

"is libjpg thread safe?"

我认为它基本上会是,如果底层的 stdio 库是或者你没有使用 jpeg_stdio_src。但是,为了“生活的光明面”,我会遵循 Georg 的建议,即在每个 read_scanline 之后检查挂起的中断(您的中断处理程序可以设置一个中断挂起标志)。这就是我解决这个问题的方法(我需要线程的抢占式调度)。

于 2011-12-12T21:14:20.447 回答