2012-01-05 24 views
6

Zrobiłem dekoder jpeg, ale nie zaimplementowałem logiki restartu. Z tego powodu mój program nie działa na niektórych obrazach (na przykład obrazy zapisane w Photoshop: Plik-> Zapisz jako-> jpeg). Chcę zaimplementować logikę znacznika restartu, ale nie ma szczegółowego wyjaśnienia online, jak działa logika znacznika restartu. Proszę, niech każdy powie mi więcej o ponownym uruchomieniu markerów lub zasugeruje mi zasób online, gdzie mogę przeczytać więcej na ten temat. Dzięki!Jpeg restart markery

Odpowiedz

13

Znaczniki restartu są dość proste. Zostały one zaprojektowane w celu umożliwienia resynchronizacji po wystąpieniu błędu. Ponieważ większość obrazów JPEG jest przesyłanych kanałami wolnymi od błędów, są one rzadko potrzebne. Interwał restartu jest zdefiniowany za pomocą znacznika FFDD jako 2-bajtowego numeru. Informuje to o liczbie MCU między markerami restartu. Po napotkaniu znacznika restartu (FFD0-FFD7), zresetuj wartości DC (Y, Cr, Cb) na 0, a strumień bitów zostanie uruchomiony na granicy bajtów (po FFDx). Jest to po prostu kwestia odliczania czasu trwania restartu w kółko podczas dekodowania obrazu. Wartości znacznika restartu zwiększą się z FFD0 do FFD7, a następnie rozpoczną się ponownie przy FFD0. Wartość znacznika nie jest bardzo ważna, ale może wskazywać, że brakuje dużych porcji danych. Oto przykład, jak to zrobić w moim dekoderze. Wyrzucam znaczniki restartu w moim czytniku bitów.

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 

Aktualizacja: markery Restart teraz służyć nowy cel - umożliwienie wielu gwintowane kodery i dekodery JPEG. Ponieważ każdy "pasek" MCU ma resetowane wartości DC na początku każdego interwału restartu i rozpoczyna się na granicy bajtów, każdy interwał restartu może być niezależnie zakodowany lub zdekodowany przez inny wątek. Enkoder może teraz dowolnie dzielić zadanie na N wątków, a następnie "skleić" dane razem ze znacznikami restartu. W przypadku dekoderów nie jest to takie łatwe. Jeśli obecne są znaczniki restartu, wówczas każdy interwał może zostać przypisany do innego wątku. Jeśli nie jest obecny, nadal możesz wykonać pewne triki dekodowania, aby podzielić zadanie na wiele wątków.

+0

Czy możesz podać mi więcej szczegółów i logiki implementacji? – MrD

+0

co, jeśli jest to obraz wieloskładnikowy z przeplotem? – adikshit

+0

@adikshit - O ile widziałem, interwał restartu odnosi się do MCU (minimalnie zakodowanych jednostek) bez względu na konfigurację. W przypadku 3-komponentowego obrazu kolorowego (Y/Cb/Cr) interwał restartu odnosi się do grup 3 bloków DCT. Na przykład przedział 100 oznaczałby 300 bloków DCT (100 mikrokontrolerów). – BitBank