116 lines
2.9 KiB
C++
116 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include "Types.h"
|
|
#include "Reader.h"
|
|
|
|
namespace Jpeg2000
|
|
{
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
// Вспомогательные функции
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
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);
|
|
}
|
|
}
|
|
} |