📄 block.cpp
字号:
/*************************************************************************
AVS1-P2视频解码器源码
版权所有:联合信源数字音视频技术(北京)有限公司, (c) 2005-2006
AVS1-P2 Video Decoder Source Code
(c) Copyright, NSCC All Rights Reserved, 2005-2006
*************************************************************************
Distributed under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*************************************************************************/
/*************************************************************************
文件名称: block.cpp
描 述: 包含IDCT变换,亮度插值算法和色度插值和其他的一些以块为单位的
操作:8x8块重构,拷贝一个8x8块,求两个块的平均值等
*************************************************************************/
/*************************************************************************
Revision History
data Modification Author
2005-2-8 Created jthou
*************************************************************************/
#include "block.h"
#include "global.h"
/************************************************************************/
/* 函数功能:IDCT */
/************************************************************************/
void inv_transform_B8(AVS_SHORT* psBlock // block to be inverse transformed.
)
{
AVS_SHORT xx, yy;
AVS_SHORT tmp[8];
AVS_SHORT t;
AVS_SHORT b[8];
for(yy=0; yy<8; yy++)
{
// Horizontal inverse transform
// Reorder
tmp[0]=psBlock[yy*8+0];
tmp[1]=psBlock[yy*8+4];
tmp[2]=psBlock[yy*8+2];
tmp[3]=psBlock[yy*8+6];
tmp[4]=psBlock[yy*8+1];
tmp[5]=psBlock[yy*8+3];
tmp[6]=psBlock[yy*8+5];
tmp[7]=psBlock[yy*8+7];
// Downleft Butterfly
b[0] = ((tmp[4] - tmp[7])<<1) + tmp[4];
b[1] = ((tmp[5] + tmp[6])<<1) + tmp[5];
b[2] = ((tmp[5] - tmp[6])<<1) - tmp[6];
b[3] = ((tmp[4] + tmp[7])<<1) + tmp[7];
b[4] = ((b[0] + b[1] + b[3])<<1) + b[1];
b[5] = ((b[0] - b[1] + b[2])<<1) + b[0];
b[6] = ((-b[1] - b[2] + b[3])<<1) + b[3];
b[7] = ((b[0] - b[2] - b[3])<<1) - b[2];
// Upleft Butterfly
t=((tmp[2]*10)+(tmp[3]<<2));
tmp[3]=((tmp[2]<<2)-(tmp[3]*10));
tmp[2]=t;
t=(tmp[0]+tmp[1])<<3;
tmp[1]=(tmp[0]-tmp[1])<<3;
tmp[0]=t;
b[0]=tmp[0]+tmp[2];
b[1]=tmp[1]+tmp[3];
b[2]=tmp[1]-tmp[3];
b[3]=tmp[0]-tmp[2];
// Last Butterfly
psBlock[yy*8+0]=((b[0]+b[4])+(1<<2))>>3;
psBlock[yy*8+1]=((b[1]+b[5])+(1<<2))>>3;
psBlock[yy*8+2]=((b[2]+b[6])+(1<<2))>>3;
psBlock[yy*8+3]=((b[3]+b[7])+(1<<2))>>3;
psBlock[yy*8+7]=((b[0]-b[4])+(1<<2))>>3;
psBlock[yy*8+6]=((b[1]-b[5])+(1<<2))>>3;
psBlock[yy*8+5]=((b[2]-b[6])+(1<<2))>>3;
psBlock[yy*8+4]=((b[3]-b[7])+(1<<2))>>3;
}
// Vertical inverse transform
for(xx=0; xx<8; xx++)
{
// Reorder
tmp[0]=psBlock[0*8+xx];
tmp[1]=psBlock[4*8+xx];
tmp[2]=psBlock[2*8+xx];
tmp[3]=psBlock[6*8+xx];
tmp[4]=psBlock[1*8+xx];
tmp[5]=psBlock[3*8+xx];
tmp[6]=psBlock[5*8+xx];
tmp[7]=psBlock[7*8+xx];
// Downleft Butterfly
b[0] = ((tmp[4] - tmp[7])<<1) + tmp[4];
b[1] = ((tmp[5] + tmp[6])<<1) + tmp[5];
b[2] = ((tmp[5] - tmp[6])<<1) - tmp[6];
b[3] = ((tmp[4] + tmp[7])<<1) + tmp[7];
b[4] = ((b[0] + b[1] + b[3])<<1) + b[1];
b[5] = ((b[0] - b[1] + b[2])<<1) + b[0];
b[6] = ((-b[1] - b[2] + b[3])<<1) + b[3];
b[7] = ((b[0] - b[2] - b[3])<<1) - b[2];
// Upleft Butterfly
t=((tmp[2]*10)+(tmp[3]<<2));
tmp[3]=((tmp[2]<<2)-(tmp[3]*10));
tmp[2]=t;
t=(tmp[0]+tmp[1])<<3;
tmp[1]=(tmp[0]-tmp[1])<<3;
tmp[0]=t;
b[0]=tmp[0]+tmp[2];
b[1]=tmp[1]+tmp[3];
b[2]=tmp[1]-tmp[3];
b[3]=tmp[0]-tmp[2];
// Last Butterfly
psBlock[0*8+xx]=(Clip3(-32768,32703,b[0]+b[4])+64)>>7;
psBlock[1*8+xx]=(Clip3(-32768,32703,b[1]+b[5])+64)>>7;
psBlock[2*8+xx]=(Clip3(-32768,32703,b[2]+b[6])+64)>>7;
psBlock[3*8+xx]=(Clip3(-32768,32703,b[3]+b[7])+64)>>7;
psBlock[7*8+xx]=(Clip3(-32768,32703,b[0]-b[4])+64)>>7;
psBlock[6*8+xx]=(Clip3(-32768,32703,b[1]-b[5])+64)>>7;
psBlock[5*8+xx]=(Clip3(-32768,32703,b[2]-b[6])+64)>>7;
psBlock[4*8+xx]=(Clip3(-32768,32703,b[3]-b[7])+64)>>7;
}
}
/************************************************************************/
/* 函数功能:8x8亮度块插值预测 */
/************************************************************************/
void GetBlock(MOTIONVECTOR* pMv, AVS_INT iImgX, AVS_INT iImgY, AVS_INT iImgWidth, AVS_INT iImgHeight, const AVS_BYTE* pbRefY, AVS_BYTE* pPred)
{
int i, j;
int imgX = iImgX;
int imgY = iImgY;
int dx = (imgX*4 + pMv->x)&3;
int dy = (imgY*4 + pMv->y)&3;
int refX = (imgX*4 + pMv->x - dx)/4;
int refY = (imgY*4 + pMv->y - dy)/4;
if(dy ==0 && dx == 0) //D
{
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
pPred[i*8+j] = *(pbRefY + max(0,min(iImgHeight-1,refY+i))*iImgWidth + max(0,min(iImgWidth-1,refX+j)));
}
}
}
else if(dx==2 && dy==0) //b
{
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
int bpie =
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)));
pPred[i*8+j] = Clip((bpie+4)>>3);
}
}
}
else if(dy==2 && dx==0) //h
{
for(i=0; i<8; i++)
for(j=0; j<8; j++)
{
int hpie =
- *(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j)))
+ 5* *(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j)))
+ 5* *(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j)))
- *(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j)));
pPred[i*8+j] = Clip((hpie+4)>>3);
}
}
else if(dy==2 && dx==2) //j
{
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
int aapie =
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j ))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
int bpie =
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j ))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
int spie =
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j ))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
int ddpie =
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j ))))
+ 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
- (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
int jpie = -aapie + 5*bpie + 5*spie - ddpie;
pPred[i*8+j] = Clip((jpie + 32)>>6);
}
}
}
else if(dy==0 && dx==1) //a
{
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
int eepie =
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j-2)))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)));
int Dpie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j))) * 8;
int bpie =
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)));
int Epie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))) * 8;
pPred[i*8+j] = Clip((eepie + 7*Dpie + 7*bpie + Epie + 64)>>7);
}
}
}
else if(dy==0 && dx==3) //c
{
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
int Dpie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j))) * 8;
int Epie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))) * 8;
int bpie =
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)));
int ccpie =
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))
+ 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))
- *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+3)));
pPred[i*8+j] = Clip((Dpie + 7*bpie + 7*Epie + ccpie + 64)>>7);
}
}
}
else if(dy==1 && dx==0) //d
{
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
int ffpie =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -