⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlc.cpp

📁 AVS是中国自己推出的视频图像音频编解码标准。包中是AVS 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	
    //make decoder table for 2DVLC_CHROMA code
	if(AVS_2DVLC_CHROMA_dec[0][0][1]<0)                                                          // Don't need to set this every time. rewrite later.
	{
		memset(AVS_2DVLC_CHROMA_dec,-1,sizeof(AVS_2DVLC_CHROMA_dec));
		for(i=0;i<5;i++)
		{
			for(run=0;run<26;run++)
				for(level=0;level<27;level++)
				{
					ipos=AVS_2DVLC_CHROMA[i][run][level];
					assert(ipos<64);
					if(ipos>=0)
					{
						if(i==0)
						{
							AVS_2DVLC_CHROMA_dec[i][ipos][0]=level+1;
							AVS_2DVLC_CHROMA_dec[i][ipos][1]=run;
							
							AVS_2DVLC_CHROMA_dec[i][ipos+1][0]=-(level+1);
							AVS_2DVLC_CHROMA_dec[i][ipos+1][1]=run;
						}
						else
						{
							AVS_2DVLC_CHROMA_dec[i][ipos][0]=level;
							AVS_2DVLC_CHROMA_dec[i][ipos][1]=run;
							
							if(level)
							{
								AVS_2DVLC_CHROMA_dec[i][ipos+1][0]=-(level);
								AVS_2DVLC_CHROMA_dec[i][ipos+1][1]=run;
							}
						}
					}
				}
		}
		assert(AVS_2DVLC_CHROMA_dec[0][0][1]>=0);        //otherwise, tables are bad.
	}
}

void  ReadLumaCoeff(const AVS_BYTE* pbCurrent,AVS_DWORD dwDataLen, AVS_DWORD* pdwBitOffset, MBINFO* pCurrMb, AVS_DWORD dwPictureStructure, AVS_SHORT* pResidual)
{
	static const AVS_INT incVlc_intra[7] = { 0,1,2,4,7,10,3000};  
	static const AVS_INT incVlc_inter[7] = { 0,1,2,3,6, 9,3000};   
	
	AVS_INT i;
	AVS_INT ii, jj;
	AVS_DWORD tabNo = 0;
	AVS_INT symbol2D; 
	AVS_INT vlc_numcoef = 0;
	AVS_INT run = 0, level = 0;
	AVS_INT buffer_level[65];
	AVS_INT buffer_run[65];
	
	AVS_INT* TABNO = TabNoBuf+512;
	AVS_INT* TABNO2 = TabNoBuf2+512;
	
	AVS_INT qp, shift;
	qp = pCurrMb->dwMbQp;
	
	AVS_INT QPI, sum;
	AVS_INT ipos = -1;
	AVS_INT Golomb_se_type=SE_LUM_AC_INTER;
	
	AVS_INT leadingZeroBits;
	AVS_INT grad;
	AVS_INT val, val2;
	
	memset(buffer_run, 0, 65*sizeof(AVS_INT));
	memset(buffer_level, 0, 65*sizeof(AVS_INT));
	if(pCurrMb->dwMbType == I_8x8)
	{
		for(i=0; i<65; i++)
		{
			leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
			grad = VLC_Golomb_Order[0][tabNo][0]; 
			val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
			symbol2D = (1<<(leadingZeroBits+grad)) - (1<<grad) + val; 
			
			if(symbol2D == EOB_Pos_intra[tabNo])
			{
				vlc_numcoef = i;
				break;
			}        
			else if(symbol2D < CODE2D_ESCAPE_SYMBOL)
			{
				level = AVS_2DVLC_INTRA_dec[tabNo][symbol2D][0]; 
				run   = AVS_2DVLC_INTRA_dec[tabNo][symbol2D][1]; 
			}
			else
			{
				run = (symbol2D - CODE2D_ESCAPE_SYMBOL)>>1;
				leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
				grad = 1; 
				val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
				val2 = (1<<(leadingZeroBits+grad)) - (1<<grad) + val; 
				level = val2 + ((run>MaxRun[0][tabNo])?1:RefAbsLevel[tabNo][run]);
				
				if(symbol2D & 1)    
					level=-level;		
			}
			buffer_level[i] = level;
			buffer_run[i]   = run;
			if(abs(level) > incVlc_intra[tabNo])  
			{
				tabNo = TABNO[level];
			}  
		}
		
		for(i=(vlc_numcoef-1); i>=0; i--)
		{
			ipos += (buffer_run[i]+1);
			
			ii = SCAN[dwPictureStructure][ipos][0];
			jj = SCAN[dwPictureStructure][ipos][1];
			
			shift = IQ_SHIFT[qp];
			QPI   = IQ_TAB[qp]; 
			val = buffer_level[i];
			sum = (val*QPI+(1<<(shift-2)) )>>(shift-1);
			
			*(pResidual+jj*8+ii) =  sum;
		}
		
	}
	else
	{
		tabNo = 0;
		for(i=0; i<65; i++)
		{
			leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
			grad = VLC_Golomb_Order[1][tabNo][0]; 
			val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
			symbol2D = (1<<(leadingZeroBits+grad)) - (1<<grad) + val; 
			
			if(symbol2D == EOB_Pos_inter[tabNo])      
			{
				vlc_numcoef = i;
				break;
			}
			else if(symbol2D < CODE2D_ESCAPE_SYMBOL)
			{
				level = AVS_2DVLC_INTER_dec[tabNo][symbol2D][0];   
				run   = AVS_2DVLC_INTER_dec[tabNo][symbol2D][1];   
			}
			else
			{
				run = (symbol2D-CODE2D_ESCAPE_SYMBOL)>>1;
				leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
				grad = 0; 
				val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
				val2 = (1<<(leadingZeroBits+grad)) - (1<<grad) + val; 
				level = val2 + ((run>MaxRun[1][tabNo])?1:RefAbsLevel[tabNo+7][run]);
				
				if(symbol2D & 1)                         //jlzheng   7.20
					level=-level;		
			}
			buffer_level[i] = level;
			buffer_run[i]   = run;
			if(abs(level) > incVlc_inter[tabNo])   //qwang 11.29
			{
				tabNo = TABNO2[level];
			}
		}
		//将解码的level,run写到LumaCoeff[][];
		for(i=(vlc_numcoef-1); i>=0; i--)
		{
			ipos += (buffer_run[i]+1);
			
			ii = SCAN[dwPictureStructure][ipos][0];
			jj = SCAN[dwPictureStructure][ipos][1];
			
			shift = IQ_SHIFT[qp];
			QPI   = IQ_TAB[qp]; 
			val = buffer_level[i];
			sum = (val*QPI+(1<<(shift-2)) )>>(shift-1);
			*(pResidual+jj*8+ii) = sum;
		}
	}
}

