📄 vopmbdec.cpp
字号:
iMBYstop= 0;
//uiNumMacroblocksInGob=8;
// dx_in_gob = ;
// dy_in_gob = ;
}
Bool bRestartDelayedQP = TRUE; // decodeMBTextureHeadOfIVOP sets this to false
uiGobNumber=0;
while (uiGobNumber < uiNumberOfGobs) {
if (short_video_header) {
uiGobHeaderEmpty=1;
if (uiGobNumber != 0) {
if (m_pbitstrmIn->peekBits(17)==1) {
uiGobHeaderEmpty=0;
/* UInt uiGobResyncMarker= wmay */m_pbitstrmIn -> getBits (17);
uiGobNumber=m_pbitstrmIn -> getBits(5);
/* UInt uiGobFrameId = wmay */ m_pbitstrmIn -> getBits(2);
/* UInt uiVopQuant= wmay */m_pbitstrmIn -> getBits(5);
uiGobNumber++;
} else {
uiGobNumber++;
}
} else {
uiGobNumber++;
}
iMBXstart=0;
iMBXstop= m_ivolWidth/16;
iMBYstart=(uiGobNumber*(m_ivolHeight/16)/uiNumberOfGobs)-1;
iMBYstop= iMBYstart+(m_ivolHeight/16)/uiNumberOfGobs;
} else {
uiGobNumber++;
}
for (iMBY = iMBYstart; iMBY < iMBYstop; iMBY++) { // [FDS]
PixelC* ppxlcRefMBY = ppxlcRefY;
PixelC* ppxlcRefMBU = ppxlcRefU;
PixelC* ppxlcRefMBV = ppxlcRefV;
Bool bSptMB_NOT_HOLE= TRUE;
// Begin: modified by Hughes 4/9/98
// if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {
// end: modified by Hughes 4/9/98
bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);
RestoreMBmCurrRow (iMBY, m_rgpmbmCurr); // restore current row pointed by *m_rgpmbmCurr
}
for (iMBX = iMBXstart; iMBX < iMBXstop; iMBX++) {
m_bSptMB_NOT_HOLE = bSptMB_NOT_HOLE;
if (!m_bSptMB_NOT_HOLE ) // current Sprite macroblock is not a hole and should be decoded
goto END_OF_DECODING2;
if (checkResyncMarker()) {
decodeVideoPacketHeader(iCurrentQP);
iVideoPacketNumber++;
bRestartDelayedQP = TRUE;
}
pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; //mv out of if by wchen to set even when errR is off; always used in mbdec
decodeMBTextureHeadOfIVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV);
// INTERLACE
if ((m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
fieldDCTtoFrameC(ppxlcRefMBY);
// ~INTERLACE
END_OF_DECODING2:
pmbmd++;
ppxlcRefMBY += MB_SIZE;
ppxlcRefMBU += BLOCK_SIZE;
ppxlcRefMBV += BLOCK_SIZE;
// Begin: modified by Hughes 4/9/98
// if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP)
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) // get the hole status for the next MB
// end: modified by Hughes 4/9/98
bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);
else
bSptMB_NOT_HOLE= TRUE;
}
MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
m_rgpmbmAbove = m_rgpmbmCurr;
// dshu: [v071] begin of modification 1/18/98
// Begin: modified by Hughes 4/9/98
// if (m_uiSprite == 1)
if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
// end: modified by Hughes 4/9/98
SaveMBmCurrRow (iMBY, m_rgpmbmCurr); // save current row pointed by *m_rgpmbmCurr
// dshu: [v071] end of modification
m_rgpmbmCurr = ppmbmTemp;
ppxlcRefY += m_iFrameWidthYxMBSize;
ppxlcRefU += m_iFrameWidthUVxBlkSize;
ppxlcRefV += m_iFrameWidthUVxBlkSize;
// dshu: [v071] begin of modification 1/18/98 move these statements up
// if (m_uiSprite == 1)
// SaveMBmCurrRow (iMBY, m_rgpmbmCurr); // save current row pointed by *m_rgpmbmCurr
// dshu: [v071] end of modification
}
} // KPN Terminate while loop Gob layer [FDS]
}
Void CVideoObjectDecoder::decodePVOP_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* pmvBY = m_rgmvBY;
PixelC* ppxlcCurrQY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
PixelC* ppxlcCurrQU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
PixelC* ppxlcCurrQV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
PixelC* ppxlcCurrQA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
Int iCurrentQP = m_vopmd.intStep;
Int iCurrentQPA = m_vopmd.intStepPAlpha;
// Added for error resilient mode by Toshiba(1997-11-14)
Int iVideoPacketNumber = 0; // added for error resilience mode by Toshiba
m_iVPMBnum = 0;
Bool bRestartDelayedQP = TRUE;
// End Toshiba(1997-11-14)
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;
// Added for error resilient mode by Toshiba(1997-11-14)
if (iMBY != 0) {
if (checkResyncMarker()) {
decodeVideoPacketHeader(iCurrentQP);
iVideoPacketNumber++;
bRestartDelayedQP = TRUE;
}
}
pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
// End Toshiba(1997-11-14)
// Modified for error resilient mode by Toshiba(1997-11-14)
ShapeMode shpmdColocatedMB;
if(m_vopmd.bShapeCodingType) {
shpmdColocatedMB = m_rgmbmdRef [
MIN (iMBY, m_iNumMBYRef-1) * m_iNumMBXRef
].m_shpmd;
decodeInterShape (m_pvopcRefQ0, pmbmd, 0, iMBY,
m_rctCurrVOPY.left, y, pmv, pmvBY,
m_ppxlcCurrMBBY, ppxlcCurrQMBBY,
shpmdColocatedMB);
}
else {
decodeIntraShape (pmbmd, 0, iMBY, m_ppxlcCurrMBBY,
ppxlcCurrQMBBY);
}
// End Toshiba(1997-11-14)
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_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
/*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)*/
decodeMBTextureHeadOfPVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
swapTransparentModes (pmbmd, BBS);
// End of Hyundai(1998-5-9)*/
decodeMVWithShape (pmbmd, 0, iMBY, pmv);
if(pmbmd->m_bhas4MVForward)
padMotionVectors(pmbmd,pmv);
}
CoordI x = m_rctCurrVOPY.left;
for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {
pmbmd->m_bPadded = FALSE;
if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
swapTransparentModes (pmbmd, BBM);
// End of Hyundai(1998-5-9)*/
if ((pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) && !pmbmd->m_bSkip) {
decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
// INTERLACE
//new changes
if ((pmbmd->m_rgTranspStatus [0] == NONE) &&
(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
fieldDCTtoFrameC(ppxlcCurrQMBY);
//end of new changes
// ~INTERLACE
if (m_volmd.fAUsage == EIGHT_BIT) {
decodeMBAlphaHeadOfPVOP (pmbmd, iCurrentQP, iCurrentQPA);
decodeAlphaIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBA);
}
}
else {
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
}
if (m_volmd.fAUsage == EIGHT_BIT) {
decodeMBAlphaHeadOfPVOP (pmbmd, iCurrentQP, iCurrentQPA);
decodeAlphaInterMB (pmbmd, ppxlcCurrQMBA);
}
}
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
mergedMacroBlockSplit (pmbmd, ppxlcCurrQMBY, ppxlcCurrQMBA);
// End of Hyundai(1998-5-9)*/
}
// decode shape, overhead, and MV for the right MB
if (iMBX != m_iNumMBX - 1) {
CMBMode* pmbmdRight = pmbmd + 1;
// Added for error resilient mode by Toshiba(1997-11-14)
if (checkResyncMarker()) {
decodeVideoPacketHeader(iCurrentQP);
iVideoPacketNumber++;
bRestartDelayedQP = TRUE;
}
pmbmdRight->m_iVideoPacketNumber = iVideoPacketNumber;
// End Toshiba(1997-11-14)
// Modified for error resilient mode by Toshiba(1997-11-14)
if(m_vopmd.bShapeCodingType) {
shpmdColocatedMB = m_rgmbmdRef [
MIN (MAX (0, iMBX+1), m_iNumMBXRef-1) +
MIN (MAX (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef
].m_shpmd;
decodeInterShape (
m_pvopcRefQ0,
pmbmdRight,
iMBX + 1, iMBY,
x + MB_SIZE, y,
pmv + PVOP_MV_PER_REF_PER_MB, pmvBY + 1,
m_ppxlcRightMBBY,
ppxlcCurrQMBBY + MB_SIZE,
shpmdColocatedMB
);
}
else {
decodeIntraShape (
pmbmdRight, iMBX + 1, iMBY,
m_ppxlcRightMBBY,
ppxlcCurrQMBBY + MB_SIZE
);
}
// End Toshiba(1997-11-14)
downSampleBY (m_ppxlcRightMBBY, m_ppxlcRightMBBUV);
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace) initMergedMode (pmbmdRight);
// End of Hyundai(1998-5-9)*/
if (pmbmdRight->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmdRight->m_rgTranspStatus [0] == PARTIAL)
isBoundaryMacroBlockMerged (pmbmdRight, m_ppxlcRightMBBY);
// End of Hyundai(1998-5-9)*/
decodeMBTextureHeadOfPVOP (pmbmdRight, iCurrentQP, bRestartDelayedQP);
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmdRight->m_bMerged[0])
swapTransparentModes (pmbmdRight, BBS);
// End of Hyundai(1998-5-9)*/
decodeMVWithShape (pmbmdRight, iMBX + 1, iMBY, pmv + PVOP_MV_PER_REF_PER_MB);
if(pmbmdRight->m_bhas4MVForward)
padMotionVectors (pmbmdRight,pmv + PVOP_MV_PER_REF_PER_MB);
}
}
if(m_volmd.bShapeOnly==FALSE) {
if (pmbmd->m_rgTranspStatus [0] != ALL) {
if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) {
motionCompMB (
m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
pmv, pmbmd,
iMBX, iMBY,
x, y,
pmbmd->m_bSkip, FALSE,
&m_rctRefVOPY0
);
if (!pmbmd->m_bSkip) {
CoordI iXRefUV, iYRefUV;
// INTERLACE //new changes
if(pmbmd->m_bFieldMV) {
CoordI iXRefUV1, iYRefUV1;
mvLookupUV (pmbmd, pmv, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1);
motionCompFieldUV(m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y,
iXRefUV, iYRefUV, pmbmd->m_bForwardTop);
motionCompFieldUV(m_ppxlcPredMBU + BLOCK_SIZE, m_ppxlcPredMBV + BLOCK_SIZE,
m_pvopcRefQ0, x, y, iXRefUV1, iYRefUV1, pmbmd->m_bForwardBottom);
}
else {
// INTERALCE //end of new changes
mvLookupUVWithShape (pmbmd, pmv, iXRefUV, iYRefUV);
motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0,
x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl,&m_rctRefVOPY0);
}
addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
}
else {
if (m_volmd.bAdvPredDisable)
copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);
else
copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);
}
if (m_volmd.fAUsage == EIGHT_BIT
&& pmbmd->m_CODAlpha!=ALPHA_ALL255)
{
motionCompMB (
m_ppxlcPredMBA, m_pvopcRefQ0->pixelsA (),
pmv, pmbmd,
iMBX, iMBY,
x, y,
FALSE, TRUE,
&m_rctRefVOPY0
);
if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)
assignAlphaPredToCurrQ (ppxlcCurrQMBA);
else
addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);
}
}
// Added for field based MC padding by Hyundai(1998-5-9)
if (!m_vopmd.bInterlace) {
if (pmbmd->m_rgTranspStatus [0] == PARTIAL)
mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -