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