void  ReadChromaCoeff(const AVS_BYTE* pbCurrent,AVS_DWORD dwDataLen, AVS_DWORD* pdwBitOffset, MBINFO* pCurrMb, AVS_DWORD dwPictureStructure, AVS_SHORT* pResidual)
{
	AVS_INT tabNo = 0;
	AVS_INT symbol2D = 0;
	AVS_INT vlc_numcoef = 0;
	AVS_INT run, level;
	AVS_INT buffer_level[65];
	AVS_INT buffer_run[65];
	static const AVS_INT EOB_Pos_chroma[2][5] = { 
		{-1, 4, 8, 6, 4}, 
		{-1, 0, 2, 0, 0} 
	};  
	static const AVS_INT incVlc_chroma[5] = {0,1,2,4,3000};   
	AVS_INT leadingZeroBits;
	AVS_INT grad;
	AVS_INT val, val2;
	
	AVS_INT qp_chroma = QP_SCALE_CR[pCurrMb->dwMbQp]; // using old style qp.
	AVS_INT temp;
	AVS_INT ii, jj;
	AVS_INT shift, QPI;
	AVS_INT ipos = -1;
	
	for(AVS_INT i=0; i<65; i++)
	{
		leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
		grad = VLC_Golomb_Order[2][tabNo][0]; 
		val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
		symbol2D = (1<<(leadingZeroBits+grad)) - (1<<grad) + val; 
		
		if(symbol2D == EOB_Pos_chroma[1][tabNo])    
		{
			vlc_numcoef = i;
			break;
		}
		if(symbol2D < CODE2D_ESCAPE_SYMBOL)
		{
			level = AVS_2DVLC_CHROMA_dec[tabNo][symbol2D][0];    
			run   = AVS_2DVLC_CHROMA_dec[tabNo][symbol2D][1];    
		}
		else
		{
			run = (symbol2D-CODE2D_ESCAPE_SYMBOL)>>1;
			
			leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
			grad = 0; 
			val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
			val2 = (1<<(leadingZeroBits+grad)) - (1<<grad) + val; 
			level = val2 + ((run>MaxRun[2][tabNo])?1:RefAbsLevel[tabNo+14][run]);
			if(symbol2D & 1)            
				level=-level;		
		}
		buffer_level[i] = level;
		buffer_run[i]   = run;
		
		if(abs(level) > incVlc_chroma[tabNo])   //qwang 11.29
		{
			if(abs(level) <= 2)
				tabNo = abs(level);
			else if(abs(level) <= 4)
				tabNo = 3;
			else
				tabNo = 4;
		}
	}
	for(i=(vlc_numcoef-1); i>=0; i--)
	{
		ipos += (buffer_run[i]+1);
		
		ii = SCAN[dwPictureStructure][ipos][0];
		jj = SCAN[dwPictureStructure][ipos][1];
		shift = IQ_SHIFT[qp_chroma];
		QPI   = IQ_TAB[qp_chroma]; 
		val = buffer_level[i];
		temp = (val*QPI+(1<<(shift-2)) )>>(shift-1);
		
		*(pResidual+jj*8+ii) = temp;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -