libjpeg支持解码中断吗?

时间:2009-10-21 02:19:09

标签: c++ jpeg libjpeg

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

3 个答案:

答案 0 :(得分:2)

Libjpeg有一个I/O suspension feature。所以是的,您可以暂停编码/解码过程(并在以后恢复),或者只是中断它(不希望以后再继续)。

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

从libjpeg doc引用,暂停非常简单:

  

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

暂停可以在早期阶段进行(例如在致电jpeg_read_header时)。也来自doc:

  

这可能发生在四个地方:

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.

Suspension实现了一些回溯,以便提供一种“恢复”编码/解码过程的方法。它可能很昂贵(我对它没有任何线索),所以你可以测试一下它是否符合你的需求。

答案 1 :(得分:1)

我不确定我理解你的问题。

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

答案 2 :(得分:0)

真的不是你的问题:

"is libjpg thread safe?"

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