В формате JPEG перезагрузить маркеры
Я сделал jpeg-декодер, но я не реализовал логику маркеров перезапуска. Вот почему моя программа не работает на некоторых изображениях (например, изображения, сохраненные с помощью Photoshop: File->Save As->jpeg). Я хочу реализовать логику маркера перезапуска, но нет подробного онлайн-объяснения того, как работает логика маркера перезапуска. Пожалуйста, кто-нибудь может рассказать мне больше о маркерах перезапуска или предложить мне онлайн-ресурс, где я могу узнать больше об этом. Thx!
1 ответов
маркеры перезапуска довольно просты. Они были разработаны, чтобы позволить повторную синхронизацию после ошибки. Поскольку большинство изображений JPEG передаются по безошибочным каналам, они редко нужны. Интервал перезапуска определяется с помощью маркера FFDD как 2-байтовое число. Это говорит, сколько MCUs между маркерами перезапуска. Когда вы сталкиваетесь с маркером перезапуска (FFD0-FFD7), сбросьте значения DC (Y,Cr,Cb) до 0, и битовый поток запускается на границе байта (после FFDx). Это просто вопрос подсчета через интервал перезапуска снова и снова по мере декодирования изображения. Значения маркера перезапуска будут увеличиваться с FFD0 до FFD7, а затем снова начинаться с FFD0. Само значение маркера не очень важно, но оно может указывать, отсутствуют ли большие куски данных. Вот пример того, как я это делаю в своем декодере. Я выбрасываю маркеры перезапуска в моем читателе bitstream.
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 шифраторы и дешифраторы. Поскольку каждая "полоса" MCUs имеет свои значения DC, сброшенные в начале каждого интервала перезапуска и начинается на границе байта, каждый интервал перезапуска может быть независимо закодирован или декодирован другим потоком. Теперь кодировщик может произвольно разделить задачу на N потоков, а затем "склеить" данные вместе с маркерами перезапуска. Для дешифраторов это не так просто. Если маркеры перезапуска присутствуют, то каждый интервал может быть назначен другому потоку. Если нет, вы можете все еще делайте некоторые трюки предварительного декодирования, чтобы разделить работу на несколько потоков.