📄 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 -PVOP
Int 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 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 coding
Int 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 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);
return nBits;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -