📄 mbenc.cpp
字号:
// : bSkipAllowed && pmv->isZero (); Int* rgiBlkCurrQ = m_ppxliErrorMBY; Int* rgiCoefQ; Int iWidthCurrQ; Bool bSkipAlpha = TRUE; for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt)iBlkEnd; iBlk++) { if (iBlk < (UInt) U_BLOCK || iBlk> (UInt) V_BLOCK) { if (pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL) continue; switch (iBlk) { case (Y_BLOCK1): rgiBlkCurrQ = m_ppxliErrorMBY; break; case (Y_BLOCK2): rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE; break; case (Y_BLOCK3): rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE; break; case (Y_BLOCK4): rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE; break; case (A_BLOCK1): rgiBlkCurrQ = m_ppxliErrorMBA; break; case (A_BLOCK2): rgiBlkCurrQ = m_ppxliErrorMBA + BLOCK_SIZE; break; case (A_BLOCK3): rgiBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE; break; case (A_BLOCK4): rgiBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE; break; } iWidthCurrQ = MB_SIZE; } else { iWidthCurrQ = BLOCK_SIZE; rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV; } rgiCoefQ = m_rgpiCoefQ [iBlk - 1]; if(iBlk>=A_BLOCK1) quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQPA, TRUE); else quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE); Bool bCoded = FALSE; UInt i; for (i = 0; i < BLOCK_SQUARE_SIZE; i++) { if (rgiCoefQ [i] != 0) { bCoded = TRUE; bMBCoded = TRUE; break; } } if(iBlk<A_BLOCK1) bSkip = bSkip & !bCoded; else bSkipAlpha = bSkipAlpha & !bCoded; pmbmd->setCodedBlockPattern ((BlockNum) iBlk, bCoded); } pmbmd->m_bSkip = bSkip; if(m_volmd.fAUsage == EIGHT_BIT) { if(bSkipAlpha == TRUE) pmbmd->m_CODAlpha = ALPHA_SKIPPED; else if(pmbmd->m_CODAlpha == ALPHA_ALL255) { PixelC *ppxlc = ppxlcCurrQMBA; Int i; for(i = 0; i<MB_SIZE; i++, ppxlc += m_iFrameWidthY) pxlcmemset(ppxlc, 255, MB_SIZE); } }// INTERLACE if ((pmbmd->m_rgTranspStatus [0] == NONE) &&(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE) && (bMBCoded == TRUE)) fieldDCTtoFrameI(m_ppxliErrorMBY);// ~INTERLACE}Void CVideoObjectEncoder::sendDCTCoefOfInterMBTexture (const CMBMode* pmbmd) { assert (pmbmd != NULL); assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ); assert (pmbmd -> m_rgTranspStatus [0] != ALL); UInt nBits, iBlk = 0; for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_ if (iBlk < U_BLOCK) if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue; if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) { Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_// Modified for data partitioning mode by Toshiba(1998-1-16) if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP) nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, TRUE); else nBits = sendTCOEFInter (rgiCoefQ, 0, m_vopmd.bAlternateScan ? grgiVerticalZigzag : grgiStandardZigzag);// End Toshiba(1998-1-16) switch (iBlk) { case U_BLOCK: m_statsMB.nBitsCr += nBits; break; case V_BLOCK: m_statsMB.nBitsCb += nBits; break; default: m_statsMB.nBitsY += nBits; } } } }Void CVideoObjectEncoder::sendDCTCoefOfIntraMBTexture (const CMBMode* pmbmd) { assert (pmbmd != NULL); assert (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ); assert (pmbmd->m_rgTranspStatus [0] != ALL); UInt iBlk = 0; for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) { UInt nBits = 0;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_ if (iBlk < U_BLOCK) if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue; Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_ Int iCoefStart = 0; if (pmbmd->m_bCodeDcAsAc != TRUE) { iCoefStart = 1; nBits = sendIntraDC (rgiCoefQ, (BlockNum) iBlk); } if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) { Int* rgiZigzag = grgiStandardZigzag; if (m_vopmd.bAlternateScan) rgiZigzag = grgiVerticalZigzag; else if (pmbmd->m_bACPrediction) rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;// Modified for data partitioning mode by Toshiba(1998-1-16) if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP) nBits += sendTCOEFIntraRVLC (rgiCoefQ, iCoefStart, rgiZigzag, TRUE); else nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);// End Toshiba(1998-1-16) } switch (iBlk) { case U_BLOCK: m_statsMB.nBitsCr += nBits; break; case V_BLOCK: m_statsMB.nBitsCb += nBits; break; default: m_statsMB.nBitsY += nBits; } } }UInt CVideoObjectEncoder::sumAbsCurrMB (){ PixelC* ppxlcCurrMBY = m_ppxlcCurrMBY; UInt uisumAbs = 0; Int ic; for (ic = 0; ic < MB_SQUARE_SIZE; ic++) { uisumAbs += ppxlcCurrMBY [ic]; } return uisumAbs;}Void CVideoObjectEncoder::codeMBAlphaHeadOfIVOP (const CMBMode* pmbmd){ // get CBPA Int CBPA = 0; UInt cNonTrnspBlk = 0, iBlk; for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) cNonTrnspBlk++; } UInt iBitPos = 1; for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) { CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos); iBitPos++; } } assert (CBPA >= 0 && CBPA <= 15); Int iCODA = 0; if(pmbmd->m_CODAlpha==ALPHA_ALL255) iCODA = 1; m_pbitstrmOut->putBits(iCODA, 1, "MB_CODA"); m_statsMB.nBitsCODA++; if(iCODA) return; m_pbitstrmOut->putBits (pmbmd->m_bACPredictionAlpha, 1, "MB_ACPRED_ALPHA"); m_statsMB.nBitsIntraPred++;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CBPA, "MB_CBPA");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA"); break; case 2: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA"); break; case 3: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA"); break; case 4: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA"); break; default: assert (FALSE); }}Void CVideoObjectEncoder::codeMBAlphaHeadOfPVOP (const CMBMode* pmbmd){ if(pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ) codeMBAlphaHeadOfIVOP(pmbmd); else { // get CBPA Int CBPA = 0; UInt cNonTrnspBlk = 0, iBlk; for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) cNonTrnspBlk++; } UInt iBitPos = 1; for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) { CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos); iBitPos++; } } assert (CBPA >= 0 && CBPA <= 15); if(pmbmd->m_CODAlpha==ALPHA_CODED) { m_pbitstrmOut->putBits(0, 2, "MB_CODA"); m_statsMB.nBitsCODA += 2; } else if(pmbmd->m_CODAlpha==ALPHA_ALL255) { m_pbitstrmOut->putBits(1, 2, "MB_CODA"); m_statsMB.nBitsCODA += 2; return; } else // ALPHA_SKIPPED { m_pbitstrmOut->putBits(1, 1, "MB_CODA"); m_statsMB.nBitsCODA ++; return; }#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CBPA, "MB_CBPA");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA"); break; case 2: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA"); break; case 3: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA"); break; case 4: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA"); break; default: assert (FALSE); } }}Void CVideoObjectEncoder::sendDCTCoefOfIntraMBAlpha (const CMBMode* pmbmd){ assert (pmbmd != NULL); assert (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ); assert (pmbmd->m_rgTranspStatus [0] != ALL); if(pmbmd->m_CODAlpha != ALPHA_CODED) return; UInt iBlk; for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) { UInt nBits = 0;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iBlk, "ALPHA_BLK_NO");#endif // __TRACE_AND_STATS_ if (pmbmd -> m_rgTranspStatus [iBlk - 6 ] == ALL) continue; Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_ Int iCoefStart = 0; if (pmbmd->m_bCodeDcAsAcAlpha != TRUE) { iCoefStart = 1; nBits = sendIntraDC (rgiCoefQ, (BlockNum) iBlk); } if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) { Int* rgiZigzag = grgiStandardZigzag; if (pmbmd->m_bACPredictionAlpha) rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag; nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag); } m_statsMB.nBitsA += nBits; } }Void CVideoObjectEncoder::sendDCTCoefOfInterMBAlpha (const CMBMode* pmbmd){ assert (pmbmd != NULL); assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ); assert (pmbmd -> m_rgTranspStatus [0] != ALL); assert (pmbmd -> m_CODAlpha == ALPHA_CODED); UInt nBits, iBlk = 0; for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_ if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) continue; if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) { Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_ nBits = sendTCOEFInter (rgiCoefQ, 0, grgiStandardZigzag); m_statsMB.nBitsA += nBits; } } }Void CVideoObjectEncoder::codeMBAlphaHeadOfBVOP (const CMBMode* pmbmd){ // get CBPA Int CBPA = 0; UInt cNonTrnspBlk = 0, iBlk; for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) cNonTrnspBlk++; } UInt iBitPos = 1; for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) { CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos); iBitPos++; } } assert (CBPA >= 0 && CBPA <= 15); if(pmbmd->m_CODAlpha==ALPHA_CODED) { m_pbitstrmOut->putBits(0, 2, "MB_CODBA"); m_statsMB.nBitsCODA += 2; } else if(pmbmd->m_CODAlpha==ALPHA_ALL255) { m_pbitstrmOut->putBits(1, 2, "MB_CODBA"); m_statsMB.nBitsCODA += 2; return; } else // ALPHA_SKIPPED { m_pbitstrmOut->putBits(1, 1, "MB_CODBA"); m_statsMB.nBitsCODA ++; return; }#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CBPA, "MB_CBPBA");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA"); break; case 2: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA"); break; case 3: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA"); break; case 4: m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA"); break; default: assert (FALSE); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -