home *** CD-ROM | disk | FTP | other *** search
- /*************************************************************************
- BitStreamStruct.cpp
-
- 03/03/07 Xiaohong CreateFile é╠ê°Éöé≡ OPEN_ALWAYS é⌐éτ CREATE_ALWAYS é╔ò╧ìX
- 03/02/08 Xiaohong
- *************************************************************************/
- #include "BitStreamStruct.h"
- #include <windows.h>
- #include <math.h>
-
- #define _malloc(s) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, (s) )
- #define _free(p) HeapFree( GetProcessHeap(), 0, (p))
-
- #define NULL_CHAR '\0'
-
- #define BITS_IN_A_BYTE 8
- #define WORD 16
-
- #define MINIMUM 4 /* Minimum size of the buffer in bytes */
- #define MAX_LENGTH 32 /* Maximum length of word written or
- read from bit stream */
- #define READ_MODE 0
- #define WRITE_MODE 1
- #define ALIGNING 8
- #define BINARY 0
- #define ASCII 1
- #define BS_FORMAT BINARY /* BINARY or ASCII = 2x bytes */
-
- #define MIN(A, B) ((A) < (B) ? (A) : (B))
- #define MAX(A, B) ((A) > (B) ? (A) : (B))
-
- static const int g_nPutMaskArray[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
-
- BitStreamStruct::BitStreamStruct()
- {
- m_hFile = NULL;
- m_pBuffer = NULL;
- }
- BitStreamStruct::~BitStreamStruct()
- {
- Clear();
- }
- void BitStreamStruct::Clear(void)
- {
- if(m_hFile!=NULL)
- {
- CloseHandle(m_hFile);
- m_hFile = NULL;
- }
-
- if(m_pBuffer!=NULL)
- {
- _free(m_pBuffer);
- m_pBuffer = NULL;
- }
- }
- BSSRET BitStreamStruct::OpenBitStreamW(const char* szFile,const int nSize)
- {
- Clear();
-
- if((m_hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL))
- == INVALID_HANDLE_VALUE)
- {
- return BSSR_OPEN_FILE_ERR;
- }
- if(!AllocBuffer(nSize))
- {
- return BSSR_ALLOC_BUFFER_ERR;
- }
- m_nBufferByteIndex = nSize-1;
- m_nBufferBitIndex = 8;
- m_nBitCount = 0;
- m_nMode = WRITE_MODE;
- m_nEndOfBuffer = 0;
- m_bEndOfBitStream = false;
-
- return BSSR_OK;
- }
- BSSRET BitStreamStruct::OpenBitStreamR(const char* szFile,const int nSize)
- {
- register DWORD n;
- register unsigned char flag = 1;
- unsigned char val;
-
- Clear();
-
- if((m_hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL))
- == INVALID_HANDLE_VALUE)
- {
- return BSSR_OPEN_FILE_ERR;
- }
- do
- {
- ReadFile(m_hFile,&val,sizeof(unsigned char), &n, NULL);
- switch (val)
- {
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- case 0x38:
- case 0x39:
- case 0x41:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- case 0xa: /* \n */
- case 0xd: /* cr */
- case 0x1a: /* sub */
- break;
-
- default: /* detection of an binary character */
- flag--;
- break;
- }
-
- } while (flag & n);
-
- if(flag)
- {
- //printf ("the bit stream file %s is an ASCII file\n", bs_filenam);
- m_nFormat = ASCII;
- }
- else
- {
- m_nFormat = BINARY;
- //printf ("the bit stream file %s is a BINARY file\n", bs_filenam);
- }
-
- CloseHandle(m_hFile);
- if((m_hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL))
- == INVALID_HANDLE_VALUE)
- {
- return BSSR_OPEN_FILE_ERR;
- }
- /*
- fclose(pt);
-
- if ((pt = fopen(szFile, "rb")) == NULL)
- {
- return BSSR_OPEN_FILE_ERR;
- }
- */
- if(!AllocBuffer(nSize))
- {
- return BSSR_ALLOC_BUFFER_ERR;
- }
- m_nBufferByteIndex=0;
- m_nBufferBitIndex=0;
- m_nBitCount=0;
- m_nMode = READ_MODE;
- m_nEndOfBuffer = 0;
- m_bEndOfBitStream = false;
-
- return BSSR_OK;
- }
- void BitStreamStruct::CloseBitStreamW(void)
- {
- EmptyBuffer(m_nBufferByteIndex);
-
- Clear();
- }
-
- void BitStreamStruct::CloseBitStreamR(void)
- {
- Clear();
- }
-
- void BitStreamStruct::RefillBuffer(void)
- {
- register int i=m_nBufSize-2-m_nBufferByteIndex;
- register DWORD n=1;
- register int index=0;
- char val[2];
-
- while ((i>=0) && (!m_nEndOfBuffer))
- {
-
- if (m_nFormat == BINARY)
- ReadFile(m_hFile,&m_pBuffer[i--],sizeof(unsigned char), &n, NULL);
- //n = fread(&m_pBuffer[i--], sizeof(unsigned char), 1, pt);
- else
- {
- while((index < 2) && n)
- {
- ReadFile(m_hFile,&val[index],sizeof(unsigned char), &n, NULL);
- //n = fread(&val[index], sizeof(char), 1, pt);
- switch (val[index])
- {
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- case 0x38:
- case 0x39:
- case 0x41:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- index++;
- break;
- default:
- break;
- }
- }
-
- if (val[0] <= 0x39)
- m_pBuffer[i] = (val[0] - 0x30) << 4;
- else
- m_pBuffer[i] = (val[0] - 0x37) << 4;
-
- if (val[1] <= 0x39)
- m_pBuffer[i--] |= (val[1] - 0x30);
- else
- m_pBuffer[i--] |= (val[1] - 0x37);
- index = 0;
- }
-
- if (!n)
- {
- m_nEndOfBuffer = i+1;
- }
-
- }
- }
-
- inline bool BitStreamStruct::AllocBuffer(const int nSize)
- {
- m_pBuffer = (unsigned char *)_malloc(nSize*sizeof(unsigned char));
- m_nBufSize = nSize;
-
- if(m_pBuffer == NULL)
- {
- return false;
- }
- ZeroMemory(m_pBuffer,m_nBufSize);
-
- return true;
- }
- void BitStreamStruct::PutBitStream(const unsigned int val,int N)
- {
- register int j = N;
- register int k, tmp;
-
- if (N > MAX_LENGTH)
- N = MAX_LENGTH;
- //printf("Cannot read or write more than %d bits at a time.\n", MAX_LENGTH);
-
- m_nBitCount += N;
- while (j > 0)
- {
- k = MIN(j, m_nBufferBitIndex);
- tmp = val >> (j-k);
- m_pBuffer[m_nBufferByteIndex] |= (tmp&g_nPutMaskArray[k]) << (m_nBufferBitIndex-k);
- m_nBufferBitIndex -= k;
- if(!m_nBufferBitIndex)
- {
- m_nBufferBitIndex = 8;
- m_nBufferByteIndex--;
- if(m_nBufferByteIndex < 0)
- EmptyBuffer(MINIMUM);
- m_pBuffer[m_nBufferByteIndex] = 0;
- }
- j -= k;
- }
- }
- void BitStreamStruct::EmptyBuffer(const int minimum)
- {
- register int i;
- DWORD dwResult;
-
- for (i=m_nBufSize-1;i>=minimum;i--)
- WriteFile(m_hFile, &m_pBuffer[i], sizeof(unsigned char), &dwResult, NULL);
- //fwrite(&m_pBuffer[i], sizeof(unsigned char), 1, pt);
-
- for (i=minimum-1; i>=0; i--)
- m_pBuffer[m_nBufSize - minimum + i] = m_pBuffer[i];
-
- m_nBufferByteIndex = m_nBufSize -1 - minimum;
- m_nBufferBitIndex = 8;
- }
- void BitStreamStruct::PutBit(const unsigned int bit)
- {
- m_nBitCount++;
-
- m_pBuffer[m_nBufferByteIndex] |= (bit&0x1) << (m_nBufferBitIndex-1);
- m_nBufferBitIndex--;
- if(!m_nBufferBitIndex)
- {
- m_nBufferBitIndex = 8;
- m_nBufferByteIndex--;
- if (m_nBufferByteIndex < 0)
- EmptyBuffer(MINIMUM);
- m_pBuffer[m_nBufferByteIndex] = 0;
- }
- }
- unsigned long BitStreamStruct::GetBitStream(int N)
- {
- unsigned long val=0;
- register int i;
- register int j = N;
- register int k, tmp;
-
- if (N > MAX_LENGTH)
- N = MAX_LENGTH;
-
- m_nBitCount += N;
- while (j > 0)
- {
- if (!m_nBufferBitIndex)
- {
- m_nBufferBitIndex = 8;
- m_nBufferByteIndex--;
- if ((m_nBufferByteIndex < MINIMUM) || (m_nBufferByteIndex < m_nEndOfBuffer))
- {
- if (m_nEndOfBuffer)
- m_bEndOfBitStream = true;
- else
- {
- for (i=m_nBufferByteIndex; i>=0;i--)
- m_pBuffer[m_nBufSize-1-m_nBufferByteIndex+i] = m_pBuffer[i];
- RefillBuffer();
- m_nBufferByteIndex = m_nBufSize-1;
- }
- }
- }
- k = MIN (j, m_nBufferBitIndex);
- tmp = m_pBuffer[m_nBufferByteIndex]&g_nPutMaskArray[m_nBufferBitIndex];
- tmp = tmp >> (m_nBufferBitIndex-k);
- val |= tmp << (j-k);
- m_nBufferBitIndex -= k;
- j -= k;
- }
- return val;
- }
-
- unsigned int BitStreamStruct::GetBit(void)
- {
- unsigned int bit;
- register int i;
- static const int mask[8]={0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
-
- m_nBitCount++;
-
- if (!m_nBufferBitIndex)
- {
- m_nBufferBitIndex = 8;
- m_nBufferByteIndex--;
- if ((m_nBufferByteIndex < MINIMUM) || (m_nBufferByteIndex < m_nEndOfBuffer))
- {
- if (m_nEndOfBuffer)
- m_bEndOfBitStream = true;
- else
- {
- for (i=m_nBufferByteIndex; i>=0;i--)
- m_pBuffer[m_nBufSize-1-m_nBufferByteIndex+i] = m_pBuffer[i];
- RefillBuffer();
- m_nBufferByteIndex = m_nBufSize-1;
- }
- }
- }
- bit = m_pBuffer[m_nBufferByteIndex]&mask[m_nBufferBitIndex-1];
- bit = bit >> (m_nBufferBitIndex-1);
- m_nBufferBitIndex--;
-
- return bit;
- }
-
- bool BitStreamStruct::SeekSync(const long sync,const int N)
- {
- unsigned long val;
- long maxi = (long)pow(2.0,N) - 1;
-
- const unsigned long aligning = sstell()%ALIGNING;
-
- if (aligning)
- GetBitStream((int)(ALIGNING-aligning));
-
- val = GetBitStream(N);
- while((((signed)val&maxi) != sync) && (!end_bs()))
- {
- val <<= ALIGNING;
- val |= GetBitStream(ALIGNING);
- }
-
- if(end_bs())
- return false;
-
- return true;
- }
-
-