📄 sys_encoder_errenc.cpp
字号:
#endif // __TRACE_AND_STATS_ ppxlcRefMBY += (MB_SIZE *m_iRRVScale); ppxlcRefMBU += (BLOCK_SIZE *m_iRRVScale); ppxlcRefMBV += (BLOCK_SIZE *m_iRRVScale); ppxlcOrigMBY += (MB_SIZE *m_iRRVScale); ppxlcOrigMBU += (BLOCK_SIZE *m_iRRVScale); ppxlcOrigMBV += (BLOCK_SIZE *m_iRRVScale); iVPtotal = (int) m_statsVOP.total() - iVPCounter; iCurrMBPos = (m_iRRVScale == 2) ? (2 *iMBX +1 +(2 *iMBY +1) *(2 *m_iNumMBX)) : ((iMBY *m_iNumMBX) +iMBX); if( ((m_volmd.bNewpredEnable) && (m_volmd.bNewpredSegmentType == 0)) ? (iCurrMBPos == g_pNewPredEnc->SliceTailMBA((iMBX *m_iRRVScale), (iMBY *m_iRRVScale))) : (iVPtotal>m_volmd.bVPBitTh || iVPlastMBnum==m_iNumMB-1)) { // Set to output bitstream m_pbitstrmOut->SetDontSendBits(FALSE); // encode video packet iVPCounter = m_statsVOP.total(); m_statsVP.reset(); iVideoPacketNumber ++; if( m_iVPMBnum > 0 ) { m_statsVP.nBitsHead = codeVideoPacketHeader (m_rgmbmd[m_iVPMBnum].m_stepSize - m_rgmbmd[m_iVPMBnum].m_intStepDelta); } bRestartDelayedQP = TRUE; DataPartitioningMotionCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP); m_pbitstrmOut -> putBits (MOTION_MARKER, NUMBITS_DP_MOTION_MARKER, "motion_marker"); m_statsVP.nBitsHead += NUMBITS_DP_MOTION_MARKER; DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP); m_iVPMBnum = iVPlastMBnum + 1; // Set not to output but count bitstream m_pbitstrmOut->SetDontSendBits(TRUE); } } MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove; m_rgpmbmAbove = m_rgpmbmCurr; m_rgpmbmCurr = ppmbmTemp; ppxlcRefY += m_iFrameWidthYxMBSize; ppxlcRefU += m_iFrameWidthUVxBlkSize; ppxlcRefV += m_iFrameWidthUVxBlkSize; ppxlcOrigY += m_iFrameWidthYxMBSize; ppxlcOrigU += m_iFrameWidthUVxBlkSize; ppxlcOrigV += m_iFrameWidthUVxBlkSize; }// RRV insertion if(m_vopmd.RRVmode.iRRVOnOff == 1) { ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY; ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV; ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV; filterCodedPictureForRRV(ppxlcRefY, ppxlcRefU, ppxlcRefV, m_ivolWidth, m_ivolHeight, m_iNumMBX, m_iNumMBY, m_iFrameWidthY, m_iFrameWidthUV); }// ~RRV // delete CoefQ_DP for(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; // Set to output bitstream m_pbitstrmOut->SetDontSendBits(FALSE);// NEWPRED // copy previous picture to reference picture memory because of output ordering if(m_volmd.bNewpredEnable) { for( int iSlice = 0; iSlice < g_pNewPredEnc->m_iNumSlice; iSlice++ ) { int iMBY = g_pNewPredEnc->NowMBA(iSlice)/((g_pNewPredEnc->getwidth())/MB_SIZE); PixelC* RefpointY = (PixelC*) m_pvopcRefQ0->pixelsY () + (m_iStartInRefToCurrRctY-EXPANDY_REF_FRAME) + iMBY * MB_SIZE * m_rctRefFrameY.width; PixelC* RefpointU = (PixelC*) m_pvopcRefQ0->pixelsU () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width; PixelC* RefpointV = (PixelC*) m_pvopcRefQ0->pixelsV () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width; g_pNewPredEnc->CopyNPtoPrev(iSlice, RefpointY, RefpointU, RefpointV); } repeatPadYOrA ((PixelC*) m_pvopcRefQ0->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ0); repeatPadUV (m_pvopcRefQ0); }// ~NEWPRED m_vopmd.intStep = newQStep;}Void CVideoObjectEncoder::DataPartitioningMotionCoding(Int iVPMBnum, Int iVPlastMBnum, CStatistics* m_statsVP, Int*** iCoefQ_DP){ assert( m_volmd.bDataPartitioning ); Int iMBnum; CMBMode* pmbmd; CMotionVector* pmv = m_rgmv; Int iMBX, iMBY; 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) { iMBX = iMBnum % m_iNumMBX; iMBY = iMBnum / m_iNumMBX;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CSite (iMBX, iMBY), "Motion_MB_X_Y");#endif // __TRACE_AND_STATS_ if( m_volmd.fAUsage != RECTANGLE ) { m_statsVP->nBitsShape += dumpCachedShapeBits_DP(iMBnum); } if (pmbmd -> m_rgTranspStatus [0] != ALL) { if( m_vopmd.vopPredType==PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)) { // GMC m_pbitstrmOut->putBits (pmbmd->m_bSkip, 1, "MB_Skip"); m_statsVP->nBitsCOD++;// GMC if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE && pmbmd->m_bSkip == TRUE) m_statsVP->nMCSELMB++;// ~GMC } //if(pmbmd->m_bSkip) // printf("(Skip)"); if (!pmbmd->m_bSkip) { UInt CBPC = (pmbmd->getCodedBlockPattern (U_BLOCK) << 1) | pmbmd->getCodedBlockPattern (V_BLOCK); //per defintion of H.263's CBPC assert (CBPC >= 0 && CBPC <= 3); Int iMBtype; //per H.263's MBtype Int iSymbol; switch( m_vopmd.vopPredType ) { case PVOP: if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) iMBtype = pmbmd->m_dctMd + 3; else iMBtype = (pmbmd -> m_dctMd - 2) | pmbmd -> m_bhas4MVForward << 1; assert (iMBtype >= 0 && iMBtype <= 4);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iMBtype, "MB_MBtype"); m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_ iSymbol = iMBtype * 4 + CBPC; m_statsVP->nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCinter->encodeSymbol (iSymbol, "MCBPC"); //printf("(%d:%d:%d)", iSymbol, pmbmd->m_bCodeDcAsAc, pmbmd->m_stepSize); break;// GMC case SPRITE: if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) iMBtype = pmbmd->m_dctMd + 3; else iMBtype = (pmbmd -> m_dctMd - 2) | pmbmd -> m_bhas4MVForward << 1; assert (iMBtype >= 0 && iMBtype <= 4);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iMBtype, "MB_MBtype"); m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_ m_statsVP->nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCinter->encodeSymbol (iMBtype * 4 + CBPC, "MCBPC"); if((pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) && (pmbmd -> m_bhas4MVForward == FALSE)){ m_pbitstrmOut->putBits (pmbmd->m_bMCSEL, 1, "MCSEL"); m_statsVP->nMCSELMB ++; m_statsVP->nBitsMCSEL ++; } break;// ~GMC case IVOP: iSymbol = 4 * pmbmd->m_dctMd + CBPC; assert (iSymbol >= 0 && iSymbol <= 7); //send MCBPC#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_ m_statsVP->nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCintra->encodeSymbol (iSymbol, "MB_MCBPC"); //printf("(%d:%d:%d)", iSymbol, pmbmd->m_bCodeDcAsAc, pmbmd->m_stepSize); break; default: assert(FALSE); } if ( m_vopmd.vopPredType == IVOP ) { if( pmbmd->m_dctMd == INTRAQ) { Int DQUANT = pmbmd->m_intStepDelta; //send DQUANT assert (DQUANT >= -2 && DQUANT <= 2); if (DQUANT != 0) { if (sign (DQUANT) == 1) m_pbitstrmOut->putBits (DQUANT + 1, 2, "MB_DQUANT"); else m_pbitstrmOut->putBits (-1 - DQUANT, 2, "MB_DQUANT"); m_statsVP->nBitsDQUANT += 2; } } 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 = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ[0], "IntraDC");#endif // __TRACE_AND_STATS_ if (pmbmd->m_bCodeDcAsAc != TRUE) { nBits = sendIntraDC (rgiCoefQ, iBlk); } switch (iBlk) { case U_BLOCK: m_statsVP->nBitsCr += nBits; break; case V_BLOCK: m_statsVP->nBitsCb += nBits; break; default: m_statsVP->nBitsY += nBits; } } } if (pmbmd->m_dctMd != INTRA && pmbmd->m_dctMd != INTRAQ && !(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE && pmbmd -> m_bMCSEL)) { // GMC if( m_volmd.fAUsage == RECTANGLE ) m_statsVP->nBitsMV += encodeMVVP (pmv, pmbmd, iMBX, iMBY); else m_statsVP->nBitsMV += encodeMVWithShape (pmv, pmbmd, iMBX, iMBY); } } } }}Void CVideoObjectEncoder::DataPartitioningTextureCoding(Int iVPMBnum, Int iVPlastMBnum, CStatistics* m_statsVP, Int*** iCoefQ_DP, Int*** iRowLength_DP){ assert( m_volmd.bDataPartitioning ); Int iMBnum; CMBMode* pmbmd; CMotionVector* pmv = m_rgmv; Int iMBX, iMBY; 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), "TextureHeader_MB_X_Y");#endif // __TRACE_AND_STATS_ Int CBPY = 0; UInt cNonTrnspBlk = 0, iBlk; for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } UInt iBitPos = 1; for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) { CBPY |= pmbmd->getCodedBlockPattern (iBlk) << (cNonTrnspBlk - iBitPos); iBitPos++; } } assert (CBPY >= 0 && CBPY <= 15); //per defintion of H.263's CBPY if (m_volmd.fAUsage == RECTANGLE) assert (cNonTrnspBlk==4); // Only all opaque is only supportedin DP mode at present if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { m_pbitstrmOut->putBits (pmbmd->m_bACPrediction, 1, "MB_ACPRED"); m_statsVP->nBitsIntraPred++;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks"); m_pbitstrmOut->trace (CBPY, "MB_CBPY (I-style)");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (CBPY, "MB_CBPY1"); break; case 2: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (CBPY, "MB_CBPY2"); break; case 3: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (CBPY, "MB_CBPY3"); break; case 4: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (CBPY, "MB_CBPY"); break; default: assert (FALSE); } m_statsVP->nIntraMB++; } else {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks"); m_pbitstrmOut->trace (CBPY, "MB_CBPY (P-style)");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPY, "MB_CBPY1"); break; case 2: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPY, "MB_CBPY2"); break; case 3: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPY, "MB_CBPY3"); break; case 4: m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPY, "MB_CBPY"); break; default: assert (FALSE); } } if ( m_vopmd.vopPredType != IVOP && (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ)) { Int DQUANT = pmbmd->m_intStepDelta; //send DQUANT assert (DQUANT >= -2 && DQUANT <= 2); if (DQUANT != 0) { if (sign (DQUANT) == 1) m_pbitstrmOut->putBits (DQUANT + 1, 2, "MB_DQUANT"); else m_pbitstrmOut->putBits (-1 - DQUANT, 2, "MB_DQUANT"); m_statsVP->nBitsDQUANT += 2; } } if (m_vopmd.vopPredType != IVOP && (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 = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (rgiCoefQ[0], "IntraDC");#endif // __TRACE_AND_STATS_ if (pmbmd->m_bCodeDcAsAc != TRUE) { nBits = sendIntraDC (rgiCoefQ, iBlk); } switch (iBlk) { case U_BLOCK: m_statsVP->nBitsCr += nBits; break; case V_BLOCK: m_statsVP->nBitsCb += nBits; break; default: m_statsVP->nBitsY += nBits; } } } } 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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -