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

📄 vopses.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                }
        }
        if ((pmbmd->m_rgTranspStatus[3] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                pmbmd->m_bMerged[2] = checkMergedStatus (7, 8, 15, 8);
                if (pmbmd->m_bMerged[2]) {
                        pmbmd->m_rgTranspStatusBBM[4] = ALL;
                        overlayBlocks (7, 8, 15, 8, pmbmd->m_dctMd);
                }
        }
        if (pmbmd->m_bMerged[1] | pmbmd->m_bMerged[2]) goto MERGE;
        else {
                if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[3]) == PARTIAL) {
                        pmbmd->m_bMerged[3] = checkMergedStatus (7, 0, 7, 8);
                        if (pmbmd->m_bMerged[3]) {
                                pmbmd->m_rgTranspStatusBBM[3] = ALL;
                                overlayBlocks (7, 0, 7, 8, pmbmd->m_dctMd);
                        }
                }
                if ((pmbmd->m_rgTranspStatus[2] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                        pmbmd->m_bMerged[4] = checkMergedStatus (15, 8, 7, 8);
                        if (pmbmd->m_bMerged[4]) {
                                pmbmd->m_rgTranspStatusBBM[4] = ALL;
                                overlayBlocks (15, 8, 7, 8, pmbmd->m_dctMd);
                        }
                }
                if (pmbmd->m_bMerged[3] | pmbmd->m_bMerged[4]) goto MERGE;
                else {
                        if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                                pmbmd->m_bMerged[5] = checkMergedStatus (7, 8, 7, 8);
                                if (pmbmd->m_bMerged[5]) {
                                        pmbmd->m_rgTranspStatusBBM[4] = ALL;
                                        overlayBlocks (7, 8, 7, 8, pmbmd->m_dctMd);
                                }
                        }
                        if ((pmbmd->m_rgTranspStatus[2] & pmbmd->m_rgTranspStatus[3]) == PARTIAL) {
                                pmbmd->m_bMerged[6] = checkMergedStatus (15, 0, 7, 8);
                                if (pmbmd->m_bMerged[6]) {
                                        pmbmd->m_rgTranspStatusBBM[3] = ALL;
                                        overlayBlocks (15, 0, 7, 8, pmbmd->m_dctMd);
                                }
                        }
                }
        }
MERGE:
        for (UInt x=1; x<7; x++)
                pmbmd->m_bMerged[0] |= pmbmd->m_bMerged[x];
        if (pmbmd->m_bMerged[0])
                swapTransparentModes (pmbmd, BBM);
}

Void CVideoObject::isBoundaryMacroBlockMerged (CMBMode* pmbmd)
{
        if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[2]) == PARTIAL) {
                pmbmd->m_bMerged[1] = checkMergedStatus (7, 8, 7, 0);
                if (pmbmd->m_bMerged[1])
                        pmbmd->m_rgTranspStatusBBM[2] = ALL;
        }
        if ((pmbmd->m_rgTranspStatus[3] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                pmbmd->m_bMerged[2] = checkMergedStatus (7, 8, 15, 8);
                if (pmbmd->m_bMerged[2])
                        pmbmd->m_rgTranspStatusBBM[4] = ALL;
        }
        if (pmbmd->m_bMerged[1] | pmbmd->m_bMerged[2]) goto MERGE;
        else {
                if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[3]) == PARTIAL) {
                        pmbmd->m_bMerged[3] = checkMergedStatus (7, 0, 7, 8);
                        if (pmbmd->m_bMerged[3])
                                pmbmd->m_rgTranspStatusBBM[3] = ALL;
                }
                if ((pmbmd->m_rgTranspStatus[2] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                        pmbmd->m_bMerged[4] = checkMergedStatus (15, 8, 7, 8);
                        if (pmbmd->m_bMerged[4])
                                pmbmd->m_rgTranspStatusBBM[4] = ALL;
                }
                if (pmbmd->m_bMerged[3] | pmbmd->m_bMerged[4]) goto MERGE;
                else {
                        if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                                pmbmd->m_bMerged[5] = checkMergedStatus (7, 8, 7, 8);
                                if (pmbmd->m_bMerged[5])
                                        pmbmd->m_rgTranspStatusBBM[4] = ALL;
                        }
                        if ((pmbmd->m_rgTranspStatus[2] & pmbmd->m_rgTranspStatus[3]) == PARTIAL) {
                                pmbmd->m_bMerged[6] = checkMergedStatus (15, 0, 7, 8);
                                if (pmbmd->m_bMerged[6])
                                        pmbmd->m_rgTranspStatusBBM[3] = ALL;
                        }
                }
        }
MERGE:
        for (UInt x=1; x<7; x++)
                pmbmd->m_bMerged[0] |= pmbmd->m_bMerged[x];
        if (pmbmd->m_bMerged[0])
                swapTransparentModes (pmbmd, BBM);
}

Void CVideoObject::isBoundaryMacroBlockMerged (CMBMode* pmbmd, PixelC* ppxlcBY)
{
        if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[2]) == PARTIAL) {
                pmbmd->m_bMerged[1] = checkMergedStatus (7, 8, 7, 0, ppxlcBY);
                if (pmbmd->m_bMerged[1])
                        pmbmd->m_rgTranspStatusBBM[2] = ALL;
        }
        if ((pmbmd->m_rgTranspStatus[3] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                pmbmd->m_bMerged[2] = checkMergedStatus (7, 8, 15, 8, ppxlcBY);
                if (pmbmd->m_bMerged[2])
                        pmbmd->m_rgTranspStatusBBM[4] = ALL;
        }
        if (pmbmd->m_bMerged[1] | pmbmd->m_bMerged[2]) goto MERGE;
        else {
                if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[3]) == PARTIAL) {
                        pmbmd->m_bMerged[3] = checkMergedStatus (7, 0, 7, 8, ppxlcBY);
                        if (pmbmd->m_bMerged[3])
                                pmbmd->m_rgTranspStatusBBM[3] = ALL;
                }
                if ((pmbmd->m_rgTranspStatus[2] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                        pmbmd->m_bMerged[4] = checkMergedStatus (15, 8, 7, 8, ppxlcBY);
                        if (pmbmd->m_bMerged[4])
                                pmbmd->m_rgTranspStatusBBM[4] = ALL;
                }
                if (pmbmd->m_bMerged[3] | pmbmd->m_bMerged[4]) goto MERGE;
                else {
                        if ((pmbmd->m_rgTranspStatus[1] & pmbmd->m_rgTranspStatus[4]) == PARTIAL) {
                                pmbmd->m_bMerged[5] = checkMergedStatus (7, 8, 7, 8, ppxlcBY);
                                if (pmbmd->m_bMerged[5])
                                        pmbmd->m_rgTranspStatusBBM[4] = ALL;
                        }
                        if ((pmbmd->m_rgTranspStatus[2] & pmbmd->m_rgTranspStatus[3]) == PARTIAL) {
                                pmbmd->m_bMerged[6] = checkMergedStatus (15, 0, 7, 8, ppxlcBY);
                                if (pmbmd->m_bMerged[6])
                                        pmbmd->m_rgTranspStatusBBM[3] = ALL;
                        }
                }
        }
MERGE: 
        for (UInt x=1; x<7; x++)
                pmbmd->m_bMerged[0] |= pmbmd->m_bMerged[x];
        if (pmbmd->m_bMerged[0])
                swapTransparentModes (pmbmd, BBM);
}

Void CVideoObject::overlayBlocks (UInt x1, UInt x2, UInt y1, UInt y2, DCTMode dctMd)
{
        UInt    pos1 = y1*MB_SIZE+x1,
                pos2 = y2*MB_SIZE+x2;
        PixelC  *SB1 = m_ppxlcCurrMBBY+pos1,
                *SB2 = m_ppxlcCurrMBBY+pos2;
 
        if (dctMd == INTRA || dctMd == INTRAQ) {
                overlayBlocks (SB1, SB2, m_ppxlcCurrMBY+pos1, m_ppxlcCurrMBY+pos2);
                if (m_volmd.fAUsage == EIGHT_BIT)
                        overlayBlocks (SB1, SB2, m_ppxlcCurrMBA+pos1, m_ppxlcCurrMBA+pos2);
        }
        else {
                overlayBlocks (SB2, m_ppxliErrorMBY+pos1, m_ppxliErrorMBY+pos2);
                if (m_volmd.fAUsage == EIGHT_BIT)
                        overlayBlocks (SB2, m_ppxliErrorMBA+pos1, m_ppxliErrorMBA+pos2);
        }
}

Void CVideoObject::overlayBlocks (PixelC* SB1, PixelC* SB2, PixelC* ppxlcB1, PixelC* ppxlcB2)
{
        UInt    x, y;
        PixelC  *ppxlcS1, *ppxlcS2;
 
        for (y = 0, ppxlcS1 = SB1, ppxlcS2 = SB2; y < BLOCK_SIZE; y++) {
                for (x = 0; x < BLOCK_SIZE; x++, ppxlcS1--, ppxlcS2++, ppxlcB1--, ppxlcB2++)
                        if (*ppxlcS2)
                                *ppxlcB1 = *ppxlcB2;
                        else if (!*ppxlcS1) {
                                *ppxlcB1 += *ppxlcB2;
                                *ppxlcB1 >>= 1;
                        }
                ppxlcS1 -= BLOCK_SIZE;
                ppxlcS2 += BLOCK_SIZE;
                ppxlcB1 -= BLOCK_SIZE;
                ppxlcB2 += BLOCK_SIZE;
        }
}
 
Void CVideoObject::overlayBlocks (PixelC* SB2, PixelI* ppxlcB1, PixelI* ppxlcB2)
{
        UInt    x, y;
        PixelC  *ppxlcS2;
 
        for (y = 0, ppxlcS2 = SB2; y < BLOCK_SIZE; y++) {
                for (x = 0; x < BLOCK_SIZE; x++, ppxlcS2++, ppxlcB1--, ppxlcB2++)
                        if (*ppxlcS2)
                                *ppxlcB1 = *ppxlcB2;
                ppxlcS2 += BLOCK_SIZE;
                ppxlcB1 -= BLOCK_SIZE;
                ppxlcB2 += BLOCK_SIZE;
        }
}

Bool CVideoObject::checkMergedStatus (UInt x1, UInt x2, UInt y1, UInt y2)
{
        PixelC  *ppxlcS1 = m_ppxlcCurrMBBY + y1 * MB_SIZE + x1,
                *ppxlcS2 = m_ppxlcCurrMBBY + y2 * MB_SIZE + x2;
 
        for (UInt y = 0; y < BLOCK_SIZE; y++) {
                for (UInt x = 0; x < BLOCK_SIZE; x++, ppxlcS1--, ppxlcS2++)
                        if (*ppxlcS1 && *ppxlcS2)
                                return FALSE;
                ppxlcS1 -= BLOCK_SIZE;
                ppxlcS2 += BLOCK_SIZE;
        }
        return TRUE;
}
 
Bool CVideoObject::checkMergedStatus (UInt x1, UInt x2, UInt y1, UInt y2, PixelC* ppxlcBY)
{
        PixelC  *ppxlcS1 = ppxlcBY + y1 * MB_SIZE + x1,
                *ppxlcS2 = ppxlcBY + y2 * MB_SIZE + x2;
 
        for (UInt y = 0; y < BLOCK_SIZE; y++) {
                for (UInt x = 0; x < BLOCK_SIZE; x++, ppxlcS1--, ppxlcS2++)
                        if (*ppxlcS1 && *ppxlcS2)
                                return FALSE;
                ppxlcS1 -= BLOCK_SIZE;
                ppxlcS2 += BLOCK_SIZE;
        }
        return TRUE;
}

Void CVideoObject::mergedMacroBlockSplit (CMBMode* pmbmd, PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBA)
{
        Bool    isIntra = (pmbmd->m_dctMd==INTRA || pmbmd->m_dctMd==INTRAQ) ? TRUE : FALSE;
 
        swapTransparentModes (pmbmd, BBS);
        if (pmbmd->m_bMerged[1])
                if (isIntra)
                        splitTwoMergedBlocks (7, 8, 7, 0, ppxlcRefMBY, ppxlcRefMBA);
                else    splitTwoMergedBlocks (7, 8, 7, 0, m_ppxliErrorMBY, m_ppxliErrorMBA);
        if (pmbmd->m_bMerged[2])
                if (isIntra)
                        splitTwoMergedBlocks (7, 8, 15, 8, ppxlcRefMBY, ppxlcRefMBA);
                else    splitTwoMergedBlocks (7, 8, 15, 8, m_ppxliErrorMBY, m_ppxliErrorMBA);
        if (pmbmd->m_bMerged[1] || pmbmd->m_bMerged[2]) goto SPLIT;
        else {
                if (pmbmd->m_bMerged[3])
                        if (isIntra)
                                splitTwoMergedBlocks (7, 0, 7, 8, ppxlcRefMBY, ppxlcRefMBA);
                        else    splitTwoMergedBlocks (7, 0, 7, 8, m_ppxliErrorMBY, m_ppxliErrorMBA);
                if (pmbmd->m_bMerged[4])
                        if (isIntra)
                                splitTwoMergedBlocks (15, 8, 7, 8, ppxlcRefMBY, ppxlcRefMBA);
                        else    splitTwoMergedBlocks (15, 8, 7, 8, m_ppxliErrorMBY, m_ppxliErrorMBA);
                if (pmbmd->m_bMerged[3] || pmbmd->m_bMerged[4]) goto SPLIT;
                else {
                        if (pmbmd->m_bMerged[5])
                                if (isIntra)
                                        splitTwoMergedBlocks (7, 8, 7, 8, ppxlcRefMBY, ppxlcRefMBA);
                                else    splitTwoMergedBlocks (7, 8, 7, 8, m_ppxliErrorMBY, m_ppxliErrorMBA);
                        if (pmbmd->m_bMerged[6])
                                if (isIntra)
                                        splitTwoMergedBlocks(15, 0, 7, 8, ppxlcRefMBY, ppxlcRefMBA);
                                else    splitTwoMergedBlocks (15, 0, 7, 8, m_ppxliErrorMBY, m_ppxliErrorMBA);
                }
        }
SPLIT:
        return;
}

Void CVideoObject::splitTwoMergedBlocks (UInt x1, UInt x2, UInt y1, UInt y2, PixelC* ppxlcIn1, PixelC* ppxlcIn2)
{
        UInt    SKIP = m_iFrameWidthY - BLOCK_SIZE,
                pos1 = y1 * m_iFrameWidthY + x1,
                pos2 = y2 * m_iFrameWidthY + x2,
                pos3 = y2 * MB_SIZE + x2;
        PixelC  *ppxlcS2, *ppxlcB1, *ppxlcB2;
 
        ppxlcB1 = ppxlcIn1 + pos1;
        ppxlcB2 = ppxlcIn1 + pos2;
        ppxlcS2 = m_ppxlcCurrMBBY + pos3;
        for (UInt y = 0; y < BLOCK_SIZE; y++) {
                for (UInt x = 0; x < BLOCK_SIZE; x++, ppxlcS2++, ppxlcB1--, ppxlcB2++)
                        if (*ppxlcS2)
                                *ppxlcB2 = *ppxlcB1;
                ppxlcS2 += BLOCK_SIZE;
                ppxlcB1 -= SKIP;
                ppxlcB2 += SKIP;
        }
        if (m_volmd.fAUsage == EIGHT_BIT) {
                ppxlcB1 = ppxlcIn2 + pos1;
                ppxlcB2 = ppxlcIn2 + pos2;
                ppxlcS2 = m_ppxlcCurrMBBY + pos3;
                for (UInt y = 0; y < BLOCK_SIZE; y++) {
                        for (UInt x = 0; x < BLOCK_SIZE; x++, ppxlcS2++, ppxlcB1--, ppxlcB2++)
                                if (*ppxlcS2)
                                        *ppxlcB2 = *ppxlcB1;
                        ppxlcS2 += BLOCK_SIZE;
                        ppxlcB1 -= SKIP;
                        ppxlcB2 += SKIP;
                }
        }
}

Void CVideoObject::splitTwoMergedBlocks (UInt x1, UInt x2, UInt y1, UInt y2, PixelI* ppxlcIn1, PixelI* ppxlcIn2)
{
        UInt    pos1 = y1 * MB_SIZE + x1,
                pos2 = y2 * MB_SIZE + x2;
        PixelC  *ppxlcS2;
        PixelI  *ppxlcB1, *ppxlcB2;
 
        ppxlcB1 = ppxlcIn1 + pos1;
        ppxlcB2 = ppxlcIn1 + pos2;
        ppxlcS2 = m_ppxlcCurrMBBY + pos2;
        for (UInt y = 0; y < BLOCK_SIZE; y++) {
                for (UInt x = 0; x < BLOCK_SIZE; x++, ppxlcS2++, ppxlcB1--, ppxlcB2++)
                        if (*ppxlcS2)
                                *ppxlcB2 = *ppxlcB1;
                ppxlcS2 += BLOCK_SIZE;
                ppxlcB1 -= BLOCK_SIZE;
                ppxlcB2 += BLOCK_SIZE;
        }
        if (m_volmd.fAUsage == EIGHT_BIT) {
                ppxlcB1 = ppxlcIn2 + pos1;
                ppxlcB2 = ppxlcIn2 + pos2;
                ppxlcS2 = m_ppxlcCurrMBBY + pos2;
                for (UInt y = 0; y < BLOCK_SIZE; y++) {
                        for (UInt x = 0; x < BLOCK_SIZE; x++, ppxlcS2++, ppxlcB1--, ppxlcB2++)
                                if (*ppxlcS2)
                                        *ppxlcB2 = *ppxlcB1;
                        ppxlcS2 += BLOCK_SIZE;
                        ppxlcB1 -= BLOCK_SIZE;
                        ppxlcB2 += BLOCK_SIZE;
                }
        }
}
 
Void CVideoObject::swapTransparentModes (CMBMode* pmbmd, Bool mode) {
        TransparentStatus rgTranspStatusTmp[5];
        memcpy (rgTranspStatusTmp, pmbmd->m_rgTranspStatusBBM, 5*sizeof(TransparentStatus));
        memcpy (pmbmd->m_rgTranspStatusBBM, pmbmd->m_rgTranspStatus, 5*sizeof(TransparentStatus));
        memcpy (pmbmd->m_rgTranspStatus, rgTranspStatusTmp, 5*sizeof(TransparentStatus));
}
 
Void CVideoObject::setMergedTransparentModes (CMBMode* pmbmd) {
        memcpy (pmbmd->m_rgTranspStatusBBM, pmbmd->m_rgTranspStatus, 11*sizeof(TransparentStatus));
}
 
Void CVideoObject::initMergedMode (CMBMode* pmbmd) {
        setMergedTransparentModes (pmbmd);
        memset (pmbmd->m_bMerged, FALSE, 7*sizeof (Bool));
}

// End of Hyundai(1998-5-9)*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -