我正在使用 libjpeg 解码 jpeg 文件。解码大图像时,用户可能会切换到另一个 jpeg 文件,那么 libjpeg 是否支持解码中断?非常感谢!
3 回答
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.
暂停实现了一些回溯,以便提供一种“恢复”编码/解码过程的方法。它可能很昂贵(我对此一无所知),因此您可以对其进行测试以查看它是否符合您的需求。
我不确定我是否理解您的问题。
据我记得你做了通常的样板,然后你开始通过迭代jpeg_start_decompress()
阅读这些行。jpeg_read_scanlines()
如果您需要取消操作,请跳出读取扫描线的循环。
如果您需要更好的响应能力,请分小块阅读。
你的问题真的不是:
"is libjpg thread safe?"
我认为它基本上会是,如果底层的 stdio 库是或者你没有使用 jpeg_stdio_src。但是,为了“生活的光明面”,我会遵循 Georg 的建议,即在每个 read_scanline 之后检查挂起的中断(您的中断处理程序可以设置一个中断挂起标志)。这就是我解决这个问题的方法(我需要线程的抢占式调度)。