📄 gme_for_iso.cpp
字号:
dl = dy1 - y1;
d1ml = 1. -dl;
dI1x1y1[0] = pref_work[iref_pel];
dI1x1y1[1] = pref_work[iref_pel1];
dI1x1y1[2] = pref_work[iref_pel2];
dI1x1y1[3] = pref_work[iref_pel3];
dI1 = d1mk*d1ml*dI1x1y1[0] + dk*d1ml*dI1x1y1[1] +
d1mk*dl*dI1x1y1[2] + dk*dl*dI1x1y1[3];
de = dI1 - pcurr_work[icurr_pel];
if(iite==0)
iperror_histgram[(Int)(fabs(de))]++;
if(fabs(de) < ithreshold_T) {
dI1dx = (dI1x1y1[1]-dI1x1y1[0])*d1ml + (dI1x1y1[3]-dI1x1y1[2])*dl;
dI1dy = (dI1x1y1[2]-dI1x1y1[0])*d1mk + (dI1x1y1[3]-dI1x1y1[1])*dk;
ddedm[0] = dx * dI1dx;
ddedm[1] = dy * dI1dx;
ddedm[2] = dI1dx;
ddedm[3] = dx * dI1dy;
ddedm[4] = dy * dI1dy;
ddedm[5] = dI1dy;
db[0] += -de*ddedm[0];
db[1] += -de*ddedm[1];
db[2] += -de*ddedm[2];
db[3] += -de*ddedm[3];
db[4] += -de*ddedm[4];
db[5] += -de*ddedm[5];
for(yj=0; yj<6; yj++)
for(xi=0; xi<=yj; xi++)
dA[yj*6+xi] += ddedm[yj] * ddedm[xi];
dE2 += de*de;
} // threshold
} // limit of ref_luma area
} // limit of curr_luma area
} // limit of curr_alpha value
} // x
icurr_pel += icurr_offset;
} // y
}
if(iite==0){
istop = istop*90/100;
itmp=0;
for(xi=0;xi<256;xi++){
itmp+=iperror_histgram[xi];
if(itmp > istop){
ithreshold_T = xi-1;
break;
}
}
}
for(yj=0; yj<5; yj++)
for(xi=yj+1; xi<6; xi++)
dA[yj*6+xi] = dA[xi*6+yj];
icheck = DeltaMP(dA, 6, db, dm);
if(icheck){
for(xi=0; xi<6; xi++)
dTM[xi] += dm[xi];
if(fabs(dm[2]) < 0.001 && fabs(dm[5]) < 0.001 && fabs(dm[0]) < 0.00001 &&
fabs(dm[1]) < 0.00001 && fabs(dm[3]) < 0.00001 &&
fabs(dm[4]) < 0.00001 ) break;
}else {
// printf("not up to matrix\n");
break;
}
} // iteration
if(ilevel){
dTM[2] *= 2;
dTM[5] *= 2;
ifilter_offset =
icurr_width * (EXPANDY_REF_FRAME>>ilevel) + (EXPANDY_REF_FRAME>>ilevel);
pref_work -= ifilter_offset ;
delete [] pref_work; pref_work = NULL;
pcurr_work -= ifilter_offset ;
delete [] pcurr_work; pcurr_work = NULL;
if(m_volmd.fAUsage != RECTANGLE) {
pref_alpha_work -= ifilter_offset ;
delete [] pref_alpha_work; pref_alpha_work = NULL;
pcurr_alpha_work -= ifilter_offset ;
delete [] pcurr_alpha_work; pcurr_alpha_work = NULL;
}
}
icurr_width *= 2;
icurr_height *= 2;
icurr_left *= 2;
icurr_top *= 2;
icurr_right *= 2;
icurr_bottom *= 2;
iref_width *= 2;
iref_height *= 2;
iref_left *= 2;
iref_top *= 2;
iref_right *= 2;
iref_bottom *= 2;
} // level
pparameter -> dp1 = dTM[0];
pparameter -> dp2 = dTM[1];
pparameter -> dp3 = dTM[2];
pparameter -> dp4 = dTM[3];
pparameter -> dp5 = dTM[4];
pparameter -> dp6 = dTM[5];
pparameter -> dp7 = 0.0;
pparameter -> dp8 = 0.0;
delete [] dm; dm=NULL;
delete [] db; db= NULL;
delete [] dA; dA= NULL;
delete [] dTM; dTM= NULL;
delete [] ddedm; ddedm = NULL;
delete [] dI1x1y1; dI1x1y1 = NULL;
delete [] iperror_histgram; iperror_histgram = NULL;
}
Void CVideoObjectEncoder::ModifiedThreeStepSearch(PixelC *pref_work,
PixelC *pcurr_work,
Int icurr_width, Int icurr_height, Int iref_width, Int iref_height,
Int icurr_left, Int icurr_top, Int icurr_right, Int icurr_bottom,
Int iref_left, Int iref_top, Int iref_right, Int iref_bottom,
Int *ibest_locationx, Int *ibest_locationy)
{
Int xi,yj, irange, ilocationx, ilocationy, ino_of_pel=0;
Int icurr_pel, iref_pel, iref_x, iref_y;
Int irange_locationx=0, irange_locationy=0;
Double dE1 = 0, dmin_error=300;
Int icurr_offsety;
icurr_offsety = icurr_width - icurr_right + icurr_left;
for (irange = 4; irange >=1 ; irange/=2) {
irange_locationx=*ibest_locationx;
irange_locationy=*ibest_locationy;
for (ilocationy = irange_locationy-irange; ilocationy <= irange_locationy+irange;
ilocationy += irange) {
for (ilocationx = irange_locationx-irange; ilocationx <= irange_locationx+irange;
ilocationx += irange) {
dE1 = 0.0;
ino_of_pel = 0;
icurr_pel = icurr_left + icurr_top*icurr_width;
for (yj = icurr_top; yj< icurr_bottom ; yj++) {
for (xi = icurr_left; xi< icurr_right ; xi++, icurr_pel++) {
iref_x = ilocationx + xi;
iref_y = ilocationy + yj;
iref_pel = iref_y * iref_width + iref_x;
if ((iref_x >= iref_left) && (iref_x < iref_right) &&
(iref_y >= iref_top) && (iref_y < iref_bottom)){
dE1 += Double(abs((Int)pcurr_work[icurr_pel] - (Int)pref_work[iref_pel]));
ino_of_pel ++;
} // limit of ref value
} // i
icurr_pel += icurr_offsety;
} // j
if (ino_of_pel > 0)
dE1 = dE1 / ino_of_pel;
else
dE1 = dmin_error;
if ((dE1 < dmin_error) || (dE1 == dmin_error && (abs(*ibest_locationx) +
abs(*ibest_locationy)) > (abs(ilocationx) + abs(ilocationy)))) {
dmin_error = dE1;
*ibest_locationx = ilocationx;
*ibest_locationy = ilocationy;
}
} // locationx
} // locationy
} // range
}
Void CVideoObjectEncoder::ModifiedThreeStepSearch_WithShape(PixelC *pref_work,
PixelC *pcurr_work,
PixelC *pref_alpha_work, PixelC *pcurr_alpha_work,
Int icurr_width, Int icurr_height, Int iref_width, Int iref_height,
Int icurr_left, Int icurr_top, Int icurr_right, Int icurr_bottom,
Int iref_left, Int iref_top, Int iref_right, Int iref_bottom,
Int *ibest_locationx, Int *ibest_locationy)
{
Int xi,yj, irange, ilocationx, ilocationy, ino_of_pel=0;
Int icurr_pel, iref_pel, iref_x, iref_y;
Int irange_locationx=0, irange_locationy=0;
Double dE1 = 0, dmin_error=300;
Int icurr_offsety;
icurr_offsety = icurr_width - icurr_right + icurr_left;
for (irange = 4; irange >=1 ; irange/=2) {
irange_locationx=*ibest_locationx;
irange_locationy=*ibest_locationy;
for (ilocationy = irange_locationy-irange; ilocationy <= irange_locationy+irange;
ilocationy += irange) {
for (ilocationx = irange_locationx-irange; ilocationx <= irange_locationx+irange;
ilocationx += irange) {
dE1 = 0.0;
ino_of_pel = 0;
icurr_pel = icurr_left + icurr_top*icurr_width;
for (yj = icurr_top; yj< icurr_bottom ; yj++) {
for (xi = icurr_left; xi< icurr_right ; xi++, icurr_pel++) {
if (pcurr_alpha_work[icurr_pel]) {
iref_x = ilocationx + xi;
iref_y = ilocationy + yj;
iref_pel = iref_y * iref_width + iref_x;
if ((iref_x >= iref_left) && (iref_x < iref_right) &&
(iref_y >= iref_top) && (iref_y < iref_bottom) &&
pref_alpha_work[iref_pel]) {
dE1 += Double(abs((Int)pcurr_work[icurr_pel] - (Int)pref_work[iref_pel]));
ino_of_pel ++;
} // limit of ref area
} // limit of curr_alpha value
} // i
icurr_pel += icurr_offsety;
} // j
if (ino_of_pel > 0)
dE1 = dE1 / ino_of_pel;
else
dE1 = dmin_error;
if ((dE1 < dmin_error) || (dE1 == dmin_error && (abs(*ibest_locationx) +
abs(*ibest_locationy)) > (abs(ilocationx) + abs(ilocationy)))) {
dmin_error = dE1;
*ibest_locationx = ilocationx;
*ibest_locationy = ilocationy;
}
} // locationx
} // locationy/
} // range
}
Void CVideoObjectEncoder::ThreeTapFilter(PixelC *pLow, PixelC *pHight, Int iwidth,
Int iheight)
{
Int xi, yj, ihwidth = iwidth/2, iwwidth = iwidth*2, iwidth2 = iwidth+2;
PixelC *plt, *pct, *prt,
*plc, *pcc, *prc,
*plb, *pcb, *prb, *pp;
pp=pLow; plt=pHight; pct=pHight; prt=pHight+1;
plc=pHight; pcc=pHight; prc=pHight+1;
plb=plc+iwidth; pcb=pcc+iwidth; prb=prc+iwidth;
*pp = (PixelC)(((UInt)(*plt) + (((UInt)(*pct))<<1) + (UInt)(*prt) +
(((UInt)(*plc))<<1) + (((UInt)(*pcc))<<2) + (((UInt)(*prc))<<1) +
(UInt)(*plb) + (((UInt)(*pcb))<<1) + (UInt)(*prb) + 8) >> 4);
pp=pLow+1; plt=pHight+1; pct=pHight+2; prt=pHight+3;
plc=pHight+1; pcc=pHight+2; prc=pHight+3;
plb=plc+iwidth; pcb=pcc+iwidth; prb=prc+iwidth;
for(xi=1; xi<iwidth/2-1; xi++, pp++, plt+=2, pct+=2, prt+=2,
plc+=2, pcc+=2, prc+=2,
plb+=2, pcb+=2, prb+=2)
*pp = (PixelC)(((UInt)(*plt) + (((UInt)(*pct))<<1) + (UInt)(*prt) +
(((UInt)(*plc))<<1) + (((UInt)(*pcc))<<2) + (((UInt)(*prc))<<1) +
(UInt)(*plb) + (((UInt)(*pcb))<<1) + (UInt)(*prb) + 8) >> 4);
pp=pLow+ihwidth; plt=pHight+iwidth; pct=pHight+iwidth; prt=pHight+iwidth+1;
plc=plt+iwidth; pcc=pct+iwidth; prc=prt+iwidth;
plb=plc+iwidth; pcb=pcc+iwidth; prb=prc+iwidth;
for(xi=1; xi<iheight/2-1; xi++, pp+=ihwidth, plt+=iwwidth, pct+=iwwidth, prt+=iwwidth,
plc+=iwwidth, pcc+=iwwidth, prc+=iwwidth,
plb+=iwwidth, pcb+=iwwidth, prb+=iwwidth)
*pp = (PixelC)(((UInt)(*plt) + (((UInt)(*pct))<<1) + (UInt)(*prt) +
(((UInt)(*plc))<<1) + (((UInt)(*pcc))<<2) + (((UInt)(*prc))<<1) +
(UInt)(*plb) + (((UInt)(*pcb))<<1) + (UInt)(*prb) + 8) >> 4);
pp=pLow+ihwidth+1; plt=pHight+1; pct=pHight+2; prt=pHight+3;
plc=plt+iwidth; pcc=pct+iwidth; prc=prt+iwidth;
plb=plc+iwidth; pcb=pcc+iwidth; prb=prc+iwidth;
for(yj=1; yj<iheight/2-2; yj++, pp++, plt+=iwidth2, pct+=iwidth2, prt+=iwidth2,
plc+=iwidth2, pcc+=iwidth2, prc+=iwidth2,
plb+=iwidth2, pcb+=iwidth2, prb+=iwidth2)
for(xi=1; xi<ihwidth; xi++, pp++, plt+=2, pct+=2, prt+=2,
plc+=2, pcc+=2, prc+=2,
plb+=2, pcb+=2, prb+=2)
{
*pp = (PixelC)(((UInt)(*plt) + (((UInt)(*pct))<<1) + (UInt)(*prt) +
(((UInt)(*plc))<<1) + (((UInt)(*pcc))<<2) + (((UInt)(*prc))<<1) +
(UInt)(*plb) + (((UInt)(*pcb))<<1) + (UInt)(*prb) + 8) >> 4);
}
}
Int CVideoObjectEncoder::DeltaMP(Double *dA, Int in, Double *db, Double *dm)
{
int xi, yj, xi2, in2=in*2, ik, i_pivot;
Double *dAi = new Double [in * in * 2];
Double dpivot, dtmp;
dpivot = *dA;
for(yj = 0; yj < in; yj++)
for(xi = 0; xi < in; xi++)
if(fabs(*(dA + yj * in + xi)) > fabs(dpivot))
dpivot = *(dA + yj * in + xi);
if(fabs(dpivot) < 0.000000001) {
delete [] dAi; dAi= NULL;
return(0);
}
dpivot = 1.0 / dpivot;
for(yj = 0; yj < in; yj++)
for(xi = 0, xi2 = in; xi < in; xi++, xi2++){
*(dAi + yj * in2 + xi) = (*(dA + yj * in + xi))*dpivot;
if(xi == yj)
*(dAi + yj * in2 + xi2) = dpivot;
else
*(dAi + yj * in2 + xi2) = 0.0;
}
for(xi = 0; xi < in; xi++) {
i_pivot = xi;
dpivot = *(dAi + xi * in2 + xi);
for(yj = xi; yj < in; yj++)
if(fabs(*(dAi + yj * in2 + xi)) > fabs(dpivot))
{
i_pivot = yj;
dpivot = *(dAi + yj * in2 + xi);
}
if(fabs(dpivot) < 0.000000001) {
delete [] dAi; dAi = NULL;
return(0);
}
if(i_pivot!=xi)
for(ik = 0; ik < in2; ik++) {
dtmp = *(dAi + xi * in2 + ik);
*(dAi + xi * in2 + ik) = *(dAi + i_pivot * in2 + ik);
*(dAi + i_pivot * in2 + ik) = dtmp;
}
for(yj = 0; yj < in; yj++) {
if(yj != xi)
{
dpivot = *(dAi + yj * in2 + xi) / *(dAi + xi * in2 + xi);
for(ik = xi+1; ik < in2; ik++)
*(dAi + yj * in2 + ik) -=
dpivot*(*(dAi + xi * in2 + ik));
}
}
}
for(yj = 0; yj < in; yj++)
for(xi = 0, xi2 = in; xi < in; xi++, xi2++)
*(dAi + yj * in2 + xi2) /= *(dAi + yj * in2 + yj);
for(xi = 0; xi < in; xi++)
*(dm + xi) = 0.0;
for(yj = 0; yj < in; yj++)
for(xi = 0, xi2 = in; xi < in; xi++, xi2++)
*(dm + yj) += (*(dAi + yj * in2 +xi2))*(*(db + xi));
delete [] dAi; dAi = NULL;
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -