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;
}