📄 mcpad.cpp
字号:
PixelC* ppxlcCurrBY = (PixelC*) pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY;
PixelC* ppxlcCurrBUV = (PixelC*) pvopcCurrQ->pixelsBUV () + m_iStartInRefToCurrRctUV;
// 12.22.98 begin of changes
PixelC* ppxlcCurrA = NULL;
if (m_volmd.fAUsage == EIGHT_BIT) {
ppxlcCurrA = (PixelC*) pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY;
}
// 12.22.98 end of changes
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
PixelC* ppxlcCurrMBY = ppxlcCurrY;
PixelC* ppxlcCurrMBU = ppxlcCurrU;
PixelC* ppxlcCurrMBV = ppxlcCurrV;
PixelC* ppxlcCurrMBBY = ppxlcCurrBY;
PixelC* ppxlcCurrMBBUV = ppxlcCurrBUV;
PixelC* ppxlcCurrMBA = NULL;
// 12.22.98 begin of changes
if (m_volmd.fAUsage == EIGHT_BIT)
ppxlcCurrMBA = ppxlcCurrA;
// 12.22.98 end of changes
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {
memset(pmbmd->m_rgbFieldPadded, 0, 5*sizeof(Bool));
fieldBasedDownSampleBY (ppxlcCurrMBBY, ppxlcCurrMBBUV);
decideFieldTransparencyStatus (pmbmd, ppxlcCurrMBBY, ppxlcCurrMBBUV);
mcPadCurrAndNeighborsMBFields (iMBX, iMBY, pmbmd, ppxlcCurrMBY, ppxlcCurrMBU, ppxlcCurrMBV, ppxlcCurrMBBY, ppxlcCurrMBBUV,ppxlcCurrMBA);
ppxlcCurrMBY += MB_SIZE;
ppxlcCurrMBU += BLOCK_SIZE;
ppxlcCurrMBV += BLOCK_SIZE;
ppxlcCurrMBBY += MB_SIZE;
ppxlcCurrMBBUV += BLOCK_SIZE;
// 12.22.98 begin of changes
if (m_volmd.fAUsage == EIGHT_BIT)
ppxlcCurrMBA += MB_SIZE;
// 12.22.98 end of changes
pmbmd++;
}
ppxlcCurrY += m_iFrameWidthYxMBSize;
ppxlcCurrU += m_iFrameWidthUVxBlkSize;
ppxlcCurrV += m_iFrameWidthUVxBlkSize;
ppxlcCurrBY += m_iFrameWidthYxMBSize;
ppxlcCurrBUV += m_iFrameWidthUVxBlkSize;
// 12.22.98 begin of changes
if (m_volmd.fAUsage == EIGHT_BIT)
ppxlcCurrA += m_iFrameWidthYxMBSize;
// 12.22.98 end of changes
}
}
Void CVideoObject::mcPadCurrAndNeighborsMBFields (
Int iMBX,
Int iMBY,
CMBMode *pmbmd,
PixelC* ppxlcRefMBY,
PixelC* ppxlcRefMBU,
PixelC* ppxlcRefMBV,
PixelC* ppxlcRefMBBY,
PixelC* ppxlcRefMBBUV,
PixelC* ppxlcRefMBA
)
{
// 2.9.99 begin of changes. X. Chen,
if (m_volmd.fAUsage == EIGHT_BIT)
mcPadFieldsCurr (iMBX, iMBY, pmbmd, MB_FIELDY, ppxlcRefMBY, ppxlcRefMBA, ppxlcRefMBBY, MB_SIZE, m_iFrameWidthY);
else
// 2.9.99 end of changes
mcPadFieldsCurr (iMBX, iMBY, pmbmd, MB_FIELDY, ppxlcRefMBY, NULL, ppxlcRefMBBY, MB_SIZE, m_iFrameWidthY);
mcPadFieldsCurr (iMBX, iMBY, pmbmd, MB_FIELDC, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBBUV, BLOCK_SIZE, m_iFrameWidthUV);
}
Void CVideoObject::mcPadFieldsCurr (
Int iMBX,
Int iMBY,
CMBMode *pmbmd,
Int mode,
PixelC *ppxlcCurrMB1,
PixelC *ppxlcCurrMB2,
PixelC *ppxlcCurrMBB,
Int uiBlkXSize,
Int uiStride
)
{
PixelC *ppxlcCurrTopField1 = ppxlcCurrMB1,
*ppxlcCurrBotField1 = ppxlcCurrMB1 + uiStride,
*ppxlcCurrTopField2 = ((ppxlcCurrMB2) ? ppxlcCurrMB2 : NULL),
*ppxlcCurrBotField2 = ((ppxlcCurrMB2) ? ppxlcCurrMB2 + uiStride : NULL),
*ppxlcCurrTopFieldB = ppxlcCurrMBB,
*ppxlcCurrBotFieldB = ppxlcCurrMBB + uiStride;
if (pmbmd->m_rgFieldTranspStatus [mode] != ALL) { // Top Field MC Padding
if (pmbmd->m_rgFieldTranspStatus [mode] == PARTIAL) {
mcPadOneField (ppxlcCurrTopField1, ppxlcCurrTopFieldB, uiBlkXSize, uiStride);
if (ppxlcCurrTopField2)
mcPadOneField (ppxlcCurrTopField2, ppxlcCurrTopFieldB, uiBlkXSize, uiStride);
}
padNeighborTranspMBFields (iMBX, iMBY, pmbmd, mode, ppxlcCurrTopField1, ppxlcCurrTopField2, uiBlkXSize, uiStride);
} else padCurrAndTopTranspMBFieldsFromNeighbor (iMBX, iMBY, pmbmd, mode, ppxlcCurrTopField1, ppxlcCurrTopField2, uiBlkXSize, uiStride);
if (pmbmd->m_rgFieldTranspStatus [mode+1] != ALL) { // Bottom Field MC Padding
if (pmbmd->m_rgFieldTranspStatus [mode+1] == PARTIAL) {
mcPadOneField (ppxlcCurrBotField1, ppxlcCurrBotFieldB, uiBlkXSize, uiStride);
if (ppxlcCurrBotField2)
mcPadOneField (ppxlcCurrBotField2, ppxlcCurrBotFieldB, uiBlkXSize, uiStride);
}
padNeighborTranspMBFields (iMBX, iMBY, pmbmd, mode+1, ppxlcCurrBotField1, ppxlcCurrBotField2, uiBlkXSize, uiStride);
} else padCurrAndTopTranspMBFieldsFromNeighbor (iMBX, iMBY, pmbmd, mode+1, ppxlcCurrBotField1, ppxlcCurrBotField2, uiBlkXSize, uiStride);
}
Void CVideoObject::mcPadOneField (
PixelC *ppxlcTextureBase,
const PixelC *ppxlcAlphaBase,
Int uiBlkXSize,
Int uiStride
)
{
Int iUnit = sizeof(PixelC);
Int uiBlkYSize = uiBlkXSize/2;
Int iFieldSkip = 2*uiStride;
CoordI iX,iY,iJ,iLeftX = 0;
Bool bEmptyRow = FALSE;
Bool bInVop;
Int iLeftColour;
PixelC *ppxlcTexture = ppxlcTextureBase;
for (iY=0;iY<(CoordI)uiBlkYSize;iY++, ppxlcTexture+=iFieldSkip) {
bInVop = TRUE;
iLeftColour = invalidColour;
m_pbEmptyRowArray[iY]=0;
const PixelC *ppxlcAlpha = ppxlcAlphaBase;
for(iX=0;iX<(CoordI)uiBlkXSize;iX++,ppxlcAlpha++) {
if(bInVop==TRUE && *ppxlcAlpha==transpValue) {
bInVop=FALSE;
iLeftX=iX;
if(iX>0)
iLeftColour=ppxlcTexture[iLeftX-1];
}
else if(bInVop==FALSE && *ppxlcAlpha!=transpValue) {
bInVop=TRUE;
if(iLeftColour==invalidColour)
iLeftColour=ppxlcTexture[iX];
else iLeftColour=(iLeftColour+ppxlcTexture[iX]+1)>>1;
for(iJ=iLeftX;iJ<iX;iJ++)
ppxlcTexture[iJ]=(PixelC)iLeftColour;
}
}
ppxlcAlphaBase += iFieldSkip;
if(bInVop==FALSE) {
if(iLeftX==0) {
m_pbEmptyRowArray[iY]=TRUE;
bEmptyRow=TRUE;
}
else {
for(iJ=iLeftX;iJ<iX;iJ++)
ppxlcTexture[iJ]=(PixelC)iLeftColour;
}
}
}
if(bEmptyRow) {
ppxlcTexture=ppxlcTextureBase;
PixelC *ppxlcUpperRow = NULL;
for(iY=0;iY<(CoordI)uiBlkYSize;iY++,ppxlcTexture+=iFieldSkip)
if(!m_pbEmptyRowArray[iY])
ppxlcUpperRow = ppxlcTexture;
else {
PixelC *ppxlcLowerRow = ppxlcTexture+iFieldSkip;
CoordI iYY;
for(iYY=iY+1;iYY<(CoordI)uiBlkYSize;iYY++,ppxlcLowerRow+=iFieldSkip)
if(!m_pbEmptyRowArray[iYY])
break;
if(iYY<(CoordI)uiBlkYSize) {
if(ppxlcUpperRow==NULL) {
for(;ppxlcTexture<ppxlcLowerRow;ppxlcTexture+=iFieldSkip)
memcpy(ppxlcTexture,ppxlcLowerRow,uiBlkXSize*iUnit);
}
else {
for(;ppxlcTexture<ppxlcLowerRow;ppxlcTexture+=iFieldSkip)
for(iX=0;iX<(CoordI)uiBlkXSize;iX++)
ppxlcTexture[iX]= (ppxlcUpperRow[iX]+ppxlcLowerRow[iX]+1)>>1;
}
}
else {
assert(ppxlcUpperRow!=NULL);
for(iYY=iY;iYY<(CoordI)uiBlkYSize;iYY++,ppxlcTexture+=iFieldSkip)
memcpy(ppxlcTexture,ppxlcUpperRow,uiBlkXSize*iUnit);
}
iY=iYY-1;
ppxlcTexture -= iFieldSkip;
}
}
}
Void CVideoObject::padNeighborTranspMBFields (
CoordI xb,
CoordI yb,
CMBMode *pmbmd,
Int mode,
PixelC *ppxlcMBField1,
PixelC *ppxlcMBField2,
Int uiBlkXSize,
Int uiStride
)
{
CMBMode* pmbmdLeft = pmbmd - 1;
CMBMode* pmbmdAbov = pmbmd - m_iNumMBX;
if (xb > 0) {
if (pmbmdLeft->m_rgFieldTranspStatus [mode] == ALL)
if (!(pmbmdLeft->m_rgbFieldPadded [mode])) {
mcPadLeftMBFields (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
pmbmdLeft->m_rgbFieldPadded[mode] = TRUE;
}
}
if (yb > 0) {
if (pmbmdAbov->m_rgFieldTranspStatus [mode] == ALL)
if (!(pmbmdAbov->m_rgbFieldPadded [mode])) {
mcPadTopMBFields (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
pmbmdAbov->m_rgbFieldPadded[mode] = TRUE;
}
}
}
Void CVideoObject::padCurrAndTopTranspMBFieldsFromNeighbor (
CoordI xb,
CoordI yb,
CMBMode *pmbmd,
Int mode,
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int uiBlkXSize,
Int uiStride
)
{
CMBMode* pmbmdLeft = pmbmd - 1;
CMBMode* pmbmdAbov = pmbmd - m_iNumMBX;
if (xb > 0) {
if (pmbmdLeft->m_rgFieldTranspStatus [mode] != ALL) {
mcPadCurrMBFieldsFromLeft (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
pmbmd->m_rgbFieldPadded [mode] = TRUE;
}
}
if (yb > 0) {
if (pmbmdAbov->m_rgFieldTranspStatus [mode] != ALL) {
if (!(pmbmd->m_rgbFieldPadded [mode])) {
mcPadCurrMBFieldsFromTop (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
pmbmd->m_rgbFieldPadded [mode] = TRUE;
}
} else {
if (!(pmbmdAbov->m_rgbFieldPadded [mode]))
mcSetTopMBFieldsGray (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
}
}
if(yb == m_iNumMBY-1) {
if(xb > 0 && pmbmdLeft->m_rgFieldTranspStatus [mode] == ALL && !(pmbmdLeft->m_rgbFieldPadded [mode]))
mcSetLeftMBFieldsGray (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
if(xb == m_iNumMBX-1 && !(pmbmd->m_rgbFieldPadded [mode]))
mcSetCurrMBFieldsGray (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
}
}
Void CVideoObject::mcPadLeftMBFields (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int uiBlkXSize,
Int uiStride
)
{
UInt iy, uiBlkYSize = uiBlkXSize/2;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField1 - uiBlkXSize, *ppxlcMBField1, uiBlkXSize);
ppxlcMBField1 += 2*uiStride;
}
if (!ppxlcMBField2) return;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField2 - uiBlkXSize, *ppxlcMBField2, uiBlkXSize);
ppxlcMBField2 += 2*uiStride;
}
}
Void CVideoObject::mcPadTopMBFields (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int iBlkXSize,
Int iStride
)
{
Int ix, iy, iBlkYSize = iBlkXSize/2;
for (ix = 0; ix < iBlkXSize; ix++) {
PixelC* ppxlcYCol = ppxlcMBField1;
for (iy = 0; iy < iBlkYSize; iy++) {
ppxlcYCol -= 2*iStride;
*ppxlcYCol = *ppxlcMBField1;
}
ppxlcMBField1++;
}
if (!ppxlcMBField2) return;
for (ix = 0; ix < iBlkXSize; ix++) {
PixelC* ppxlcACol = ppxlcMBField2;
for (iy = 0; iy < iBlkYSize; iy++) {
ppxlcACol -= 2*iStride;
*ppxlcACol = *ppxlcMBField2;
}
ppxlcMBField2++;
}
}
Void CVideoObject::mcPadCurrMBFieldsFromLeft (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int uiBlkXSize,
Int uiStride)
{
UInt iy, uiBlkYSize = uiBlkXSize/2;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField1, *(ppxlcMBField1 - 1), uiBlkXSize);
ppxlcMBField1 += 2*uiStride;
}
if (!ppxlcMBField2) return;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField2, *(ppxlcMBField2 - 1), uiBlkXSize);
ppxlcMBField2 += 2*uiStride;
}
}
Void CVideoObject::mcPadCurrMBFieldsFromTop (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int iBlkXSize,
Int iStride)
{
Int ix, iy, iBlkYSize = iBlkXSize/2;
PixelC *ppxlcSrcMBField = ppxlcMBField1-2*iStride;
for (ix = 0; ix < iBlkXSize; ix++) {
PixelC* ppxlcDstMBField = ppxlcSrcMBField;
for (iy = 0; iy < iBlkYSize; iy++) {
ppxlcDstMBField += 2*iStride;
*ppxlcDstMBField = *ppxlcSrcMBField;
}
ppxlcSrcMBField++;
}
if(!ppxlcMBField2) return;
ppxlcSrcMBField = ppxlcMBField2-2*iStride;
for (ix = 0; ix < iBlkXSize; ix++) {
PixelC* ppxlcDstMBField = ppxlcSrcMBField;
for (iy = 0; iy < iBlkYSize; iy++) {
ppxlcDstMBField += 2*iStride;
*ppxlcDstMBField = *ppxlcSrcMBField;
}
ppxlcSrcMBField++;
}
}
Void CVideoObject::mcSetTopMBFieldsGray (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int uiBlkXSize,
Int uiStride
)
{
UInt iy, uiBlkYSize = uiBlkXSize/2;
PixelC pxlcGrayVal = 128;
if(m_volmd.bNot8Bit)
pxlcGrayVal = 1<<(m_volmd.nBits-1);
ppxlcMBField1 -= 2*uiStride;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField1, pxlcGrayVal, uiBlkXSize);
ppxlcMBField1 -= 2*uiStride;
}
if (!ppxlcMBField2) return;
ppxlcMBField2 -= 2*uiStride;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField2, pxlcGrayVal, uiBlkXSize);
ppxlcMBField2 -= 2*uiStride;
}
}
Void CVideoObject::mcSetLeftMBFieldsGray (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int uiBlkXSize,
Int uiStride)
{
UInt iy, uiBlkYSize = uiBlkXSize/2;
PixelC pxlcGrayVal = 128;
if(m_volmd.bNot8Bit)
pxlcGrayVal = 1<<(m_volmd.nBits-1);
ppxlcMBField1 = ppxlcMBField1-uiBlkXSize;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField1, pxlcGrayVal, uiBlkXSize);
ppxlcMBField1 += 2*uiStride;
}
if (!ppxlcMBField2) return;
ppxlcMBField2 = ppxlcMBField2-uiBlkXSize;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField2, pxlcGrayVal, uiBlkXSize);
ppxlcMBField2 += 2*uiStride;
}
}
Void CVideoObject::mcSetCurrMBFieldsGray (
PixelC* ppxlcMBField1,
PixelC* ppxlcMBField2,
Int uiBlkXSize,
Int uiStride)
{
UInt iy, uiBlkYSize = uiBlkXSize/2;
PixelC pxlcGrayVal = 128;
if(m_volmd.bNot8Bit)
pxlcGrayVal = 1<<(m_volmd.nBits-1);
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField1, pxlcGrayVal, uiBlkXSize);
ppxlcMBField1 += 2*uiStride;
}
if (!ppxlcMBField2) return;
for (iy = 0; iy < uiBlkYSize; iy++) {
pxlcmemset (ppxlcMBField2, pxlcGrayVal, uiBlkXSize);
ppxlcMBField2 += 2*uiStride;
}
}
// End of HYUNDAI(1998-5-9)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -