jpeg 디코더를 만들었지 만 마커 논리를 다시 구현하지 않았습니다. 그래서 내 프로그램이 일부 이미지 (예 : Photoshop에서 저장된 이미지 : 파일 -> 다른 이름으로 저장 -> jpeg)에서 작동하지 않는 이유입니다. 재시작 마커 논리를 구현하고 싶지만 재시작 마커 논리가 어떻게 작동하는지에 대한 자세한 온라인 설명은 없습니다. 아무도 나에게 마커를 다시 시작하는 것에 대해 더 자세히 알려주거나, 내가 그것에 대해 더 많이 읽을 수있는 온라인 리소스를 제안 해 주실 수 있습니까? 고마워!Jpeg 다시 시작 표시 자
답변
재시작 마커는 매우 간단합니다. 오류 후 재 동기화를 허용하도록 설계되었습니다. 대부분의 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 개의 스레드로 임의로 분할 한 다음 재시작 마커와 함께 데이터를 '붙입니다'. 디코더의 경우 쉽지 않습니다. 재시작 마커가 있으면 각 간격을 다른 스레드에 할당 할 수 있습니다. 존재하지 않는다면 작업을 여러 스레드로 분할하기 위해 일부 사전 디코딩 트릭을 수행 할 수 있습니다.
자세한 구현 세부 정보 및 로직을 알려주시겠습니까? – MrD
인터리브가있는 다중 구성 요소 이미지 인 경우 어떻게해야합니까? – adikshit
@adikshit - 내가 본 것만 큼 재시작 간격은 구성에 상관없이 MCU (최소 코딩 단위)를 나타냅니다. 3 성분 컬러 이미지 (Y/Cb/Cr)의 경우, 재시작 간격은 3 개의 DCT 블록 그룹을 나타냅니다. 예를 들어, 간격이 100이면 300 DCT 블록 (100 MCU)을 의미합니다. – BitBank