📄 deblock.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 + -