vlc.c
来自「此code含H.264解码需要的 lib和 src」· C语言 代码 · 共 1,387 行 · 第 1/3 页
C
1,387 行
// return -1;
//
// // make infoword
// inf = 0; // shortest possible code is 1, then info is always 0
//
// while (len--)
// {
// bitcounter++;
// bitoffset --;
// bitoffset &= 0x07;
// cur_byte += (bitoffset == 7);
// inf <<= 1;
// inf |= ((*cur_byte)>> (bitoffset)) & 0x01;
// }
//
// *info = inf;
// return bitcounter; // return absolute offset in bit from start of frame
//}
/*!
************************************************************************
* \brief
* test if bit buffer contains only stop bit
*
* \param buffer
* buffer containing VLC-coded data bits
* \param totbitoffset
* bit offset from start of partition
* \param bytecount
* buffer length
* \return
* true if more bits available
************************************************************************
*/
int more_rbsp_data (byte buffer[],int totbitoffset,int bytecount)
{
int bitoffset = (7 - (totbitoffset & 0x07)); // bit from start of byte
long byteoffset = (totbitoffset >> 3); // byte from start of buffer
byte *cur_byte = &(buffer[byteoffset]);
int ctr_bit = 0; // control bit for current bit posision
int cnt = 0;
assert (byteoffset<bytecount);
// there is more until we're in the last byte
if (byteoffset < (bytecount - 1)) return TRUE;
// read one bit
ctr_bit = ((*cur_byte)>> (bitoffset--)) & 0x01;
// a stop bit has to be one
if (ctr_bit==0) return TRUE;
while (bitoffset>=0 && !cnt)
{
cnt |= ((*cur_byte)>> (bitoffset--)) & 0x01; // set up control bit
}
return (cnt);
}
/*!
************************************************************************
* \brief
* Check if there are symbols for the next MB
************************************************************************
*/
//int uvlc_startcode_follows(struct img_par *img, int dummy)
//{
// int dp_Nr = assignSE2partition[img->currentSlice->dp_mode][SE_MBTYPE];
// DataPartition *dP = &(img->currentSlice->partArr[dp_Nr]);
// Bitstream *currStream = dP->bitstream;
// byte *buf = currStream->streamBuffer;
//
// //KS: new function test for End of Buffer
// return (!(more_rbsp_data(buf, currStream->frame_bitoffset,currStream->bitstream_length)));
//}
/*!
************************************************************************
* \brief
* read one exp-golomb VLC symbol
*
* \param buffer
* containing VLC-coded data bits
* \param totbitoffset
* bit offset from start of partition
* \param info
* returns the value of the symbol
* \param bytecount
* buffer length
* \return
* bits read
************************************************************************
*/
int GetVLCSymbol (byte buffer[],int totbitoffset,int *info, int bytecount)
{
register int inf;
long byteoffset = (totbitoffset>>3); // byte from start of buffer
int bitoffset = (7-(totbitoffset&0x07)); // bit from start of byte
int bitcounter = 1;
int len = 0;
byte *cur_byte = &(buffer[byteoffset]);
int ctr_bit = ((*cur_byte) >> (bitoffset)) & 0x01; // control bit for current bit posision
while (ctr_bit == 0)
{ // find leading 1 bit
len++;
bitcounter++;
bitoffset--;
bitoffset &= 0x07;
cur_byte += (bitoffset == 7);
byteoffset+= (bitoffset == 7);
ctr_bit = ((*cur_byte) >> (bitoffset)) & 0x01;
}
if (byteoffset + ((len + 7) >> 3) > bytecount)
return -1;
// make infoword
inf = 0; // shortest possible code is 1, then info is always 0
while (len--)
{
bitoffset --;
bitoffset &= 0x07;
cur_byte += (bitoffset == 7);
bitcounter++;
inf <<= 1;
inf |= ((*cur_byte) >> (bitoffset)) & 0x01;
}
*info = inf;
return bitcounter; // return absolute offset in bit from start of frame
}
extern void tracebits2(const char *trace_str, int len, int info) ;
/*!
************************************************************************
* \brief
* code from bitstream (2d tables)
************************************************************************
*/
//int code_from_bitstream_2d(SyntaxElement *sym,
// Bitstream *currStream,
// const int *lentab,
// const int *codtab,
// int tabwidth,
// int tabheight,
// int *code)
//{
// int frame_bitoffset = currStream->frame_bitoffset;
// int BitstreamLengthInBytes = currStream->bitstream_length - (frame_bitoffset >> 3);
// byte *buf = &currStream->streamBuffer[frame_bitoffset>>3];
// int current_bit_pos = 7 - (frame_bitoffset & 0x07);
//
// int i, j;
// const int *len = &lentab[0], *cod = &codtab[0];
//
// // this VLC decoding method is not optimized for speed
// for (j = 0; j < tabheight; j++)
// {
// for (i = 0; i < tabwidth; i++)
// {
// //if ((*len == 0) || (ShowBits(buf, frame_bitoffset, BitstreamLengthInBytes, *len) != *cod))
// if ((*len == 0) || (ShowBitsThres(buf, current_bit_pos, BitstreamLengthInBytes, *len, *cod) != *cod))
// {
// len++;
// cod++;
// }
// else
// {
// sym->value1 = i;
// sym->value2 = j;
// sym->len = *len;
// currStream->frame_bitoffset += *len; // move bitstream pointer
// *code = *cod; // found code and return
// return 0;
// }
// }
// }
// return -1; // failed to find code
//}
/*!
************************************************************************
* \brief
* read FLC codeword from UVLC-partition
************************************************************************
*/
int readSyntaxElement_FLC(SyntaxElement *sym, Bitstream *currStream)
{
int frame_bitoffset = currStream->frame_bitoffset;
int BitstreamLengthInBytes = currStream->bitstream_length;
byte *buf = currStream->streamBuffer;
if ((GetBits(buf, frame_bitoffset, &(sym->inf), BitstreamLengthInBytes, sym->len)) < 0)
return -1;
sym->value1 = sym->inf;
currStream->frame_bitoffset += sym->len; // move bitstream pointer
#if TRACE
tracebits2(sym->tracestring, sym->len, sym->inf);
#endif
return 1;
}
/*!
************************************************************************
* \brief
* read NumCoeff/TrailingOnes codeword from UVLC-partition
************************************************************************
*/
//int readSyntaxElement_NumCoeffTrailingOnes(SyntaxElement *sym,
// Bitstream *currStream,
// char *type)
//{
// int frame_bitoffset = currStream->frame_bitoffset;
// int BitstreamLengthInBytes = currStream->bitstream_length;
// byte *buf = currStream->streamBuffer;
//
// static const int lentab[3][4][17] =
// {
// { // 0702
// { 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
// { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
// { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
// { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16},
// },
// {
// { 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
// { 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
// { 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
// { 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14},
// },
// {
// { 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
// { 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
// { 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
// { 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10},
// },
// };
//
// static const int codtab[3][4][17] =
// {
// {
// { 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4},
// { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10,6},
// { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9,5},
// { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12,8},
// },
// {
// { 3,11, 7, 7, 7, 4, 7,15,11,15,11, 8,15,11, 7, 9,7},
// { 0, 2, 7,10, 6, 6, 6, 6,14,10,14,10,14,10,11, 8,6},
// { 0, 0, 3, 9, 5, 5, 5, 5,13, 9,13, 9,13, 9, 6,10,5},
// { 0, 0, 0, 5, 4, 6, 8, 4, 4, 4,12, 8,12,12, 8, 1,4},
// },
// {
// {15,15,11, 8,15,11, 9, 8,15,11,15,11, 8,13, 9, 5,1},
// { 0,14,15,12,10, 8,14,10,14,14,10,14,10, 7,12, 8,4},
// { 0, 0,13,14,11, 9,13, 9,13,10,13, 9,13, 9,11, 7,3},
// { 0, 0, 0,12,11,10, 9, 8,13,12,12,12, 8,12,10, 6,2},
// },
// };
//
// int retval = 0, code;
// int vlcnum = sym->value1;
// // vlcnum is the index of Table used to code coeff_token
// // vlcnum==3 means (8<=nC) which uses 6bit FLC
//
// if (vlcnum == 3)
// {
// // read 6 bit FLC
// code = ShowBits(buf, frame_bitoffset, BitstreamLengthInBytes, 6);
// currStream->frame_bitoffset += 6;
// sym->value2 = (code & 3);
// sym->value1 = (code >> 2);
//
// if (!sym->value1 && sym->value2 == 3)
// {
// // #c = 0, #t1 = 3 => #c = 0
// sym->value2 = 0;
// }
// else
// sym->value1++;
//
// sym->len = 6;
// }
// else
// {
// //retval = code_from_bitstream_2d(sym, currStream, &lentab[vlcnum][0][0], &codtab[vlcnum][0][0], 17, 4, &code);
// retval = code_from_bitstream_2d(sym, currStream, lentab[vlcnum][0], codtab[vlcnum][0], 17, 4, &code);
// if (retval)
// {
// printf("ERROR: failed to find NumCoeff/TrailingOnes\n");
// exit(-1);
// }
// }
//
//#if TRACE
// snprintf(sym->tracestring,
// TRACESTRING_SIZE, "%s # c & tr.1s vlc=%d #c=%d #t1=%d",
// type, vlcnum, sym->value1, sym->value2);
// tracebits2(sym->tracestring, sym->len, code);
//#endif
//
// return retval;
//}
/*!
************************************************************************
* \brief
* read NumCoeff/TrailingOnes codeword from UVLC-partition ChromaDC
************************************************************************
*/
//int readSyntaxElement_NumCoeffTrailingOnesChromaDC(SyntaxElement *sym, Bitstream *currStream)
//{
// static const int lentab[3][4][17] =
// {
// //YUV420
// {{ 2, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 1, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 3, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
// //YUV422
// {{ 1, 7, 7, 9, 9,10,11,12,13, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 2, 7, 7, 9,10,11,12,12, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 3, 7, 7, 9,10,11,12, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 0, 5, 6, 7, 7,10,11, 0, 0, 0, 0, 0, 0, 0, 0}},
// //YUV444
// {{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
// { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
// { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
// { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}}
// };
//
// static const int codtab[3][4][17] =
// {
// //YUV420
// {{ 1, 7, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 1, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
// //YUV422
// {{ 1,15,14, 7, 6, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 1,13,12, 5, 6, 6, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 1,11,10, 4, 5, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 0, 1, 1, 9, 8, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0}},
// //YUV444
// {{ 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7, 4},
// { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10, 6},
// { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9, 5},
// { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12, 8}}
//
// };
//
// int code;
// int yuv = active_sps->chroma_format_idc - 1;
// int retval = code_from_bitstream_2d(sym, currStream, &lentab[yuv][0][0], &codtab[yuv][0][0], 17, 4, &code);
//
// if (retval)
// {
// printf("ERROR: failed to find NumCoeff/TrailingOnes ChromaDC\n");
// exit(-1);
// }
//
//#if TRACE
// snprintf(sym->tracestring,
// TRACESTRING_SIZE, "ChrDC # c & tr.1s #c=%d #t1=%d",
// sym->value1, sym->value2);
// tracebits2(sym->tracestring, sym->len, code);
//
//#endif
//
// return retval;
//}
/*!
************************************************************************
* \brief
* read Level VLC0 codeword from UVLC-partition
************************************************************************
*/
//int readSyntaxElement_Level_VLC0(SyntaxElement *sym, Bitstream *currStream)
//{
// int frame_bitoffset = currStream->frame_bitoffset;
// int BitstreamLengthInBytes = currStream->bitstream_length;
// byte *buf = currStream->streamBuffer;
// int len = 0, sign=0, level=0, code = 1;
// int offset, addbit;
//
// while (!ShowBits(buf, frame_bitoffset+len, BitstreamLengthInBytes, 1))
// len++;
//
// len++;
// frame_bitoffset += len;
//
// if (len < 15)
// {
// sign = (len - 1) & 1;
// level = ((len - 1) >> 1) + 1;
// }
// else if (len == 15)
// {
// // escape code
// code <<= 4;
// code |= ShowBits(buf, frame_bitoffset, BitstreamLengthInBytes, 4);
// len += 4;
// frame_bitoffset += 4;
// sign = (code & 0x01);
// level = ((code >> 1) & 0x07) + 8;
// }
// else if (len >= 16)
// {
// // escape code
// addbit = (len - 16);
// len -= 4;
// code = ShowBits(buf, frame_bitoffset, BitstreamLengthInBytes, len);
// sign = (code & 0x01);
// frame_bitoffset += len;
//
// offset=(2048<<addbit) - 2032;
// level = (code >> 1) + offset;
// code |= (1 << (len)); // for display purpose only
// len += addbit + 16;
// }
//
// sym->inf = (sign) ? -level : level ;
// sym->len = len;
//
//#if TRACE
// tracebits2(sym->tracestring, sym->len, code);
//#endif
// currStream->frame_bitoffset = frame_bitoffset;
// return 0;
//
//}
/*!
************************************************************************
* \brief
* read Level VLC codeword from UVLC-partition
************************************************************************
*/
//int readSyntaxElement_Level_VLCN(SyntaxElement *sym, int vlc, Bitstream *currStream)
//{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?