📄 vopmbenc.cpp
字号:
if (m_volmd.fAUsage == EIGHT_BIT) {
pppxlcRefA = new PixelC* [m_volmd.iAuxCompCount];
pppxlcOrigA = new PixelC* [m_volmd.iAuxCompCount];
pppxlcRefMBA = new PixelC* [m_volmd.iAuxCompCount];
pppxlcOrigMBA = new const PixelC* [m_volmd.iAuxCompCount];
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {
pppxlcRefA[iAuxComp] = (PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iStartInRefToCurrRctY;
pppxlcOrigA[iAuxComp] = (PixelC*) m_pvopcOrig->pixelsBoundA (iAuxComp);
}
}
// ~MAC
Bool bRestartDelayedQP = TRUE;
// Added for error resilient mode by Toshiba(1997-11-14)
Bool bCodeVPHeaderNext = FALSE; // needed only for OBMC
Int iTempVPMBnum = 0;
// End Toshiba(1997-11-14)
for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
PixelC* ppxlcRefMBY = ppxlcRefY;
PixelC* ppxlcRefMBU = ppxlcRefU;
PixelC* ppxlcRefMBV = ppxlcRefV;
PixelC* ppxlcRefMBBY = ppxlcRefBY;
//PixelC* ppxlcRefMBA = ppxlcRefA;
PixelC* ppxlcOrigMBY = ppxlcOrigY;
PixelC* ppxlcOrigMBU = ppxlcOrigU;
PixelC* ppxlcOrigMBV = ppxlcOrigV;
PixelC* ppxlcOrigMBBY = ppxlcOrigBY;
//PixelC* ppxlcOrigMBA = ppxlcOrigA;
CoordI x = m_rctCurrVOPY.left;
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {
pppxlcRefMBA[iAuxComp] = pppxlcRefA[iAuxComp];
pppxlcOrigMBA[iAuxComp] = pppxlcOrigA[iAuxComp];
}
}
#ifdef __TRACE_AND_STATS_
m_statsMB.reset ();
#endif // __TRACE_AND_STATS_
// initiate advance shape coding
// Added for error resilient mode by Toshiba(1997-11-14)
// The following operation is needed only for OBMC
if ( m_volmd.bVPBitTh >= 0) {
Int iCounter = m_pbitstrmOut -> getCounter();
bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh;
if( bCodeVPHeaderNext ) {
iTempVPMBnum = m_iVPMBnum;
m_iVPMBnum = VPMBnum(0, iMBY);
m_iVPCounter = iCounter;
}
} else {
bCodeVPHeaderNext = FALSE;
}
// 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) {
//OBSS_SAIT_991015
if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)){
shpmdColocatedMB = m_rgmbmdRef [
min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
}
else {
//OBSSFIX_MODE3
if(m_volmd.volType == BASE_LAYER)
shpmdColocatedMB = m_rgmbmdRef [min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
else if(m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType!=0 && m_volmd.iuseRefShape ==1 )
shpmdColocatedMB = ALL_OPAQUE;
else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability
shpmdColocatedMB = m_rgBaseshpmd [
min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef];
}
// if((m_volmd.volType == BASE_LAYER) || (!(m_volmd.iEnhnType==0 || m_volmd.iuseRefShape ==0) && !m_volmd.bShapeOnly) )
// shpmdColocatedMB = m_rgmbmdRef [
// min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
// else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability
// shpmdColocatedMB = m_rgBaseshpmd [
// min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef];
// }
//~OBSSFIX_MODE3
}
//~OBSS_SAIT_991015
encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY);
}
else {
m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY);
decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);
}
// End Toshiba(1997-11-14)
// Added for error resilient mode by Toshiba(1997-11-14)
// The following operation is needed only for OBMC
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, iMB++) {
// MB rate control
if (m_uiRateControl>=RC_TM5) {
pmbmd->m_intStepDelta = m_tm5rc.tm5rc_calc_mquant(iMB,
m_statsVOP.total()) - iQPPrev;
if (pmbmd->m_intStepDelta>2) pmbmd->m_intStepDelta = 2;
else if (pmbmd->m_intStepDelta<-2) pmbmd->m_intStepDelta = -2;
}
// Added for error resilient mode by Toshiba(1997-11-14)
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
if ( m_volmd.bVPBitTh >= 0) {
if( bCodeVPHeaderNext ) {
codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
bRestartDelayedQP = TRUE;
}
} else {
bCodeVPHeaderNext = FALSE;
}
// End Toshiba(1997-11-14)
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)");
// shape quantization part
m_statsMB.reset ();
#endif // __TRACE_AND_STATS_
pmbmd->m_bPadded=FALSE;
dumpCachedShapeBits();
if(iMBX<m_iNumMBX-1)
{
// Added for error resilient mode by Toshiba(1997-11-14)
// The following operation is needed only for OBMC
if ( m_volmd.bVPBitTh >= 0) {
Int iCounter = m_pbitstrmOut -> getCounter();
bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh;
if( bCodeVPHeaderNext ) {
iTempVPMBnum = m_iVPMBnum;
m_iVPMBnum = VPMBnum(iMBX+1, iMBY);
m_iVPCounter = iCounter;
}
} else {
bCodeVPHeaderNext = FALSE;
}
// End Toshiba(1997-11-14)
// code shape 1mb in advance
copyToCurrBuffJustShape (ppxlcOrigMBBY+MB_SIZE,m_iFrameWidthY);
// Modified for error resilient mode by Toshiba(1997-11-14)
if(m_vopmd.bShapeCodingType) {
//OBSS_SAIT_991015
if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)){
shpmdColocatedMB = m_rgmbmdRef [
min (max (0, iMBX+1), m_iNumMBXRef-1) +
min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef
].m_shpmd;
}
else {
//OBSSFIX_MODE3
if(m_volmd.volType == BASE_LAYER)
shpmdColocatedMB = m_rgmbmdRef [
min (max (0, iMBX+1), m_iNumMBXRef-1) +
min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef
].m_shpmd;
else if(m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType!=0 && m_volmd.iuseRefShape ==1 )
shpmdColocatedMB = ALL_OPAQUE;
else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability
shpmdColocatedMB = m_rgBaseshpmd [
min (max (0, ((iMBX+xIndex+1)*m_volmd.ihor_sampling_factor_m_shape/m_volmd.ihor_sampling_factor_n_shape)), (m_iNumMBBaseXRef-1)) +
min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef];
}
// if((m_volmd.volType == BASE_LAYER) || (!(m_volmd.iEnhnType==0 || m_volmd.iuseRefShape ==0) && !m_volmd.bShapeOnly) )
// shpmdColocatedMB = m_rgmbmdRef [
// min (max (0, iMBX+1), m_iNumMBXRef-1) +
// min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef
// ].m_shpmd;
// else if(m_volmd.volType == ENHN_LAYER) // if SpatialScalability
// {
// shpmdColocatedMB = m_rgBaseshpmd [
// min (max (0, ((iMBX+xIndex+1)*m_volmd.ihor_sampling_factor_m_shape/m_volmd.ihor_sampling_factor_n_shape)), (m_iNumMBBaseXRef-1)) +
// min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef];
// }
//~OBSSFIX_MODE3
}
//~OBSS_SAIT_991015
encodePVOPMBJustShape(
ppxlcRefMBBY+MB_SIZE, pmbmd+1,
shpmdColocatedMB, pmv + PVOP_MV_PER_REF_PER_MB,
pmvBY+1, x+MB_SIZE, y,
iMBX+1, iMBY
);
}
else {
m_statsMB.nBitsShape
+= codeIntraShape (
ppxlcRefMBBY+MB_SIZE,
pmbmd+1, iMBX+1, iMBY
);
decideTransparencyStatus (pmbmd+1,
m_ppxlcCurrMBBY);
}
// End Toshiba(1997-11-14)
// Added for error resilient mode by Toshiba(1997-11-14)
// The following operation is needed only for OBMC
if( bCodeVPHeaderNext )
m_iVPMBnum = iTempVPMBnum;
// End Toshiba(1997-11-14)
// shape needs padded mvs ready for next mb
if((pmbmd+1)->m_bhas4MVForward)
padMotionVectors(pmbmd+1, pmv + PVOP_MV_PER_REF_PER_MB);
}
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace) initMergedMode (pmbmd);
// End of Hyundai(1998-5-9)*/
if(m_volmd.bShapeOnly==FALSE)
{
pmbmd->m_stepSizeDelayed = iQPPrev;
if (pmbmd -> m_rgTranspStatus [0] != ALL) {
// need to copy binary shape too since curr buff is future shape
copyToCurrBuffWithShape(ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV,
ppxlcRefMBBY, pppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV);
downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
// HHI Schueuer: sadct
if (!m_volmd.bSadctDisable) {
deriveSADCTRowLengths (m_rgiCurrMBCoeffWidth, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd->m_rgTranspStatus);
encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,
pppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, iQPPrev, iQPPrevAlpha,
bRestartDelayedQP, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV );
}
else
encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,
pppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, iQPPrev, iQPPrevAlpha,
bRestartDelayedQP);
// end HHI
// Added for field based MC padding by Hyundai(1998-5-9)
if (!m_vopmd.bInterlace) {
if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA);
padNeighborTranspMBs (
iMBX, iMBY,
pmbmd,
ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA
);
}
// End of Hyundai(1998-5-9)
}
else {
// Added for field based MC padding by Hyundai(1998-5-9)
if (!m_vopmd.bInterlace) {
padCurrAndTopTranspMBFromNeighbor (
iMBX, iMBY,
pmbmd,
ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA
);
}
// End of Hyundai(1998-5-9)
}
}
pmbmd++;
pmv += PVOP_MV_PER_REF_PER_MB;
pmvBY++;
ppxlcRefMBBY += MB_SIZE;
// ppxlcRefMBA += MB_SIZE;
ppxlcOrigMBBY += MB_SIZE;
// ppxlcOrigMBA += MB_SIZE;
#ifdef __TRACE_AND_STATS_
m_statsVOP += m_statsMB;
#endif // __TRACE_AND_STATS_
ppxlcRefMBY += MB_SIZE;
ppxlcRefMBU += BLOCK_SIZE;
ppxlcRefMBV += BLOCK_SIZE;
ppxlcOrigMBY += MB_SIZE;
ppxlcOrigMBU += BLOCK_SIZE;
ppxlcOrigMBV += BLOCK_SIZE;
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {
pppxlcRefMBA[iAuxComp] += MB_SIZE;
pppxlcOrigMBA[iAuxComp] += MB_SIZE;
}
}
}
MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
m_rgpmbmAbove = m_rgpmbmCurr;
m_rgpmbmCurr = ppmbmTemp;
ppxlcRefY += m_iFrameWidthYxMBSize;
ppxlcRefU += m_iFrameWidthUVxBlkSize;
ppxlcRefV += m_iFrameWidthUVxBlkSize;
ppxlcRefBY += m_iFrameWidthYxMBSize;
//ppxlcRefA += m_iFrameWidthYxMBSize;
ppxlcOrigY += m_iFrameWidthYxMBSize;
ppxlcOrigBY += m_iFrameWidthYxMBSize;
// ppxlcOrigA += m_iFrameWidthYxMBSize;
ppxlcOrigU += m_iFrameWidthUVxBlkSize;
ppxlcOrigV += m_iFrameWidthUVxBlkSize;
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {
pppxlcRefA[iAuxComp] += m_iFrameWidthYxMBSize;
pppxlcOrigA[iAuxComp] += m_iFrameWidthYxMBSize;
}
}
}
// Added for field based MC padding by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1);
// End of Hyundai(1998-5-9)
//OBSS_SAIT_991015
//OBSSFIX_MODE3
if((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER && !(m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1) ) { // if SpatialScalability
// if((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER) { // if SpatialScalability
//~OBSSFIX_MODE3
delete m_pvopcRefQ0->getPlane (BY_PLANE)->m_pbHorSamplingChk;
delete m_pvopcRefQ0->getPlane (BY_PLANE)->m_pbVerSamplingChk;
}
//~OBSS_SAIT_991015
// MAC
if (m_volmd.fAUsage == EIGHT_BIT) {
delete [] pppxlcRefA;
delete [] pppxlcOrigA;
delete [] pppxlcRefMBA;
delete [] pppxlcOrigMBA;
}
//~MAC
// restore normal output stream
m_pbitstrmShapeMBOut = m_pbitstrmOut;
}
Void CVideoObjectEncoder::encodeNSForBVOP ()
{
motionEstBVOP ();
CoordI y = 0;
CMBMode* pmbmd = m_rgmbmd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -