📄 spt.cpp
字号:
}
VWH = VW * VH;
vwh_pwr = vw_pwr + vh_pwr;
Int x2 = 0;
Int y2 = H;
ex2p = LinearExtrapolation(x0, x2, x0p, x2p, H, VH) + (x0<<4);
ey2p = LinearExtrapolation(y0, y2, y0p, y2p, H, VH) + ((y0+VH)<<4);
if (vw_pwr<=vh_pwr) {
VH /= VW;
VWH /= VW;
VW=1;
vh_pwr -= vw_pwr;
vwh_pwr -= vw_pwr;
vw_pwr=0;
}
else {
VW /= VH;
VWH /= VH;
VH=1;
vw_pwr -= vh_pwr;
vwh_pwr -= vh_pwr;
vh_pwr=0;
}
ex2p -= (sprite_left_edge * 16);
ey2p -= (sprite_top_edge * 16);
}
x0p -= (sprite_left_edge * 16);
y0p -= (sprite_top_edge * 16);
ex1p -= (sprite_left_edge * 16);
ey1p -= (sprite_top_edge * 16);
if (pntNum == 2) {
a = ex1p - x0p ;
b = y0p - ey1p ;
c = x0p * VW;
d = -b ;
e = a ;
f = y0p * VW;
dnm_pwr = r_pwr + vw_pwr;
cxy = c + r*VW/2;
cyy = f + r*VW/2;
}
else if (pntNum == 3) {
a = (ex1p - x0p) * VH;
b = (ex2p - x0p) * VW;
c = x0p * VWH;
d = (ey1p - y0p) * VH;
e = (ey2p - y0p) * VW;
f = y0p * VWH;
dnm_pwr = r_pwr + vwh_pwr;
cxy = c + r*VWH/2;
cyy = f + r*VWH/2;
}
Int sprite_width = m_pvopcSptQ -> whereY ().width;
Int sprite_height = m_pvopcSptQ -> whereY ().bottom
- m_pvopcSptQ -> whereY ().top;
sprite_left_edge *= (1 << accuracy1);
sprite_top_edge *= (1 << accuracy1);
Int cxx_i, cxx_f, cyx_i, cyx_f, cxy_i, cxy_f, cyy_i, cyy_f;
Int a_i, a_f, b_i, b_f, d_i, d_f, e_i, e_f;
FourSlashes(cxy, 1<<dnm_pwr, &cxy_i, &cxy_f);
FourSlashes(cyy, 1<<dnm_pwr, &cyy_i, &cyy_f);
FourSlashes(a, 1<<dnm_pwr, &a_i, &a_f);
FourSlashes(b, 1<<dnm_pwr, &b_i, &b_f);
FourSlashes(d, 1<<dnm_pwr, &d_i, &d_f);
FourSlashes(e, 1<<dnm_pwr, &e_i, &e_f);
Int fracmask = (1 << dnm_pwr) - 1;
Int y,x;
UInt accuracy2 = accuracy1 << 1;
#ifdef _FOR_GSSP_
PixelC pxlcWarpedBY;
#else
PixelC pxlcWarpedA;
#endif
Int rx,ry;
Int addr_offset;
Int warpmask = uiScale -1;
Int bias = 1<<(accuracy2-1);
for (y = 0; y < height;
cxy_i += b_i, cxy_f += b_f, cyy_i += e_i, cyy_f += e_f, y++) {
cxy_i += cxy_f >> dnm_pwr;
cyy_i += cyy_f >> dnm_pwr;
cxy_f &= fracmask;
cyy_f &= fracmask;
for (x = 0, cxx_i = cxy_i, cxx_f = cxy_f,
cyx_i = cyy_i, cyx_f = cyy_f;
x < width; cxx_i += a_i, cxx_f += a_f,
cyx_i += d_i, cyx_f += d_f, x++) {
cxx_i += cxx_f >> dnm_pwr;
cyx_i += cyx_f >> dnm_pwr;
cxx_f &= fracmask;
cyx_f &= fracmask;
if (cxx_i >= EXPANDY_REFVOP && cyx_i >= EXPANDY_REFVOP
&& cxx_i <= ((sprite_width-1-EXPANDY_REFVOP)<<accuracy1)
&& cyx_i <= ((sprite_height-1-EXPANDY_REFVOP)<<accuracy1)) {
addr_offset = (cyx_i>>accuracy1) * sprite_width + (cxx_i>>accuracy1);
rx = cxx_i & warpmask;
ry = cyx_i & warpmask;
#ifdef _FOR_GSSP_
pxlcWarpedBY = CInterpolatePixelValue ( ppxlcSptQBY,
#else
pxlcWarpedA = CInterpolatePixelValue ( ppxlcSptQA,
#endif
addr_offset,sprite_width, rx, ry,
uiScale, bias, accuracy2);
#ifdef _FOR_GSSP_
if (pxlcWarpedBY >= 128) {
*ppxlcCurrQBY = MPEG4_OPAQUE;
#else
if (pxlcWarpedA >= 128) {
*ppxlcCurrQA = MPEG4_OPAQUE;
#endif
*ppxlcCurrQY = CInterpolatePixelValue ( ppxlcSptQY,
addr_offset, sprite_width, rx, ry,
uiScale, bias, accuracy2);
#ifdef _FOR_GSSP_
if(m_pvopcSptQ -> fAUsage () == EIGHT_BIT)
*ppxlcCurrQA = CInterpolatePixelValue ( ppxlcSptQA,
addr_offset, sprite_width, rx, ry,
uiScale, bias, accuracy2);
#endif
}
}
ppxlcCurrQY++;
#ifdef _FOR_GSSP_
ppxlcCurrQBY++;
#endif
ppxlcCurrQA++;
}
ppxlcCurrQY += offset;
#ifdef _FOR_GSSP_
ppxlcCurrQBY += offset;
#endif
ppxlcCurrQA += offset;
}
#ifdef _FOR_GSSP_
ppxlcCurrQBY = (PixelC*) puciCurrBY -> pixels (rctWarpedBound.left, rctWarpedBound.top);
PixelC* ppxlcCurrQBYNextRow = ppxlcCurrQBY + puciCurrBY -> where ().width;
#else
ppxlcCurrQA = (PixelC*) puciCurrA -> pixels (rctWarpedBound.left, rctWarpedBound.top);
PixelC* ppxlcCurrQANextRow = ppxlcCurrQA + puciCurrA -> where ().width;
#endif
sprite_left_edge /= 2;
sprite_top_edge /= 2;
width /= 2;
height /= 2;
sprite_width /= 2;
sprite_height /= 2;
if (pntNum == 2) {
c = 2 * x0p * VW - 16*VW ;
f = 2 * y0p * VW - 16*VW ;
cxy = a + b + c + 2*r*VW;
cyy = d + e + f + 2*r*VW;
}
else if (pntNum == 3) {
c = 2 * x0p * VWH - 16*VWH ;
f = 2 * y0p * VWH - 16*VWH ;
cxy = a + b + c + 2*VWH*r;
cyy = d + e + f + 2*VWH*r;
}
a_f *= 4;
b_f *= 4;
d_f *= 4;
e_f *= 4;
dnm_pwr += 2;
FourSlashes(cxy, 1<<dnm_pwr, &cxy_i, &cxy_f);
FourSlashes(cyy, 1<<dnm_pwr, &cyy_i, &cyy_f);
fracmask = (1 << dnm_pwr) - 1;
for (y = 0; y < height;
cxy_i+=b_i, cxy_f+=b_f, cyy_i+=e_i, cyy_f+=e_f, y++) {
cxy_i += cxy_f >> dnm_pwr;
cyy_i += cyy_f >> dnm_pwr;
cxy_f &= fracmask;
cyy_f &= fracmask;
for (x = 0, cxx_i = cxy_i, cxx_f = cxy_f,
cyx_i = cyy_i, cyx_f = cyy_f;
x < width; cxx_i += a_i, cxx_f += a_f,
cyx_i += d_i, cyx_f += d_f, x++) {
cxx_i += cxx_f >> dnm_pwr;
cyx_i += cyx_f >> dnm_pwr;
cxx_f &= fracmask;
cyx_f &= fracmask;
if ( cxx_i >= EXPANDUV_REFVOP && cyx_i >= EXPANDUV_REFVOP
&& cxx_i <= ((sprite_width-1-EXPANDUV_REFVOP)<<accuracy1)
&& cyx_i <= ((sprite_height-1-EXPANDUV_REFVOP)<<accuracy1)) {
addr_offset = (cyx_i>>accuracy1) * sprite_width + (cxx_i>>accuracy1);
rx = cxx_i & warpmask;
ry = cyx_i & warpmask;
#ifdef _FOR_GSSP_
if (*ppxlcCurrQBY | *(ppxlcCurrQBY + 1) | *ppxlcCurrQBYNextRow | *(ppxlcCurrQBYNextRow+1)) {
#else
if (*ppxlcCurrQA | *(ppxlcCurrQA + 1) | *ppxlcCurrQANextRow | *(ppxlcCurrQANextRow+1)) {
#endif
*ppxlcCurrQU = CInterpolatePixelValue ( ppxlcSptQU, addr_offset,
sprite_width, rx, ry, uiScale,
bias, accuracy2);
*ppxlcCurrQV = CInterpolatePixelValue ( ppxlcSptQV, addr_offset,
sprite_width, rx, ry, uiScale,
bias, accuracy2);
}
}
#ifdef _FOR_GSSP_
ppxlcCurrQBY += 2;
ppxlcCurrQBYNextRow += 2;
#else
ppxlcCurrQA += 2;
ppxlcCurrQANextRow += 2;
#endif
ppxlcCurrQU++;
ppxlcCurrQV++;
}
#ifdef _FOR_GSSP_
ppxlcCurrQBY += offsetBY;
ppxlcCurrQBYNextRow += offsetBY;
#else
ppxlcCurrQA += offsetBY;
ppxlcCurrQANextRow += offsetBY;
#endif
ppxlcCurrQU += offsetUV;
ppxlcCurrQV += offsetUV;
}
}
PixelC CVideoObject:: CInterpolatePixelValue(PixelC* F, Int pos, Int width,
Int rx, Int ry, Int wpc, Int bias, Int pow_denom)
{
PixelC* Fp;
Int rxc, ryc;
Int hstep, vstep;
Fp = F + pos;
rxc = wpc - rx;
ryc = wpc - ry;
hstep = rx ? 1 : 0;
vstep = ry ? width : 0;
return ((PixelC) (((ryc * (rxc * *Fp + rx * *(Fp+hstep))
+ ry * (rxc * *(Fp+vstep) + rx * *(Fp+vstep+hstep))) + bias)
>> pow_denom));
}
Int CVideoObject:: LinearExtrapolation(Int x0, Int x1, Int x0p, Int x1p, Int W, Int VW)
{
Int quot, res, ressum, extrapolated;
FourSlashes(x0p - (x0 << 4), W, ", &res);
extrapolated = quot * (W - VW);
FourSlashes(res * (W - VW), W, ", &res);
extrapolated += quot;
ressum = res;
FourSlashes(x1p - (x1 << 4), W, ", &res);
extrapolated += quot * VW + res;
FourSlashes(res * (VW - W), W, ", &res);
extrapolated += quot;
ressum += res;
FourSlashes(ressum, W, ", &res);
extrapolated += quot;
if(extrapolated >= 0) {
if(res >= (W+1) / 2)
extrapolated++;
}
else
if(res > W / 2)
extrapolated++;
return(extrapolated);
}
Void CVideoObject::FourSlashes(Int num, Int denom, Int *quot, Int *res)
{
*quot = num / denom;
if (*quot * denom == num)
*res = 0;
else
{
if (num < 0) /* denom is larger than zero */
*quot -= 1;
*res = num - denom * *quot;
}
}
Void CVideoObject::swapRefQ1toSpt ()
{
m_pvopcSptQ = m_pvopcRefQ1;
m_pvopcSptQ -> shift (m_rctSpt.left, m_rctSpt.top);
#ifdef _FOR_GSSP_
if(m_pvopcSptQ -> fAUsage () == EIGHT_BIT){
CU8Image* puciSptBY = (CU8Image *) m_pvopcSptQ -> getPlane (BY_PLANE);
puciSptBY -> shift (m_rctSpt.left, m_rctSpt.top);
}
#endif
m_pvopcRefQ1 = NULL;
}
Void CVideoObject::changeSizeofCurrQ (CRct rctOrg)
{
delete m_pvopcCurrQ;
rctOrg.expand (EXPANDY_REF_FRAME);
m_pvopcCurrQ = new CVOPU8YUVBA (m_pvopcSptQ -> fAUsage (), rctOrg);
}
Bool CVideoObject::SptPieceMB_NOT_HOLE(Int iMBXoffset, Int iMBYoffset, CMBMode* pmbmd)
// In a given Sprite object piece, Check whether current macroblock is not a hole and should be coded ?
{
if (m_tPiece < 0)
return TRUE;
else
{
CMBMode* pmbmdLeft = pmbmd - 1;
Int iMBX = iMBXoffset + m_iPieceXoffset;
Int iMBY = iMBYoffset + m_iPieceYoffset;
Int iMBX1 = iMBX -1;
// dshu: [v071] begin of modification
Int iMod = m_rctSpt.width % MB_SIZE;
Int iSptWidth = (iMod > 0) ? m_rctSpt.width + MB_SIZE - iMod : m_rctSpt.width;
Int iNumMBX = iSptWidth / MB_SIZE;
// dshu: [v071] end of modification
IntraPredDirection* Spreddir = m_rgmbmdSpt[iMBY][iMBX1].m_preddir;
IntraPredDirection* preddir = (*pmbmdLeft).m_preddir;
if (iMBXoffset >0 )
if( m_ppPieceMBstatus[iMBY][iMBX1] == NOT_DONE)
{
m_ppPieceMBstatus[iMBY][iMBX1] = PIECE_DONE;
m_rgmbmdSpt[iMBY][iMBX1] = CMBMode (*pmbmdLeft);
m_rgmbmdSprite[iMBX1 + iNumMBX * iMBY] = CMBMode (*pmbmdLeft); // dshu: [v071] added to store mbmd array for sprite
memcpy (Spreddir, preddir, 10 * sizeof (IntraPredDirection));
}
else {
*pmbmdLeft = CMBMode (m_rgmbmdSpt[iMBY][iMBX1]);
memcpy (preddir, Spreddir, 10 * sizeof (IntraPredDirection));
}
// dshu: begin of modification
if ( iMBX < (m_rctSptQ.width / MB_SIZE))
// dshu: end of modification
// if ( iMBX < (m_rctSptExp.width / MB_SIZE))
return ( m_ppPieceMBstatus[iMBY][iMBX] == NOT_DONE) ;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -