/** @file DLIB_BitOp.c @brief PHOENIX HAL library bitbuf/memchain/huffman Copyright 2006~2010 Digital STREAM Technology, Inc. All Rights Reserved */ #include "DHL_OSAL.h" #include "DHL_DBG.h" #include "DLIB_BitOp.h" ////#include /* ¸ðµç Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÏÁö´Â ¾ÊÀ¸¸ç, compile timeÀ» ÁÙÀ̱â À§ÇØ °¢ ¸ðµâÀº ÇÊ¿äÇÑ ¸¸Å­ÀÇ Çì´õ¸¦ ¼±¾ðÇϵµ·Ï ÇÔ. */ /* DHL µð¹ö±× ¸ðµâ À̸§ Á¤ÀÇ ·ê Âü°í: DHL ¸ðµâµéÀº ¸ðµÎ * ·Î ½ÃÀÛ. API´Â ´ë¹®ÀÚ, Platform ¹× ±âŸ´Â ¼Ò¹®ÀÚ »ç¿ë. µðÆúÆ® ·¹º§Àº 0À¸·Î ¼³Á¤ÇÑ´Ù. (0: ¿¡·¯ ¸Þ½ÃÁö¸¸ Ãâ·Â) */ //DHL_MODULE("!Bit", 0); #if COMMENT ____Config____(){} #endif /* ÀÌ ¸ðµâ ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â °¢Á¾ configuration Á¤ÀÇ. */ /* #define SUPPORT_FAST_SWITCHING_OPTIMIZATION 1 */ /* #define FUNC_MONITOR_TIMER_ID TIMER_ID_FUNC_MONITOR */ #if COMMENT ____Types____(){} #endif /* ÀÌ ¸ðµâ ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â structure ¹× enumerations. */ #if COMMENT ____Variables____(){} #endif /* global·Î Àû¿ëµÇ´Â variable Á¤ÀÇ. °¢ function º°·Î Ư¼öÇÑ ¿ëµµÀÇ variableÀº °¢ functionX block ¿¡¼­ Á¤ÀÇ °¡´É. */ #if COMMENT ____BitOp____(){} #endif static const UINT32 bitMaskTable[] = { 0x00000000,0x00000001,0x00000003,0x00000007,0x0000000F,0x0000001F,0x0000003F,0x0000007F, 0x000000FF,0x000001FF,0x000003FF,0x000007FF,0x00000FFF,0x00001FFF,0x00003FFF,0x00007FFF, 0x0000FFFF,0x0001FFFF,0x0003FFFF,0x0007FFFF,0x000FFFFF,0x001FFFFF,0x003FFFFF,0x007FFFFF, 0x00FFFFFF,0x01FFFFFF,0x03FFFFFF,0x07FFFFFF,0x0FFFFFFF,0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF, 0xFFFFFFFF }; static const UINT8 shiftTable1[] = {8,1,2,3,4,5,6,7}; static const UINT8 shiftTable2[] = {0,7,6,5,4,3,2,1}; DHL_RESULT bitBufferCreate (bitBufferPtr_t *instance, UINT8 *buffer, UINT32 bufSize) { bitBufferPtr_t bitBufferPtr; /* create bitBuffer structure */ bitBufferPtr = (bitBufferPtr_t)DHL_OS_Malloc(sizeof(bitBuffer_t)); if (bitBufferPtr == NULL) { return (DHL_FAIL_OUT_OF_MEMORY); } /* Initialize */ bitBufferPtr->buffer = buffer; bitBufferPtr->bufSize = bufSize; bitBufferPtr->bitOffset = 0; bitBufferPtr->overrunError = FALSE; /* pass instance to user */ *instance = bitBufferPtr; return DHL_OK; } DHL_RESULT bitBufferDestroy (bitBufferPtr_t instance) { if (instance == NULL) return DHL_FAIL_NULL_POINTER; DHL_OS_Free((void**)&instance); return DHL_OK; } UINT32 bitBufferGetBits (bitBufferPtr_t instance, UINT8 numberOfBits) { UINT32 returnBits = 0; UINT8 bitIndex; UINT8 newBitIndexDiv8,newBitIndexMod8; UINT8 readByteCount; UINT8 *p; UINT8 i; DHL_ASSERT((numberOfBits <= 32), "numberOfBits > 32"); if (numberOfBits > (8*instance->bufSize - instance->bitOffset)) { /* avoid too many overrun error message.. */ if (instance->overrunError == FALSE) { DHL_OS_Printf("bitBuffer Overrun! \n",numberOfBits); DHL_OS_Printf(" required bits %d, bitOffset %u:%d\n", numberOfBits, instance->bitOffset/8, instance->bitOffset%8); } instance->overrunError = TRUE; instance->bitOffset = 8*instance->bufSize; returnBits = 0; goto GetBitsReturn; } bitIndex = instance->bitOffset & 0x07; newBitIndexDiv8 = (bitIndex+numberOfBits) >> 3; newBitIndexMod8 = (bitIndex+numberOfBits) & 0x07; readByteCount = newBitIndexDiv8 + (newBitIndexMod8 ? 1:0); p = instance->buffer + (instance->bitOffset >> 3); /* copy first byte */ returnBits = *p++; if (readByteCount < 2) { /* shift bits right */ returnBits = returnBits >> shiftTable2[newBitIndexMod8]; } else { /* more bytes */ for (i=0; i < readByteCount-2; i++) { /* just copying 'middle' bytes */ returnBits = (returnBits << 8) | *p++; } /* copy last byte */ returnBits = (returnBits << shiftTable1[newBitIndexMod8]) | ((*p) >> shiftTable2[newBitIndexMod8]); } returnBits &= bitMaskTable[numberOfBits]; instance->bitOffset += numberOfBits; GetBitsReturn: return (returnBits); } void bitBufferSkipBits (bitBufferPtr_t instance, UINT16 numberOfBits) { instance->bitOffset += numberOfBits; if (8*instance->bufSize < instance->bitOffset) { instance->overrunError = TRUE; } } UINT8* bitBufferGetBytePointer (bitBufferPtr_t instance) { return (instance->buffer + (instance->bitOffset >> 3)); } BOOLEAN bitBufferCheckError (bitBufferPtr_t instance) { return (instance->overrunError); } void bitBufferInitialize(bitBufferPtr_t instance, UINT8 *buffer, UINT32 bufSize) { /* Initialize */ instance->buffer = buffer; instance->bufSize = bufSize; instance->bitOffset = 0; instance->overrunError = 0; } #if COMMENT ____Memchain____(){} #endif #define MEMCHAIN_MAGIC 0x45CBA9D1 typedef struct memElement { void* userData; struct memElement *next; } memElement_t, *memElementPtr_t; typedef struct memChainHead { UINT32 magic; UINT32 memLimit; myMalloc_f Malloc; myFree_f Free; UINT32 totalElements; UINT32 totalBytes; UINT32 totalUserBytes; memElementPtr_t element; } memChainHead_t, *memChainHeadPtr_t; static void *memChainMalloc(unsigned size, const char *_file, unsigned _line) { #if DHL_OS_USE_HEAP_DEBUG return DHL_OS_DbgMalloc(size, _file, _line); #else return DHL_OS_Malloc(size); #endif } static void memChainFree(void *p, const char *_file, unsigned _line) { // in fact, p is (void **) type. // but for myFree_f, we use (void *). #if DHL_OS_USE_HEAP_DEBUG DHL_OS_DbgFree(p, _file, _line); #else DHL_OS_Free(p); #endif } #undef memChainCreate DHL_RESULT memChainCreateDbg (memId_t *memId, memChainSetupPtr_t setupPtr, const char *_file, unsigned _line) { myMalloc_f Malloc; memChainHeadPtr_t memChainHeadPtr; DHL_RESULT err = DHL_OK; /* OS_DbgPrintf("memChainCreate()\n"); */ DHL_ASSERT((memId != NULL), "memChainCreate():param error"); DHL_ASSERT((setupPtr != NULL), "memChainCreate():param error"); if ((memId == NULL) || setupPtr == NULL) { err = DHL_FAIL_INVALID_PARAM; goto memChainCreateEnd; } if (setupPtr->Malloc == NULL) { Malloc = memChainMalloc; } else { Malloc = setupPtr->Malloc; } memChainHeadPtr = (memChainHeadPtr_t)Malloc(sizeof(memChainHead_t), _file, _line); if (memChainHeadPtr == NULL) { err = DHL_FAIL_OUT_OF_MEMORY; goto memChainCreateEnd; } memset(memChainHeadPtr,0x00,sizeof(memChainHead_t)); /* initialize */ memChainHeadPtr->memLimit = setupPtr->memLimit; memChainHeadPtr->Malloc = Malloc; if (setupPtr->Free == NULL) { memChainHeadPtr->Free = memChainFree; } else { memChainHeadPtr->Free = setupPtr->Free; } memChainHeadPtr->magic = MEMCHAIN_MAGIC; memChainHeadPtr->totalElements = 0; memChainHeadPtr->totalBytes = sizeof(memChainHead_t); memChainHeadPtr->totalUserBytes = 0; memChainHeadPtr->element = NULL; /* set instance */ *memId = memChainHeadPtr; memChainCreateEnd: return (err); } DHL_RESULT memChainCreate (memId_t *memId, memChainSetupPtr_t setupPtr) { return memChainCreateDbg (memId, setupPtr, NULL, 0); } #undef memChainDestroy DHL_RESULT memChainDestroyDbg (memId_t memId, const char *_file, unsigned _line) { memChainHeadPtr_t memChainHeadPtr = (memChainHeadPtr_t)memId; memElementPtr_t currElem, prevElem; /* OS_DbgPrintf("memChainDestroy(%d)\n", instance); OS_DbgPrintf("totalElements=%d\n", memChainHeadPtr->totalElements); */ DHL_ASSERT((memChainHeadPtr->magic == MEMCHAIN_MAGIC), "Not valid memChain.\n"); memChainHeadPtr->magic = 0; /* free the memElements */ currElem = memChainHeadPtr->element; while (currElem != NULL) { prevElem = currElem; currElem = currElem->next; /* OS_DbgPrintf("free:0x%08X\n",(INT32)prevElem); */ memChainHeadPtr->Free(&prevElem, _file, _line); } /* lastly, free the memChainHead */ memChainHeadPtr->Free(&memChainHeadPtr, _file, _line); /* OS_DbgPrintf("free:0x%08X\n",memChainHeadPtr); */ return DHL_OK; } DHL_RESULT memChainDestroy (memId_t memId) { return memChainDestroyDbg (memId, NULL, 0); } #undef memChainAlloc void* memChainAllocDbg (memId_t memId, UINT32 size, const char *_file, unsigned _line) { memChainHeadPtr_t memChainHeadPtr = (memChainHeadPtr_t)memId; memElementPtr_t memElementPtr; UINT32 allocSize; void *rptr, *p; DHL_ASSERT((memChainHeadPtr->magic == MEMCHAIN_MAGIC), "Not valid memChain.\n"); /* OS_DbgPrintf("memChainAlloc(%d), size:%d\n",instance,size); */ /* check the memLimit (memLimit = 0 means no limit) */ if (memChainHeadPtr->memLimit > 0) { if (memChainHeadPtr->totalUserBytes + size > memChainHeadPtr->memLimit) { DHL_OS_Printf("memLimit exceeded. totalUserBytes=%d\n", memChainHeadPtr->totalUserBytes); rptr = NULL; goto memChainAllocEnd; } } /* allocate the memory - add 8 bytes to guarantee 64-bit alignment of user data */ allocSize = sizeof(memElement_t) + size + 8; memElementPtr = (memElementPtr_t)memChainHeadPtr->Malloc(allocSize, _file, _line); if (memElementPtr == NULL) { rptr = NULL; goto memChainAllocEnd; } memset(memElementPtr,0x00,allocSize); p = (void *)(((UINT8 *)(memElementPtr) + sizeof(memElement_t))); /* align on 64-bit boundary */ memElementPtr->userData = (void *)((UINT32)(((UINT8 *)p)+8) & ((UINT32)(~0) << 3)); /*!PRM typecase UINT32*/ rptr = memElementPtr->userData; /* insert element in list */ memElementPtr->next = memChainHeadPtr->element; memChainHeadPtr->element = memElementPtr; /* update tracking statistics */ memChainHeadPtr->totalElements++; memChainHeadPtr->totalBytes += allocSize; memChainHeadPtr->totalUserBytes += size; /* OS_DbgPrintf("\ttotalElements:%d,",memChainHeadPtr->totalElements); OS_DbgPrintf("totalBytes:%d,",memChainHeadPtr->totalBytes); OS_DbgPrintf("totalUserBytes:%d\n",memChainHeadPtr->totalUserBytes); OS_DbgPrintf("memElementPtr:0x%08X\n", (INT32)memElementPtr); OS_DbgPrintf("rptr:0x%08X\n",(INT32)rptr); */ memChainAllocEnd: return (rptr); } void *memChainAlloc (memId_t memId, UINT32 size) { return memChainAllocDbg (memId, size, NULL, 0); } DHL_RESULT memChainStatus (memId_t memId, memChainStatus_t *pStatus) { memChainHeadPtr_t memChainHeadPtr = (memChainHeadPtr_t)memId; if (memChainHeadPtr==NULL || memChainHeadPtr->magic!=MEMCHAIN_MAGIC) { return DHL_FAIL_INVALID_HANDLE; } if (pStatus==NULL) { return DHL_FAIL_INVALID_PARAM; } pStatus->memLimit = memChainHeadPtr->memLimit; pStatus->totalElements = memChainHeadPtr->totalElements; pStatus->totalBytes = memChainHeadPtr->totalBytes; pStatus->totalUserBytes = memChainHeadPtr->totalUserBytes; return DHL_OK; } #if COMMENT ____Huffman____(){} #endif /* Huffman Special Characters */ #define STRING_TERMINATE 0x00 #define ORDER_1_ESCAPE 0x1B /* Table element syntax */ #define LEAF_FLAG_MASK 0x80 #define LEAF_CHAR_MASK 0x7F /* Huffman Program Title Decode Table C.5 */ static const UINT8 ProgramTitleDecodeTableC5 [] = { 0x01, 0x00, 0x01, 0x3A, 0x01, 0x3C, 0x01, 0x3E, 0x01, 0x40, 0x01, 0x42, 0x01, 0x44, 0x01, 0x46, 0x01, 0x48, 0x01, 0x4A, 0x01, 0x4C, 0x01, 0x4E, 0x01, 0x50, 0x01, 0x52, 0x01, 0x54, 0x01, 0x56, 0x01, 0x58, 0x01, 0x5A, 0x01, 0x5C, 0x01, 0x5E, 0x01, 0x60, 0x01, 0x62, 0x01, 0x64, 0x01, 0x66, 0x01, 0x68, 0x01, 0x6A, 0x01, 0x6C, 0x01, 0x6E, 0x01, 0x70, 0x01, 0x72, 0x01, 0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0xCE, 0x01, 0xD2, 0x01, 0xD4, 0x01, 0xD6, 0x01, 0xD8, 0x01, 0xDA, 0x01, 0xDC, 0x01, 0xE6, 0x01, 0xE8, 0x01, 0xEA, 0x01, 0xF0, 0x01, 0xF2, 0x01, 0xF4, 0x02, 0x06, 0x02, 0x12, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x28, 0x02, 0x30, 0x02, 0x34, 0x02, 0x36, 0x02, 0x38, 0x02, 0x3A, 0x02, 0x3C, 0x02, 0x3E, 0x02, 0x46, 0x02, 0x48, 0x02, 0x4A, 0x02, 0x4C, 0x02, 0x4E, 0x02, 0x50, 0x02, 0x52, 0x02, 0x54, 0x02, 0x7E, 0x02, 0x92, 0x02, 0xAC, 0x02, 0xBA, 0x02, 0xD2, 0x02, 0xE4, 0x02, 0xFA, 0x03, 0x06, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x32, 0x03, 0x3E, 0x03, 0x52, 0x03, 0x64, 0x03, 0x7A, 0x03, 0x94, 0x03, 0x98, 0x03, 0xA4, 0x03, 0xC8, 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xF4, 0x04, 0x04, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x10, 0x04, 0x12, 0x04, 0x14, 0x04, 0x16, 0x04, 0x18, 0x04, 0x1A, 0x04, 0x1C, 0x04, 0x52, 0x04, 0x6A, 0x04, 0x8E, 0x04, 0xAE, 0x04, 0xEE, 0x05, 0x06, 0x05, 0x28, 0x05, 0x44, 0x05, 0x72, 0x05, 0x76, 0x05, 0x90, 0x05, 0xBE, 0x05, 0xD6, 0x06, 0x0A, 0x06, 0x44, 0x06, 0x64, 0x06, 0x66, 0x06, 0x9A, 0x06, 0xD0, 0x06, 0xFC, 0x07, 0x22, 0x07, 0x2C, 0x07, 0x46, 0x07, 0x54, 0x07, 0x7C, 0x07, 0x8A, 0x07, 0x8C, 0x07, 0x8E, 0x07, 0x90, 0x07, 0x92, 0x1B, 0x1C, 0xB4, 0xA4, 0xB2, 0xB7, 0xDA, 0x01, 0xD1, 0x02, 0x03, 0x9B, 0x04, 0xD5, 0xD9, 0x05, 0xCB, 0xD6, 0x06, 0xCF, 0x07, 0x08, 0xCA, 0x09, 0xC9, 0xC5, 0xC6, 0x0A, 0xD2, 0xC4, 0xC7, 0xCC, 0xD0, 0xC8, 0xD7, 0xCE, 0x0B, 0xC1, 0x0C, 0xC2, 0xCD, 0xC3, 0x0D, 0x0E, 0x0F, 0x10, 0xD3, 0x11, 0xD4, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x29, 0x2A, 0xD8, 0xE5, 0xB9, 0x01, 0xA7, 0xB1, 0xEC, 0xD1, 0x02, 0xAD, 0xB2, 0xDA, 0xE3, 0xB3, 0x03, 0xE4, 0xE6, 0x04, 0x9B, 0xE2, 0x05, 0x06, 0x07, 0x08, 0x09, 0xD5, 0x0A, 0xD6, 0x0B, 0xD9, 0x0C, 0xA6, 0xE9, 0xCB, 0xC5, 0xCF, 0x0D, 0x0E, 0xCA, 0xC9, 0x0F, 0xC7, 0x10, 0x11, 0xE1, 0x12, 0x13, 0xC6, 0xD2, 0xC8, 0xCE, 0xC1, 0xC4, 0xD0, 0xCC, 0x14, 0x15, 0xEF, 0xC2, 0xD7, 0x16, 0xCD, 0x17, 0xF4, 0xD4, 0x18, 0x19, 0x1A, 0xC3, 0xD3, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x01, 0x80, 0xA0, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0xB1, 0x9B, 0x9B, 0x9B, 0x9B, 0xA0, 0x04, 0xF3, 0xE4, 0xB9, 0x01, 0xF4, 0xA0, 0x9B, 0x02, 0x03, 0x9B, 0x9B, 0x9B, 0x9B, 0x01, 0x02, 0x9B, 0xC1, 0xC8, 0xD3, 0x9B, 0x9B, 0x9B, 0xA0, 0x07, 0x08, 0xB1, 0xD2, 0xD3, 0xD4, 0xD5, 0xAD, 0xCD, 0xC1, 0x01, 0x02, 0x03, 0xA0, 0x04, 0x9B, 0x05, 0x06, 0xA0, 0x05, 0xC9, 0xD7, 0xD3, 0x01, 0x02, 0x9B, 0xAE, 0x80, 0x03, 0x04, 0x9B, 0x9B, 0x02, 0x03, 0xAD, 0x9B, 0x01, 0x80, 0xA0, 0xB0, 0x04, 0x05, 0x80, 0x9B, 0xB1, 0xB2, 0xA0, 0xB0, 0xB9, 0x01, 0x02, 0x03, 0x02, 0x03, 0xB1, 0xBA, 0x01, 0xB0, 0x9B, 0x80, 0x80, 0x01, 0xB0, 0x9B, 0x9B, 0xB8, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0xB0, 0x9B, 0xA0, 0x02, 0x03, 0xB1, 0xB3, 0xB9, 0xB0, 0x01, 0x9B, 0x9B, 0xA0, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x80, 0x9B, 0x9B, 0x13, 0x14, 0xAA, 0xAD, 0xAE, 0xF6, 0xE7, 0xF4, 0xE2, 0xE9, 0x01, 0x02, 0xC2, 0xF0, 0x9B, 0xF3, 0xE3, 0xE6, 0xF7, 0x03, 0xF5, 0x04, 0x05, 0x06, 0xF2, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xE4, 0xA0, 0x0D, 0xEC, 0xEE, 0x0E, 0xED, 0x0F, 0x10, 0x11, 0x12, 0x08, 0x09, 0xC1, 0xD3, 0x9B, 0x01, 0xC3, 0x02, 0xE9, 0xEC, 0x03, 0xF2, 0xF5, 0x04, 0xEF, 0xE1, 0x05, 0xE5, 0x06, 0x07, 0x0B, 0x0C, 0xC1, 0xF9, 0x01, 0xC2, 0xCF, 0xE5, 0xF5, 0x9B, 0xE9, 0x02, 0xA0, 0x03, 0x04, 0x05, 0xF2, 0x06, 0xEC, 0x07, 0xE1, 0x08, 0x09, 0xE8, 0x0A, 0xEF, 0x05, 0x06, 0xF9, 0x9B, 0x01, 0xF5, 0x02, 0xF2, 0xE9, 0xE5, 0xEF, 0x03, 0xE1, 0x04, 0x0A, 0x0B, 0xF1, 0xF5, 0xF3, 0x01, 0xED, 0xF9, 0xC3, 0x02, 0xEC, 0xEE, 0xE4, 0xF8, 0x03, 0x9B, 0xF6, 0x04, 0x05, 0xE1, 0x06, 0x07, 0x08, 0x09, 0x07, 0x08, 0xA0, 0x9B, 0xCC, 0x01, 0xE5, 0x02, 0xEC, 0xF5, 0xEF, 0x03, 0xE9, 0xF2, 0x04, 0x05, 0xE1, 0x06, 0x09, 0x0A, 0xAE, 0xEC, 0xF9, 0xC1, 0xE8, 0x01, 0x9B, 0x02, 0x03, 0x04, 0xE1, 0xF5, 0xE9, 0x05, 0xE5, 0x06, 0xF2, 0xEF, 0x07, 0x08, 0xEF, 0x05, 0x80, 0x9B, 0xF5, 0x01, 0x02, 0xE9, 0xE1, 0x03, 0xE5, 0x04, 0xEE, 0x0B, 0xBA, 0xD4, 0xAE, 0xF2, 0xE3, 0x01, 0xA0, 0x02, 0x80, 0x9B, 0xED, 0x03, 0xC9, 0xF3, 0xF4, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x02, 0x03, 0x9B, 0xF5, 0x01, 0xE1, 0xEF, 0xE5, 0x05, 0xE9, 0xE1, 0xEF, 0xF5, 0xEE, 0x9B, 0xE5, 0x01, 0x02, 0x03, 0x04, 0x04, 0x05, 0xA0, 0x9B, 0x01, 0xF5, 0x02, 0xE5, 0xEF, 0x03, 0xE1, 0xE9, 0x08, 0x09, 0xAA, 0xD4, 0x01, 0x9B, 0xE3, 0x02, 0xF2, 0x03, 0xE5, 0x04, 0xF5, 0xF9, 0xE9, 0x05, 0xEF, 0x06, 0x07, 0xE1, 0xE5, 0x08, 0xCE, 0xA0, 0xC6, 0xF5, 0x01, 0x02, 0x9B, 0xC2, 0x03, 0xE1, 0x04, 0xEF, 0x05, 0xE9, 0x06, 0x07, 0x09, 0x0A, 0xE4, 0xF3, 0xE6, 0xF6, 0xF7, 0xF0, 0xF2, 0x01, 0xEC, 0x02, 0x03, 0xA0, 0x9B, 0x04, 0x05, 0xF5, 0x06, 0x07, 0xEE, 0x08, 0x0B, 0x0C, 0xA0, 0xF3, 0xF9, 0xAE, 0xD2, 0xC7, 0x01, 0x9B, 0x02, 0xF5, 0x03, 0x04, 0x05, 0xE9, 0xEC, 0x06, 0xE5, 0x07, 0xEF, 0x08, 0xE1, 0x09, 0xF2, 0x0A, 0x01, 0xF5, 0x9B, 0xD6, 0x04, 0x05, 0xE8, 0x9B, 0x01, 0xF5, 0x02, 0xE1, 0xE9, 0xEF, 0x03, 0xE5, 0x10, 0x11, 0xAA, 0xEC, 0xF1, 0xAE, 0xA0, 0xF7, 0xED, 0xEE, 0x01, 0x02, 0x9B, 0xEB, 0x03, 0x04, 0x05, 0x06, 0xE3, 0x07, 0xEF, 0x08, 0xE9, 0xF5, 0x09, 0xE1, 0xE5, 0xF0, 0xE8, 0x0A, 0x0B, 0x0C, 0x0D, 0xF4, 0x0E, 0x0F, 0xE8, 0x0A, 0xAD, 0xCE, 0x9B, 0x01, 0xD6, 0x02, 0xF5, 0xF7, 0x03, 0x04, 0xE1, 0xE5, 0xE9, 0x05, 0xF2, 0x06, 0xEF, 0x07, 0x08, 0x09, 0xEE, 0x03, 0xEC, 0xAE, 0x01, 0x9B, 0x02, 0xF0, 0x06, 0xE9, 0xA0, 0xC3, 0xEF, 0x9B, 0xE5, 0x01, 0x80, 0x02, 0x03, 0xE1, 0x04, 0x05, 0x06, 0x07, 0xC6, 0xD7, 0x01, 0x9B, 0xF2, 0x02, 0x03, 0xE8, 0xE5, 0xE1, 0x04, 0xE9, 0xEF, 0x05, 0x9B, 0x9B, 0x02, 0xEF, 0xE1, 0x9B, 0x01, 0xE5, 0x01, 0xEF, 0x9B, 0xE1, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x19, 0x1A, 0x9B, 0xBA, 0xE5, 0xEA, 0xF8, 0x01, 0x02, 0xE6, 0xA7, 0x03, 0xFA, 0xE8, 0x04, 0xF7, 0x05, 0xF5, 0xE2, 0x06, 0xEB, 0x07, 0xF0, 0x08, 0x80, 0xF6, 0xE7, 0x09, 0xE4, 0x0A, 0xA0, 0xE9, 0x0B, 0xE3, 0xF9, 0x0C, 0x0D, 0xED, 0x0E, 0x0F, 0xF3, 0x10, 0x11, 0xEC, 0x12, 0xF4, 0xF2, 0x13, 0xEE, 0x14, 0x15, 0x16, 0x17, 0x18, 0x0A, 0x0B, 0xF3, 0x9B, 0xF5, 0xE2, 0x01, 0x80, 0xA0, 0x02, 0xE5, 0xF2, 0xE9, 0x03, 0xEC, 0x04, 0xF9, 0x05, 0xEF, 0x06, 0xE1, 0x07, 0x08, 0x09, 0x10, 0x11, 0xC3, 0xCC, 0xC7, 0x9B, 0xE3, 0x01, 0x80, 0xEC, 0xF9, 0x02, 0xF3, 0x03, 0xF5, 0x04, 0x05, 0xF2, 0x06, 0xE9, 0xA0, 0x07, 0x08, 0xEF, 0xF4, 0x09, 0x0A, 0xE1, 0x0B, 0xE8, 0xEB, 0xE5, 0x0C, 0x0D, 0x0E, 0x0F, 0x0E, 0x0F, 0xAE, 0xF5, 0xF7, 0x01, 0xEC, 0x02, 0xE4, 0xE7, 0xF2, 0x03, 0x9B, 0xEF, 0x04, 0xF6, 0x05, 0x06, 0xF9, 0xF3, 0x07, 0xE9, 0xE1, 0x08, 0x09, 0x80, 0x0A, 0x0B, 0xE5, 0x0C, 0x0D, 0xA0, 0x1E, 0x1F, 0x9B, 0xA1, 0xAD, 0xE8, 0xEA, 0xF1, 0xF5, 0xFA, 0x01, 0x02, 0x03, 0x04, 0xBA, 0xF8, 0xA7, 0xE2, 0xE9, 0x05, 0x06, 0x07, 0xE6, 0xED, 0xE7, 0xEB, 0x08, 0x09, 0xF6, 0xF0, 0x0A, 0xEF, 0x0B, 0xE3, 0x0C, 0x0D, 0x0E, 0xF9, 0x0F, 0xE4, 0xEC, 0x10, 0xE5, 0x11, 0xF4, 0xF7, 0x12, 0x13, 0xE1, 0x14, 0x15, 0x16, 0xEE, 0xF3, 0x17, 0x80, 0x18, 0x19, 0xF2, 0x1A, 0x1B, 0xA0, 0x1C, 0x1D, 0xA0, 0x0B, 0xF5, 0x9B, 0x01, 0xEC, 0xF3, 0xF2, 0x80, 0xE1, 0x02, 0x03, 0xF4, 0xE9, 0xEF, 0xE6, 0x04, 0x05, 0x06, 0x07, 0xE5, 0x08, 0x09, 0x0A, 0x0F, 0x10, 0xBA, 0xF9, 0xA7, 0xF4, 0x9B, 0x01, 0xE7, 0xEC, 0x02, 0xEE, 0x03, 0xEF, 0xF5, 0x04, 0xF2, 0x05, 0x06, 0xE9, 0x07, 0xF3, 0xE1, 0x08, 0x09, 0x0A, 0x0B, 0xE5, 0x80, 0x0C, 0xE8, 0xA0, 0x0D, 0x0E, 0xE5, 0x0D, 0xE2, 0xF5, 0xF7, 0x9B, 0xEC, 0x01, 0xF9, 0xEE, 0x02, 0x03, 0x04, 0xF2, 0x05, 0x80, 0x06, 0xA0, 0xE1, 0xEF, 0x07, 0xF4, 0xE9, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x15, 0x16, 0xA1, 0xF8, 0xE9, 0xEB, 0x01, 0x80, 0x9B, 0xFA, 0xE2, 0x02, 0x03, 0x04, 0xA0, 0xF0, 0x05, 0x06, 0x07, 0xE1, 0x08, 0xE6, 0xF2, 0xED, 0xF6, 0x09, 0xE4, 0x0A, 0xEF, 0xF4, 0xEC, 0xF3, 0xE7, 0xE5, 0x0B, 0xE3, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0xEE, 0x14, 0xEF, 0x01, 0x9B, 0xE1, 0x0B, 0x0C, 0xD4, 0xEF, 0xE6, 0xEC, 0xF7, 0xE1, 0x01, 0xBA, 0x02, 0x9B, 0xF9, 0x03, 0x04, 0x05, 0xF3, 0x06, 0x07, 0x08, 0xE9, 0xA0, 0x09, 0x80, 0xE5, 0x0A, 0x15, 0x16, 0xA7, 0xBA, 0xE3, 0xF7, 0xF2, 0xAD, 0xE2, 0x01, 0x02, 0x9B, 0xE6, 0x03, 0xED, 0xF6, 0x04, 0xEB, 0x05, 0xF4, 0x06, 0x07, 0x08, 0xF3, 0x09, 0xF5, 0x0A, 0xEF, 0x0B, 0x0C, 0x80, 0xF9, 0xE1, 0x0D, 0xE4, 0xE9, 0xA0, 0x0E, 0x0F, 0xEC, 0xE5, 0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x0B, 0xF9, 0x9B, 0xF5, 0xF3, 0x01, 0x02, 0xE2, 0xED, 0x80, 0x03, 0xF0, 0xEF, 0x04, 0xA0, 0x05, 0xE9, 0x06, 0xE1, 0x07, 0x08, 0x09, 0xE5, 0x18, 0x19, 0xE2, 0xEA, 0xF2, 0xE8, 0xEC, 0xED, 0xFA, 0x9B, 0x01, 0xF5, 0x02, 0x03, 0xF6, 0x04, 0xBA, 0xE6, 0x05, 0x06, 0xEB, 0xEF, 0x07, 0xA7, 0xF9, 0x08, 0x09, 0x0A, 0x0B, 0xE3, 0x0C, 0xEE, 0xE1, 0x0D, 0xF3, 0x0E, 0xE9, 0x0F, 0x10, 0xF4, 0x80, 0xE4, 0xE5, 0x11, 0x12, 0xE7, 0xA0, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1B, 0x1C, 0xAE, 0xFA, 0xBF, 0x01, 0xA7, 0x9B, 0x02, 0xE9, 0xF8, 0xF9, 0x03, 0xE5, 0xE8, 0x04, 0xE1, 0xEB, 0x05, 0xE2, 0x06, 0x07, 0xE3, 0x08, 0xE7, 0xF4, 0x09, 0x80, 0xF6, 0xF0, 0x0A, 0xE4, 0x0B, 0xF3, 0xF7, 0x0C, 0x0D, 0xEF, 0xEC, 0xA0, 0x0E, 0x0F, 0xED, 0xE6, 0x10, 0xF5, 0x11, 0x12, 0x13, 0x14, 0x15, 0xF2, 0x16, 0xEE, 0x17, 0x18, 0x19, 0x1A, 0x0E, 0x0F, 0xED, 0xA7, 0x9B, 0xE4, 0x01, 0xF9, 0xF3, 0xF2, 0xF4, 0x02, 0xE8, 0x03, 0xEC, 0xF0, 0x04, 0xE1, 0xE9, 0x05, 0x06, 0x80, 0xA0, 0x07, 0x08, 0x09, 0x0A, 0xE5, 0xEF, 0x0B, 0x0C, 0x0D, 0x9B, 0xF5, 0x18, 0x19, 0xBA, 0xAC, 0xF6, 0x9B, 0xF0, 0xE2, 0x01, 0xE6, 0x02, 0xA7, 0xAE, 0xE7, 0x03, 0xE3, 0xF5, 0x04, 0xED, 0x05, 0x06, 0x07, 0xEB, 0x08, 0x09, 0xEE, 0xF2, 0x0A, 0xE4, 0x0B, 0xF9, 0xEC, 0x0C, 0x0D, 0xF4, 0x80, 0x0E, 0xEF, 0xF3, 0xA0, 0xE1, 0x0F, 0xE9, 0x10, 0x11, 0xE5, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1A, 0xA7, 0xAC, 0xBF, 0xC3, 0xC8, 0xE4, 0xE6, 0xED, 0xF2, 0xAE, 0xEC, 0xEE, 0xF9, 0x01, 0x02, 0x03, 0x04, 0xBA, 0x05, 0x9B, 0xF5, 0x06, 0x07, 0x08, 0x09, 0xEB, 0xF0, 0x0A, 0x0B, 0x0C, 0xE1, 0xE3, 0x0D, 0xE8, 0x0E, 0x0F, 0xEF, 0x10, 0x11, 0xF3, 0x12, 0xE9, 0x13, 0xE5, 0x14, 0x15, 0xF4, 0x16, 0x17, 0xA0, 0x18, 0x80, 0x14, 0x15, 0xBA, 0xBF, 0xE4, 0xF7, 0x9B, 0xA7, 0x01, 0xEE, 0x02, 0x03, 0x04, 0xE3, 0xE2, 0xED, 0x05, 0xF9, 0x06, 0xF4, 0x07, 0xEC, 0x08, 0xF5, 0xF2, 0x09, 0xE1, 0xF3, 0x0A, 0xEF, 0x0B, 0x0C, 0x0D, 0xE9, 0x80, 0xE5, 0x0E, 0xA0, 0x0F, 0xE8, 0x10, 0x11, 0x12, 0x13, 0x11, 0x12, 0xEB, 0xFA, 0x80, 0xE6, 0x9B, 0x01, 0xA0, 0x02, 0x03, 0xE9, 0xE1, 0x04, 0xE4, 0xF0, 0xED, 0xE2, 0xE3, 0xE7, 0xEC, 0x05, 0xE5, 0x06, 0x07, 0x08, 0x09, 0xF4, 0x0A, 0x0B, 0x0C, 0xF3, 0xEE, 0x0D, 0x0E, 0xF2, 0x0F, 0x10, 0x04, 0xE5, 0xF3, 0xEF, 0x9B, 0x01, 0xE1, 0x02, 0x03, 0xE9, 0x0B, 0x0C, 0xA7, 0xE2, 0xEC, 0xE3, 0xF2, 0x01, 0x9B, 0x02, 0x03, 0x04, 0xE9, 0xEF, 0xEE, 0xE5, 0xE1, 0x80, 0x05, 0xA0, 0x06, 0x07, 0x08, 0x09, 0xF3, 0x0A, 0x05, 0x06, 0x9B, 0xA0, 0xE1, 0xE5, 0xE9, 0x01, 0x80, 0xF0, 0x02, 0xF4, 0x03, 0x04, 0xA0, 0x13, 0xE3, 0xAD, 0xE4, 0xE9, 0xEE, 0xEF, 0xF0, 0xF4, 0xF6, 0xA1, 0xE1, 0xED, 0x01, 0xE2, 0x02, 0x03, 0x04, 0xA7, 0x05, 0x06, 0xF7, 0x07, 0x9B, 0xEC, 0x08, 0xE5, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xF3, 0x0F, 0x10, 0x11, 0x80, 0x12, 0x05, 0x06, 0xE5, 0xFA, 0xA0, 0xF9, 0x9B, 0x01, 0x80, 0xE9, 0x02, 0xE1, 0x03, 0x04, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B }; /* Huffman Program Description Decode Table C.7 */ static const UINT8 ProgramDescriptionDecodeTableC7 [] = { 0x01, 0x00, 0x01, 0x2C, 0x01, 0x2E, 0x01, 0x30, 0x01, 0x32, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, 0x01, 0x3A, 0x01, 0x3C, 0x01, 0x3E, 0x01, 0x40, 0x01, 0x42, 0x01, 0x44, 0x01, 0x46, 0x01, 0x48, 0x01, 0x4A, 0x01, 0x4C, 0x01, 0x4E, 0x01, 0x50, 0x01, 0x52, 0x01, 0x54, 0x01, 0x56, 0x01, 0x58, 0x01, 0x5A, 0x01, 0x5C, 0x01, 0x5E, 0x01, 0x60, 0x01, 0x62, 0x01, 0x64, 0x01, 0x66, 0x01, 0x68, 0x01, 0x6A, 0x01, 0xDE, 0x01, 0xE0, 0x01, 0xEA, 0x01, 0xEC, 0x01, 0xEE, 0x01, 0xF0, 0x01, 0xF2, 0x01, 0xF8, 0x01, 0xFA, 0x01, 0xFC, 0x01, 0xFE, 0x02, 0x00, 0x02, 0x04, 0x02, 0x16, 0x02, 0x20, 0x02, 0x22, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3C, 0x02, 0x40, 0x02, 0x44, 0x02, 0x46, 0x02, 0x4A, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x56, 0x02, 0x58, 0x02, 0x5A, 0x02, 0x5C, 0x02, 0x5E, 0x02, 0x60, 0x02, 0x62, 0x02, 0x76, 0x02, 0x84, 0x02, 0x94, 0x02, 0xA2, 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC8, 0x02, 0xD2, 0x02, 0xDE, 0x02, 0xEA, 0x02, 0xF2, 0x02, 0xFC, 0x03, 0x08, 0x03, 0x10, 0x03, 0x1A, 0x03, 0x28, 0x03, 0x2A, 0x03, 0x34, 0x03, 0x4A, 0x03, 0x5A, 0x03, 0x5E, 0x03, 0x64, 0x03, 0x6E, 0x03, 0x70, 0x03, 0x72, 0x03, 0x74, 0x03, 0x76, 0x03, 0x78, 0x03, 0x7A, 0x03, 0x7C, 0x03, 0x7E, 0x03, 0x80, 0x03, 0xB4, 0x03, 0xCE, 0x03, 0xF0, 0x04, 0x1A, 0x04, 0x58, 0x04, 0x6E, 0x04, 0x8E, 0x04, 0xAC, 0x04, 0xD8, 0x04, 0xE0, 0x04, 0xF4, 0x05, 0x24, 0x05, 0x40, 0x05, 0x76, 0x05, 0xAE, 0x05, 0xCE, 0x05, 0xD0, 0x06, 0x06, 0x06, 0x34, 0x06, 0x60, 0x06, 0x86, 0x06, 0x92, 0x06, 0xAA, 0x06, 0xB8, 0x06, 0xDC, 0x06, 0xEC, 0x06, 0xEE, 0x06, 0xF0, 0x06, 0xF2, 0x06, 0xF4, 0x14, 0x15, 0x9B, 0xD6, 0xC9, 0xCF, 0xD7, 0xC7, 0x01, 0xA2, 0xCE, 0xCB, 0x02, 0x03, 0xC5, 0xCC, 0xC6, 0xC8, 0x04, 0xC4, 0x05, 0xC2, 0x06, 0xC3, 0xD2, 0x07, 0xD3, 0x08, 0xCA, 0xD4, 0x09, 0xCD, 0xD0, 0x0A, 0xC1, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x38, 0x39, 0xAD, 0xAF, 0xB7, 0xDA, 0xA8, 0xB3, 0xB5, 0x01, 0x02, 0x9B, 0xB4, 0xF1, 0xA2, 0xD5, 0xD6, 0xD9, 0x03, 0x04, 0x05, 0xCF, 0x06, 0xC9, 0xF9, 0xEA, 0xEB, 0xF5, 0xF6, 0x07, 0x08, 0x09, 0xB2, 0xC5, 0xC6, 0xB1, 0x0A, 0xEE, 0xCB, 0x0B, 0xD4, 0x0C, 0xC4, 0xC8, 0xD2, 0x0D, 0x0E, 0x0F, 0xC7, 0xCA, 0xCE, 0xD0, 0xD7, 0x10, 0xC2, 0x11, 0xCC, 0xEC, 0xE5, 0xE7, 0x12, 0xCD, 0x13, 0x14, 0xC3, 0x15, 0x16, 0x17, 0xED, 0x18, 0x19, 0xF2, 0x1A, 0xD3, 0x1B, 0x1C, 0xE4, 0x1D, 0xC1, 0xE3, 0x1E, 0xE9, 0xF0, 0xE2, 0xF7, 0x1F, 0xF3, 0xE6, 0x20, 0x21, 0x22, 0xE8, 0xEF, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0xF4, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0xE1, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x9B, 0x9B, 0x03, 0x04, 0x80, 0xAE, 0xC8, 0xD4, 0x01, 0x02, 0x9B, 0xA0, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x02, 0xF3, 0xA0, 0xF4, 0x9B, 0x01, 0x9B, 0x9B, 0xAC, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x01, 0xA0, 0x9B, 0xA2, 0x07, 0x08, 0xE2, 0xE4, 0xE5, 0xE6, 0xA0, 0xF2, 0xE1, 0x01, 0x02, 0xF3, 0xE3, 0x03, 0x04, 0x05, 0x9B, 0x06, 0x04, 0x80, 0xCA, 0xD3, 0xA2, 0x01, 0x9B, 0x02, 0x03, 0xA0, 0x9B, 0xA0, 0x03, 0x04, 0x9B, 0xB7, 0xF4, 0xA0, 0xB0, 0xF3, 0x01, 0x02, 0xB9, 0x02, 0xB8, 0x9B, 0xA0, 0x01, 0xAE, 0x02, 0xB6, 0x9B, 0x01, 0xA0, 0xA0, 0x01, 0x9B, 0xB0, 0xAE, 0x01, 0x9B, 0xA0, 0xAE, 0x01, 0xA0, 0x9B, 0x9B, 0x9B, 0x9B, 0x01, 0xAC, 0xAE, 0x9B, 0x9B, 0x02, 0x03, 0x9B, 0xA0, 0xB5, 0xB6, 0xB8, 0x01, 0x9B, 0xA0, 0x9B, 0xA0, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0xA0, 0x9B, 0x9B, 0x08, 0x09, 0xE6, 0xF5, 0xF3, 0xF4, 0x9B, 0xE4, 0x01, 0xED, 0x02, 0x03, 0x04, 0xF2, 0x05, 0x06, 0xEC, 0xEE, 0x07, 0xA0, 0x05, 0x06, 0x9B, 0xEC, 0xF5, 0x01, 0x02, 0xE1, 0xEF, 0xE5, 0xE9, 0xF2, 0x03, 0x04, 0x06, 0x07, 0x9B, 0xE9, 0xF9, 0xF2, 0xF5, 0x01, 0x02, 0x03, 0xEC, 0xEF, 0xE1, 0x04, 0xE8, 0x05, 0x05, 0x06, 0xF9, 0xF2, 0xF5, 0x9B, 0xE5, 0xEF, 0x01, 0x02, 0xE9, 0xE1, 0x03, 0x04, 0x06, 0x07, 0xE1, 0xE9, 0xEE, 0xF6, 0xE4, 0xEC, 0xF3, 0x01, 0x02, 0xF2, 0x03, 0x04, 0x9B, 0x05, 0x02, 0x03, 0xE5, 0xEC, 0x9B, 0xEF, 0x01, 0xF2, 0x05, 0x06, 0xF5, 0xEF, 0x9B, 0xEC, 0xE9, 0x01, 0xE1, 0xF2, 0x02, 0xE5, 0x03, 0x04, 0x03, 0x04, 0x9B, 0xE5, 0xE9, 0xF5, 0xE1, 0x01, 0xEF, 0x02, 0x04, 0x05, 0xA0, 0xC9, 0xF3, 0x9B, 0xAE, 0xF2, 0x01, 0x02, 0x03, 0xEE, 0xEF, 0x05, 0x9B, 0xAE, 0xE9, 0xE5, 0x01, 0xF5, 0x02, 0xE1, 0x03, 0x04, 0xE5, 0x03, 0xE1, 0xE9, 0xF2, 0x9B, 0x01, 0x02, 0x03, 0x04, 0x9B, 0xE9, 0xF5, 0x01, 0xE5, 0x02, 0xEF, 0xE1, 0xE1, 0x05, 0x9B, 0xE3, 0xEF, 0x01, 0xF5, 0xE5, 0x02, 0x03, 0xE9, 0x04, 0xE5, 0x03, 0x9B, 0xE9, 0x01, 0xE1, 0xEF, 0x02, 0x03, 0x04, 0xA7, 0xEE, 0xEC, 0xF2, 0xF3, 0x01, 0x9B, 0x02, 0xE1, 0x06, 0x9B, 0xE8, 0xE9, 0x01, 0xF2, 0xEC, 0x02, 0xEF, 0x03, 0xE5, 0x04, 0x05, 0x9B, 0x9B, 0x03, 0x04, 0x9B, 0xAE, 0x01, 0xE9, 0x02, 0xE1, 0xE5, 0xEF, 0x09, 0x0A, 0xF6, 0xF9, 0x01, 0xAE, 0xE3, 0xE9, 0xF5, 0x9B, 0xE5, 0xEF, 0x02, 0x03, 0xE1, 0x04, 0xE8, 0x05, 0x06, 0xF4, 0x07, 0x08, 0xE8, 0x07, 0xE5, 0xF7, 0xD6, 0xE1, 0x9B, 0xE9, 0xF2, 0x01, 0x02, 0x03, 0x04, 0xEF, 0x05, 0x06, 0xAE, 0x01, 0x9B, 0xEE, 0xE9, 0x02, 0xE5, 0x9B, 0xA0, 0x01, 0x03, 0x04, 0x9B, 0xE8, 0xE5, 0xE1, 0xEF, 0x01, 0xE9, 0x02, 0x9B, 0x9B, 0x9B, 0xEF, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x18, 0x19, 0xE8, 0xEF, 0xF8, 0x9B, 0xA7, 0xF7, 0xFA, 0x01, 0x02, 0x03, 0x04, 0xE5, 0xAE, 0x05, 0xE6, 0xE2, 0x06, 0xF6, 0xEB, 0xF5, 0xE9, 0x07, 0xF0, 0xF9, 0xE7, 0x08, 0x09, 0xE4, 0x0A, 0xE3, 0x0B, 0xED, 0x0C, 0xF3, 0x0D, 0x0E, 0x0F, 0xEC, 0x10, 0xF4, 0x11, 0x12, 0xF2, 0xA0, 0x13, 0x14, 0x15, 0xEE, 0x16, 0x17, 0x0B, 0x0C, 0xE4, 0xF3, 0x9B, 0xAE, 0xE2, 0x01, 0x02, 0x03, 0xEC, 0xA0, 0x04, 0xE9, 0xF2, 0xF5, 0x05, 0xF9, 0xE1, 0x06, 0xEF, 0x07, 0xE5, 0x08, 0x09, 0x0A, 0x0F, 0x10, 0xF1, 0xAE, 0xC4, 0xF9, 0xAC, 0x01, 0xE3, 0x02, 0x9B, 0xF2, 0x03, 0x04, 0xA0, 0xEC, 0xF5, 0x05, 0x06, 0xE9, 0x07, 0xEB, 0x08, 0xF4, 0x09, 0xE5, 0x0A, 0xEF, 0xE1, 0xE8, 0x0B, 0x0C, 0x0D, 0x0E, 0x13, 0x14, 0xA7, 0xBB, 0xE6, 0xED, 0xF7, 0xE7, 0xF6, 0x01, 0x02, 0x9B, 0xEE, 0x03, 0x04, 0xEC, 0x05, 0xF5, 0x06, 0xAC, 0xE4, 0xF9, 0xF2, 0x07, 0x08, 0x09, 0xAE, 0x0A, 0xEF, 0x0B, 0xE1, 0xF3, 0x0C, 0xE9, 0x0D, 0x0E, 0x0F, 0x10, 0xE5, 0x11, 0x12, 0xA0, 0x1D, 0x1E, 0xA9, 0xE8, 0xF5, 0x9B, 0x01, 0xAD, 0xBB, 0xEB, 0xFA, 0x02, 0xA7, 0xE6, 0xE2, 0xE7, 0x03, 0x04, 0x05, 0x06, 0xE9, 0xF8, 0x07, 0xAC, 0xEF, 0xF0, 0x08, 0xED, 0xF6, 0xF9, 0x09, 0xF7, 0x0A, 0x0B, 0xAE, 0x0C, 0xE3, 0x0D, 0xE5, 0xF4, 0x0E, 0x0F, 0xE4, 0x10, 0xEC, 0x11, 0xE1, 0x12, 0x13, 0x14, 0x15, 0x16, 0xEE, 0xF3, 0x17, 0x18, 0xF2, 0xA0, 0x19, 0x1A, 0x1B, 0x1C, 0x09, 0x0A, 0xAE, 0x9B, 0xEC, 0x01, 0xF5, 0x02, 0xF4, 0xE6, 0x03, 0xE1, 0xE5, 0xE9, 0x04, 0xF2, 0xEF, 0x05, 0x06, 0x07, 0xA0, 0x08, 0x0E, 0x0F, 0xAD, 0xE7, 0x9B, 0xA7, 0xF9, 0x01, 0xEC, 0x02, 0xAC, 0xF2, 0x03, 0xAE, 0xF3, 0xF5, 0x04, 0x05, 0xEF, 0x06, 0x07, 0xE9, 0xE1, 0x08, 0x09, 0xE8, 0x0A, 0x0B, 0xE5, 0x0C, 0xA0, 0x0D, 0x0D, 0x0E, 0xA7, 0xAC, 0xF3, 0xAD, 0x01, 0x02, 0x9B, 0xF9, 0xF5, 0xAE, 0x03, 0xEE, 0x04, 0xF2, 0x05, 0x06, 0xF4, 0x07, 0x08, 0x09, 0xEF, 0xE1, 0xA0, 0x0A, 0xE9, 0x0B, 0x0C, 0xE5, 0x14, 0x15, 0xAC, 0xE2, 0xF8, 0x9B, 0xAE, 0xFA, 0x01, 0xEB, 0x02, 0xA0, 0x03, 0x04, 0xF0, 0x05, 0x06, 0xE6, 0xF6, 0x07, 0xE4, 0xED, 0xE7, 0x08, 0xE1, 0xEF, 0xF2, 0x09, 0x0A, 0x0B, 0xEC, 0x0C, 0xE5, 0xE3, 0x0D, 0xF4, 0x0E, 0xF3, 0x0F, 0x10, 0x11, 0xEE, 0x12, 0x13, 0x03, 0xEF, 0x9B, 0xE1, 0xE5, 0xF5, 0x01, 0x02, 0x08, 0x09, 0xEC, 0xF9, 0xA7, 0xEE, 0x01, 0xAC, 0x9B, 0xAE, 0x02, 0x03, 0x04, 0xF3, 0x05, 0xE9, 0x06, 0xA0, 0x07, 0xE5, 0x16, 0x17, 0xA7, 0xAD, 0xEE, 0xE3, 0xEB, 0xF2, 0x9B, 0xE2, 0x01, 0x02, 0xF5, 0x03, 0xF4, 0xAC, 0x04, 0x05, 0xE6, 0xED, 0xF6, 0x06, 0xAE, 0xF0, 0x07, 0x08, 0xF3, 0x09, 0x0A, 0xE4, 0x0B, 0x0C, 0xF9, 0x0D, 0xEF, 0x0E, 0xE1, 0x0F, 0x10, 0xE9, 0xEC, 0x11, 0xA0, 0xE5, 0x12, 0x13, 0x14, 0x15, 0x0C, 0x0D, 0xA7, 0xBB, 0x9B, 0x01, 0xF9, 0xAE, 0xE2, 0x02, 0xED, 0xF3, 0x03, 0xF5, 0xEF, 0xF0, 0x04, 0x05, 0xE9, 0x06, 0x07, 0x08, 0x09, 0xA0, 0xE1, 0xE5, 0x0A, 0x0B, 0x19, 0x1A, 0xAD, 0xBB, 0xE2, 0xEA, 0xED, 0xF2, 0xFA, 0xE6, 0xEC, 0x01, 0x02, 0x03, 0x9B, 0xF5, 0x04, 0xA7, 0xF6, 0xF9, 0x05, 0x06, 0xEB, 0xEF, 0x07, 0x08, 0x09, 0x0A, 0xAC, 0x0B, 0x0C, 0xE3, 0xAE, 0x0D, 0xEE, 0xE9, 0x0E, 0xE1, 0x0F, 0xF3, 0x10, 0x11, 0xF4, 0x12, 0xE7, 0xE5, 0x13, 0x14, 0xE4, 0x15, 0x16, 0x17, 0xA0, 0x18, 0x1A, 0x1B, 0xC2, 0x9B, 0xAD, 0xAC, 0xF8, 0x01, 0xAE, 0x02, 0x03, 0xE5, 0xE7, 0xE8, 0xF9, 0xE9, 0xEB, 0x04, 0xE3, 0xE1, 0x05, 0xF6, 0x06, 0xE4, 0x07, 0xE2, 0xF0, 0x08, 0x09, 0xF3, 0xF4, 0xF7, 0xEF, 0x0A, 0x0B, 0x0C, 0x0D, 0xEC, 0x0E, 0x0F, 0x10, 0xF5, 0xED, 0x11, 0xE6, 0xA0, 0x12, 0xF2, 0x13, 0x14, 0x15, 0xEE, 0x16, 0x17, 0x18, 0x19, 0x0E, 0x0F, 0xAD, 0xED, 0xF9, 0x9B, 0xAE, 0x01, 0xF3, 0x02, 0x03, 0xF5, 0xF4, 0xF0, 0x04, 0xEF, 0x05, 0xE9, 0x06, 0xE8, 0xA0, 0xE1, 0xEC, 0x07, 0xF2, 0x08, 0xE5, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x9B, 0xF5, 0x19, 0x1A, 0xA9, 0xBB, 0xF6, 0xE6, 0x01, 0x9B, 0xAD, 0xE2, 0xF0, 0x02, 0xA7, 0x03, 0x04, 0x05, 0xF5, 0xE3, 0xAC, 0xE7, 0xF2, 0x06, 0xEB, 0x07, 0xEC, 0xED, 0xEE, 0xF9, 0x08, 0xAE, 0x09, 0x0A, 0xE4, 0x0B, 0x0C, 0xF4, 0x0D, 0xF3, 0x0E, 0x0F, 0x10, 0xE1, 0xEF, 0x11, 0xE9, 0x12, 0x13, 0xE5, 0x14, 0xA0, 0x15, 0x16, 0x17, 0x18, 0xA0, 0x16, 0xA2, 0xA7, 0xE2, 0xEB, 0xED, 0xEE, 0x9B, 0xF7, 0x01, 0x02, 0x03, 0xBB, 0xF9, 0xF0, 0x04, 0x05, 0xEC, 0x06, 0x07, 0x08, 0xF5, 0xE1, 0x09, 0xAC, 0xE3, 0x0A, 0xE8, 0x0B, 0xE9, 0x0C, 0xEF, 0xF3, 0xAE, 0x0D, 0x0E, 0xE5, 0x0F, 0x10, 0x11, 0xF4, 0x12, 0x13, 0x14, 0x15, 0x14, 0x15, 0xBB, 0xE2, 0xAD, 0xED, 0x01, 0x9B, 0xA7, 0xE3, 0xAC, 0xEC, 0xEE, 0x02, 0xF7, 0x03, 0x04, 0xF9, 0x05, 0x06, 0x07, 0x08, 0xF4, 0xAE, 0xF5, 0x09, 0x0A, 0xF2, 0xE1, 0xF3, 0x0B, 0x0C, 0x0D, 0xE9, 0x0E, 0x0F, 0xEF, 0xE5, 0x10, 0xA0, 0xE8, 0x11, 0x12, 0x13, 0x11, 0x12, 0xEF, 0xF6, 0x9B, 0xEB, 0xF9, 0x01, 0xA0, 0xE2, 0x02, 0xE1, 0x03, 0xED, 0x04, 0xE3, 0xE9, 0x05, 0xE4, 0xE5, 0xE7, 0x06, 0xEC, 0xF0, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xF3, 0x0C, 0xF4, 0xEE, 0x0D, 0xF2, 0x0E, 0x0F, 0x10, 0x05, 0xE5, 0xF3, 0xF9, 0x9B, 0x01, 0xEF, 0x02, 0x03, 0xE1, 0x04, 0xE9, 0x0A, 0x0B, 0xAE, 0x9B, 0xEC, 0xED, 0x01, 0x02, 0xF3, 0xEE, 0xF2, 0x03, 0xE5, 0x04, 0xE8, 0xA0, 0xE1, 0x05, 0xEF, 0x06, 0x07, 0x08, 0xE9, 0x09, 0x05, 0x06, 0xA0, 0xAC, 0xAD, 0xF4, 0xE9, 0x01, 0x02, 0xE1, 0xE5, 0x03, 0x9B, 0x04, 0x11, 0xA0, 0xBF, 0xE1, 0xE2, 0xE6, 0xED, 0xE4, 0xE9, 0xF7, 0xA7, 0x01, 0x02, 0xBB, 0x03, 0x04, 0xEC, 0x05, 0x9B, 0xEE, 0x06, 0xEF, 0x07, 0xAC, 0xE5, 0xF3, 0x08, 0x09, 0x0A, 0xAE, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x06, 0x07, 0xA0, 0xAE, 0xE1, 0xE5, 0xEC, 0xFA, 0x9B, 0xEF, 0xE9, 0x01, 0x02, 0x03, 0x04, 0x05, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B }; DHL_RESULT DecodeHuffmanString (UINT8 *compressedStr, UINT32 length, compress_type_k type, char *text, UINT32 textlen) { bitBuffer_t tBits; bitBufferPtr_t bits = &tBits; const UINT8 *DecodeTable; UINT32 textindex; UINT32 bitsremaining; UINT8 hbit; UINT8 decodedchar; BOOLEAN firstOrderEsc; BOOLEAN charDecoded; UINT16 tableoffset; UINT16 treerootoffset; UINT8 child_word_offset_or_char_leaf; DHL_RESULT err = DHL_OK; DHL_ASSERT(((type == cm_Huffman_C4C5) || (type == cm_Huffman_C6C7)), "DecodeHuffmanString()\n"); bitBufferInitialize(bits,compressedStr,length); /* Select the Huffman Decode Table C.5 or C.7 */ if (type == cm_Huffman_C4C5) { DecodeTable = ProgramTitleDecodeTableC5; } else { DecodeTable = ProgramDescriptionDecodeTableC7; } textindex = 0; bitsremaining = 8 * length; decodedchar = STRING_TERMINATE; /* initial value */ firstOrderEsc = FALSE; if (0) { DHL_ASSERT(!((int) DecodeTable) & 1, "alignment assumption is broken"); tableoffset = ((UINT16 *)DecodeTable)[decodedchar]; } else { tableoffset = DecodeTable[decodedchar*2+0] << 8 | DecodeTable[decodedchar*2+1]; } while (bitsremaining && (textlen > 1)) { /* space for EOS char */ /* any character which follows a character from the set (127-255) is uncompressed */ /* any character which follows a first-order escape character is uncompressed */ if (decodedchar > 127 || firstOrderEsc == TRUE) { /* uncompressed */ decodedchar = bitBufferGetBits(bits,8); bitsremaining -= 8; firstOrderEsc = FALSE; } else { if (0) { DHL_ASSERT(!((int) DecodeTable) & 1, "alignment assumption is broken"); /* compressed */ treerootoffset = tableoffset = ((UINT16 *)DecodeTable)[decodedchar]; } else { treerootoffset = tableoffset = DecodeTable[decodedchar*2+0] << 8 | DecodeTable[decodedchar*2+1]; } /* decode a character */ charDecoded = FALSE; while (charDecoded == FALSE && bitsremaining) { /* Get a bit */ hbit = bitBufferGetBits(bits,1); bitsremaining--; if (hbit) { /* right child word offset or char leaf */ child_word_offset_or_char_leaf = DecodeTable[tableoffset+1]; } else { /* left child word offset or char leaf */ child_word_offset_or_char_leaf = DecodeTable[tableoffset]; } /* child node or leaf character? */ if (child_word_offset_or_char_leaf & LEAF_FLAG_MASK) { /* leaf character */ decodedchar = child_word_offset_or_char_leaf & LEAF_CHAR_MASK; charDecoded = TRUE; } else { /* child node */ tableoffset = treerootoffset + (2 * child_word_offset_or_char_leaf); } } /* check for first-order escape character */ if (decodedchar == ORDER_1_ESCAPE) { firstOrderEsc = TRUE; } } /* first-order escape character is a control character only */ if (firstOrderEsc == FALSE) { text[textindex++] = decodedchar; textlen--; } } /* terminate the string with ASCII Null */ text[textindex] = STRING_TERMINATE; return (err); } #if COMMENT ____Debug____(){} #endif #if COMMENT ____Symbol____(){} #endif #if DHL_REGISTER_DEUBG_SYMBOLS static DHL_SymbolTable _XxxxSymbols[] = { /* however, if you want typing short-cut, it is good usage. DHL_FNC_SYM_ENTRY2("epg_start", App_EpgUpdateStart), DHL_FNC_SYM_ENTRY2("epg_stop", App_EpgUpdateCancel), DHL_FNC_SYM_ENTRY2("epg_list", Dmc_EpgPrintAllTables), DHL_FNC_SYM_ENTRY2("epg_delete", App_EpgDeleteAll), DHL_VAR_SYM_ENTRY(g_XX_TestMode), */ 0, }; #endif /* DHL_REGISTER_DEUBG_SYMBOLS */ #if COMMENT ____Init____(){} #endif /* end of file */