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

📄 deblock.cpp

📁 这是G.723和G.729的音频编解码的源代码
💻 CPP
字号:


#include "stdafx.h"
#include "Deblock.h"

int CDeblock::STRENGTH[32] ={1,1,1,2,2,3,3,4,4,4,5,5,6,6,7,7,7,
							 8,8,8,9,9,9,10,10,10,11,11,11,12,12,12};

void CDeblock::DeblockPlaneYUV411(BYTE* pYUV411,int nQuant,int nWidth,int nHeight)
{
	//deblock Y component
	DeblockYUVComponent(pYUV411,nQuant,nWidth,nHeight);

	//deblock U component
	DeblockYUVComponent(pYUV411+nWidth*nHeight,nQuant,nWidth/2,nHeight/2);

	//deblock V component
	DeblockYUVComponent(pYUV411+nWidth*nHeight*5/4,nQuant,nWidth/2,nHeight/2);
}

void CDeblock::DeblockYUVComponent(BYTE* pComponent,int nQuant,int nWidth,int nHeight)
{
	int A[8],B[8],C[8],D[8];
	int nImageSize=nWidth*nHeight;
	int nCol,nLine,nLineStartPos=0;
	//deblock up edge of picture
	for(nCol=8;nCol<nWidth;nCol+=8)
	{
		GetLeftBlockABCD(pComponent+nCol,nWidth,A,B,C,D);
		FilterBlock(A,B,C,D,nQuant);
		PutLeftBlockABCD(pComponent+nCol,nWidth,A,B,C,D);
	}

	//deblock left edge of picture
	nLineStartPos=0;
	for(nLine=8;nLine<nHeight;nLine+=8)
	{
		nLineStartPos+=8*nWidth;
		GetUpBlockABCD(pComponent+nLineStartPos,nWidth,A,B,C,D);
		FilterBlock(A,B,C,D,nQuant);
		PutUpBlockABCD(pComponent+nLineStartPos,nWidth,A,B,C,D);
	}

	//deblock center of picture
	nLineStartPos=8*nWidth;
	for(nLine=8;nLine<nHeight;nLine+=8)
	{
		for(nCol=8;nCol<nWidth;nCol+=8)
		{
			//up edge of block
			GetUpBlockABCD(pComponent+nLineStartPos+nCol,nWidth,A,B,C,D);
			FilterBlock(A,B,C,D,nQuant);
			PutUpBlockABCD(pComponent+nLineStartPos+nCol,nWidth,A,B,C,D);

			//left edge of block
			GetLeftBlockABCD(pComponent+nLineStartPos+nCol,nWidth,A,B,C,D);
			FilterBlock(A,B,C,D,nQuant);
			PutLeftBlockABCD(pComponent+nLineStartPos+nCol,nWidth,A,B,C,D);
		}
		nLineStartPos+=8*nWidth;
	}	
}

void CDeblock::GetUpBlockABCD(BYTE* pBlockUpLeft,int nWidth,int *A,int *B,int *C,int *D)
{
	int i;	
	for ( i=0;i<8;i++) {
		A[i]=pBlockUpLeft[-nWidth-nWidth+i];
		B[i]=pBlockUpLeft[-nWidth+i];
		C[i]=pBlockUpLeft[i];
		D[i]=pBlockUpLeft[nWidth+i];
	}
}

void CDeblock::GetLeftBlockABCD(BYTE* pBlockUpLeft,int nWidth,int *A,int *B,int *C,int *D)
{
	int i;
	
	int nOffset=0;
	for ( i=0;i<8;i++) 
	{
		A[i]=pBlockUpLeft[nOffset-2];
		B[i]=pBlockUpLeft[nOffset-1];
		C[i]=pBlockUpLeft[nOffset];
		D[i]=pBlockUpLeft[nOffset+1];
		nOffset+=nWidth;
	}
}

void CDeblock::PutUpBlockABCD(BYTE* pBlockUpLeft,int nWidth,int *A,int *B,int *C,int *D)
{
	int i;

	for ( i=0;i<8;i++) {
		pBlockUpLeft[-nWidth-nWidth+i]=A[i];
		pBlockUpLeft[-nWidth+i]=B[i];
		pBlockUpLeft[i]=C[i];
		pBlockUpLeft[nWidth+i]=D[i];
	}
}

void CDeblock::PutLeftBlockABCD(BYTE* pBlockUpLeft,int nWidth,int *A,int *B,int *C,int *D)
{
	int i;
	int nOffset=0;

	for ( i=0;i<8;i++) 
	{
		pBlockUpLeft[nOffset-2]=A[i];
		pBlockUpLeft[nOffset-1]=B[i];
		pBlockUpLeft[nOffset]=C[i];
		pBlockUpLeft[nOffset+1]=D[i];
		nOffset+=nWidth;
	}
}

void CDeblock::FilterBlock(int *A,int *B,int *C,int *D,int nQuant)
{
	int i,d,d1,d2,intensity;
	intensity=STRENGTH[nQuant];

	static int k=0;
	static int j=0;

	for (i=0;i<8;i++)
	{
		d = (A[i]-(B[i]<<2)+(C[i]<<2)-D[i])>>3;		
		if ( d > 0 ) 
		{
			d1=max(0,d-max(0,((d-intensity)<<1)));
			d2=max(-(d1>>1),min((A[i]-D[i])>>2,(d1>>1)));
		}
		else
		{
			d1=-max(0,-d-max(0,((-d-intensity)<<1)));
			d2=max((d1>>1),min((A[i]-D[i])>>2,-(d1>>1)));
		}
	
		A[i] = A[i]-d2;		
		B[i] = max(0,min(255,B[i]+d1));
		C[i] = max(0,min(255,C[i]-d1));		
		D[i] = D[i]+d2;
	}
}

⌨️ 快捷键说明

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