📄 gmc_util.cpp
字号:
Int ibias, isqr_wac;
Int iPowerWA, iwarpmask;
iPowerWA = 1 << iWarpingAccuracyp1;
iwarpmask = iPowerWA - 1;
ir_pwr = 4 - iWarpingAccuracyp1;
irat = 1<<(4 - iWarpingAccuracyp1);
isqr_wac = iWarpingAccuracyp1 << 1;
ibias = 1 << (isqr_wac - 1);
xi0 = m_rctCurrVOPY.left ;
yj0 = m_rctCurrVOPY.top ;
xi1 = m_rctCurrVOPY.right ;
yj1 = m_rctCurrVOPY.top ;
xi0prime = (Int)((m_rgstDstQ[0].x) * 2.0) ;
yj0prime = (Int)((m_rgstDstQ[0].y) * 2.0) ;
xi1prime = (Int)((m_rgstDstQ[1].x) * 2.0) ;
yj1prime = (Int)((m_rgstDstQ[1].y) * 2.0) ;
xi0prime = xi0prime << 3;
yj0prime = yj0prime << 3;
xi1prime = xi1prime << 3;
yj1prime = yj1prime << 3;
if(m_iNumOfPnts == 3) {
xi2 = m_rctCurrVOPY.left ;
yj2 = m_rctCurrVOPY.bottom ;
xi2prime = (Int)((m_rgstDstQ[2].x) * 2.0) ;
yj2prime = (Int)((m_rgstDstQ[2].y) * 2.0) ;
xi2prime = xi2prime << 3;
yj2prime = yj2prime << 3;
}
iWidth = xi1 - xi0;
iVW = 1; ivw_pwr = 0;
while(iVW < iWidth) {
iVW <<= 1;
ivw_pwr++;
}
if(m_iNumOfPnts == 3) {
iHight = yj2 - yj0;
iWidthHight = iWidth*iHight;
iVH = 1; ivh_pwr = 0;
while(iVH < iHight) {
iVH <<= 1;
ivh_pwr++;
}
iVWH = iVW * iVH;
ivwh_pwr = ivw_pwr + ivh_pwr;
}
xi1dprime = LinearExtrapolation(xi0, xi1, xi0prime, xi1prime, iWidth, iVW) + ((xi0+iVW)<<4);
yj1dprime = LinearExtrapolation(yj0, yj1, yj0prime, yj1prime, iWidth, iVW) + (yj0<<4);
if(m_iNumOfPnts == 3) {
xi2dprime = LinearExtrapolation(xi0, xi2, xi0prime, xi2prime, iHight, iVH) + (xi0<<4);
yj2dprime = LinearExtrapolation(yj0, yj2, yj0prime, yj2prime, iHight, iVH) + ((yj0+iVH)<<4);
}
xi0prime += 256;
yj0prime += 256;
xi1prime = xi1dprime + 256;
yj1prime = yj1dprime + 256;
if(m_iNumOfPnts == 3) {
xi2prime = xi2dprime + 256;
yj2prime = yj2dprime + 256;
}
if(m_iNumOfPnts == 3) {
if(ivw_pwr<=ivh_pwr)
{
iVH /= iVW;
iVWH /= iVW;
iVW=1;
ivh_pwr -= ivw_pwr;
ivwh_pwr -= ivw_pwr;
ivw_pwr=0;
}
else
{
iVW /= iVH;
iVWH /= iVH;
iVH=1;
ivw_pwr -= ivh_pwr;
ivwh_pwr -= ivh_pwr;
ivh_pwr=0;
}
}
if(m_iNumOfPnts == 2) {
ipa = xi1prime - xi0prime;
ipb = -(yj1prime - yj0prime);
ipc = xi0prime * iVW;
ipd = -ipb;
ipe = ipa;
ipf = yj0prime * iVW;
cxy = ipc + irat*iVW/2;
cyy = ipf + irat*iVW/2;
idnm_pwr = ir_pwr+ivw_pwr;
} else {
ipa = (xi1prime - xi0prime) * iVH;
ipb = (xi2prime - xi0prime) * iVW;
ipc = xi0prime * iVWH;
ipd = (yj1prime - yj0prime) * iVH;
ipe = (yj2prime - yj0prime) * iVW;
ipf = yj0prime * iVWH;
cxy = ipc + irat*iVWH/2;
cyy = ipf + irat*iVWH/2;
idnm_pwr = ir_pwr+ivwh_pwr;
}
cxy += ipb * (cy_curr - yj0) + ipa * (cx_curr -xi0);
cyy += ipe * (cy_curr - yj0) + ipd * (cx_curr -xi0);
FourSlashesShift(cxy, idnm_pwr, &cxy_i, &cxy_f);
FourSlashesShift(cyy, idnm_pwr, &cyy_i, &cyy_f);
FourSlashesShift(ipa, idnm_pwr, &ipa_i, &ipa_f);
FourSlashesShift(ipb, idnm_pwr, &ipb_i, &ipb_f);
FourSlashesShift(ipd, idnm_pwr, &ipd_i, &ipd_f);
FourSlashesShift(ipe, idnm_pwr, &ipe_i, &ipe_f);
ifracmask = (1 << idnm_pwr) - 1;
for (yj = 0; yj < MB_SIZE;
cxy_i+=ipb_i, cxy_f+=ipb_f, cyy_i+=ipe_i, cyy_f+=ipe_f, yj++) {
cxy_i += cxy_f >> idnm_pwr;
cyy_i += cyy_f >> idnm_pwr;
cxy_f &= ifracmask;
cyy_f &= ifracmask;
for (xi = 0, cxx_i = cxy_i, cxx_f = cxy_f, cyx_i= cyy_i, cyx_f= cyy_f;
xi < MB_SIZE;
cxx_i+=ipa_i, cxx_f+=ipa_f, cyx_i+=ipd_i, cyx_f+=ipd_f, xi++) {
cxx_i += cxx_f >> idnm_pwr;
cyx_i += cyx_f >> idnm_pwr;
cxx_f &= ifracmask;
cyx_f &= ifracmask;
cxx_w = cxx_i;
cyx_w = cyx_i;
if (cxx_w<iref_left||cyx_w<iref_top||cxx_w>iref_right||cyx_w>iref_bottom)
{
if(cxx_w<=iref_left)cxx_w=iref_left;
if(cxx_w>iref_right)cxx_w=iref_right;
if(cyx_w<=iref_top)cyx_w=iref_top;
if(cyx_w>iref_bottom)cyx_w=iref_bottom;
}
ioffset=(cyx_w>>iWarpingAccuracyp1)*iref_width + (cxx_w>>iWarpingAccuracyp1);
irx = cxx_w & iwarpmask;
iry = cyx_w & iwarpmask;
ppxlcRef[xi+yj*MB_SIZE] = CInterpolatePixelValue(pprev, ioffset,
iref_width, irx, iry, iPowerWA,
ibias, isqr_wac);
}
}
}
Void CVideoObject::FastAffineWarpChromForGMC(Int cx_curry, Int cy_curry,
PixelC *ppxlcRefU, PixelC *ppxlcRefV)
{
Int iWarpingAccuracyp1 = m_uiWarpingAccuracy+1;
Int iref_width = m_rctRefFrameY.right - m_rctRefFrameY.left;
Int iref_height = m_rctRefFrameY.bottom - m_rctRefFrameY.top;
Int iref_left = ((m_rctRefVOPY0.left/2) + EXPANDUV_REFVOP)<<iWarpingAccuracyp1;
Int iref_top = ((m_rctRefVOPY0.top/2) + EXPANDUV_REFVOP)<<iWarpingAccuracyp1;
Int iref_right = ((m_rctRefVOPY0.right/2) - EXPANDUV_REFVOP + 15)<<iWarpingAccuracyp1;
Int iref_bottom = ((m_rctRefVOPY0.bottom/2) - EXPANDUV_REFVOP + 15)<<iWarpingAccuracyp1;
CU8Image *puciRefU = (CU8Image*) m_pvopcRefQ0 -> getPlane (U_PLANE);
CU8Image *puciRefV = (CU8Image*) m_pvopcRefQ0 -> getPlane (V_PLANE);
PixelC* pprevu = (PixelC*) puciRefU -> pixels () +
(EXPANDUV_REF_FRAME - 8)*m_iFrameWidthUV +EXPANDUV_REF_FRAME - 8;
PixelC* pprevv = (PixelC*) puciRefV -> pixels () +
(EXPANDUV_REF_FRAME - 8)*m_iFrameWidthUV +EXPANDUV_REF_FRAME - 8;
Int xi0, yj0, xi1, yj1, xi2, yj2;
Int xi0prime, yj0prime, xi1prime, yj1prime, xi2prime, yj2prime;
Int ipa, ipb, ipc, ipd, ipe, ipf;
Int ipa_i, ipa_f, ipb_i, ipb_f, ipd_i, ipd_f, ipe_i, ipe_f;
Int iWidth, iHight, iWidthHight;
Int xi, yj;
Int xi1dprime, yj1dprime, xi2dprime, yj2dprime;
Int iVW, iVH, iVWH;
Int ivw_pwr, ivh_pwr, ivwh_pwr;
Int ir_pwr, irat;
Int cxy, cyy, idnm_pwr, ifracmask;
Int cxx_i, cxx_f, cyx_i, cyx_f, cxy_i, cxy_f, cyy_i, cyy_f, ioffset;
Int cxx_w, cyx_w;
Int irx, iry;
Int ibias, isqr_wac;
Int iPowerWA, iwarpmask;
iref_width = iref_width >>1;
iref_height = iref_height >>1;
iPowerWA = 1 << iWarpingAccuracyp1;
iwarpmask = iPowerWA - 1;
ir_pwr = 4 - iWarpingAccuracyp1;
irat = 1<<(4 - iWarpingAccuracyp1);
isqr_wac = iWarpingAccuracyp1 << 1;
ibias = 1 << (isqr_wac - 1);
xi0 = m_rctCurrVOPY.left ;
yj0 = m_rctCurrVOPY.top ;
xi1 = m_rctCurrVOPY.right ;
yj1 = m_rctCurrVOPY.top ;
Int cx_curr = cx_curry-xi0;
Int cy_curr = cy_curry-yj0;
xi0prime = (Int)((m_rgstDstQ[0].x) * 2.0) ;
yj0prime = (Int)((m_rgstDstQ[0].y) * 2.0) ;
xi1prime = (Int)((m_rgstDstQ[1].x) * 2.0) ;
yj1prime = (Int)((m_rgstDstQ[1].y) * 2.0) ;
xi0prime = xi0prime << 3;
yj0prime = yj0prime << 3;
xi1prime = xi1prime << 3;
yj1prime = yj1prime << 3;
if(m_iNumOfPnts == 3) {
xi2 = m_rctCurrVOPY.left ;
yj2 = m_rctCurrVOPY.bottom ;
xi2prime = (Int)((m_rgstDstQ[2].x) * 2.0) ;
yj2prime = (Int)((m_rgstDstQ[2].y) * 2.0) ;
xi2prime = xi2prime << 3;
yj2prime = yj2prime << 3;
}
iWidth = xi1 - xi0;
iVW = 1; ivw_pwr = 0;
while(iVW < iWidth) {
iVW <<= 1;
ivw_pwr++;
}
if(m_iNumOfPnts == 3) {
iHight = yj2 - yj0;
iWidthHight = iWidth*iHight;
iVH = 1; ivh_pwr = 0;
while(iVH < iHight) {
iVH <<= 1;
ivh_pwr++;
}
iVWH = iVW * iVH;
ivwh_pwr = ivw_pwr + ivh_pwr;
}
xi1dprime = LinearExtrapolation(xi0, xi1, xi0prime, xi1prime, iWidth, iVW) + ((xi0+iVW)<<4);
yj1dprime = LinearExtrapolation(yj0, yj1, yj0prime, yj1prime, iWidth, iVW) + (yj0<<4);
if(m_iNumOfPnts == 3) {
xi2dprime = LinearExtrapolation(xi0, xi2, xi0prime, xi2prime, iHight, iVH) + (xi0<<4);
yj2dprime = LinearExtrapolation(yj0, yj2, yj0prime, yj2prime, iHight, iVH) + ((yj0+iVH)<<4);
}
xi0prime += 256;
yj0prime += 256;
xi1prime = xi1dprime + 256;
yj1prime = yj1dprime + 256;
if(m_iNumOfPnts == 3) {
xi2prime = xi2dprime + 256;
yj2prime = yj2dprime + 256;
}
if(m_iNumOfPnts == 3) {
if(ivw_pwr<=ivh_pwr)
{
iVH /= iVW;
iVWH /= iVW;
iVW=1;
ivh_pwr -= ivw_pwr;
ivwh_pwr -= ivw_pwr;
ivw_pwr=0;
}
else
{
iVW /= iVH;
iVWH /= iVH;
iVH=1;
ivw_pwr -= ivh_pwr;
ivwh_pwr -= ivh_pwr;
ivh_pwr=0;
}
}
if(m_iNumOfPnts == 2) {
ipa = xi1prime - xi0prime;
ipb = -(yj1prime - yj0prime);
ipc = 2 * iVW * xi0prime - 16*iVW;
ipd = -ipb;
ipe = ipa;
ipf = 2 * iVW * yj0prime - 16*iVW;
cxy = ipa + ipb + ipc + 2*irat*iVW;
cyy = ipd + ipe + ipf + 2*irat*iVW;
idnm_pwr = ir_pwr+ivw_pwr+2;
} else {
ipa = (xi1prime - xi0prime) * iVH;
ipb = (xi2prime - xi0prime) * iVW;
ipc = 2 * iVWH * xi0prime - 16*iVWH;
ipd = (yj1prime - yj0prime) * iVH;
ipe = (yj2prime - yj0prime) * iVW;
ipf = 2 * iVWH * yj0prime - 16*iVWH;
cxy = ipa + ipb + ipc + 2*irat*iVWH;
cyy = ipd + ipe + ipf + 2*irat*iVWH;
idnm_pwr = ir_pwr+ivwh_pwr+2;
}
cxy += (ipb * cy_curr + ipa * cx_curr)<<1;
cyy += (ipe * cy_curr + ipd * cx_curr)<<1;
FourSlashesShift(ipa, idnm_pwr-2, &ipa_i, &ipa_f);
FourSlashesShift(ipb, idnm_pwr-2, &ipb_i, &ipb_f);
FourSlashesShift(ipd, idnm_pwr-2, &ipd_i, &ipd_f);
FourSlashesShift(ipe, idnm_pwr-2, &ipe_i, &ipe_f);
ipa_f *= 4;
ipb_f *= 4;
ipd_f *= 4;
ipe_f *= 4;
FourSlashesShift(cxy, idnm_pwr, &cxy_i, &cxy_f);
FourSlashesShift(cyy, idnm_pwr, &cyy_i, &cyy_f);
ifracmask = (1 << idnm_pwr) - 1;
for (yj = 0; yj < MB_SIZE/2;
cxy_i+=ipb_i, cxy_f+=ipb_f, cyy_i+=ipe_i, cyy_f+=ipe_f, yj++) {
cxy_i += cxy_f >> idnm_pwr;
cyy_i += cyy_f >> idnm_pwr;
cxy_f &= ifracmask;
cyy_f &= ifracmask;
for (xi = 0, cxx_i = cxy_i, cxx_f = cxy_f, cyx_i= cyy_i, cyx_f= cyy_f;
xi < MB_SIZE/2;
cxx_i+=ipa_i, cxx_f+=ipa_f, cyx_i+=ipd_i, cyx_f+=ipd_f, xi++) {
cxx_i += (cxx_f >> idnm_pwr);
cyx_i += (cyx_f >> idnm_pwr);
cxx_f &= ifracmask;
cyx_f &= ifracmask;
cxx_w = cxx_i;
cyx_w = cyx_i;
if (cxx_w<iref_left||cyx_w<iref_top||cxx_w>iref_right||cyx_w>iref_bottom)
{
if(cxx_w<=iref_left)cxx_w=iref_left;
if(cxx_w>iref_right)cxx_w=iref_right;
if(cyx_w<=iref_top)cyx_w=iref_top;
if(cyx_w>iref_bottom)cyx_w=iref_bottom;
}
ioffset = (cyx_w>>iWarpingAccuracyp1)*iref_width+(cxx_w>>iWarpingAccuracyp1);
irx = cxx_w & iwarpmask;
iry = cyx_w & iwarpmask;
ppxlcRefU[xi+yj*BLOCK_SIZE] = CInterpolatePixelValue(pprevu, ioffset,
iref_width, irx, iry, iPowerWA,
ibias, isqr_wac);
ppxlcRefV[xi+yj*BLOCK_SIZE] = CInterpolatePixelValue(pprevv, ioffset,
iref_width, irx, iry, iPowerWA,
ibias, isqr_wac);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -