📄 shpenc.cpp
字号:
m_pbitstrmShapeMBOut->setBookmark (); // try intra UInt nBitsModeIntra = codeShapeModeInter (INTRA_CAE, shpmdColocatedMB);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTRA_HORIZONTAL_CODING (TRIAL)");#endif // __TRACE_AND_STATS_ UInt nBitsHIntra = encodeCAEIntra (INTRA_CAE, HORIZONTAL);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTRA_VERTICAL_CODING (TRIAL)");#endif // __TRACE_AND_STATS_ UInt nBitsVIntra = encodeCAEIntra (INTRA_CAE, VERTICAL); UInt nBitsIntra = nBitsModeIntra + min (nBitsVIntra, nBitsHIntra); // try inter UInt nBitsMV=0; UInt nBitsModeInter = codeShapeModeInter (pmbmd->m_shpmd, shpmdColocatedMB); if(pmbmd->m_shpmd==INTER_CAE_MVDNZ) nBitsMV = encodeMVDS (mvBYD);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTER_VERTICAL_CODING (TRIAL)");#endif // __TRACE_AND_STATS_ UInt nBitsVInter = encodeCAEInter (pmbmd->m_shpmd, VERTICAL);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTER_HORIZONTAL_CODING (TRIAL)");#endif // __TRACE_AND_STATS_ UInt nBitsHInter = encodeCAEInter (pmbmd->m_shpmd, HORIZONTAL); UInt nBitsInter = nBitsModeInter + nBitsMV + min (nBitsVInter, nBitsHInter); m_pbitstrmShapeMBOut->gotoBookmark (); if (nBitsInter < nBitsIntra) { // choose inter coding#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTER_CODING (REAL)"); m_pbitstrmOut->trace (mvShapeMVP, "MB_SHP_MV_PRED (half pel)"); m_pbitstrmOut->trace (*pmvBY, "MB_SHP_MV (half pel)"); m_pbitstrmOut->trace (mvBYD, "MB_SHP_MVD (half pel)");#endif // __TRACE_AND_STATS_ codeShapeModeInter (pmbmd->m_shpmd, shpmdColocatedMB); if(pmbmd->m_shpmd==INTER_CAE_MVDNZ) encodeMVDS (mvBYD); if(nBitsVInter<nBitsHInter) encodeCAEInter (pmbmd->m_shpmd, VERTICAL); else encodeCAEInter (pmbmd->m_shpmd, HORIZONTAL); return nBitsInter; } else { // choose intra coding#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTRA_CODING (REAL)");#endif // __TRACE_AND_STATS_ pmvBY->iMVX = NOT_MV; pmvBY->iMVY = NOT_MV; pmbmd->m_shpmd = INTRA_CAE; codeShapeModeInter (pmbmd->m_shpmd, shpmdColocatedMB); if(nBitsVIntra<nBitsHIntra) encodeCAEIntra (pmbmd->m_shpmd, VERTICAL); else encodeCAEIntra (pmbmd->m_shpmd, HORIZONTAL); return nBitsIntra; } } case MVDZ_NOUPDT: case MVDNZ_NOUPDT: {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("MB_CAE_INTER_CODING_NO_UPDATE"); m_pbitstrmOut->trace (mvShapeMVP, "MB_SHP_MV_PRED (half pel)"); m_pbitstrmOut->trace (*pmvBY, "MB_SHP_MV (half pel)"); m_pbitstrmOut->trace (mvBYD, "MB_SHP_MVD (half pel)");#endif // __TRACE_AND_STATS_ copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ((PixelC *)m_puciPredBAB->pixels(), MC_BAB_SIZE, MC_BAB_SIZE, "MB_MC_PRED_BAB");#endif // __TRACE_AND_STATS_ Int nBits = codeShapeModeInter (pmbmd->m_shpmd, shpmdColocatedMB); if(pmbmd->m_shpmd==MVDNZ_NOUPDT) nBits += encodeMVDS (mvBYD); return nBits; } default: assert(FALSE); return 0; }}//OBSS_SAIT_991015//for SI coding -PVOPInt CVideoObjectEncoder::codeSIShapePVOP (PixelC* ppxlcSrcFrm, CVOPU8YUVBA* pvopcRefQ, CMBMode* pmbmd, const ShapeMode& shpmdColocatedMB, const CMotionVector* pmv, CMotionVector* pmvBY, CoordI iX, CoordI iY, Int iMBX, Int iMBY){ m_iInverseCR = 1; m_iWidthCurrBAB = BAB_SIZE; pmbmd->m_shpssmd = UNDEFINED; // CMotionVector mvBYD (0, 0);#ifdef __TRACE_AND_STATS_ if(pmbmd->m_rgTranspStatus [0] == NONE) m_pbitstrmOut->trace ("ORIGINAL BAB IS ALL MPEG4_OPAQUE"); else if(pmbmd->m_rgTranspStatus [0] == ALL) m_pbitstrmOut->trace ("ORIGINAL BAB IS ALL TRANSP"); else m_pbitstrmOut->trace (m_ppxlcCurrMBBY, MB_SIZE, MB_SIZE, "ORIGINAL_BAB");#endif // __TRACE_AND_STATS_ Int iMBnum = VPMBnum(iMBX, iMBY); m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX); m_bVPNoTop = bVPNoTop(iMBnum); m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX); m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX); m_bVPNoRight = bVPNoRight(iMBX); m_bVPNoBottom = bVPNoBottom(iMBY); motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ->getPlane (BY_PLANE)->pixels (), iX-1, iY-1); //-1 due to 18x18 motion comp pmvBY->iMVX = 0; pmvBY->iMVY = 0; if (!isErrorLarge (m_ppxlcCurrMBBY, m_rgiSubBlkIndx16x16, 16, m_puciPredBAB->pixels (), m_rgiSubBlkIndx18x18, 18, pmbmd)) pmbmd->m_shpssmd = INTRA_NOT_CODED; //NO_UPDATE else pmbmd->m_shpssmd = INTRA_CODED; //CODED if((m_volmd.iuseRefShape ==1) && !m_volmd.bShapeOnly) { copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); Int nBits =0; return nBits; } switch(pmbmd->m_shpssmd){ case INTRA_CODED: { m_bNoShapeChg = TRUE; m_iInverseCR = 1; m_iWidthCurrBAB = BAB_SIZE; // copy data to ReconCurrBAB PixelC* ppxlcDst = m_ppxlcReconCurrBAB + BAB_BORDER + BAB_BORDER * TOTAL_BAB_SIZE; PixelC* ppxlcSrc = m_ppxlcCurrMBBY; Int iUnit = sizeof(PixelC); // NBIT: for memcpy Int i; for (i = 0; i < MB_SIZE; i++) { memcpy (ppxlcDst, ppxlcSrc, MB_SIZE*iUnit); ppxlcSrc += MB_SIZE; ppxlcDst += BAB_SIZE; } // make borders copyLeftTopBorderFromVOP (ppxlcSrcFrm, m_ppxlcReconCurrBAB); makeRightBottomBorder ( m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, (PixelC*)((pvopcRefQ->getPlane (BY_PLANE)->pixels ())+(iY + EXPANDY_REF_FRAME) * m_iFrameWidthY + iX + EXPANDY_REF_FRAME), m_iFrameWidthY); // assign encoding buffer m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; if (m_bNoShapeChg) copyReconShapeToRef (ppxlcSrcFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER); else copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ((PixelC *)m_puciPredBAB->pixels(), MC_BAB_SIZE, MC_BAB_SIZE, "MB_MC_PRED_BAB"); m_pbitstrmOut->trace (m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, TOTAL_BAB_SIZE, "MB_RECON_BAB (Ignore Borders)"); m_pbitstrmOut->trace (m_rgpxlcCaeSymbol, m_iWidthCurrBAB , m_iWidthCurrBAB , "MB_ENCODED_BAB");#endif // __TRACE_AND_STATS_//OBSS shape mode coding UInt nBitsModeIntra=0; nBitsModeIntra = codeShapeModeSSIntra (INTRA_CODED, shpmdColocatedMB);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("INTRA_CODED_CODING");#endif // __TRACE_AND_STATS_ UInt nBitsSIIntra = encodeSIIntra (INTRA_CODED, (pvopcRefQ->getPlane (BY_PLANE)->m_pbHorSamplingChk)+iX, (pvopcRefQ->getPlane (BY_PLANE)->m_pbVerSamplingChk)+iY);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("SI_INTRA_CODING");#endif // __TRACE_AND_STATS_ UInt nBitsIntra = nBitsModeIntra + nBitsSIIntra; return nBitsIntra; } case INTRA_NOT_CODED: {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("SPATIAL_SCALABLE_SHAPE_NO_UPDATE"); m_pbitstrmOut->trace (*pmvBY, "MB_SHP_MV (half pel)");#endif // __TRACE_AND_STATS_ copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), /*BAB_SIZE-BAB_BORDER*2*/MC_BAB_SIZE, /*0*/MC_BAB_BORDER);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ((PixelC *)m_puciPredBAB->pixels(), MC_BAB_SIZE, MC_BAB_SIZE, "MB_MC_PRED_BAB_SS");#endif // __TRACE_AND_STATS_//OBSS shape mode coding Int nBits=0; nBits = codeShapeModeSSIntra (INTRA_NOT_CODED, shpmdColocatedMB); return nBits; } default: assert(FALSE); return 0; }}//for BVOP SI shape codingInt CVideoObjectEncoder::codeSIShapeBVOP (PixelC* ppxlcSrcFrm, CVOPU8YUVBA* pvopcRefQ0, //previous VOP CVOPU8YUVBA* pvopcRefQ1, //lower reference VOP CMBMode* pmbmd, const ShapeMode& shpmdColocatedMB, const CMotionVector* pmv, CMotionVector* pmvBY, CMotionVector* pmvBaseBY, CoordI iX, CoordI iY, Int iMBX, Int iMBY){ UInt nBitsIntra=0; m_iInverseCR = 1; m_iWidthCurrBAB = BAB_SIZE; pmbmd->m_shpssmd = UNDEFINED; // CMotionVector mvBYD (0, 0);#ifdef __TRACE_AND_STATS_ if(pmbmd->m_rgTranspStatus [0] == NONE) m_pbitstrmOut->trace ("ORIGINAL BAB IS ALL MPEG4_OPAQUE"); else if(pmbmd->m_rgTranspStatus [0] == ALL) m_pbitstrmOut->trace ("ORIGINAL BAB IS ALL TRANSP"); else m_pbitstrmOut->trace (m_ppxlcCurrMBBY, MB_SIZE, MB_SIZE, "ORIGINAL_BAB");#endif // __TRACE_AND_STATS_ Int iMBnum = VPMBnum(iMBX, iMBY); m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX); m_bVPNoTop = bVPNoTop(iMBnum); m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX); m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX); m_bVPNoRight = bVPNoRight(iMBX); m_bVPNoBottom = bVPNoBottom(iMBY); // copy data to ReconCurrBAB PixelC* ppxlcDst = m_ppxlcReconCurrBAB + BAB_BORDER + BAB_BORDER * TOTAL_BAB_SIZE; PixelC* ppxlcSrc = m_ppxlcCurrMBBY; Int iUnit = sizeof(PixelC); // NBIT: for memcpy Int i; for (i = 0; i < MB_SIZE; i++) { memcpy (ppxlcDst, ppxlcSrc, MB_SIZE*iUnit); ppxlcSrc += MB_SIZE; ppxlcDst += BAB_SIZE; } motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ1->getPlane (BY_PLANE)->pixels (), iX-1, iY-1); //-1 due to 18x18 motion comp // make borders copyLeftTopBorderFromVOP (ppxlcSrcFrm, m_ppxlcReconCurrBAB); makeRightBottomBorder ( m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, (PixelC*)((pvopcRefQ1->getPlane (BY_PLANE)->pixels ())+(iY + EXPANDY_REF_FRAME) * m_iFrameWidthY + iX + EXPANDY_REF_FRAME), m_iFrameWidthY); // assign encoding buffer m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; if((m_volmd.iuseRefShape ==1) && !m_volmd.bShapeOnly) { copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); Int nBits =0; return nBits; } if (!isErrorLarge (m_ppxlcCurrMBBY, m_rgiSubBlkIndx16x16, 16, m_puciPredBAB->pixels (), m_rgiSubBlkIndx18x18, 18, pmbmd)){ if(!(shpmdColocatedMB == 0 || shpmdColocatedMB == 1)){ if (pmvBaseBY->iMVX == NOT_MV && pmvBaseBY->iMVY == NOT_MV ){ pmvBaseBY->iMVX = 0; pmvBaseBY->iMVY = 0; } motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ0->getPlane (BY_PLANE)->pixels (), (((pmvBaseBY->iMVX)*m_volmd.ihor_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVX))*m_volmd.ihor_sampling_factor_m_shape/2)/m_volmd.ihor_sampling_factor_m_shape) + iX - 1, (((pmvBaseBY->iMVY)*m_volmd.iver_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVY))*m_volmd.iver_sampling_factor_m_shape/2)/m_volmd.iver_sampling_factor_m_shape) + iY - 1); //-1 due to 18x18 motion comp if (!isErrorLarge (m_ppxlcCurrMBBY, m_rgiSubBlkIndx16x16, 16, m_puciPredBAB->pixels (), m_rgiSubBlkIndx18x18, 18, pmbmd)){ pmvBY->iMVX = (((pmvBaseBY->iMVX)*m_volmd.ihor_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVX))*m_volmd.ihor_sampling_factor_m_shape/2)/m_volmd.ihor_sampling_factor_m_shape); pmvBY->iMVY = (((pmvBaseBY->iMVY)*m_volmd.iver_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVY))*m_volmd.iver_sampling_factor_m_shape/2)/m_volmd.iver_sampling_factor_m_shape); pmbmd->m_shpssmd = INTER_NOT_CODED; //INTER_NO_UPDATE//INTER_NOT_CODED mode Coding #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("SCALABLE_SHAPE_INTER_NO_UPDATE"); m_pbitstrmOut->trace (*pmvBY, "MB_SHP_MV (half pel)"); #endif // __TRACE_AND_STATS_ copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ((PixelC *)m_puciPredBAB->pixels(), MC_BAB_SIZE, MC_BAB_SIZE, "MB_MC_PRED_BAB_SS"); #endif // __TRACE_AND_STATS_ //OBSS shape mode coding Int nBits=0; nBits = codeShapeModeSSInter (INTER_NOT_CODED, shpmdColocatedMB); return nBits; } else { motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ1->getPlane (BY_PLANE)->pixels (), iX-1, iY-1); //-1 due to 18x18 motion comp } } pmvBY->iMVX = 0; pmvBY->iMVY = 0; pmbmd->m_shpssmd = INTRA_NOT_CODED; //INTRA_NO_UPDATE//INTRA_NOT_CODED mode Coding #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("SCALABLE_SHAPE_INTRA_NO_UPDATE"); m_pbitstrmOut->trace (*pmvBY, "MB_SHP_MV (half pel)"); #endif // __TRACE_AND_STATS_ copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ((PixelC *)m_puciPredBAB->pixels(), MC_BAB_SIZE, MC_BAB_SIZE, "MB_MC_PRED_BAB_SS"); #endif // __TRACE_AND_STATS_ //SS shape mode coding Int nBits=0; nBits = codeShapeModeSSInter (INTRA_NOT_CODED, shpmdColocatedMB); return nBits; } else { m_pbitstrmShapeMBOut->setBookmark ();//try INTRA_CODED UInt nBitsModeIntra = codeShapeModeSSInter (INTRA_CODED, shpmdColocatedMB);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("SCALABLE_SHAPE_INTRA_CODED_CODING (TRIAL)");#endif // __TRACE_AND_STATS_ UInt nBitsSIIntra = encodeSIIntra (INTRA_CODED, (pvopcRefQ1->getPlane (BY_PLANE)->m_pbHorSamplingChk)+iX, (pvopcRefQ1->getPlane (BY_PLANE)->m_pbVerSamplingChk)+iY); nBitsIntra = nBitsModeIntra + nBitsSIIntra; m_pbitstrmShapeMBOut->gotoBookmark (); //if lower layer has no motion vector then the current MV is set to (0,0) if (pmvBaseBY->iMVX == NOT_MV && pmvBaseBY->iMVY == NOT_MV ){ pmvBaseBY->iMVX = 0; pmvBaseBY->iMVY = 0; } motionCompBY ( (PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ0->getPlane (BY_PLANE)->pixels (), (((pmvBaseBY->iMVX)*m_volmd.ihor_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVX))*m_volmd.ihor_sampling_factor_m_shape/2)/m_volmd.ihor_sampling_factor_m_shape) + iX - 1, (((pmvBaseBY->iMVY)*m_volmd.iver_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVY))*m_volmd.iver_sampling_factor_m_shape/2)/m_volmd.iver_sampling_factor_m_shape) + iY - 1); //-1 due to 18x18 motion comp if (!isErrorLarge (m_ppxlcCurrMBBY, m_rgiSubBlkIndx16x16, 16, m_puciPredBAB->pixels (), m_rgiSubBlkIndx18x18, 18, pmbmd)){ pmvBY->iMVX = (((pmvBaseBY->iMVX)*m_volmd.ihor_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVX))*m_volmd.ihor_sampling_factor_m_shape/2)/m_volmd.ihor_sampling_factor_m_shape); pmvBY->iMVY = (((pmvBaseBY->iMVY)*m_volmd.iver_sampling_factor_n_shape+(SIGN(pmvBaseBY->iMVY))*m_volmd.iver_sampling_factor_m_shape/2)/m_volmd.iver_sampling_factor_m_shape); pmbmd->m_shpssmd = INTER_NOT_CODED; //INTER_NO_UPDATE//INTER_NOT_CODED mode Coding #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ("SCALABLE_SHAPE_INTER_NO_UPDATE"); m_pbitstrmOut->trace (*pmvBY, "MB_SHP_MV (half pel)"); #endif // __TRACE_AND_STATS_ copyReconShapeToMbAndRef (m_ppxlcCurrMBBY, ppxlcSrcFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); #ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace ((PixelC *)m_puciPredBAB->pixels(), MC_BAB_SIZE, MC_BAB_SIZE, "MB_MC_PRED_BAB_SS"); #endif // __TRACE_AND_STATS_ //OBSS shape mode coding Int nBits=0; nBits = codeShapeModeSSInter (INTER_NOT_CODED, shpmdColocatedMB);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -