📄 vopmbdec.cpp
字号:
(m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0)))
{
copyFromRefToCurrQ (
m_pvopcRefQ0,
x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL
);
pmbmd->m_bSkip = TRUE;
memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
pmbmd->m_mbType = FORWARD; // can be set to FORWARD mode since the result is the same
}
else {
if (checkResyncMarker()) {
decodeVideoPacketHeader(iCurrentQP);
iVideoPacketNumber++;
m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0;
m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0;
m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
}
pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; //mv out of if by wchen to set even when errR is off; always used in mbdec
// End Toshiba(1998-1-16:B-VOP+Error)
decodeMBTextureHeadOfBVOP (pmbmd, iCurrentQP);
decodeMVofBVOP (pmv, pmvBackward, pmbmd, iMBX, iMBY, pmvRef, pmbmdRef);
if (!pmbmd->m_bSkip) {
decodeTextureInterMB (pmbmd);
// INTERLACE
if (m_vopmd.bInterlace == TRUE && pmbmd->m_bFieldDCT == TRUE)
fieldDCTtoFrameI(m_ppxliErrorMBY);
// ~INTERLACE
motionCompAndAddErrorMB_BVOP (
pmv, pmvBackward,
pmbmd,
iMBX, iMBY,
x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
&m_rctRefVOPY0,&m_rctRefVOPY1);
}
else {
if (m_vopmd.bInterlace) { // Need to remove this 'if' (Bob Eifrig)
assert(pmbmd->m_mbType == DIRECT);
pmbmd->m_vctDirectDeltaMV.x = 0;
pmbmd->m_vctDirectDeltaMV.y = 0;
memset (m_ppxliErrorMBY, 0, MB_SQUARE_SIZE * sizeof(Int));
memset (m_ppxliErrorMBU, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
memset (m_ppxliErrorMBV, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
motionCompAndAddErrorMB_BVOP (
pmv, pmvBackward,
pmbmd,
iMBX, iMBY,
x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
&m_rctRefVOPY0, &m_rctRefVOPY1);
} else {
motionCompSkipMB_BVOP (pmbmd, pmv, pmvBackward,
x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0, &m_rctRefVOPY1);
}
}
}
if(m_bCodedFutureRef!=FALSE)
{
pmbmdRef++;
pmvRef += PVOP_MV_PER_REF_PER_MB;
}
pmbmd++;
pmv += BVOP_MV_PER_REF_PER_MB;
pmvBackward += BVOP_MV_PER_REF_PER_MB;
ppxlcCurrQMBY += MB_SIZE;
ppxlcCurrQMBU += BLOCK_SIZE;
ppxlcCurrQMBV += BLOCK_SIZE;
}
ppxlcCurrQY += m_iFrameWidthYxMBSize;
ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
}
}
Void CVideoObjectDecoder::decodeBVOP_WithShape ()
{
Int iMBX, iMBY;
CoordI y = m_rctCurrVOPY.top;
CMBMode* pmbmd = m_rgmbmd;
// Added for field based MC padding by Hyundai(1998-5-9)
CMBMode* field_pmbmd = m_rgmbmd;
// End of Hyundai(1998-5-9)
CMotionVector* pmv = m_rgmv;
CMotionVector* pmvBackward = m_rgmvBackward;
CMotionVector* pmvBY = m_rgmvBY;
const CMotionVector* pmvRef;
const CMBMode* pmbmdRef;
PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;
PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;
PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;
PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY;
PixelC* ppxlcCurrQA = (PixelC*) m_pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY;
// decide prediction direction for shape
if(m_bCodedFutureRef==FALSE)
m_vopmd.fShapeBPredDir = B_FORWARD;
else
{
if(m_tFutureRef - m_t >= m_t - m_tPastRef)
m_vopmd.fShapeBPredDir = B_FORWARD;
else
m_vopmd.fShapeBPredDir = B_BACKWARD;
}
Int iCurrentQP = m_vopmd.intStepB;
Int iCurrentQPA = m_vopmd.intStepBAlpha;
// Added for error resilient mode by Toshiba(1998-1-16:B-VOP+Error)
Int iVideoPacketNumber = 0;
m_iVPMBnum = 0;
// End Toshiba(1998-1-16:B-VOP+Error)
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
PixelC* ppxlcCurrQMBY = ppxlcCurrQY;
PixelC* ppxlcCurrQMBU = ppxlcCurrQU;
PixelC* ppxlcCurrQMBV = ppxlcCurrQV;
PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;
PixelC* ppxlcCurrQMBA = ppxlcCurrQA;
CoordI x = m_rctCurrVOPY.left;
m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0;
m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0;
m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {
// Added for error resilient mode by Toshiba(1998-1-16:B-VOP+Error)
if (checkResyncMarker()) {
decodeVideoPacketHeader(iCurrentQP);
iVideoPacketNumber++;
m_vctForwardMvPredBVOP[0].x = m_vctForwardMvPredBVOP[0].y = 0;
m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
m_vctForwardMvPredBVOP[1].x = m_vctForwardMvPredBVOP[1].y = 0;
m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
}
pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; //mv out of if by wchen to set even when errR is off; always used in mbdec
// End Toshiba(1998-1-16:B-VOP+Error)
pmbmd->m_bPadded=FALSE;
findColocatedMB (iMBX, iMBY, pmbmdRef, pmvRef);
pmbmd->m_bColocatedMBSkip = (pmbmdRef!=NULL && pmbmdRef->m_bSkip);
if(m_vopmd.bShapeCodingType)
{
ShapeMode shpmdColocatedMB;
if(m_vopmd.fShapeBPredDir==B_FORWARD)
shpmdColocatedMB = m_rgshpmd [MIN (MAX (0, iMBX), m_iRefShpNumMBX - 1)
+ MIN (MAX (0, iMBY), m_iRefShpNumMBY - 1) * m_iRefShpNumMBX];
else
shpmdColocatedMB = m_rgmbmdRef [MIN (MAX (0, iMBX), m_iNumMBXRef - 1)
+ MIN (MAX (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
decodeInterShape (
m_vopmd.fShapeBPredDir==B_FORWARD ? m_pvopcRefQ0 : m_pvopcRefQ1,
pmbmd, iMBX, iMBY, x, y,
NULL, pmvBY, m_ppxlcCurrMBBY, ppxlcCurrQMBBY, shpmdColocatedMB);
} else {
decodeIntraShape (pmbmd, iMBX, iMBY, m_ppxlcCurrMBBY, ppxlcCurrQMBBY);
}
if(m_volmd.bShapeOnly==FALSE)
{
downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace) initMergedMode (pmbmd);
// End of Hyundai(1998-5-9)*/
if (pmbmd->m_bColocatedMBSkip &&
(m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0))) {
// don't need to send any bit for this mode except enhn_layer
copyFromRefToCurrQ (
m_pvopcRefQ0,
x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
&m_rctRefVOPY0
);
if(m_volmd.fAUsage == EIGHT_BIT)
copyAlphaFromRefToCurrQ(m_pvopcRefQ0, x, y, ppxlcCurrQMBA, &m_rctRefVOPY0);
pmbmd->m_bSkip = TRUE;
memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
pmbmd->m_mbType = FORWARD; // can be set to FORWARD mode since the result is the same
}
else {
if (pmbmd->m_rgTranspStatus [0] != ALL) {
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus [0] == PARTIAL)
isBoundaryMacroBlockMerged (pmbmd);
// End of Hyundai(1998-5-9)*/
decodeMBTextureHeadOfBVOP (pmbmd, iCurrentQP);
decodeMVofBVOP (pmv, pmvBackward, pmbmd, iMBX, iMBY, pmvRef, pmbmdRef);
if (!pmbmd->m_bSkip) {
decodeTextureInterMB (pmbmd);
// INTERLACE
//new changes
if ((pmbmd->m_rgTranspStatus [0] == NONE) &&
(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
fieldDCTtoFrameI(m_ppxliErrorMBY);
//end of new changes
// ~INTERLACE
//motionCompAndAddErrorMB_BVOP ( // delete by Hyundai, ok swinder
// pmv, pmvBackward,
// pmbmd,
// iMBX, iMBY,
// x, y,
// ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
// &m_rctRefVOPY0, &m_rctRefVOPY1
//);
}
else {
// new changes 10/20/98
if (m_vopmd.bInterlace) {
assert(pmbmd->m_mbType == DIRECT);
pmbmd->m_vctDirectDeltaMV.x = 0;
pmbmd->m_vctDirectDeltaMV.y = 0;
memset (m_ppxliErrorMBY, 0, MB_SQUARE_SIZE * sizeof(Int));
memset (m_ppxliErrorMBU, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
memset (m_ppxliErrorMBV, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
motionCompAndAddErrorMB_BVOP (
pmv, pmvBackward,
pmbmd,
iMBX, iMBY,
x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
&m_rctRefVOPY0, &m_rctRefVOPY1);
} else
// end of new changes 10/20/98
{
//assert(pmbmdRef!=NULL);
motionCompSkipMB_BVOP (pmbmd, pmv, pmvBackward, x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0, &m_rctRefVOPY1);
}
}
if(m_volmd.fAUsage == EIGHT_BIT)
{
decodeMBAlphaHeadOfBVOP(pmbmd, iCurrentQP, iCurrentQPA);
decodeAlphaInterMB(pmbmd, ppxlcCurrQMBA);
/* delete by Hyundai, ok swinder
if (pmbmd->m_CODAlpha!=ALPHA_ALL255)
{
motionCompAlphaMB_BVOP(
pmv, pmvBackward,
pmbmd,
iMBX, iMBY,
x, y,
ppxlcCurrQMBA,
&m_rctRefVOPY0, &m_rctRefVOPY1
);
if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)
assignAlphaPredToCurrQ (ppxlcCurrQMBA);
else
addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);
}
*/
}
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
mergedMacroBlockSplit (pmbmd);
// End of Hyundai(1998-5-9)*/
if (!pmbmd->m_bSkip) {
motionCompAndAddErrorMB_BVOP (
pmv, pmvBackward,
pmbmd,
iMBX, iMBY,
x, y,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
&m_rctRefVOPY0, &m_rctRefVOPY1
);
}
if (m_volmd.fAUsage == EIGHT_BIT) {
if (pmbmd->m_CODAlpha!=ALPHA_ALL255)
{
motionCompAlphaMB_BVOP(
pmv, pmvBackward,
pmbmd,
iMBX, iMBY,
x, y,
ppxlcCurrQMBA,
&m_rctRefVOPY0, &m_rctRefVOPY1
);
if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)
assignAlphaPredToCurrQ (ppxlcCurrQMBA);
else
addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);
}
}
}
}
//padding of bvop is necessary for temporal scalability: bvop in base layer is used for prediction in enhancement layer
// Added for field based MC padding by Hyundai(1998-5-9)
if (!m_vopmd.bInterlace) {
if (pmbmd -> m_rgTranspStatus [0] != ALL) {
if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);
padNeighborTranspMBs (
iMBX, iMBY,
pmbmd,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
);
}
else {
padCurrAndTopTranspMBFromNeighbor (
iMBX, iMBY,
pmbmd,
ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
);
}
}
// End of Hyundai(1998-5-9)
}
pmbmd++;
pmv += BVOP_MV_PER_REF_PER_MB;
pmvBY++;
pmvBackward += BVOP_MV_PER_REF_PER_MB;
ppxlcCurrQMBY += MB_SIZE;
ppxlcCurrQMBU += BLOCK_SIZE;
ppxlcCurrQMBV += BLOCK_SIZE;
ppxlcCurrQMBBY += MB_SIZE;
ppxlcCurrQMBA += MB_SIZE;
}
ppxlcCurrQY += m_iFrameWidthYxMBSize;
ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
ppxlcCurrQBY += m_iFrameWidthYxMBSize;
ppxlcCurrQA += m_iFrameWidthYxMBSize;
}
// Added for field based MC padding by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
fieldBasedMCPadding (field_pmbmd, m_pvopcCurrQ);
// End of Hyundai(1998-5-9)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -