方式1记录Ctu失真
float Ctudistortiontable[codeframenum + 1][Ctunuminwide + 1][Ctunuminheight + 1];
void recod16BSDioiofCurctu(int poc,int ctupex_x,int ctupex_y,Pel*org,Pel*rec, int orgstride, int recstride)
{
.....
ctudistortion = 0;
for (int i = 0; i< 64; i++) //计算CTU失真
{
for (int j = 0; j < 64; j++)
{
ctudistortion = ctudistortion+ resctubuf[i][j]* resctubuf[i][j];
}
}
//printf("ctudistortion=%f", ctudistortion);
Ctudistortiontable[poc][ctupex_x/64][ctupex_y/64]= ctudistortion;
.......
}
方式2记录失真 :
//记录每个CTU的传播因子和失真,用来计算拉格朗日因子
struct dis_chanbofactor
{
float dis;
int chuanboyinzi;
int blockx;
int blocky;
int Pixelx;
int Pixely;
int poc;
};
vector<dis_chanbofactor> framedis_chanbo;
vector <vector<dis_chanbofactor>>dis_chanbo;
Void TEncSlice::compressSlice(TComPic* pcPic, const Bool bCompressEntireSlice, const Bool bFastDeltaQP)
{
for (UInt ctuTsAddr = startCtuTsAddr; ctuTsAddr < boundingCtuTsAddr; ++ctuTsAddr)
{ //CTU地址
............
m_pcCuEncoder->compressCtu(pCtu);//一个CTU的编码,包括CU的划分,PU模式的决定,TU的划分
if (pCtu->getCUPelX() <= (picturewide - 64) && pCtu->getCUPelY() <= pictureheigt - 64) //只对整数CTU计算传播因子,边界处不算
{
ctudisfactor = computeCtuchuanboyinzi(curframeindex, ctu_x, ctu_y); //xinlongkun
//printf("当前CTU的聚合传播因子%d", ctudisfactor);
dis_chanbofactor tempctudisfactor; //将失真和对应的传播因子入动态vector
tempctudisfactor.chuanboyinzi = ctudisfactor;
tempctudisfactor.dis = ComputerCurctuDistion(pCtu->getSlice()->getPOC(), pCtu->getCUPelX(), pCtu->getCUPelY(),
pCtu->getPic()->getPicYuvTrueOrg()->getAddr(COMPONENT_Y, pCtu->getCtuRsAddr()),
pCtu->getPic()->getPicYuvRec()->getAddr(COMPONENT_Y, pCtu->getCtuRsAddr()),
pCtu->getPic()->getPicYuvTrueOrg()->getStride(COMPONENT_Y),
pCtu->getPic()->getPicYuvRec()->getStride(COMPONENT_Y));
tempctudisfactor.poc = pCtu->getSlice()->getPOC();
tempctudisfactor.Pixelx = pCtu->getCUPelX();
tempctudisfactor.Pixely = pCtu->getCUPelY();
//tempctudisfactor.chuanboyinzi = 2;
//tempctudisfactor.dis = 1;
framedis_chanbo.push_back(tempctudisfactor);
if (poc >= 1)
{
//printf("glonal=%f", globallamba);
//m_pcRdCost->setLambda(globallamba*oldLambda / (ctudisfactor + 1), pcSlice->getSPS()->getBitDepths());
}
}
}
.........
dis_chanbo.push_back(framedis_chanbo);//存入每帧的失真
//methodtwoprintCtuditortionOneFrame(pcSlice->getPOC());
}