www.pudn.com > wm2.5.zip > vlc.c


/* 
*********************************************************************** 
* COPYRIGHT AND WARRANTY INFORMATION 
* 
* Copyright 2003, Advanced Audio Video Coding Standard, Part II 
* 
* DISCLAIMER OF WARRANTY 
* 
* These software programs are available to the users without any 
* license fee or royalty on an "as is" basis. The AVS disclaims 
* any and all warranties, whether express, implied, or statutory, 
* including any implied warranties of merchantability or of fitness 
* for a particular purpose. In no event shall the contributors or  
* the AVS be liable for any incidental, punitive, or consequential 
* damages of any kind whatsoever arising from the use of this program. 
* 
* This disclaimer of warranty extends to the user of this program 
* and user's customers, employees, agents, transferees, successors, 
* and assigns. 
* 
* The AVS does not represent or warrant that the program furnished 
* hereunder are free of infringement of any third-party patents. 
* Commercial implementations of AVS, including shareware, may be 
* subject to royalty fees to patent holders. Information regarding 
* the AVS patent policy is available from the AVS Web site at 
* http://www.avs.org.cn 
* 
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY. 
************************************************************************ 
*/ 
 
/* 
************************************************************************************* 
* File name: vlc.c 
* Function: VLC support functions 
* 
************************************************************************************* 
*/ 
 
#include  
#include  
#include  
#include  
#include  
 
#include "global.h" 
#include "vlc.h" 
#include "elements.h" 
#include "header.h" 
#include "global.h" 
 
// A little trick to avoid those horrible #if TRACE all over the source code 
#if TRACE 
#define SYMTRACESTRING(s) strncpy(sym->tracestring,s,TRACESTRING_SIZE) 
#else 
#define SYMTRACESTRING(s) // do nothing 
#endif 
 
extern void tracebits(const char *trace_str,  int len,  int info,int value1); 
extern void tracebits3(const char *trace_str,  int len,  int info,int value1); 
extern int  readSyntaxElement_GOLOMB(SyntaxElement *se); 
 
int UsedBits;      // for internal statistics, is adjusted by se_v, ue_v, u_1 
 
const byte NTAB_INTER[15][2] =        //qwang 2004-3-16 
{ 
  {1,0}, {1,1}, {1,2}, {2,0}, {1,3},  
  {1,4}, {1,5}, {3,0}, {2,1}, {2,2},  
  {1,6}, {1,7}, {1,8}, {1,9}, {4,0},  
}; 
 
const byte NTAB_INTRA[15][2] =        //qwang 2004-3-16 
{ 
  {1,0}, {1,1}, {2,0}, {1,2}, {3,0},  
  {4,0}, {5,0}, {1,3}, {1,4}, {2,1},  
  {3,1}, {6,0}, {7,0}, {8,0}, {9,0},  
}; 
 
 
const int SCAN[16][2] = // [scan_pos][x/y] ATTENTION: the ScanPositions are (pix,lin)!    //qwang 2004-3-9 
{ 
	{0,0},{1,0},{0,1},{0,2}, 
	{1,1},{2,0},{3,0},{2,1}, 
	{1,2},{0,3},{1,3},{2,2}, 
	{3,1},{3,2},{2,3},{3,3} 
}; 
 
const byte QP_RANGE[64] = 
{ 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
  1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
  3, 3, 3, 3 
}; 
 
const byte VLC_TABLE_INTRA[4] =  
{ 
  0, 1, 2, 3 
}; 
 
const byte VLC_TABLE_INTER[4][7] =  
{ 
  {  2,  2,  2,  3,  3,  3,  0}, 
  {  6,  6,  6,  7,  8,  8,  1}, 
  {  6,  6,  6,  7,  8,  8,  4}, 
  {  6,  6,  6,  7,  8,  8,  5} 
}; 
char AVS_2DVLC_INTER_dec[7][64][2]={{{-1,-1}}}; 
const char AVS_2DVLC_INTER[7][26][27] =  
{ 
	{ 
		{ 0, 26, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{ 2, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{ 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{ 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{ 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
	}, 
	{ 
		{ 2,  0, 13, 29, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1,  3, 23, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1,  5, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1,  7, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1,  9, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 11, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 15, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		}, 
		{ 
			{ 2,  0,  5, 11, 23, 35, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1,  3, 13, 27, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1,  7, 21, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1,  9, 29, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 15, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 17, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 19, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
		}, 
		{ 
			{ 2,  0,  3,  7, 13, 17, 27, 35, 43, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1,  5, 11, 21, 33, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1,  9, 23, 37, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 15, 29, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 19, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 25, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			}, 
			{ 
				{ 2,  0,  3,  5,  9, 11, 17, 21, 25, 33, 41, 45, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1,  7, 13, 19, 29, 35, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 15, 27, 43, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 23, 37, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 31, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
			}, 
			{ 
				{ 0,  1,  3,  5,  7,  9, 13, 15, 17, 21, 25, 29, 33, 39, 43, 49, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 11, 19, 27, 31, 41, 45, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 23, 37, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 35, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				}, 
				{ 
					{ 0,  1,  3,  5,  7,  9, 11, 13, 17, 19, 21, 23, 25, 29, 33, 35, 39, 41, 43, 47, 49, 57, -1, -1, -1, -1, -1}, 
					{-1, 15, 27, 37, 45, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, 31, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
					{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 
				} 
}; 
const char VLC_Golomb_Order[2][3][7][2] =       //[interlace/frame][intra/inter/chroma][tablenum][grad/maxlevel] 
{ 
	{  //interlace coding 
		{ 
			{2,9}, {2,9}, {1,9}, {2,9}, {2,9}, {3,9}, {-1,-1}, 
		}, 
		{ 
			{3,9}, {2,9}, {1,9}, {2,9}, {2,9}, {2,9}, {3,9}, 
			}, 
			{ 
				{2,9}, {2,9}, {1,9}, {1,9}, {2,9}, {-1,-1}, {-1,-1}, 
			}, 
	},  
	{  //frame coding 
		{ 
			{2,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, 
		}, 
		{ 
			{3,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, 
			}, 
			{ 
				{2,9}, {0,9}, {1,9}, {1,9}, {0,9}, {-1,-1}, {-1,-1}, 
			}, 
				} 
}; 
const char MaxRun[3][7] =  
{ 
	{22,14,9,6,4,2,1}, 
	{25,18,13,9,6,4,3}, 
	{24,19,10,7,4,-1,-1} 
}; 
 
const char RefAbsLevel[19][26] =  
{ 
	{ 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1}, 
	{ 7, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{10, 6, 4, 4, 3, 3, 3, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{13, 7, 5, 4, 3, 2, 2,-1,-1,-1 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{18, 8, 4, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{22, 7, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{27, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{ 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, 
	{ 5, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1}, 
	{ 7, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{10, 6, 5, 4, 3, 3, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{13, 7, 5, 4, 3, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{17, 8, 4, 3, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{22, 6, 3, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{ 5, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1}, 
	{ 6, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1}, 
	{10, 6, 4, 4, 3, 3, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{14, 7, 4, 3, 3, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 
	{20, 7, 3, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} 
}; 
const int B8SCAN[2][64][2] = // [scan_pos][x/y] ATTENTION: the ScanPositions are (pix,lin)! 
{ 
	{ 
		{0,0},{0,1},{0,2},{1,0},{0,3},{0,4},{1,1},{1,2}, 
		{0,5},{0,6},{1,3},{2,0},{2,1},{0,7},{1,4},{2,2}, 
		{3,0},{1,5},{1,6},{2,3},{3,1},{3,2},{4,0},{1,7}, 
		{2,4},{4,1},{2,5},{3,3},{4,2},{2,6},{3,4},{4,3}, 
		{5,0},{5,1},{2,7},{3,5},{4,4},{5,2},{6,0},{5,3}, 
		{3,6},{4,5},{6,1},{6,2},{5,4},{3,7},{4,6},{6,3}, 
		{5,5},{4,7},{6,4},{5,6},{6,5},{5,7},{6,6},{7,0}, 
		{6,7},{7,1},{7,2},{7,3},{7,4},{7,5},{7,6},{7,7} 
	}, 
	{ 
		{ 0, 0}, { 1, 0}, { 0, 1}, { 0, 2}, { 1, 1}, { 2, 0}, { 3, 0}, { 2, 1}, 
		{ 1, 2}, { 0, 3}, { 0, 4}, { 1, 3}, { 2, 2}, { 3, 1}, { 4, 0}, { 5, 0}, 
		{ 4, 1}, { 3, 2}, { 2, 3}, { 1, 4}, { 0, 5}, { 0, 6}, { 1, 5}, { 2, 4}, 
		{ 3, 3}, { 4, 2}, { 5, 1}, { 6, 0}, { 7, 0}, { 6, 1}, { 5, 2}, { 4, 3}, 
		{ 3, 4}, { 2, 5}, { 1, 6}, { 0, 7}, { 1, 7}, { 2, 6}, { 3, 5}, { 4, 4}, 
		{ 5, 3}, { 6, 2}, { 7, 1}, { 7, 2}, { 6, 3}, { 5, 4}, { 4, 5}, { 3, 6}, 
		{ 2, 7}, { 3, 7}, { 4, 6}, { 5, 5}, { 6, 4}, { 7, 3}, { 7, 4}, { 6, 5}, 
		{ 5, 6}, { 4, 7}, { 5, 7}, { 6, 6}, { 7, 5}, { 7, 6}, { 6, 7}, { 7, 7} 
	} 
}; 
extern int  readSyntaxElement_HybridGOLOMB(SyntaxElement *se); 
 
/* 
************************************************************************* 
* Function:ue_v, reads an ue(v) syntax element, the length in bits is stored in  
     the global UsedBits variable 
* Input: 
		tracestring 
      the string for the trace file 
        bitstream 
      the stream to be read from  
* Output: 
* Return: the value of the coded syntax element 
* Attention: 
************************************************************************* 
*/ 
 
int ue_v (char *tracestring) 
{ 
  SyntaxElement symbol, *sym=&symbol; 
 
  assert (currStream->streamBuffer != NULL); 
  sym->type = SE_HEADER; 
  sym->mapping = mapping_ue;   // Mapping rule 
  SYMTRACESTRING(tracestring); 
  read_VLC (sym); 
 
  return sym->value1; 
} 
 
/* 
************************************************************************* 
* Function:ue_v, reads an se(v) syntax element, the length in bits is stored in  
     the global UsedBits variable 
* Input:  
		tracestring 
      the string for the trace file 
        bitstream 
      the stream to be read from 
* Output: 
* Return: the value of the coded syntax element 
* Attention: 
************************************************************************* 
*/ 
 
int se_v (char *tracestring) 
{ 
  SyntaxElement symbol, *sym=&symbol; 
 
  assert (currStream->streamBuffer != NULL); 
  sym->type = SE_HEADER; 
  sym->mapping = mapping_se;   // Mapping rule: signed integer 
  SYMTRACESTRING(tracestring); 
  read_VLC (sym); 
 
  return sym->value1; 
} 
 
/* 
************************************************************************* 
* Function:ue_v, reads an u(v) syntax element, the length in bits is stored in  
      the global UsedBits variable 
* Input: 
		tracestring 
     the string for the trace file 
       bitstream 
      the stream to be read from 
* Output: 
* Return: the value of the coded syntax element 
* Attention: 
************************************************************************* 
*/ 
 
int u_v (int LenInBits, char*tracestring) 
{ 
  SyntaxElement symbol, *sym=&symbol; 
 
  assert (currStream->streamBuffer != NULL); 
  sym->type = SE_HEADER; 
  sym->mapping = mapping_ue;   // Mapping rule 
  sym->len = LenInBits; 
  SYMTRACESTRING(tracestring); 
  read_FLC (sym); 
 
  return sym->inf; 
} 
 
/* 
************************************************************************* 
* Function:ue_v, reads an u(1) syntax element, the length in bits is stored in  
     the global UsedBits variable 
* Input: 
		tracestring 
     the string for the trace file 
       bitstream 
     the stream to be read from 
* Output: 
* Return: the value of the coded syntax element 
* Attention: 
************************************************************************* 
*/ 
 
int u_1 (char *tracestring) 
{ 
  return u_v (1, tracestring); 
} 
 
/* 
************************************************************************* 
* Function:mapping rule for ue(v) syntax elements 
* Input:lenght and info 
* Output:number in the code table 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
void mapping_ue(int len, int info, int *value1) 
{ 
  *value1 = (int)pow(2,(len/2))+info-1; // *value1 = (int)(2<<(len>>1))+info-1; 
} 
 
/* 
************************************************************************* 
* Function:mapping rule for se(v) syntax elements 
* Input:lenght and info 
* Output:signed mvd 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
void mapping_se(int len,  int info, int *value1) 
{ 
  int n; 
  n = (int)pow(2,(len/2))+info-1; 
  *value1 = (n+1)/2; 
  if((n & 0x01)==0)                           // lsb is signed bit 
    *value1 = -*value1; 
 
} 
 
/* 
************************************************************************* 
* Function:lenght and info 
* Input: 
* Output:cbp (intra) 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
 
void read_cbp_intra(int len,int info,int *cbp) 
{ 
  extern const byte NCBP[48][2]; 
    int cbp_idx; 
  mapping_ue(len,info,&cbp_idx); 
    *cbp=NCBP[cbp_idx][0]; 
} 
 
/* 
************************************************************************* 
* Function: 
* Input:lenght and info 
* Output:cbp (inter) 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
void read_cbp_inter(int len,int info,int *cbp) 
{ 
  extern const byte NCBP[48][2]; 
  int cbp_idx; 
  mapping_ue(len,info,&cbp_idx); 
    *cbp=NCBP[cbp_idx][1]; 
} 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
void symbol2D_levrun_intra(int *level, int *run, int symbol2D)    //qwang 2004-3-16 
{ 
  const byte LEVRUN[8]= 
  { 
    9,3,1,1,1,0,0,0 
  }; 
  int sign; 
 
  if(symbol2D==0) 
    *level = 0; 
  else if(symbol2D <= 30)   //lookup table 
  { 
    if(symbol2D&1)          //+level 
      sign = 0; 
    else                    //-level 
    { 
      sign = 1; 
      symbol2D--; 
    } 
 
    symbol2D = (symbol2D/2); 
 
    *level = NTAB_INTRA[symbol2D][0]; 
    *run   = NTAB_INTRA[symbol2D][1]; 
    if(sign == 1) 
      *level = -(*level); 
  } 
  else 
  { 
    if(symbol2D&1)         //+level 
    { 
      sign = 0; 
      symbol2D++; 
    } 
    else                   //-level 
      sign = 1; 
 
    *run   = (symbol2D%16)/2; 
    *level = (((symbol2D - (symbol2D%16) - 16))/16 + LEVRUN[*run]); 
    if(sign == 1) 
      *level = -(*level); 
  } 
} 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
void symbol2D_levrun_inter(int *level, int *run, int symbol2D)    //qwang 2004-3-16 
{ 
  const byte LEVRUN[16]= 
  {4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0}; 
  int sign; 
 
  if(symbol2D==0) 
    *level = 0; 
  else if(symbol2D <= 30)   //lookup table 
  { 
    if(symbol2D&1)          //+level 
      sign = 0; 
    else                    //-level 
    { 
      sign = 1; 
      symbol2D--; 
    } 
 
    symbol2D = (symbol2D/2); 
 
    *level = NTAB_INTER[symbol2D][0]; 
    *run   = NTAB_INTER[symbol2D][1]; 
    if(sign == 1) 
      *level = -(*level); 
  } 
  else 
  { 
    if(symbol2D&1)         //+level 
    { 
      sign = 0; 
      symbol2D++; 
    } 
    else                   //-level 
      sign = 1; 
 
    *run   = (symbol2D%32)/2; 
    *level = ((symbol2D/32)+LEVRUN[*run]); 
    if(sign == 1) 
      *level = -(*level); 
  } 
} 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
void symbol2D_levrun(int *level, int *run, int intra, int tableindex, int symbol2D) 
{ 
  const byte LEVRUN_INTRA[7][16]= // dongjie 
  { 
    { 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, 
    { 6, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 6, 4, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 8, 5, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    {10, 5, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    {12, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    {15, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
  }; 
	 
  const byte LEVRUN_INTER[7][16]= // dongjie 
  { 
    { 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, 
    { 5, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, 
    { 5, 3, 3, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 6, 4, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 7, 4, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 9, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    {13, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
  }; 
  int sign; 
 
 
  if(symbol2D&1)         //+level 
  { 
    sign = 0; 
    symbol2D++; 
  } 
  else                   //-level 
    sign = 1; 
   
  *run   = ((symbol2D-8)%32)/2; 
  if(intra) 
    *level = (((symbol2D-8)/32)+LEVRUN_INTRA[tableindex][*run]); 
  else 
    *level = (((symbol2D-8)/32)+LEVRUN_INTER[tableindex][*run]); 
  if(sign == 1) 
    *level = -(*level); 
 
} 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
void symbol2D_levrun_chroma(int *level, int *run, int symbol2D, int tableindex) 
{ 
  const byte LEVRUN_CHROMA[4][16]= // dongjie 
  { 
    { 6, 2, 2, 2, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, 
    { 7, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, 
    { 9, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    {12, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
  }; 
 
  int sign; 
 
 
  if(symbol2D&1)         //+level 
  { 
    sign = 0; 
    symbol2D++; 
  } 
  else                   //-level 
    sign = 1; 
   
  //*run   = (symbol2D%32)/2; 
  *run   = ((symbol2D-8)%32)/2; 
  *level = ((symbol2D-8)/32+LEVRUN_CHROMA[tableindex/*dongjie*/][*run]); 
  if(sign == 1) 
    *level = -(*level); 
 
} 
 
// added by PSL 20041228 
void find_level(int sign, int *level, int run, int intra, int tableindex, int abs_level_diff) 
{ 
	const byte LEVRUN_INTRA[7][16]= // dongjie 
	{ 
		{ 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, 
		{ 6, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{ 6, 4, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{ 8, 5, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{10, 5, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{12, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{15, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
	}; 
	 
	const byte LEVRUN_INTER[7][16]= // dongjie 
	{ 
		{ 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, 
		{ 5, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, 
		{ 5, 3, 3, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{ 6, 4, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{ 7, 4, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{ 9, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
		{13, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
	}; 
	 
	if(intra) 
		*level = (abs_level_diff+LEVRUN_INTRA[tableindex][run]); 
	else 
		*level = (abs_level_diff+LEVRUN_INTER[tableindex][run]); 
	 
	if(sign == 1) 
		*level = -(*level); 
	 
} 
// added by PSL 20041228 
void find_level_chroma(int sign, int *level, int run, int tableindex, int abs_level_diff) 
{ 
 const byte LEVRUN_CHROMA[4][16]= // dongjie 
  { 
    { 6, 2, 2, 2, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, 
    { 7, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, 
    { 9, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    {12, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
  }; 
   
  *level = abs_level_diff +  LEVRUN_CHROMA[tableindex/*dongjie*/][run]; 
  if(sign == 1) 
    *level = -(*level); 
} 
 
/* 
************************************************************************* 
* Function:read next UVLC codeword from UVLC-partition and 
      map it to the corresponding syntax element 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
 
int read_VLC(SyntaxElement *sym) 
{ 
  int frame_bitoffset = currStream->frame_bitoffset; 
  byte *buf = currStream->streamBuffer; 
  int BitstreamLengthInBytes = currStream->bitstream_length; 
 
  sym->len =  GetVLCSymbol (&(sym->inf)); 
 
  if (sym->len == -1) 
    return -1; 
 
  sym->mapping(sym->len,sym->inf,&(sym->value1)); 
 
#if TRACE 
  tracebits(sym->tracestring, sym->len, sym->inf, sym->value1); 
#endif 
 
  return 1; 
} 
 
/* 
************************************************************************* 
* Function:read next UVLC codeword from UVLC-partition and 
      map it to the corresponding syntax element 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
 
int read_UVLC(SyntaxElement *sym) 
{ 
  int frame_bitoffset = currStream->frame_bitoffset; 
  byte *buf = currStream->streamBuffer; 
  int BitstreamLengthInBytes = currStream->bitstream_length; 
 
  if(sym->type == SE_REFFRAME) 
  { 
    sym->len = 1; 
     
    if ((GetVLCSymbol_refidx(&(sym->inf))) < 0) 
      return -1; 
     
    sym->value1 = sym->inf; 
    currStream->frame_bitoffset += sym->len; 
  
	 
#if TRACE 
    tracebits3(sym->tracestring, sym->len, sym->inf, sym->value1);//sym->inf, sym->value1); 
#endif 
    
  } 
  else 
  { 
    sym->len =  GetVLCSymbol (&(sym->inf)); 
    if (sym->len == -1) 
      return -1; 
 
    sym->mapping(sym->len,sym->inf,&(sym->value1)); 
    
#if TRACE 
    tracebits(sym->tracestring, sym->len, sym->inf, sym->value1); 
#endif 
    
  } 
   
  return 1; 
} 
 
/* 
************************************************************************* 
* Function:read next VLC codeword for 4x4 Intra Prediction Mode and 
     map it to the corresponding Intra Prediction Direction 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
int read_Intra4x4PredictionMode(SyntaxElement *sym)   //qwang 2004-3-9 
{ 
  int         frame_bitoffset        = currStream->frame_bitoffset; 
  byte        *buf                   = currStream->streamBuffer; 
  int         BitstreamLengthInBytes = currStream->bitstream_length; 
  int		  value1;  //temporal varibale 
 
  sym->len = GetIntraMode (buf, frame_bitoffset, &(sym->inf), BitstreamLengthInBytes); 
 
  if (sym->len == -1) 
    return -1; 
 
  currStream->frame_bitoffset += sym->len; 
  sym->value1                  = sym->len == 1 ? -1 : sym->inf; 
 
    //add ctrl bits 
	if(sym->len == 1) 
		value1 = 0; 
	else 
	    value1 = sym->value1 + 8;   // add 
#if TRACE 
	//tracebits2(sym->tracestring, sym->len, sym->value1); 
    tracebits3(sym->tracestring, sym->len, value1,sym->value1); 
#endif 
 
 
  return 1; 
} 
 
 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
int GetIntraMode (byte buffer[],int totbitoffset,int *info, int bytecount) 
{ 
 
  register int inf; 
  long byteoffset;      // byte from start of buffer 
  int bitoffset;      // bit from start of byte 
  int ctr_bit=0;      // control bit for current bit posision 
  int bitcounter=1; 
  int len; 
  int info_bit; 
 
  byteoffset = totbitoffset/8; 
  bitoffset  = 7-(totbitoffset%8); 
  ctr_bit    = (buffer[byteoffset] & (0x01< bytecount) 
    { 
      return -1; 
    } 
    inf=(inf<<1); 
    if(buffer[byteoffset] & (0x01<<(bitoffset))) 
      inf |=1; 
  } 
 
  *info = inf; 
  return bitcounter;           // return absolute offset in bit from start of frame 
} 
 
/* 
************************************************************************* 
* Function: Moves the read pointer of the partition forward by one symbol 
* Input: 
		byte buffer[] 
     containing VLC-coded data bits 
		int totbitoffset 
     bit offset from start of partition 
		 int type 
     expected data type (Partiotion ID) 
* Output: 
* Return: Length and Value of the next symbol 
* Attention:As in both nal_bits.c and nal_part.c all data of one partition, slice, 
      picture was already read into a buffer, there is no need to read any data 
     here again. 
	\par 
      This function could (and should) be optimized considerably 
    \par 
      If it is ever decided to have different VLC tables for different symbol 
      types, then this would be the place for the implementation 
    \par 
      An alternate VLC table is implemented based on exponential Golomb codes. 
     The encoder must have a matching define selected. 
	 \par 
      GetVLCInfo was extracted because there should be only one place in the 
      source code that has knowledge about symbol extraction, regardless of 
      the number of different NALs. 
************************************************************************* 
*/ 
 
int GetVLCSymbol (int *info) 
{ 
 
	register int inf; 
	long byteoffset;      // byte from start of buffer 
	int bitoffset;      // bit from start of byte 
	int ctr_bit=0;      // control bit for current bit posision 
	int bitcounter=1; 
	int len; 
	int info_bit; 
	byte *buffer = currStream->streamBuffer; 
	int bytecount = currStream->bitstream_length; 
	int totbitoffset = currStream->frame_bitoffset; 
 
	byteoffset= totbitoffset/8; 
	bitoffset= 7-(totbitoffset%8); 
	ctr_bit = (buffer[byteoffset] & (0x01< bytecount) 
		{ 
			error("parse error", -1); 
			return -1; 
		} 
		inf=(inf<<1); 
		if(buffer[byteoffset] & (0x01<<(bitoffset))) 
			inf |=1; 
	} 
 
	*info = inf; 
 
	currStream->frame_bitoffset += bitcounter; 
	return bitcounter;           // return absolute offset in bit from start of frame 
} 
/* 
************************************************************************* 
* Function: get one symbol but not moves the read pointer of the partition forward by one symbol 
* Input: 
byte buffer[] 
containing VLC-coded data bits 
int totbitoffset 
bit offset from start of partition 
* Output: 
* Return: Value of the next symbol 
* Author: Wang Jianpeng 
************************************************************************* 
*/ 
//WJP FOR SLICE_HEADER 050320 
int search_ue_code (int totbitoffset) 
{ 
	 
	register int inf; 
	long byteoffset;      // byte from start of buffer 
	int bitoffset;      // bit from start of byte 
	int ctr_bit=0;      // control bit for current bit posision 
	int bitcounter=1; 
	int len; 
	int info_bit; 
	byte *buffer = currStream->streamBuffer; 
	int bytecount = currStream->bitstream_length; 
	int symbal; 
	 
	byteoffset= totbitoffset/8; 
	bitoffset= 7-(totbitoffset%8); 
	ctr_bit = (buffer[byteoffset] & (0x01< bytecount) 
		{ 
			error("parse error", -1); 
			return -1; 
		} 
		inf=(inf<<1); 
		if(buffer[byteoffset] & (0x01<<(bitoffset))) 
			inf |=1; 
	} 
	 
	mapping_ue(bitcounter,inf,&symbal); 
	return symbal; 
} 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
int GetVLCSymbol_refidx (int *info) 
{ 
   
  register int inf; 
  long byteoffset;      // byte from start of buffer 
  int bitoffset;      // bit from start of byte 
  int bitcounter=1; 
  int len; 
  int info_bit; 
  byte *buffer=currStream->streamBuffer; 
  int bytecount = currStream->bitstream_length; 
  int totbitoffset = currStream->frame_bitoffset; 
   
	byteoffset= totbitoffset/8; 
  bitoffset= 7-(totbitoffset%8); 
   
  len=1; 
  inf=0; 
   
  for(info_bit=0;(info_bit bytecount) 
    { 
      return -1; 
    } 
     
    if(buffer[byteoffset] & (0x01<<(bitoffset))) 
      inf = 1; 
     
    bitcounter++; 
    bitoffset-=1; 
  } 
   
  *info = inf; 
 
  return bitcounter;           // return absolute offset in bit from start of frame 
} 
 
extern void tracebits2(const char *trace_str,  int len,  int info) ; 
 
/* 
************************************************************************* 
* Function:read FLC codeword from UVLC-partition  
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
int read_FLC(SyntaxElement *sym) 
{ 
  int frame_bitoffset = currStream->frame_bitoffset; 
  byte *buf = currStream->streamBuffer; 
  int BitstreamLengthInBytes = currStream->bitstream_length; 
 
  if ((GetBits(buf, frame_bitoffset, &(sym->inf), BitstreamLengthInBytes, sym->len)) < 0) 
    return -1; 
 
  currStream->frame_bitoffset += sym->len; // move bitstream pointer 
  sym->value1 = sym->inf; 
 
#if TRACE 
  tracebits2(sym->tracestring, sym->len, sym->inf); 
#endif 
 
  return 1; 
} 
 
/* 
************************************************************************* 
* Function:Reads bits from the bitstream buffer 
* Input: 
		byte buffer[] 
	 containing VLC-coded data bits 
	    int totbitoffset 
     bit offset from start of partition 
   	   int bytecount 
     total bytes in bitstream 
	    int numbits 
     number of bits to read 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
 
int GetBits (byte buffer[],int totbitoffset,int *info, int bytecount,  
             int numbits) 
{ 
  register int inf; 
  long byteoffset;      // byte from start of buffer 
  int bitoffset;      // bit from start of byte 
 
  int bitcounter=numbits; 
 
  byteoffset= totbitoffset/8; 
  bitoffset= 7-(totbitoffset%8); 
 
  inf=0; 
  while (numbits) 
  { 
    inf <<=1; 
    inf |= (buffer[byteoffset] & (0x01<>bitoffset; 
    numbits--; 
    bitoffset--; 
    if (bitoffset < 0) 
    { 
      byteoffset++; 
      bitoffset += 8; 
      if (byteoffset > bytecount) 
      { 
        return -1; 
      } 
    } 
  } 
 
  *info = inf; 
 
  return bitcounter;           // return absolute offset in bit from start of frame 
}       
 
/* 
************************************************************************* 
* Function:Reads bits from the bitstream buffer 
* Input: 
		byte buffer[] 
     containing VLC-coded data bits 
        int totbitoffset 
     bit offset from start of partition 
		int bytecount 
     total bytes in bitstream 
		int numbits 
     number of bits to read 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
int ShowBits (byte buffer[],int totbitoffset,int bytecount, int numbits) 
{ 
 
  register int inf; 
  long byteoffset;      // byte from start of buffer 
  int bitoffset;      // bit from start of byte 
 
  byteoffset= totbitoffset/8; 
  bitoffset= 7-(totbitoffset%8); 
 
  inf=0; 
  while (numbits) 
  { 
    inf <<=1; 
    inf |= (buffer[byteoffset] & (0x01<>bitoffset; 
    numbits--; 
    bitoffset--; 
    if (bitoffset < 0) 
    { 
      byteoffset++; 
      bitoffset += 8; 
      if (byteoffset > bytecount) 
      { 
        return -1; 
      } 
    } 
  } 
 
  return inf;           // return absolute offset in bit from start of frame 
}      
 
/* 
************************************************************************* 
* Function:Read coefficients of one 8x8 block 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
void readLumaCoeff_4x4_UVLC(int b8, int b4) 
{ 
  int mb_nr          = pgImage->current_mb_nr; 
  SyntaxElement currSE; 
  int ipos; 
  int run, level; 
  int ii,jj,k,i; 
  int boff_x, boff_y; 
  int symbol2D,Golomb_se_type; 
  int intra,vlc_numcoef,buffer_level[17],buffer_run[17],abslevel; 
  int tableindex; 
	// dongjie 
  const char (*table2D)[16],(*table2D_inter)[14]; 
  const char eob_intra[7]={-1,0,0,0,0,0,0};   //MA.Zhan	 
  //const char eob_intra[7]={-1,0,2,0,0,0,0}; 
	int incLevel_intra[7]={0,1,2,3,4,6,3000},incRun_intra[7]={-1,3,17,17,17,17,17}; 
	int incLevel_inter[7]={0,1,1,2,3,5,3000},incRun_inter[7]={-1,3,6,17,17,17,17}; 
	int level1_inter[16]={1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}; 
	int level1_intra[16]={1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2}; 
	// end 
 
  intra          = IS_INTRA(pgcurrMB); 
  Golomb_se_type = SE_LUM_AC_INTER; 
 
 
 
  boff_x = (((b8 &1)<<3) + ((b4 &1)<<2)); 
  boff_y = (((b8>>1)<<3) + ((b4>>1)<<2)); 
 
	tableindex = 0; 
 
  //make decoder table for VLC_INTRA code 
  if(VLC_INTRA_dec[0][0][1]<0)                                                          // Don't need to set this every time. rewrite later. 
  { 
    memset(VLC_INTRA_dec,-1,sizeof(VLC_INTRA_dec)); 
    for(i=0;i<7;i++) 
    { 
      table2D=VLC_INTRA[i]; 
      for(run=0;run<16;run++) 
        for(level=0;level<16;level++) 
        { 
          ipos=table2D[run][level]; 
          assert(ipos<40); 
          if(ipos>=0) 
          { 
						if(i==0) 
						{ 
							VLC_INTRA_dec[i][ipos][0]=level+1; 
							VLC_INTRA_dec[i][ipos][1]=run; 
							 
							VLC_INTRA_dec[i][ipos+1][0]=-(level+1); 
							VLC_INTRA_dec[i][ipos+1][1]=run; 
						} 
						else 
						{ 
							VLC_INTRA_dec[i][ipos][0]=level; 
							VLC_INTRA_dec[i][ipos][1]=run;               
							if(level) 
							{ 
								VLC_INTRA_dec[i][ipos+1][0]=-(level); 
								VLC_INTRA_dec[i][ipos+1][1]=run; 
							} 
						} 
          } 
        } 
    } 
    assert(VLC_INTRA_dec[0][0][1]>=0);        //otherwise, tables are bad. 
  } 
  //make decoder table for VLC_INTER code 
	if(VLC_INTER_dec[0][0][1]<0)                                                          // Don't need to set this every time. rewrite later. 
	{ 
		memset(VLC_INTER_dec,-1,sizeof(VLC_INTER_dec)); 
		for(i=0;i<7;i++) 
		{ 
			table2D_inter=VLC_INTER[i]; 
			for(run=0;run<16;run++) 
				for(level=0;level<14;level++) 
				{ 
					ipos=table2D_inter[run][level]; 
					assert(ipos<40); 
					if(ipos>=0) 
					{ 
						if(i==0) 
						{ 
							VLC_INTER_dec[i][ipos][0]=level+1; 
							VLC_INTER_dec[i][ipos][1]=run; 
							 
							VLC_INTER_dec[i][ipos+1][0]=-(level+1); 
							VLC_INTER_dec[i][ipos+1][1]=run; 
						} 
						else 
						{ 
							VLC_INTER_dec[i][ipos][0]=level; 
							VLC_INTER_dec[i][ipos][1]=run;               
							if(level) 
							{ 
								VLC_INTER_dec[i][ipos+1][0]=-(level); 
								VLC_INTER_dec[i][ipos+1][1]=run; 
							} 
						} 
					} 
				} 
		} 
		assert(VLC_INTER_dec[0][0][1]>=0);        //otherwise, tables are bad. 
	} 
  ipos  = -1; 
  level = 1;                        // get inside loop 
	if(intra) 
	{ 
		int previousRunCnt = 0; // added by PSL 20041228 
		for(k=0; k<17; k++) 
		{ 
			currSE.type = Golomb_se_type; 
			currSE.golomb_grad = VLC_GC_Order_INTRA[tableindex][0];          
			currSE.golomb_maxlevels = VLC_GC_Order_INTRA[tableindex][1];     
			read_GOLOMB(&currSE); 
			symbol2D = currSE.value1;  
			 
			if(symbol2D==eob_intra[tableindex])       
			{ 
				vlc_numcoef = k; 
				break; 
			} 
			 
			if(symbol2D < CODE2D_ESCAPE_SYMBOL) 
			{ 
				level = VLC_INTRA_dec[tableindex][symbol2D][0];    
				run   = VLC_INTRA_dec[tableindex][symbol2D][1];    
			} 
			else 
			{ 
 
				// commented by PSL 20041228 
				//symbol2D_levrun(&level, &run, intra, tableindex, symbol2D); 
				// added by PSL 20041228 
				int abs_lev_diff; 
				int sign; 
				 
				if(symbol2D<71) 
				{					 
					sign = symbol2D&0x1;//MAZHAN for "sign" 
					run = ((symbol2D-39)%32)/2;					 
					abs_lev_diff = 1; 
				} 
				else 
				{ 
					abs_lev_diff = (symbol2D -39-32)/2+2; 
					sign = symbol2D&0x1;//MAZHAN for "sign" 
					currSE.type = Golomb_se_type; 
					currSE.golomb_grad = 0;          
					currSE.golomb_maxlevels = VLC_GC_Order_INTRA[tableindex][1];     
					read_GOLOMB(&currSE); 
					symbol2D = currSE.value1; 
					run = symbol2D; 
				} 
				find_level(sign, &level, run, intra, tableindex, abs_lev_diff); 
			} 
				// added by PSL 20041228 
			previousRunCnt += run+1; 
			buffer_level[k] = level; 
			buffer_run[k]   = run; 
			abslevel = abs(level); 
			if(abslevel>=incLevel_intra[tableindex]) 
			{ 
				if(abslevel == 1) 
					tableindex = (run>incRun_intra[tableindex])?level1_intra[run]:tableindex; 
				else if(abslevel < 4) 
					tableindex = (abslevel+1); 
				else if(abslevel < 6) 
					tableindex = 5; 
				else 
					tableindex = 6; 
			} 
			// added by PSL 20041228 
			if (previousRunCnt==16) 
			{ 
				vlc_numcoef = k+1; 
				break; 
			} 
 
#if TRACE 
         snprintf(currSE.tracestring,  
          TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", 
             "LUMA4x4_INTRA" ,run, level, VLC_GC_Order_INTRA[tableindex][0], tableindex); 
		 tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); 
		  
		 fflush(p_trace); 
 
#endif 
 
		}//loop for k 
		ipos  = -1; 
		for(i=(vlc_numcoef-1); i>=0; i--) 
		{ 
			ipos += (buffer_run[i]+1);           
			ii = SCAN[ipos][0]; 
			jj = SCAN[ipos][1]; 
			pgImage->m7[boff_x + ii][boff_y + jj] = buffer_level[i]; 
		} 
	} 
	else 
	{ 
		int previousRunCnt = 0; // added by PSL 20041228 
		for(k=0; k<17; k++) 
		{ 
			currSE.type = Golomb_se_type; 
			currSE.golomb_grad = VLC_GC_Order_INTER[tableindex][0];          
			currSE.golomb_maxlevels = VLC_GC_Order_INTER[tableindex][1];     
			read_GOLOMB(&currSE); 
			symbol2D = currSE.value1;  
			 
			if((symbol2D==0)&&(tableindex!=0))       
			{ 
				vlc_numcoef = k; 
				break; 
			} 
			 
			if(symbol2D < CODE2D_ESCAPE_SYMBOL) 
			{ 
				level = VLC_INTER_dec[tableindex][symbol2D][0];    
				run   = VLC_INTER_dec[tableindex][symbol2D][1];    
			} 
			else 
			{ 
 
				// commented by PSL 20041228 
				//symbol2D_levrun(&level, &run, intra, tableindex, symbol2D); 
				// added by PSL 20041228 
				int abs_lev_diff; 
				int sign; 
				 
				if(symbol2D<71) 
				{					 
					sign = symbol2D&0x1;//MAZHAN for "sign" 
					run = ((symbol2D-39)%32)/2;					 
					abs_lev_diff = 1; 
				} 
				else 
				{ 
					abs_lev_diff = (symbol2D -71)/2+2; 
					sign = symbol2D&0x1;//MAZHAN for "sign" 
					currSE.type = Golomb_se_type; 
					currSE.golomb_grad = 0;          
					currSE.golomb_maxlevels = VLC_GC_Order_INTER[tableindex][1];     
					read_GOLOMB(&currSE);   
					symbol2D = currSE.value1; 
					run = symbol2D; 
				} 
 
				find_level(sign, &level, run, intra, tableindex, abs_lev_diff); 
			} 
			 // added by PSL 20041228 
			previousRunCnt += run+1; 
			buffer_level[k] = level; 
			buffer_run[k]   = run; 
			abslevel = abs(level); 
			if(abslevel>=incLevel_inter[tableindex]) 
			{ 
				if(abslevel == 1) 
					tableindex = (run>incRun_inter[tableindex])?level1_inter[run]:tableindex; 
				else if(abslevel == 2) 
					tableindex = 4; 
				else if(abslevel <= 4) 
					tableindex = 5; 
				else 
					tableindex = 6; 
			} 
			// added by PSL 20041228 
			if (previousRunCnt==16) 
			{ 
				vlc_numcoef = k+1; 
				break; 
			} 
#if TRACE 
		 snprintf(currSE.tracestring,  
			 TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", 
            "LUMA4x4_INTER", run, level, VLC_GC_Order_INTER[tableindex][0], tableindex); 
		 tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); 
		 fflush(p_trace); 
 
#endif 
		}//loop for k 
		ipos  = -1; 
		for(i=(vlc_numcoef-1); i>=0; i--) 
		{ 
			ipos += (buffer_run[i]+1);           
			ii = SCAN[ipos][0]; 
			jj = SCAN[ipos][1]; 
			pgImage->m7[boff_x + ii][boff_y + jj] = buffer_level[i]; 
		} 
	} 
} 
// end 
/* 
************************************************************************* 
* Function: decode chroma coefficents 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
// modified by dongjie 
void readChromaCoeff_4x4_UVLC(int b8, int b4)    //qwang 2004-4-27 
{ 
  int mb_nr          = pgImage->current_mb_nr; 
  SyntaxElement currSE; 
  int ipos; 
  int run, level; 
  int ii,jj,k,tableindex,i,vlc_numcoef; 
  int boff_x, boff_y; 
  int symbol2D,Golomb_se_type; 
  int buffer_level[16], buffer_run[16],abslevel; 
  const char (*table2D)[13]; 
   
  int previousRunCnt = 0; // added by PSL 20041228	 
	int incLevel_chroma[4]={0,1,2,3000}; // dongjie 
 
  boff_x = ((b4 &1)<<2); 
  boff_y = ((b4>>1)<<2); 
 
  Golomb_se_type=SE_LUM_AC_INTER; 
  //make decoder table for VLC_CHROMA code 
  if(VLC_CHROMA_dec[0][0][1]<0)                                                          // Don't need to set this every time. rewrite later. 
  { 
    memset(VLC_CHROMA_dec,-1,sizeof(VLC_CHROMA_dec)); 
		for(i=0;i<4;i++) 
		{ 
      table2D=VLC_CHROMA[i]; 
      for(run=0;run<16;run++) 
        for(level=0;level<13;level++) 
        { 
          ipos=table2D[run][level]; 
          assert(ipos<40); 
          if(ipos>=0) 
          {						 
						if(i==0) 
						{ 
							VLC_CHROMA_dec[i][ipos][0]=level+1; 
							VLC_CHROMA_dec[i][ipos][1]=run; 
							 
							VLC_CHROMA_dec[i][ipos+1][0]=-(level+1); 
							VLC_CHROMA_dec[i][ipos+1][1]=run; 
						} 
						else 
						{ 
							VLC_CHROMA_dec[i][ipos][0]=level; 
							VLC_CHROMA_dec[i][ipos][1]=run;               
							if(level) 
							{ 
								VLC_CHROMA_dec[i][ipos+1][0]=-(level); 
								VLC_CHROMA_dec[i][ipos+1][1]=run; 
							} 
						} 
 
          } 
        } 
		} 
    assert(VLC_CHROMA_dec[0][1]>=0);        //otherwise, tables are bad. 
  } 
 
  ipos  = -1; 
  level=1;                        // get inside loop 
	tableindex = 0; 
	for(k=0; k<17; k++) 
	{ 
		currSE.type = Golomb_se_type; 
		currSE.golomb_grad = VLC_GC_Order_CHROMA[tableindex][0];          
		currSE.golomb_maxlevels = VLC_GC_Order_CHROMA[tableindex][1];     
		read_GOLOMB(&currSE); 
		symbol2D = currSE.value1;  
		 
		if((symbol2D==0)&&(tableindex!=0))       
		{ 
			vlc_numcoef = k; 
			break; 
		} 
		 
		if(symbol2D < CODE2D_ESCAPE_SYMBOL) 
		{ 
			level = VLC_CHROMA_dec[tableindex][symbol2D][0];    
			run   = VLC_CHROMA_dec[tableindex][symbol2D][1];    
		} 
		else 
		{ 
			// commented by PSL 20041228 
			//symbol2D_levrun_chroma(&level, &run, symbol2D, tableindex); 
			// added by PSL 20041228 
			int abs_lev_diff; 
			int sign; 
			 
			if(symbol2D<32+39) 
			{				 
				sign = symbol2D&0x1; //MAZHAN for "sign" 
				run = ((symbol2D-39)%32)/2;				 
				abs_lev_diff = 1; 
			} 
			else 
			{ 
				abs_lev_diff = (symbol2D -39-32)/2+2; 
				sign = symbol2D&0x1;//MAZHAN for "sign" 
				 currSE.type = Golomb_se_type; 
				currSE.golomb_grad = 0;          
				currSE.golomb_maxlevels = VLC_GC_Order_CHROMA[tableindex][1];     
				read_GOLOMB(&currSE); 
				symbol2D = currSE.value1; 
				run = symbol2D; 
			} 
			find_level_chroma(sign, &level, run, tableindex, abs_lev_diff); 
		} 
		// added by PSL 20041228 
		previousRunCnt += run+1; 
		buffer_level[k] = level; 
		buffer_run[k]   = run; 
		abslevel = abs(level); 
		if(abslevel>incLevel_chroma[tableindex]) 
		{ 
			if(abslevel<3) 
				tableindex = abslevel; 
			else 
				tableindex = 3; 
		} 
		// added by PSL 20041228 
		if (previousRunCnt==16) 
		{ 
			vlc_numcoef = k+1; 
			break; 
		} 
 
#if TRACE 
		 snprintf(currSE.tracestring,  
			 TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", 
             "CHR4x4",run, level, VLC_GC_Order_CHROMA[tableindex][0], tableindex); 
		 tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); 
		 fflush(p_trace); 
 
#endif 
 
	}//loop for k 
	 
		ipos  = -1; 
		for(i=(vlc_numcoef-1); i>=0; i--) 
		{ 
			ipos += (buffer_run[i]+1);           
			ii = SCAN[ipos][0]; 
			jj = SCAN[ipos][1]; 
			pgImage->m8[b8-4][boff_x + ii][boff_y + jj] = buffer_level[i]; 
		} 
} 
// end 
#if TRACE 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
void encode_golomb_word(unsigned int symbol,unsigned int grad0,unsigned int max_levels,unsigned int *res_bits,unsigned int *res_len) 
{ 
  unsigned int level,res,numbits; 
  res=1UL<=res && level=max_levels) 
  { 
    if(symbol>=res) 
      symbol=res-1UL;  //crop if too large. 
  } 
  //set data bits 
  *res_bits=res|symbol; 
  *res_len=numbits; 
} 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
void encode_multilayer_golomb_word(unsigned int symbol,const unsigned int *grad,const unsigned int *max_levels,unsigned int *res_bits,unsigned int *res_len) 
{ 
  unsigned accbits,acclen,bits,len,tmp; 
  accbits=acclen=0UL; 
  while(1) 
  { 
    encode_golomb_word(symbol,*grad,*max_levels,&bits,&len); 
    accbits=(accbits<>bit)&1UL) ; 
      bit = (bit-1UL) & 7UL ; 
      if(bit==7UL) 
        byte=*(++rd); 
    } 
  } 
  else 
  { 
    for( t=0UL ; t<(grad0+level-1) ; t++ ) 
    { 
      databits = (databits<<1UL) | ((byte>>bit)&1UL) ; 
      bit = (bit-1UL) & 7UL ; 
      if(bit==7UL) 
        byte=*(++rd); 
    } 
    if( (signed)databits > ((1<>bit)&1UL) ; 
      bit = (bit-1UL) & 7UL ; 
      if(bit==7UL) 
        byte=*(++rd); 
      first_layer = 0; 
    } 
    else 
      first_layer = 1; 
  } 
 
  *buffer=rd; 
  *bitoff=bit; 
   
  num_codeword = 0; 
  for(i=0; i>bit)&1UL) ; 
    bit = (bit-1UL) & 7UL ; 
    if(bit==7UL)byte=*(++rd); 
  } 
  *buffer=rd; 
  *bitoff=bit; 
 
  return (((1UL<frame_bitoffset; 
  buf = (unsigned char*)currStream->streamBuffer; 
  BitstreamLengthInBytes = currStream->bitstream_length; 
   
  bit=7UL-(frame_bitoffset&7); 
  read=buf+(frame_bitoffset>>3); 
   
 
  se->value1=decode_hybridgolomb_word(&read,&bit,se->golomb_grad,se->golomb_maxlevels); 
 
   
  se->len=(((read-buf)<<3)+(7-bit))-frame_bitoffset; 
   
  se->value2=0; 
  currStream->frame_bitoffset += se->len; 
   
  return 1; 
} 
 
int  read_GOLOMB(SyntaxElement *se) 
{ 
  int frame_bitoffset; 
  unsigned char *buf,*read; 
  int BitstreamLengthInBytes; 
  unsigned int bit,i; 
  unsigned int grad[4],max_lev[4]; 
	 
#if TRACE 
  unsigned int len; 
#endif   
	 
  frame_bitoffset = currStream->frame_bitoffset; 
  buf = (unsigned char*)currStream->streamBuffer; 
  BitstreamLengthInBytes = currStream->bitstream_length; 
   
  bit=7UL-(frame_bitoffset&7); 
  read=buf+(frame_bitoffset>>3); 
   
  if(!( se->golomb_maxlevels&~0xFF )) 
  { 
    se->value1=decode_golomb_word(&read,&bit,se->golomb_grad,se->golomb_maxlevels); 
  } 
  else 
  { 
    for(i=0UL;i<4UL;i++) 
    { 
      grad[i]=(se->golomb_grad>>(i<<3))&0xFFUL; 
      max_lev[i]=(se->golomb_maxlevels>>(i<<3))&0xFFUL; 
    } 
    se->value1=decode_multilayer_golomb_word(&read,&bit,grad,max_lev); 
  } 
   
  se->len=(((read-buf)<<3)+(7-bit))-frame_bitoffset; 
   
#if TRACE 
  if(!( se->golomb_maxlevels&~0xFF ))    //only bits 0-7 used? This means normal Golomb word. 
    encode_golomb_word(se->value1,se->golomb_grad,se->golomb_maxlevels,&(se->value2),&len); 
  else 
  { 
    for(i=0UL;i<4UL;i++) 
    { 
      grad[i]=(se->golomb_grad>>(i<<3))&0xFFUL; 
      max_lev[i]=(se->golomb_maxlevels>>(i<<3))&0xFFUL; 
    } 
    encode_multilayer_golomb_word(se->value1,grad,max_lev,&(se->value2),&len); 
  } 
   
 // tracebits3("", se->len, se->value2, se->value1); 
#endif 
 
  se->value2=0; 
  currStream->frame_bitoffset += se->len; 
   
  return 1; 
} 
//#ifdef AVS_ABT 
/************************************************************************* 
* Function:Read coefficients of one 8x8 block 
* Input: 
* Output: 
* Return:  
* Attention: 
*************************************************************************/ 
void readLumaCoeff_8x8_UVLC(int b8)  
{ 
	int i; 
	SyntaxElement currSE; 
	int icoef;                      /* current coefficient */ 
	int ipos; 
	int run, level; 
	int ii,jj; 
	int vlc_numcoef; 
	int tablenum;         //add by qwang 
	static const int incVlc_inter[2][7] = { {0,1,2,3,5,8,3000}, {0,1,2,3,6,9,3000} };   //qwang 11.29 
	int buffer_level[65];    //add by qwang 
	int buffer_run[64];      //add by qwang 
	int EOB_Pos_inter[2][7] = { {-1, 12, 8, 8, 10, 8, 6}, {-1, 2, 2, 2, 2, 0, 0}};            //qwang 11.29  
	int symbol2D,Golomb_se_type; 
	int boff_x = ((b8 &1)<<3); 
	int boff_y = ((b8>>1)<<3); 
 
	if(AVS_2DVLC_INTER_dec[0][0][1]<0)                                                          // Don't need to set this every time. rewrite later. 
	{ 
		memset(AVS_2DVLC_INTER_dec,-1,sizeof(AVS_2DVLC_INTER_dec)); 
		for(i=0;i<7;i++) 
		{ 
			for(run=0;run<26;run++) 
			for(level=0;level<27;level++) 
			{ 
				ipos=AVS_2DVLC_INTER[i][run][level]; 
				assert(ipos<64); 
				if(ipos>=0) 
				{ 
					if(i==0) 
					{ 
						AVS_2DVLC_INTER_dec[i][ipos][0]=level+1; 
						AVS_2DVLC_INTER_dec[i][ipos][1]=run; 
						 
						AVS_2DVLC_INTER_dec[i][ipos+1][0]=-(level+1); 
						AVS_2DVLC_INTER_dec[i][ipos+1][1]=run; 
					} 
					else 
					{ 
						AVS_2DVLC_INTER_dec[i][ipos][0]=level; 
						AVS_2DVLC_INTER_dec[i][ipos][1]=run;               
						if(level) 
						{ 
							AVS_2DVLC_INTER_dec[i][ipos+1][0]=-(level); 
							AVS_2DVLC_INTER_dec[i][ipos+1][1]=run; 
						} 
					} 
				} 
			} 
		} 
		assert(AVS_2DVLC_INTER_dec[0][0][1]>=0);        //otherwise, tables are bad. 
	} 
	vlc_numcoef=-1;   
	Golomb_se_type=SE_LUM_AC_INTER; 
	if (pgcurrMB->cbp & (1<>1;			   
				currSE.type=Golomb_se_type; 
				currSE.golomb_grad = 0; 
				currSE.golomb_maxlevels=11; 
				readSyntaxElement_GOLOMB(&currSE); 
				level = currSE.value1 + ((run>MaxRun[1][tablenum])?1:RefAbsLevel[tablenum+7][run]); 
				if( (symbol2D-ABTCODE2D_ESCAPE_SYMBOL) & 1 )   
					level=-level;		 
			} 
			buffer_level[icoef] = level; 
			buffer_run[icoef]   = run; 
			if(abs(level) > incVlc_inter[1][tablenum])   //qwang 11.29 
			{             
				if(abs(level) <= 3) 
					tablenum = abs(level); 
				else if(abs(level) <= 6) 
					tablenum = 4; 
				else if(abs(level) <= 9)  
					tablenum = 5; 
				else 
					tablenum = 6; 
 
			} 
 
#if TRACE 
         	  
         snprintf(currSE.tracestring,  
			 TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", 
             "LUMA8x8", run, level, icoef, tablenum); 
		 tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); 
		 fflush(p_trace); 
 
#endif 
 
        }//loop for icoef 
		ipos  = -1; 
        for(i=(vlc_numcoef-1); i>=0; i--) 
        { 
			ipos += (buffer_run[i]+1);           
			ii = B8SCAN[1][ipos][0]; 
			jj = B8SCAN[1][ipos][1]; 
			pgImage->m7[boff_x + ii][boff_y + jj] = buffer_level[i]; 
		} 
	}//end if ( cbp & (1<frame_bitoffset; 
	buf = (unsigned char*)currStream->streamBuffer; 
	BitstreamLengthInBytes = currStream->bitstream_length; 
	 
	bit=7UL-(frame_bitoffset&7); 
	read=buf+(frame_bitoffset>>3); 
	 
	if(!(se->golomb_maxlevels&~0xFF )) 
	{ 
		se->value1=decode_golomb_word(&read,&bit,se->golomb_grad,se->golomb_maxlevels); 
	} 
	else 
	{ 
		for(i=0UL;i<4UL;i++) 
		{ 
			grad[i]=(se->golomb_grad>>(i<<3))&0xFFUL; 
			max_lev[i]=(se->golomb_maxlevels>>(i<<3))&0xFFUL; 
		} 
		se->value1=decode_multilayer_golomb_word(&read,&bit,grad,max_lev); 
	}   
	se->len=(((read-buf)<<3)+(7-bit))-frame_bitoffset; 
	currStream->frame_bitoffset += se->len;   
	return 1; 
} 
//#endif