📄 vopses.cpp
字号:
} } 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 + -