📄 bitpack.cpp
字号:
return v;
}
/* Read nbits bits from a file */
Int CVTCCommon::get_X_bits(Int nbits)
{
Int v=0;
while (nbits--)
v = (v << 1) + nextinputbit();
return v;
}
/*-------------------------------------------------------------------*/
/*********************************************************/
/* get a parameter Into the file, refer to VTC syntax */
/* for algorithm */
/*********************************************************/
Int CVTCDecoder::get_param(Int nbits)
{
Int countg=0;
Int word=0;
Int value=0;
Int module=1<<(nbits);
do {
word=get_X_bits(nbits+1);
value += (word & (module-1))<<(countg*nbits);
countg++;
} while (word>>nbits);
return (value);
}
/******************************************************************/
/* function to adjust the extra bytes read in by arithmetic coder.*/
/* called by ac_decoder_done */
/******************************************************************/
Void CVTCDecoder::restore_arithmetic_offset(Int bits_to_go)
{
/* for nonalignment, 14 has something to do with Max_frequency */
bit_num +=14;
count -= 14;
if(((Int)(bit_buf>>(bit_num+1)) &1)==0){
bit_num--;
count++;
}
}
/**********************************************************/
/* This function returns the next n bits in the bitstream */
/* where n<=32 */
/**********************************************************/
UInt CVTCEncoder::LookBitsFromStream (Int n)
{
Int tmp_bit_num=bit_num+1, tmp_byte_ptr=byte_ptr;
unsigned long tmp_buf=bit_buf,v;
/* test if enough bits */
/* hjlee 0901 */
if(n>MAXLOOKBITS)
errorHandler("LookBitsFromStream() can only return a maximum of "\
"%d bits.\n", MAXLOOKBITS);
if(buffer_length<BUFFER_SIZE-EXTRABYTES)
if(((buffer_length-tmp_byte_ptr)<<3)+tmp_bit_num<n)
/*errorHandler("LookBitsFromStream(): "\
"There are not enough bits in the bitstream.\n");*/
return(0);
/* get bits */
while(tmp_bit_num<n/* && tmp_bit_num<(MAXLOOKBITS-8)*/){
tmp_bit_num +=8;
tmp_buf = (tmp_buf << 8) + output_buffer[tmp_byte_ptr++];
}
v = (tmp_buf >> (tmp_bit_num-n));
return(v&1 );
}
/* modified by Jie Liang (Texas Instruments)
to return the last bits left in the last byte */
Int CVTCDecoder::align_byte1()
{
Int i;
if((i=(bit_num+1)%8)==0)
return 0;
return(get_X_bits(i)<<(8-i));
}
Int CVTCDecoder::align_byte ()
{
Int i;
if((i=(bit_num+1)%8)==0)
i=8; /* for stuffing as defined in CD 6.2.1 */
junkCount += i;
count -= i;
return(get_X_bits(i)<<(8-i));
}
/* added by Jie Liang (Texas Instruments) */
/* the data needs to by byte aligned first */
Int CVTCDecoder::get_allbits (Char *buffer)
{
Int n,len;
Int loc=0;
/* read until end of file */
do {
buffer[loc]=get_X_bits(8);
loc++;
}while (!feof(bitfile));
/* read until the data in buffer is finished */
len = buffer_length-byte_ptr+2;
for (n=0;n<len;n++)
{
buffer[loc]=get_X_bits(8);
loc++;
}
return loc;
}
/* added by Jie Liang (Texas Instruments) */
/* check the next four bytes for start code */
Int CVTCDecoder::Is_startcode (long startcode)
{
long next_4bytes=0;
Int i;
Int offset;
if (bit_num>=7)
offset=1;
else
offset=0;
next_4bytes = output_buffer[byte_ptr-offset];
for(i=0;i<3;i++)
next_4bytes = (next_4bytes<<8)+output_buffer[byte_ptr-offset+1+i];
if(next_4bytes == startcode)
return 1;
return 0;
}
#define MAXRUNZERO 22 // hjlee
Void CVTCEncoder::emit_bits_checksc(UInt code, Int size)
{
Int m;
Int bit;
for(m=size-1;m>=0;m--){
bit = (code>>m) & (0x01);
emit_bits (bit, 1);
/* update zero bit count */
if (bit)
zerocount=0;
else
zerocount++;
if (zerocount>=MAXRUNZERO)
{ /* exceeding maximum runs, add 1 */
emit_bits (1, 1);
zerocount=0;
}
} /* end of m - bits */
return;
}
Void CVTCEncoder::emit_bits_checksc_init()
{
zerocount=0;
}
Int CVTCDecoder::get_X_bits_checksc(Int nbits)
{
Int v=0;
Int bit;
while (nbits--){
if(zerocount==MAXRUNZERO) /*skip next bit */
{
// if(!nextinputbit()) ; deleted by swinder
nextinputbit(); // added by swinder
// noteProgress("Possible start code emulation error: should be 1 after MAXZERORUN 0's");
zerocount = 0;
}
bit = nextinputbit();
if(!bit)
zerocount++;
else
zerocount =0;
v = (v << 1) + bit;
}
return v;
}
Void CVTCDecoder::get_X_bits_checksc_init()
{
zerocount=0;
}
Int CVTCDecoder::get_allbits_checksc (unsigned char *buffer)
{
Int n,len;
Int loc=0;
/* read until end of file */
do {
buffer[loc]=get_X_bits_checksc(8);
loc++;
}while (!feof(bitfile));
/* read until the data in buffer is finished */
len = buffer_length-byte_ptr+2;
for (n=0;n<len;n++)
{
buffer[loc]=get_X_bits_checksc(8);
loc++;
}
return loc;
}
Int CVTCDecoder::align_byte_checksc ()
{
Int bit;
Int i;
Int m;
Int out=0;
Int n=0;
if((i=(bit_num+1)%8)==0)
return 0;
for(m=0;m<i;m++){
if(zerocount==MAXRUNZERO){
get_X_bits(1);
zerocount=0;
}
else{
bit = get_X_bits(1);
out = (out<<1) | bit;
if (bit)
zerocount=0;
else
zerocount++;
n++;
}
}
return(out<<(8-n));
}
/* This program combine the stuff in bitbuffer Into the actual bitstream */
Void CVTCEncoder::write_to_bitstream(UChar *bitbuffer,Int total_bits)
{
Int i,bit_stream_length=total_bits>>3, resid=total_bits%8;
/* write to file assume file has been opened by control program*/
for(i=0;i<bit_stream_length;i++)
emit_bits(bitbuffer[i],8);
if(resid != 0)
emit_bits(bitbuffer[bit_stream_length]>>(8-resid),resid);
}
/* get the number of bytes already decoded */
int CVTCDecoder::decoded_bytes_from_bitstream ()
{
long n;
n = ftell(bitfile);
return (n+byte_ptr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -