Files
core/ASCImageStudio3/ASCImageJpeg2000/Jpt.h

114 lines
2.8 KiB
C

#pragma once
#include "Types.h"
#include "Reader.h"
//-------------------------------------------------------------------------------------------------------------------------------
// Âñïîìîãàòåëüíûå ôóíêöèè
//-------------------------------------------------------------------------------------------------------------------------------
static unsigned int JPT_ReadVBASInfo(CReader *pStream, unsigned int nValue)
{
unsigned char nElement = pStream->Read( 1 );
while ( (nElement >> 7) == 1 )
{
nValue = (nValue << 7);
nValue |= (nElement & 0x7f);
nElement = pStream->Read( 1 );
}
nValue = (nValue << 7);
nValue |= (nElement & 0x7f);
return nValue;
}
static void JPT_ReInitMessageHeader(JPTMessageHeader *pHeader)
{
pHeader->nId = 0;
pHeader->nLastByte = 0;
pHeader->nMessageOffset = 0;
pHeader->nMessageLength = 0;
}
//-------------------------------------------------------------------------------------------------------------------------------
// Îñíîâíûå ôóíêöèè
//-------------------------------------------------------------------------------------------------------------------------------
void JPT_InitMessageHeader(JPTMessageHeader *pHeader)
{
pHeader->nId = 0;
pHeader->nLastByte = 0;
pHeader->nClassId = 0;
pHeader->nCSnId = 0;
pHeader->nMessageOffset = 0;
pHeader->nMessageLength = 0;
pHeader->nLayerNB = 0;
}
void JPT_ReadMessageHeader(PCommon pInfo, CReader *pStream, JPTMessageHeader *pHeader)
{
JPT_ReInitMessageHeader( pHeader );
// VBAS : Bin-ID
unsigned char nElement = pStream->Read( 1 );
// See for Class and CSn
unsigned char nClass = 0, nCSn = 0;
switch ( (nElement >> 5) & 0x03 )
{
case 0:
Event_Message( EVT_ERROR, "Forbidden value encounter in message header !!\n");
break;
case 1:
nClass = 0;
nCSn = 0;
break;
case 2:
nClass = 1;
nCSn = 0;
break;
case 3:
nClass = 1;
nCSn = 1;
break;
default:
break;
}
// [A.2.1 ISO/IEC FCD 15444-9]
if ( ( (nElement >> 4) & 0x01 ) == 1 )
pHeader->nLastByte = 1;
// In-class identifier
pHeader->nId |= (nElement & 0x0f);
if ( (nElement >> 7) == 1 )
pHeader->nId = JPT_ReadVBASInfo( pStream, pHeader->nId );
// VBAS : Class
if ( nClass == 1 )
{
pHeader->nClassId = 0;
pHeader->nClassId = JPT_ReadVBASInfo( pStream, pHeader->nClassId );
}
// VBAS : CSn
if ( nCSn == 1 )
{
pHeader->nCSnId = 0;
pHeader->nCSnId = JPT_ReadVBASInfo( pStream, pHeader->nCSnId );
}
// VBAS : Msg_offset
pHeader->nMessageOffset = JPT_ReadVBASInfo( pStream, pHeader->nMessageOffset );
// VBAS : Msg_length
pHeader->nMessageLength = JPT_ReadVBASInfo( pStream, pHeader->nMessageLength );
// VBAS : Aux
if ( ( pHeader->nClassId & 0x01 ) == 1 )
{
pHeader->nLayerNB = 0;
pHeader->nLayerNB = JPT_ReadVBASInfo( pStream, pHeader->nLayerNB );
}
}