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

📄 mcpad.cpp

📁 jpeg and mpeg 编解码技术源代码
💻 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 + -