2009-10-21 110 views

回答

1

我不知道我明白你的問題。

據我記得你做的通常鍋爐板達jpeg_start_decompress(),然後你開始通過jpeg_read_scanlines()反覆讀線。如果您需要取消操作,請跳出讀取掃描線的循環。
如果您需要更好的響應能力,請閱讀更小的塊。

+0

非常感謝! 所以你的意思是,如果我想中斷解碼,我需要修改libjpeg源代碼,對吧? – user25749 2009-10-21 09:43:42

+0

你想打斷什麼? 'jpeg_read_scanlines()'? – 2009-10-21 09:53:14

+0

解碼圖像需要1000ms,在300ms我決定取消解碼。 我希望解碼器能夠立即中斷 – user25749 2009-10-22 01:35:58

0

是不是你的問題真:

"is libjpg thread safe?" 

我認爲這基本上是,如果底層stdio庫是或不使用jpeg_stdio_src。然而,爲了處於「生命的光明一面」,我會按照Georg的建議,在每個read_scanline之後檢查一個掛起的中斷(您的中斷處理程序可以設置中斷掛起標誌)。這就是我解決這個問題的方式(我需要搶先調度線程)。

+0

你確定嗎?因爲http://www.imagemagick.org/discourse-server/viewtopic.php?t=8702表示它不是 – 2017-08-03 14:11:08

2

Libjpeg有一個I/O suspension feature。因此,您可以暫停編碼/解碼過程(稍後恢復),或者乾脆中斷它(不希望以後繼續)。

您可以提供一個自定義的輸入例程到libjpeg(通過設置jpeg_source_mgr結構),然後使用libjpeg提供的I/O Suspension

從文檔的libjpeg引用,懸浮液是非常簡單的:

對於減壓懸浮液,(錯誤恢復期間也許除了,如下面所討論的)使用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. 

懸架實現了一些回溯,以提供一種方法來「恢復」的編碼/解碼過程。它可能很昂貴(我對此毫無頭緒),因此您可以測試它是否符合您的需求。