Re: VLC funcs
skal <[email protected]> 18 Mar 2003 16:59:57 +0100
| Newsgroups | gmane.comp.video.h264.devel |
|---|---|
| Message-ID | <1048003197.1448.53.camel@latitude344> |
Hi On Mon, 2003-03-17 at 10:38, skal wrote: > Attached are some other replacement functions I forgot > last time, as well as a "cleared" version of > readCoeff4x4_CAVLC() in macroblock.c > > ... and here are some replacement for the VLC0/VLCN decoding func, too... later, Skal
hdot264_3.c
(text/x-c, 1.6 KB)
/*!
************************************************************************
* \brief
* read Level VLC0 codeword from UVLC-partition
************************************************************************
*/
int readSyntaxElement_Level_VLC0(SyntaxElement *sym, struct datapartition *dP)
{
int level, len, code;
len = 1;
code = See_Bits(dP, 16);
while(!(code&0x8000)) { len++; code<<=1; }
Discard_Bits(dP, len);
if (len < 15)
{
level = ((len-1)>>1) + 1;
sym->inf = (len&1) ? level : -level;
}
else {
if (len == 15) // 4bits esc
{
code = (1 << 4) | Get_Bits(dP, 4);
level = ((code >> 1) & 0x7) + 8;
len += 4;
}
else if (len == 16) // 12bits esc
{
code = (1 << 12) | Get_Bits(dP, 12);
len += 12;
level = ((code >> 1) & 0x7ff) + 16;
}
else
{
printf("ERROR reading Level code\n");
exit(-1);
}
sym->inf = (code&1) ? -level : level;
}
sym->len = len;
return 0;
}
/*!
************************************************************************
* \brief
* read Level VLC codeword from UVLC-partition
************************************************************************
*/
int readSyntaxElement_Level_VLCN(SyntaxElement *sym, int vlc, struct datapartition *dP)
{
int code, level, len;
len = 1;
code = See_Bits(dP, 16);
while(!(code&0x8000)) { len++; code<<=1; }
Discard_Bits(dP, len);
if (len<16) {
level = ((len-1)<<vlc) | Get_Bits(dP, vlc);
len += vlc;
}
else {
level = (15<<vlc) + Get_Bits(dP, 12);
len += 12;
}
sym->inf = (level&1) ? -(level>>1)-1 : (level>>1)+1;
sym->len = len;
return 0;
}