📄 bitstream.c
字号:
oldCurrentBit = stream->currentBit;
result = BsGetBitChar(stream,data,numBit);
stream->currentBit = oldCurrentBit;
if (result)
CommonWarning("BsGetBitAheadChar: error reading bit stream");
return result;
}
/* BsGetBitAheadShort() */
/* Read bits from bit stream (short). */
/* (Current position in bit stream is NOT advanced !!!) */
int BsGetBitAheadShort (
BsBitStream *stream, /* in: bit stream */
unsigned short *data, /* out: bits read */
/* (may be NULL if numBit==0) */
int numBit) /* in: num bits to read */
/* [0..16] */
/* returns: */
/* 0=OK 1=error */
{
long oldCurrentBit;
int result;
if (BSdebugLevel >= 3)
printf("BsGetBitAheadShort: %s id=%ld numBit=%d\n",
(stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
oldCurrentBit = stream->currentBit;
result = BsGetBitShort(stream,data,numBit);
stream->currentBit = oldCurrentBit;
if (result)
CommonWarning("BsGetBitAheadShort: error reading bit stream");
return result;
}
/* BsGetBitAheadInt() */
/* Read bits from bit stream (int). */
/* (Current position in bit stream is NOT advanced !!!) */
int BsGetBitAheadInt (
BsBitStream *stream, /* in: bit stream */
unsigned int *data, /* out: bits read */
/* (may be NULL if numBit==0) */
int numBit) /* in: num bits to read */
/* [0..16] */
/* returns: */
/* 0=OK 1=error */
{
long oldCurrentBit;
int result;
if (BSdebugLevel >= 3)
printf("BsGetBitAheadInt: %s id=%ld numBit=%d\n",
(stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
oldCurrentBit = stream->currentBit;
result = BsGetBitInt(stream,data,numBit);
stream->currentBit = oldCurrentBit;
if (result)
CommonWarning("BsGetBitAheadInt: error reading bit stream");
return result;
}
long BsGetBufferFullness (BsBitBuffer *buffer)
{
return (buffer->numBit);
}
/* BsGetBuffer() */
/* Read bits from bit stream to buffer. */
/* (Current position in bit stream is advanced !!!) */
/* (Buffer is cleared first - previous data in buffer is lost !!!) */
int BsGetBuffer (
BsBitStream *stream, /* in: bit stream */
BsBitBuffer *buffer, /* out: buffer read */
/* (may be NULL if numBit==0) */
long numBit) /* in: num bits to read */
/* returns: */
/* 0=OK 1=error */
{
long i,numByte,numRemain;
unsigned long data;
if (BSdebugLevel >= 2) {
printf("BsGetBuffer: %s id=%ld numBit=%ld ",
(stream->file!=NULL)?"file":"buffer",
stream->streamId,numBit);
if (buffer != NULL)
printf("bufSize=%ld bufAddr=0x%lx ",
buffer->size,(unsigned long)buffer);
else
printf("(bufAddr=(NULL) ");
printf("curBit=%ld\n",stream->currentBit);
}
if (stream->write != 0)
CommonExit(1,"BsGetBuffer: stream not in read mode");
if (numBit == 0)
return 0;
if (stream->buffer[0] == buffer)
CommonExit(1,"BsGetBuffer: can not get buffer from itself");
if (numBit < 0 || numBit > buffer->size)
CommonExit(1,"BsGetBuffer: number of bits out of range (%ld)",numBit);
BsClearBuffer(buffer);
numByte = bit2byte(numBit)-1;
for (i=0; i<numByte; i++) {
if (BsGetBit(stream,&data,BYTE_NUMBIT)) {
if ( ! BSaacEOF || BSdebugLevel > 0 )
CommonWarning("BsGetBuffer: error reading bit stream");
buffer->numBit = i*BYTE_NUMBIT;
return 1;
}
buffer->data[i] = data;
}
numRemain = numBit-numByte*BYTE_NUMBIT;
if (BsGetBit(stream,&data,numRemain)) {
if ( ! BSaacEOF || BSdebugLevel > 0 )
CommonWarning("BsGetBuffer: error reading bit stream");
buffer->numBit = numByte*BYTE_NUMBIT;
return 1;
}
buffer->data[i] = data<<(BYTE_NUMBIT-numRemain);
buffer->numBit = numBit;
return 0;
}
/* BsGetBufferAppend() */
/* Append bits from bit stream to buffer. */
/* (Current position in bit stream is advanced !!!) */
int BsGetBufferAppend (
BsBitStream *stream, /* in: bit stream */
BsBitBuffer *buffer, /* out: buffer read */
/* (may be NULL if numBit==0) */
int append, /* in: if != 0: append bits to buffer */
/* (don't clear buffer) */
long numBit) /* in: num bits to read */
/* returns: */
/* 0=OK 1=error */
{
long i,numByte,last_byte,numRemain;
unsigned long data;
int tmp,shift_cnt,eof;
if (BSdebugLevel >= 2) {
printf("BsGetBufferAppend: %s id=%ld numBit=%ld ",
(stream->file!=NULL)?"file":"buffer",
stream->streamId,numBit);
if (buffer != NULL)
printf("bufSize=%ld bufAddr=0x%lx ",
buffer->size,(unsigned long)buffer);
else
printf("(bufAddr=(NULL) ");
printf("curBit=%ld\n",stream->currentBit);
}
if (stream->write != 0)
CommonExit(1,"BsGetBufferAppend: stream not in read mode");
if (stream->buffer[0] == buffer)
CommonExit(1,"BsGetBufferAppend: cannot get buffer from itself");
if (numBit < 0)
CommonExit(1,"BsGetBufferAppend: number of bits out of range (%ld)",
numBit);
#if 1 /* AI 990528 */
/* check whether number of bits to be read exceeds the end of bitstream */
eof = BsEof(stream, numBit);
/* if (BsEof(stream, numBit-1)) { */
if (eof) {
numBit = BYTE_NUMBIT*stream->numByte - stream->currentBit;
if (BSdebugLevel >= 2) {
printf("*** numBits(modified)=%ld\n", numBit);
}
}
#endif
if (append) {
/* append to buffer (don't clear buffer) */
if ((numBit+buffer->numBit) > buffer->size)
CommonExit(1,"BsGetBufferAppend: number of bits out of range (%ld)",
numBit);
/* fill up the last possible incomplete byte */
tmp = 8 - buffer->numBit%8;
if (tmp == 8)
tmp = 0;
if (tmp <= numBit) {
shift_cnt = 0;
}
else {
shift_cnt = tmp - numBit;
tmp = numBit;
}
if (tmp) {
if (BsGetBit(stream,&data,tmp)) {
CommonWarning("BsGetBufferAppend: error reading bit stream");
return 1;
}
data <<= shift_cnt;
numBit -= tmp;
last_byte = buffer->numBit/8;
data |= buffer->data[last_byte];
buffer->numBit += tmp;
buffer->data[last_byte] = data;
last_byte++;
}
else
last_byte = buffer->numBit/8;
}
else { /* if (append) */
/* clear buffer */
if (numBit > buffer->size)
CommonExit(1,"BsGetBufferAppend: number of bits out of range (%ld)",
numBit);
BsClearBuffer(buffer);
last_byte = 0;
}
if (numBit > 0) {
numByte = bit2byte(numBit)-1;
for (i=last_byte; i<last_byte+numByte; i++) {
if ((tmp = BsGetBit(stream,&data,BYTE_NUMBIT))) {
buffer->numBit += (i-last_byte)*BYTE_NUMBIT;
if (tmp==-1)
return -1; /* end of file */
CommonWarning("BsGetBufferAppend: error reading bit stream");
return 1;
}
buffer->data[i] = data;
}
numRemain = numBit-numByte*BYTE_NUMBIT;
if (BsGetBit(stream,&data,numRemain)) {
CommonWarning("BsGetBufferAppend: error reading bit stream");
buffer->numBit += numByte*BYTE_NUMBIT;
return 1;
}
buffer->data[i] = data<<(BYTE_NUMBIT-numRemain);
buffer->numBit += numBit;
}
#if 1 /* AI 990528 */
if ( eof ) {
/* just reached to the end of bitstream */
if (stream->currentBit == BYTE_NUMBIT*stream->numByte) {
if (BSdebugLevel >= 2) {
printf("*** just reached the end of bitstream\n");
}
return -1; /* end of file */
}
}
#endif
/* } */
return 0;
}
/* BsGetBufferAhead() */
/* Read bits ahead of current position from bit stream to buffer. */
/* (Current position in bit stream is NOT advanced !!!) */
/* (Buffer is cleared first - previous data in buffer is lost !!!) */
int BsGetBufferAhead (
BsBitStream *stream, /* in: bit stream */
BsBitBuffer *buffer, /* out: buffer read */
/* (may be NULL if numBit==0) */
long numBit) /* in: num bits to read */
/* returns: */
/* 0=OK 1=error */
{
long oldCurrentBit;
int result;
if (BSdebugLevel >= 2)
printf("BsGetBufferAhead: %s id=%ld numBit=%ld\n",
(stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
if (numBit > stream->buffer[0]->size)
CommonExit(1,"BsGetBufferAhead: "
"number of bits to look ahead too high (%ld)",numBit);
oldCurrentBit = stream->currentBit;
result = BsGetBuffer(stream,buffer,numBit);
stream->currentBit = oldCurrentBit;
if (result)
if ( ! BSaacEOF || BSdebugLevel > 0 )
CommonWarning("BsGetBufferAhead: error reading bit stream");
return result;
}
/* BsGetSkip() */
/* Skip bits in bit stream (read). */
/* (Current position in bit stream is advanced !!!) */
int BsGetSkip (
BsBitStream *stream, /* in: bit stream */
long numBit) /* in: num bits to skip */
/* returns: */
/* 0=OK 1=error */
{
if (BSdebugLevel >= 2) {
printf("BsGetSkip: %s id=%ld numBit=%ld ",
(stream->file!=NULL)?"file":"buffer",
stream->streamId,numBit);
printf("curBit=%ld\n",stream->currentBit);
}
if (stream->write != 0)
CommonExit(1,"BsGetSkip: stream not in read mode");
if (numBit < 0)
CommonExit(1,"BsGetSkip: number of bits out of range (%ld)",numBit);
if (numBit == 0)
return 0;
if (BsReadAhead(stream,numBit) || BsCheckRead(stream,numBit)) {
CommonWarning("BsGetSkip: error reading bit stream");
return 1;
}
stream->currentBit += numBit;
return 0;
}
/* BsPutBit() */
/* Write bits to bit stream. */
int BsPutBit (
BsBitStream *stream, /* in: bit stream */
unsigned long data, /* in: bits to write */
int numBit) /* in: num bits to write */
/* [0..32] */
/* returns: */
/* 0=OK 1=error */
{
int num,maxNum,curNum;
unsigned long bits;
if (BSdebugLevel > 3)
printf("BsPutBit: %s id=%ld numBit=%d data=0x%lx,%ld curBit=%ld\n",
(stream->file!=NULL)?"file":"buffer",
stream->streamId,numBit,data,data,stream->currentBit);
if (stream->write != 1)
CommonExit(1,"BsPutBit: stream not in write mode");
if (numBit<0 || numBit>LONG_NUMBIT)
CommonExit(1,"BsPutBit: number of bits out of range (%d)",numBit);
if (numBit < 32 && data > ((unsigned long)1<<numBit)-1)
CommonExit(1,"BsPutBit: data requires more than %d bits (0x%lx)",
numBit,data);
if (numBit == 0)
return 0;
/* write bits in packets according to buffer byte boundaries */
num = 0;
maxNum = BYTE_NUMBIT - stream->currentBit % BYTE_NUMBIT;
while (num < numBit) {
curNum = min(numBit-num,maxNum);
bits = data>>(numBit-num-curNum);
if (BsWriteByte(stream,bits,curNum)) {
CommonWarning("BsPutBit: error writing bit stream");
return 1;
}
num += curNum;
maxNum = BYTE_NUMBIT;
}
return 0;
}
/* BsPutBuffer() */
/* Write bits from buffer to bit stream. */
int BsPutBuffer (
BsBitStream *stream, /* in: bit stream */
BsBitBuffer *buffer) /* in: buffer to write */
/* returns: */
/* 0=OK 1=error */
{
long i,numByte,numRemain;
if (buffer->numBit == 0)
return 0;
if (BSdebugLevel >= 2)
printf("BsPutBuffer: %s id=%ld numBit=%ld bufAddr=0x%lx curBit=%ld\n",
(stream->file!=NULL)?"file":"buffer",
stream->streamId,buffer->numBit,(unsigned long)buffer,
stream->currentBit);
if (stream->write != 1)
CommonExit(1,"BsPutBuffer: stream not in write mode");
if (stream->buffer[0] == buffer)
CommonExit(1,"BsPutBuffer: can not put buffer into itself");
numByte = bit2byte(buffer->numBit)-1;
for (i=0; i<numByte; i++)
if (BsPutBit(stream,buffer->data[i],BYTE_NUMBIT)) {
CommonWarning("BsPutBuffer: error writing bit stream");
return 1;
}
numRemain = buffer->numBit-numByte*BYTE_NUMBIT;
if (BsPutBit(stream,buffer->data[i]>>(BYTE_NUMBIT-numRemain),numRemain)) {
CommonWarning("BsPutBuffer: error reading bit stream");
return 1;
}
return 0;
}
/* BsAllocBuffer() */
/* Allocate bit buffer. */
BsBitBuffer *BsAllocBuffer (
long numBit) /* in: buffer size in bits */
/* returns: */
/* bit buffer (handle) */
{
BsBitBuffer *buffer;
if (BSdebugLevel >= 2)
printf("BsAllocBuffer: size=%ld\n",numBit);
if ((buffer=(BsBitBuffer*)malloc(sizeof(BsBitBuffer))) == NULL)
CommonExit(1,"BsAllocBuffer: memory allocation error (buffer)");
if ((buffer->data=(unsigned char*)malloc(bit2byte(numBit)*sizeof(char)))
== NULL)
CommonExit(1,"BsAllocBuffer: memory allocation error (data)");
buffer->numBit = 0;
buffer->size = numBit;
if (BSdebugLevel >= 2)
printf("BsAllocBuffer: bufAddr=0x%lx\n",(unsigned long)buffer);
return buffer;
}
/* BsFreeBuffer() */
/*FREE bit buffer. */
void BsFreeBuffer (
BsBitBuffer *buffer) /* in: bit buffer */
{
if (BSdebugLevel >= 2)
printf("BsFreeBuffer: size=%ld bufAddr=0x%lx\n",
buffer->size,(unsigned long)buffer);
FREE(buffer->data);
FREE(buffer);
}
/* BsBufferNumBit() */
/* Get number of bits in buffer. */
long BsBufferNumBit (
BsBitBuffer *buffer) /* in: bit buffer */
/* returns: */
/* number of bits in buffer */
{
if (BSdebugLevel >= 2)
printf("BsBufferNumBit: numBit=%ld size=%ld bufAddr=0x%lx\n",
buffer->numBit,buffer->size,(unsigned long)buffer);
return buffer->numBit ;
}
/* BsClearBuffer() */
/* Clear bit buffer (set numBit to 0). */
void BsClearBuffer (
BsBitBuffer *buffer) /* in: bit buffer */
{
if (BSdebugLevel >= 2)
printf("BsClearBuffer: size=%ld bufAddr=0x%lx\n",
buffer->size,(unsigned long)buffer);
if (buffer->numBit != 0 ) {
#if 0 /* removed due to BUG! in mp4dec.c */
CommonWarning("BsClearBuffer: Buffer not empty!");
#endif /* removed due to BUG! in mp4dec.c */
}
buffer->numBit = 0;
}
/* end of bitstream.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -