📄 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 + -