⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcpad.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -