📄 errenc.cpp
字号:
} } } } for(iMBnum = iVPMBnum, pmbmd = m_rgmbmd+iVPMBnum, pmv = m_rgmv+iVPMBnum*PVOP_MV_PER_REF_PER_MB; iMBnum <= iVPlastMBnum; iMBnum++, pmbmd++, pmv+=PVOP_MV_PER_REF_PER_MB) { if (pmbmd->m_bSkip || pmbmd -> m_rgTranspStatus [0] == ALL) continue; iMBX = iMBnum % m_iNumMBX; iMBY = iMBnum / m_iNumMBX;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CSite (iMBX, iMBY), "TextureTcoef_MB_X_Y");#endif // __TRACE_AND_STATS_ if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { 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]; Int* rgiCoefQ = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_ Int iCoefStart; if (pmbmd->m_bCodeDcAsAc != TRUE) { iCoefStart = 1; } else { iCoefStart = 0; } if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) { Int* rgiZigzag = grgiStandardZigzag; if (pmbmd->m_bACPrediction) rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag; if( m_volmd.bReversibleVlc == TRUE ) nBits += sendTCOEFIntraRVLC (rgiCoefQ, iCoefStart, rgiZigzag, FALSE); else nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag); } switch (iBlk) { case U_BLOCK: m_statsVP->nBitsCr += nBits; break; case V_BLOCK: m_statsVP->nBitsCb += nBits; break; default: m_statsVP->nBitsY += nBits; } } } else { 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]; Int* rgiCoefQ = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_ if( m_volmd.bReversibleVlc == TRUE ) nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, FALSE); else nBits = sendTCOEFInter (rgiCoefQ, 0, grgiStandardZigzag); switch (iBlk) { case U_BLOCK: m_statsVP->nBitsCr += nBits; break; case V_BLOCK: m_statsVP->nBitsCb += nBits; break; default: m_statsVP->nBitsY += nBits; } } } } }}Void CVideoObjectEncoder::encodeNSForIVOP_WithShape_DP (){ assert( m_volmd.bDataPartitioning ); assert( m_vopmd.vopPredType==IVOP ); assert( m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE ); assert(m_volmd.nBits==8); //in case the IVOP is used as an ref for direct mode memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));//#ifdef __SHARP_FIX_ memset (m_rgmvBY, 0, m_iNumMB * sizeof (CMotionVector));//#endif Int iMBX, iMBY; CMBMode* pmbmd = m_rgmbmd; Int iQPPrev = m_vopmd.intStepI; //initialization Int iVPCounter = m_statsVOP.total(); Int iVPtotal; m_iVPMBnum = 0; CStatistics m_statsVP; // DCT coefficient buffer for Data Partitioning mode Int*** iCoefQ_DP = new Int** [m_iNumMB]; // Set not to output but count bitstream// m_pbitstrmOut->SetDontSendBits(TRUE); PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV; PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV; PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV; PixelC *ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY; PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY (); PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU (); PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV (); PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY (); PixelC* ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA (); Bool bRestartDelayedQP = TRUE; for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) { PixelC* ppxlcRefMBY = ppxlcRefY; PixelC* ppxlcRefMBU = ppxlcRefU; PixelC* ppxlcRefMBV = ppxlcRefV; PixelC* ppxlcRefMBBY = ppxlcRefBY; PixelC* ppxlcRefMBBUV = ppxlcRefBUV; PixelC* ppxlcRefMBA = ppxlcRefA; PixelC* ppxlcOrigMBY = ppxlcOrigY; PixelC* ppxlcOrigMBU = ppxlcOrigU; PixelC* ppxlcOrigMBV = ppxlcOrigV; PixelC* ppxlcOrigMBBY = ppxlcOrigBY; PixelC* ppxlcOrigMBA = ppxlcOrigA; for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");#endif // __TRACE_AND_STATS_ pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta; if(bRestartDelayedQP) pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize; else pmbmd->m_stepSizeDelayed = iQPPrev; Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX; // shape bitstream is set to shape cache m_pbitstrmShapeMBOut = m_pbitstrmShape_DP[iVPlastMBnum]; m_statsMB.reset (); pmbmd->m_bSkip = FALSE; //reset for direct mode pmbmd->m_bPadded=FALSE; copyToCurrBuffWithShape ( ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, ppxlcOrigMBBY, ppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV ); downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape) decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) { LPEPadding (pmbmd); m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY); downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // need to modify it a little (NONE block won't change) } else m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY); if(m_volmd.bShapeOnly == FALSE) {// // Set not to output but count bitstream m_pbitstrmOut->SetDontSendBits(TRUE); if (pmbmd -> m_rgTranspStatus [0] != ALL) { pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta; bRestartDelayedQP = FALSE; Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1; assert (pmbmd->m_stepSize <= iQuantMax && pmbmd->m_stepSize > 0); iQPPrev = pmbmd->m_stepSize; if (pmbmd->m_intStepDelta == 0) pmbmd->m_dctMd = INTRA; else pmbmd->m_dctMd = INTRAQ; quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA); codeMBTextureHeadOfIVOP (pmbmd); sendDCTCoefOfIntraMBTexture (pmbmd); // MC padding if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA); padNeighborTranspMBs ( iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA ); } else { padCurrAndTopTranspMBFromNeighbor ( iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA ); }// // Set to output bitstream m_pbitstrmOut->SetDontSendBits(FALSE); } // copy DCT coefficient to buffer iCoefQ_DP[iVPlastMBnum] = new Int* [6]; Int iBlk; for (iBlk = 0; iBlk < 6; iBlk++) { iCoefQ_DP [iVPlastMBnum] [iBlk] = new Int [BLOCK_SQUARE_SIZE]; for( Int t = 0; t < BLOCK_SQUARE_SIZE; t++ ) iCoefQ_DP[iVPlastMBnum][iBlk][t] = m_rgpiCoefQ[iBlk][t]; } ppxlcRefMBA += MB_SIZE; ppxlcOrigMBBY += MB_SIZE; ppxlcOrigMBA += MB_SIZE; pmbmd++;#ifdef __TRACE_AND_STATS_ m_statsVOP += m_statsMB;#endif // __TRACE_AND_STATS_ ppxlcRefMBY += MB_SIZE; ppxlcRefMBU += BLOCK_SIZE; ppxlcRefMBV += BLOCK_SIZE; ppxlcRefMBBY += MB_SIZE; ppxlcRefMBBUV += BLOCK_SIZE; ppxlcOrigMBY += MB_SIZE; ppxlcOrigMBU += BLOCK_SIZE; ppxlcOrigMBV += BLOCK_SIZE; iVPtotal = (int) m_statsVOP.total() - iVPCounter; if( iVPtotal > m_volmd.bVPBitTh || iVPlastMBnum == m_iNumMB-1 /* last MB in a VOP */) { // Set to output bitstream m_pbitstrmOut->SetDontSendBits(FALSE); // encode video packet iVPCounter = m_statsVOP.total(); m_statsVP.reset(); if( m_iVPMBnum > 0 ) { m_statsVP.nBitsHead = codeVideoPacketHeader (m_rgmbmd[m_iVPMBnum].m_stepSize); bRestartDelayedQP = TRUE; } DataPartitioningMotionCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP); m_pbitstrmOut -> putBits (DC_MARKER, NUMBITS_DP_DC_MARKER, "DC_marker"); m_statsVP.nBitsHead += NUMBITS_DP_DC_MARKER; DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP); assert( iVPtotal + m_statsVP.nBitsHead == m_statsVP.total() ); m_iVPMBnum = iVPlastMBnum + 1; } } MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove; m_rgpmbmAbove = m_rgpmbmCurr; m_rgpmbmCurr = ppmbmTemp; ppxlcRefY += m_iFrameWidthYxMBSize; ppxlcRefA += m_iFrameWidthYxMBSize; ppxlcRefU += m_iFrameWidthUVxBlkSize; ppxlcRefV += m_iFrameWidthUVxBlkSize; ppxlcRefBY += m_iFrameWidthYxMBSize; ppxlcRefBUV += m_iFrameWidthUVxBlkSize; ppxlcOrigY += m_iFrameWidthYxMBSize; ppxlcOrigBY += m_iFrameWidthYxMBSize; ppxlcOrigA += m_iFrameWidthYxMBSize; ppxlcOrigU += m_iFrameWidthUVxBlkSize; ppxlcOrigV += m_iFrameWidthUVxBlkSize; } // delete CoefQ_DP for( Int iMB = 0; iMB < m_iNumMB; iMB++ ) { for (Int iBlk = 0; iBlk < 6; iBlk++) { delete [] iCoefQ_DP [iMB] [iBlk]; } delete [] iCoefQ_DP[iMB]; } delete [] iCoefQ_DP; // restore normal output stream m_pbitstrmShapeMBOut = m_pbitstrmOut; // Set to output bitstream m_pbitstrmOut->SetDontSendBits(FALSE);}Void CVideoObjectEncoder::encodeNSForPVOP_WithShape_DP (){ assert( m_volmd.bDataPartitioning ); assert( m_vopmd.vopPredType==PVOP ); assert( m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE ); assert(m_volmd.nBits==8); Int iMBX, iMBY; motionEstPVOP_WithShape (); // Rate Control if (m_uiRateControl == RC_MPEG4) { Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16); m_statRC.setMad (Ec); if (m_statRC.noCodedFrame () >= RC_START_RATE_CONTROL) { UInt newQStep = m_statRC.updateQuanStepsize (); m_vopmd.intStepDiff = newQStep - m_vopmd.intStep; // DQUANT m_vopmd.intStep = newQStep; } cout << "\t" << "Q:" << "\t\t\t" << m_vopmd.intStep << "\n"; m_statRC.setQc (m_vopmd.intStep); } CoordI y = m_rctCurrVOPY.top; CMBMode* pmbmd = m_rgmbmd; Int iQPPrev = m_vopmd.intStep; Int iQPPrevAlpha = m_vopmd.intStepPAlpha; CMotionVector* pmv = m_rgmv; CMotionVector* pmvBY = m_rgmvBY; Int iVPCounter = m_statsVOP.total(); Int iVPtotal; m_iVPMBnum = 0; CStatistics m_statsVP; // DCT coefficient buffer for Data Partitioning mode Int*** iCoefQ_DP = new Int** [m_iNumMB]; PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV; PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV; PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY; PixelC* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV; PixelC *ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY; PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY (); PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU (); PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV (); PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY (); PixelC* ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();// Added for error resilient mode by Toshiba(1997-11-14) Bool bCodeVPHeaderNext = FALSE; // needed only for OBMC Int iTempVPMBnum = 0; Int iCounter;// End Toshiba(1997-11-14) Bool bRestartDelayedQP = TRUE; for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) { PixelC* ppxlcRefMBY = ppxlcRefY; PixelC* ppxlcRefMBU = ppxlcRefU; PixelC* ppxlcRefMBV = ppxlcRefV; PixelC* ppxlcRefMBBY = ppxlcRefBY; PixelC* ppxlcRefMBBUV = ppxlcRefBUV; PixelC* ppxlcRefMBA = ppxlcRefA; PixelC* ppxlcOrigMBY = ppxlcOrigY; PixelC* ppxlcOrigMBU = ppxlcOrigU; PixelC* ppxlcOrigMBV = ppxlcOrigV; PixelC* ppxlcOrigMBBY = ppxlcOrigBY; PixelC* ppxlcOrigMBA = ppxlcOrigA; CoordI x = m_rctCurrVOPY.left;#ifdef __TRACE_AND_STATS_ m_statsMB.reset ();#endif // __TRACE_AND_STATS_ // initiate advance shape coding // shape bitstream is set to shape cache m_pbitstrmShapeMBOut = m_pbitstrmShape_DP[iMBY * m_iNumMBX];// pmbmd->m_bPadded=FALSE;// Added for error resilient mode by Toshiba(1997-11-14) // The following operation is needed only for OBMC// if( bCodeVPHeaderNext ) {// iTempVPMBnum = m_iVPMBnum;// m_iVPMBnum = VPMBnum(0, iMBY);// }// End Toshiba(1997-11-14) copyToCurrBuffJustShape (ppxlcOrigMBBY, m_iFrameWidthY); // Modified for error resilient mode by Toshiba(1997-11-14) ShapeMode shpmdColocatedMB; if(m_vopmd.bShapeCodingType) { shpmdColocatedMB = m_rgmbmdRef [ min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd; encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY); } else { m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY); decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); }// if( bCodeVPHeaderNext )// m_iVPMBnum = iTempVPMBnum; // End Toshiba(1997-11-14) if(pmbmd->m_bhas4MVForward) padMotionVectors(pmbmd,pmv); for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) { pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)"); // shape quantization part m_statsMB.reset ();#endif // __TRACE_AND_STATS_ Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX; pmbmd->m_bPadded=FALSE; if(iMBX<m_iNumMBX-1) { // shape bitstream is set to shape cache
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -