我使用libjpeg解码jpeg文件。 解码大图像时,用户可能会切换到另一个jpeg文件,那么libjpeg支持解码中断吗? 非常感谢!
答案 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之后检查一个挂起的中断(你的中断处理程序可以设置一个中断挂起的标志)。这就是我解决这个问题的方法(我需要抢先调度线程)。