📄 mbheaddec.cpp
字号:
case 3: iCBPY = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol (); break; case 4: iCBPY = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol (); break; default: assert (FALSE); } } assert (iCBPY >= 0 && iCBPY <= 15); } else { //skipped pmbmd->m_dctMd = INTER; pmbmd -> m_bhas4MVForward = FALSE; pmbmd -> m_bFieldMV = FALSE;// GMC pmbmd -> m_bMCSEL = FALSE; if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE) pmbmd -> m_bMCSEL = TRUE;// ~GMC } setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk); pmbmd->m_intStepDelta = 0; if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) { assert (!pmbmd->m_bSkip); Int iDQUANT = m_pbitstrmIn->getBits (2); switch (iDQUANT) { case 0: pmbmd->m_intStepDelta = -1; break; case 1: pmbmd->m_intStepDelta = -2; break; case 2: pmbmd->m_intStepDelta = 1; break; case 3: pmbmd->m_intStepDelta = 2; break; default: assert (FALSE); } iCurrentQP += pmbmd->m_intStepDelta; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; iCurrentQP = checkrange (iCurrentQP, 1, iQuantMax); } pmbmd->m_stepSize = iCurrentQP; //printf("(%d)", iCurrentQP);// INTERLACE if (m_vopmd.bInterlace && !pmbmd->m_bSkip) { if ((pmbmd->m_dctMd == INTRA) || (pmbmd->m_dctMd == INTRAQ) || (iCBPY || iCBPC)) pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type else pmbmd->m_bFieldDCT = FALSE;// GMC pmbmd->m_bFieldMV = FALSE;// ~GMC if (((pmbmd->m_dctMd == INTERQ) || (pmbmd->m_dctMd == INTER)) && (pmbmd -> m_bhas4MVForward == FALSE) && (pmbmd -> m_bMCSEL == FALSE)) { // GMC pmbmd->m_bFieldMV = m_pbitstrmIn->getBits (1); // get field_prediction if (pmbmd->m_bFieldMV == TRUE) { pmbmd->m_bForwardTop = m_pbitstrmIn->getBits (1); // get top field reference pmbmd->m_bForwardBottom = m_pbitstrmIn->getBits (1); // get bottom field reference } } }// ~INTERLACE setDCVLCMode(pmbmd, pbRestart);}// B-VOPVoid CVideoObjectDecoder::decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int& iCurrQP){ assert (pmbmd -> m_rgTranspStatus [0] != ALL); pmbmd -> m_bhas4MVForward = pmbmd -> m_bhas4MVBackward = FALSE; pmbmd->m_bMCSEL = FALSE; pmbmd->m_bSkip = FALSE; pmbmd->m_dctMd = INTER; pmbmd->m_intStepDelta = 0; pmbmd->m_bFieldDCT = FALSE; pmbmd->m_bFieldMV = FALSE; Int iBlk = 0, cNonTrnspBlk = 0; for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } Int iMODB = 0; // Int iMCBPC = 0; Int iCBPC = 0; Int iCBPY = 0; Int iMbType, uiCBPB = 0; if (m_pbitstrmIn->getBits (1) == 1) { //MODB=1 colocated non-skip but curr skip pmbmd->m_bSkip = TRUE; iMODB = 0; pmbmd->m_mbType = (!(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0))? DIRECT : FORWARD; if(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0) return; } else if (m_pbitstrmIn->getBits (1) == 1) { //MODB="01" if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0)) iMbType = m_pentrdecSet->m_pentrdecMbTypeBVOP->decodeSymbol (); else { if (m_pbitstrmIn->getBits (1) == 1) iMbType = FORWARD; else if (m_pbitstrmIn->getBits (1) == 1) iMbType = INTERPOLATE; else if (m_pbitstrmIn->getBits (1) == 1) iMbType = BACKWARD; else { fprintf(stderr,"MB Type 0000 does not exsit.\n"); exit(2); } } //yrchen to throw severe exception caused by packet loss 10.21.2003 //assert (iMbType >= 0 && iMbType <= 3); ASSERT (iMbType >= 0 && iMbType <= 3); pmbmd->m_mbType = (MBType) iMbType; iMODB = 1; } //MODB="00" else { if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0)) iMbType = m_pentrdecSet->m_pentrdecMbTypeBVOP->decodeSymbol (); else { if (m_pbitstrmIn->getBits (1) == 1) iMbType = FORWARD; else if (m_pbitstrmIn->getBits (1) == 1) iMbType = INTERPOLATE; else if (m_pbitstrmIn->getBits (1) == 1) iMbType = BACKWARD; else{ fprintf(stderr,"MB Type 0000 is not exsit.\n"); exit(2); } } //yrchen to throw severe exception caused by packet loss 10.21.2003 //assert (iMbType >= 0 && iMbType <= 3); ASSERT (iMbType >= 0 && iMbType <= 3); pmbmd->m_mbType = (MBType) iMbType; iMODB = 2; uiCBPB = m_pbitstrmIn->getBits (cNonTrnspBlk + 2); pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE; //this is okay; will be reset later //Only one mv for B-VOP except direct mode (will be reset in mvdec.cpp) iCBPC = uiCBPB & 0x0003; iCBPY = (uiCBPB >> 2) & 0x000F; if (pmbmd->m_mbType != DIRECT) { Int DQUANT; if (m_pbitstrmIn->getBits (1) == 0) DQUANT = 0; else if (m_pbitstrmIn->getBits (1) == 0) DQUANT = -2; else DQUANT = 2; pmbmd->m_intStepDelta = DQUANT; iCurrQP += pmbmd->m_intStepDelta; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; iCurrQP = checkrange (iCurrQP, 1, iQuantMax); } } pmbmd->m_stepSize = iCurrQP; setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk); if (pmbmd->m_mbType == DIRECT) pmbmd->m_dctMd = INTER; //direct mode doesn't have dquant else pmbmd->m_dctMd = INTERQ; //meaningless in B_VOP 'cause DQUANT is always sent// INTERLACE if (m_vopmd.bInterlace) { if (uiCBPB != 0) pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type if (pmbmd->m_mbType != DIRECT) { pmbmd->m_bFieldMV = m_pbitstrmIn->getBits (1); if (pmbmd->m_bFieldMV) { if (pmbmd->m_mbType != BACKWARD) { pmbmd->m_bForwardTop = m_pbitstrmIn->getBits (1); pmbmd->m_bForwardBottom = m_pbitstrmIn->getBits (1); } if (pmbmd->m_mbType != FORWARD) { pmbmd->m_bBackwardTop = m_pbitstrmIn->getBits (1); pmbmd->m_bBackwardBottom = m_pbitstrmIn->getBits (1); } } } }// ~INTERLACE}Void CVideoObjectDecoder::decodeMBAlphaHeadOfPVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA, Int iAuxComp){ if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { decodeMBAlphaHeadOfIVOP(pmbmd, iCurrQP, iCurrQPA, m_vopmd.intStep, m_vopmd.intStepPAlpha[iAuxComp], iAuxComp); } else { // update alpha quantiser if(!m_volmd.bNoGrayQuantUpdate) { iCurrQPA = (pmbmd->m_stepSize * m_vopmd.intStepPAlpha[iAuxComp]) / m_vopmd.intStep; if(iCurrQPA<1) iCurrQPA = 1; } pmbmd->m_stepSizeAlpha = iCurrQPA; assert (pmbmd->m_rgTranspStatus [0] != ALL); if(m_pbitstrmIn->getBits (1) == 0) { if(m_pbitstrmIn->getBits (1) == 0) pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED; else pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255; } else pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_SKIPPED; if(pmbmd->m_pCODAlpha[iAuxComp]!=ALPHA_CODED) return; Int iBlk = 0, cNonTrnspBlk = 0; for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } Int iCBPA = 0; switch (cNonTrnspBlk) { case 1: iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol (); break; case 2: iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol (); break; case 3: iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol (); break; case 4: iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol (); break; default: assert (FALSE); } Int iBitPos = 1; for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) { pmbmd->setCodedBlockPattern ( iBlk+iAuxComp*4, (iCBPA >> (cNonTrnspBlk - iBitPos)) & 1 ); iBitPos++; } else pmbmd->setCodedBlockPattern (iBlk+iAuxComp*4, 0); } }}Void CVideoObjectDecoder::decodeMBAlphaHeadOfBVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA, Int iAuxComp){ // update alpha quantiser if(!m_volmd.bNoGrayQuantUpdate) { iCurrQPA = (iCurrQP * m_vopmd.intStepBAlpha[iAuxComp]) / m_vopmd.intStepB; if(iCurrQPA<1) iCurrQPA = 1; } pmbmd->m_stepSizeAlpha = iCurrQPA; assert (pmbmd->m_rgTranspStatus [0] != ALL); if(m_pbitstrmIn->getBits (1) == 0) { if(m_pbitstrmIn->getBits (1) == 0) pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED; else pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255; } else pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_SKIPPED; if(pmbmd->m_pCODAlpha[iAuxComp]!=ALPHA_CODED) return; Int iBlk = 0, cNonTrnspBlk = 0; for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } Int iCBPA = 0; switch (cNonTrnspBlk) { case 1: iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol (); break; case 2: iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol (); break; case 3: iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol (); break; case 4: iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol (); break; default: assert (FALSE); } Int iBitPos = 1; for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) { pmbmd->setCodedBlockPattern ( iBlk+iAuxComp*4, (iCBPA >> (cNonTrnspBlk - iBitPos)) & 1 ); iBitPos++; } else pmbmd->setCodedBlockPattern (iBlk+iAuxComp*4, 0); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -