Маркеры перезапуска jpeg - PullRequest
       7

Маркеры перезапуска jpeg

7 голосов
/ 05 января 2012

Я сделал jpeg декодер, но не реализовал логику маркеров перезапуска. Вот почему моя программа не работает с некоторыми изображениями (например, изображения, сохраненные с помощью Photoshop: Файл-> Сохранить как-> jpeg). Я хочу реализовать логику маркера перезапуска, но нет подробного объяснения, как работает логика маркера перезапуска. Пожалуйста, кто-нибудь может рассказать мне больше о маркерах перезапуска или предложить мне интернет-ресурс, где я могу прочитать больше об этом. Thx!

1 Ответ

18 голосов
/ 06 января 2012

Маркеры перезапуска довольно просты. Они были разработаны, чтобы позволить повторную синхронизацию после ошибки. Поскольку большинство изображений 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 потоков и затем «склеить» данные вместе с маркерами перезапуска. Для декодеров это не так просто. Если присутствуют маркеры перезапуска, то каждый интервал может быть назначен другому потоку. Если он отсутствует, вы все равно можете выполнить некоторые приемы предварительного декодирования, чтобы разбить работу на несколько потоков.

...