2012-01-05 73 views
6

我製作了jpeg解碼器,但是我沒有實現重啓標記的邏輯。這就是爲什麼我的程序無法在某些圖像上工作(例如,使用Photoshop保存的圖像:文件 - >另存爲 - > jpeg)。我想實現重新啓動標記邏輯,但沒有詳細的在線說明重新啓動標記邏輯的工作原理。請任何人都可以告訴我更多關於重新啓動標記的信息,或者向我建議在線資源,我可以在其中閱讀更多信息謝謝!Jpeg重啓標記

回答

13

重新啓動標記非常簡單。它們旨在允許在發生錯誤後重新同步。由於大多數JPEG圖像是通過無差錯通道傳輸的,因此很少需要它們。重啓時間間隔由FFDD標記定義爲2字節數字。這告訴重啓標記之間有多少個MCU。遇到重啓標記(FFD0-FFD7)時,將DC值(Y,Cr,Cb)重置爲0,並在字節邊界(FFDx後)開始比特流。這只不過是在解碼圖像時反覆計算重新啓動間隔的問題。重新開始標記值將從FFD0遞增到FFD7,然後再次從FFD0開始。標記值本身不是非常重要,但它可以指示是否缺少大塊數據。這是我在解碼器中如何做的一個例子。我在比特流閱讀器中丟棄重新啓動標記。

iRestartCount = iRestartInterval; 
for (y=0; y<Height_in_MCUs; y++) 
    { 
    for (x=0; x<Width_in_MCUs; x++) 
     { 
     <decode an MCU> 
     if (iRestartInterval) // if there is a restart interval defined 
      { 
      if (--iRestartCount == 0) 
      { 
      iRestartCount = iRestartInterval; // reset restart inverval counter 
      iDCPred0 = iDCPred1 = iDCPred2 = 0; // reset DC predictors 
      if (*iBit & 7) // adjust bitstream to start on the next byte boundary 
       { 
       *iBit += (8 - (*iBit & 7)); 
       } 
      } // if restart interval expired 
      } // if restart interval defined 
     } // for x 
    } // for y 

更新:重新開始標誌,現在服務於一個新的目標 - 允許多線程JPEG編碼器和解碼器。由於MCU的每個「條帶」在每個重新啓動間隔開始時都會重置DC值,並在字節邊界上啓動,因此每個重新啓動間隔可以由不同的線程獨立編碼或解碼。編碼器現在可以任意地將任務分成N個線程,然後將數據與重新啓動標記「粘合」在一起。對於解碼器來說,這並不容易。如果存在重新啓動標記,則可以將每個間隔分配給不同的線程。如果不存在,您仍然可以執行一些預解碼技巧將作業分成多個線程。

+0

請你能告訴我更多的實現細節和邏輯嗎? – MrD 2012-01-20 00:04:09

+0

如果是交織的多分量圖像會怎麼樣? – adikshit 2017-07-13 22:33:32

+0

@adikshit - 據我所見,無論配置如何,重啓時間間隔都是指MCU(最小編碼單位)。對於3分量彩色圖像(Y/Cb/Cr),重啓間隔是指3個DCT塊的組。例如,間隔100將意味着300個DCT塊(100個MCU)。 – BitBank 2017-07-14 23:38:01