📄 mbdatactrl.cpp
字号:
//////////////////////////////////////////////////////////
//VBL
///////////////////////////////////////////////////////////
MbDataCtrl *pcBaseMbDataCtrl = &rcBaseMbDataCtrl;
MbDataCtrl *pcVBLMbDataCtrl = NULL;
pcVBLMbDataCtrl=xBuildVirtualBaseLayer(pcBaseMbDataCtrl,m_bBuildInterlacePred,pcParameters);
/////////////////////////////////////////////////////////////
for( Int iMbY = iMbOrigY ; iMbY < iMbEndY; iMbY++)
for(Int iMbX = iMbOrigX ; iMbX < iMbEndX; iMbX++)
{
MbData& rcMbDes = m_pcMbData[iMbY*uiMbStride + iMbX];
RNOK( rcMbDes.copyMotionBL( pcVBLMbDataCtrl->m_pcMbData[(iMbY - iMbOrigY)*uiMbStride + (iMbX - iMbOrigX)], bDirect8x8, m_uiSliceId ) );
rcMbDes.setInCropWindowFlag( true );
}
//////////////////////////////////////////////////////////
//VBL
///////////////////////////////////////////////////////////
if( pcVBLMbDataCtrl !=pcBaseMbDataCtrl)
{
pcVBLMbDataCtrl->uninit();
delete pcVBLMbDataCtrl;
}
/////////////////////////////////////////////////////////////
return Err::m_nOK;
}
// motion upsampling with any cropping and upsampling factor
ErrVal
MbDataCtrl::xUpsampleMotionESS( MbDataCtrl& rcBaseMbDataCtrl,
ResizeParameters* pcParameters )
{
Bool bDirect8x8 = rcBaseMbDataCtrl.xGetDirect8x8InferenceFlag();
if( pcParameters->m_iExtendedSpatialScalability == ESS_PICT )
{
Int index = m_pcSliceHeader->getPoc();
pcParameters->setPoc( index );
pcParameters->setCurrentPictureParametersWith(index);
}
Int iScaledBaseOrigX = pcParameters->m_iPosX;
Int iScaledBaseOrigY = pcParameters->m_iPosY;
Int iMbOrigX = (iScaledBaseOrigX+15) / 16;
Int iMbOrigY = (iScaledBaseOrigY+15) / 16;
Int iMbEndX = (iScaledBaseOrigX+pcParameters->m_iOutWidth) / 16;
Int iMbEndY = (iScaledBaseOrigY+pcParameters->m_iOutHeight) / 16;
Int aiPelOrig[2];
UInt uiBaseMbStride, uiBLMbOffset, uiConfig=0;
UInt uiMbStride = m_iMbPerLine;
//////////////////////////////////////////////////////////
//VBL
//////////////////////////////////////////////////////////
MbDataCtrl *pcBaseMbDataCtrl = &rcBaseMbDataCtrl;
MbDataCtrl *pcVBLMbDataCtrl = NULL;
pcVBLMbDataCtrl=xBuildVirtualBaseLayer(pcBaseMbDataCtrl,m_bBuildInterlacePred,pcParameters);
// SET PICTURE SIZE PARAMETERS
xInitVBLUpsampleData(pcVBLMbDataCtrl,pcParameters,uiConfig,iMbOrigY,iMbEndY ,iScaledBaseOrigY,uiBaseMbStride);
/////////////////////////////////////////////////////////////
// loop on MBs of high res picture
//--------------------------------
for( Int iMbY = 0; iMbY < m_iMbPerColumn; iMbY++ )
{
for( Int iMbX = 0; iMbX < m_iMbPerLine; iMbX++ )
{
//VBL
xInitVBLPelOrig( pcVBLMbDataCtrl,uiConfig,iMbX,iMbY,iScaledBaseOrigX,iScaledBaseOrigY,aiPelOrig,uiBLMbOffset);
// get current high res MB and upsampling
MbData& rcMbDes = m_pcMbData[iMbY*uiMbStride + iMbX];
rcMbDes.configureFieldFrameMode( m_bBuildInterlacePred );
// check if MB is inside cropping window - if not, no upsampling is performed
if ( (iMbX >= iMbOrigX) && (iMbX < iMbEndX) && (iMbY >= iMbOrigY) && (iMbY < iMbEndY) )
{
RNOK(rcMbDes.upsampleMotionESS(pcVBLMbDataCtrl->m_pcMbData+uiBLMbOffset,
uiBaseMbStride,
aiPelOrig,
bDirect8x8,
pcParameters));
rcMbDes.setInCropWindowFlag( true );
}
else
{
rcMbDes.noUpsampleMotion();
}
} // end of for( Int iMbX = 0; iMbX < m_iMbPerLine; iMbX++ )
} // end of for( Int iMbY = 0; iMbY < m_iMbPerColumn; iMbY++ )
//////////////////////////////////////////////////////////
//VBL
///////////////////////////////////////////////////////////
// RESET PICTURE SIZE PARAMETERS
xUninitVBLUpsampleData( pcParameters, uiConfig );
if( pcVBLMbDataCtrl != pcBaseMbDataCtrl)
{
pcVBLMbDataCtrl->uninit();
delete pcVBLMbDataCtrl;
}
/////////////////////////////////////////////////////////////
return Err::m_nOK;
}
ErrVal
MbDataCtrl::xUninitVBLUpsampleData( ResizeParameters* pcParameters,
UInt uiConfig )
{
if ( uiConfig == 2 ) // BL Prog -> VBL Prog -> EL Interl with He>=2.Hb
{
pcParameters->m_iOutHeight *= 2;
}
else if( uiConfig == 3 ) // BL prog, Frame or Field -> VBL Interl Field -> EL Interl
{
pcParameters->m_iInHeight *= 2;
pcParameters->m_iOutHeight *= 2;
}
else if( uiConfig == 4 ) // BL Field -> VBL Interl -> EL Prog
{
pcParameters->m_iInHeight *= 2;
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::xInitVBLUpsampleData( MbDataCtrl* pcBaseMbDataCtrl,
ResizeParameters* pcParameters,
UInt& ruiConfig,
Int& riMbOrigY,
Int& riMbEndY ,
Int& riScaledBaseOrigY,
UInt& ruiBaseMbStride )
{
const SliceHeader* pcBaseSliceHeader = pcBaseMbDataCtrl->m_pcSliceHeader;
ROT( NULL == pcBaseSliceHeader);
Bool bBaseProg = !pcBaseSliceHeader->isMbAff() && !pcBaseSliceHeader->getFieldPicFlag();
//Bool bBaseProg = !pcParameters->m_bBaseIsMbAff && !pcParameters->m_bBaseFieldPicFlag;
Bool bBaseField = pcBaseSliceHeader->getFieldPicFlag();
//Bool bBaseField = pcParameters->m_bBaseFieldPicFlag;
// SET PICTURE SIZE PARAMETERS
if ( m_bBuildInterlacePred && bBaseProg && pcParameters->m_iOutHeight>=2*pcParameters->m_iInHeight )
{
// BL Prog -> VBL Prog -> EL Interl with He>=2.Hb
ruiConfig = 2;
riMbOrigY += (riMbOrigY%2);
riMbEndY -= (riMbEndY%2);
riScaledBaseOrigY /= 2;
ruiBaseMbStride = pcBaseMbDataCtrl->m_iMbPerLine;
pcParameters->m_iOutHeight /= 2;
}
else if ( !m_bBuildInterlacePred && bBaseField )
{
// BL Field -> VBL Interl -> EL Prog
ruiConfig = 4;
ruiBaseMbStride = 2 * pcBaseMbDataCtrl->m_iMbPerLine;
pcParameters->m_iInHeight /= 2;
}
else if( m_bBuildInterlacePred )
{
// BL prog, Frame or Field -> VBL Interl Field -> EL Interl
ruiConfig = 3;
riMbOrigY += (riMbOrigY%2);
riMbEndY -= (riMbEndY%2);
riScaledBaseOrigY /= 2;
ruiBaseMbStride = 2 * pcBaseMbDataCtrl->m_iMbPerLine;
pcParameters->m_iInHeight /= 2;
pcParameters->m_iOutHeight /= 2;
}
else
{
// BL Prog -> VBL Prog -> EL Prog
ruiConfig = 1;
ruiBaseMbStride = pcBaseMbDataCtrl->m_iMbPerLine;
if (pcParameters->m_bIsMbAff)
{
riMbOrigY += (riMbOrigY%2);
riMbEndY -= (riMbEndY%2);
}
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::xInitVBLPelOrig( MbDataCtrl* pcBaseMbDataCtrl,
UInt uiConfig,
Int iMbX,
Int iMbY,
Int iScaledBaseOrigX,
Int iScaledBaseOrigY,
Int aiPelOrig[2],
UInt& ruiBLMbOffset)
{
aiPelOrig[0] = (Int)16 * iMbX - iScaledBaseOrigX;
if (uiConfig == 1) // VBL prog -> EL prog
{
ruiBLMbOffset = 0;
aiPelOrig[1] = (Int)16 * iMbY - iScaledBaseOrigY;
}
else if (uiConfig == 2) // VBL prog -> EL interl && He>=Hb/2
{
ruiBLMbOffset = 0;
aiPelOrig[1] = (Int)16 * (iMbY/2) - iScaledBaseOrigY;
}
else if (uiConfig == 3) // VBL Interl -> EL Interl
{
ruiBLMbOffset = (iMbY%2) * pcBaseMbDataCtrl->m_iMbPerLine; //EL TOP (BOT) MBs deduced from BL TOP (BOT) MBs
aiPelOrig[1] = (Int)16 * (iMbY/2) - iScaledBaseOrigY;
}
else if (uiConfig == 4) // VBL Interl Field -> EL prog
{
ruiBLMbOffset = pcBaseMbDataCtrl->m_uiMbOffset; // depends on the current BL field (if top-->0, if bottom-->pcBaseMbDataCtrl->m_uiMbStride)
aiPelOrig[1] = (Int)16 * iMbY - iScaledBaseOrigY;
}
return Err::m_nOK;
}
//TMM_INTERLACE }
ErrVal
MbDataCtrl::upsampleMotion( MbDataCtrl& rcBaseMbDataCtrl, ResizeParameters* pcParameters )
{
if(NULL==pcParameters)
return copyMotion(rcBaseMbDataCtrl);
if(pcParameters->m_iSpatialScalabilityType==SST_RATIO_1)
return copyMotionBL(rcBaseMbDataCtrl, pcParameters);
return xUpsampleMotionESS(rcBaseMbDataCtrl, pcParameters);
}
// TMM_ESS_UNIFIED }
ErrVal MbDataCtrl::uninit()
{
m_ucLastMbQp = 0;
m_uiMbStride = 0;
m_uiMbOffset = 0;
m_iMbPerLine = 0;
m_iMbPerColumn = 0;
m_uiMbProcessed = 0;
m_uiSliceId = 0;
m_pcMbDataCtrl0L1 = 0;
RNOK( m_cMbProcessed.uninit() );
for( UInt n = 0; n < m_cpDFPBuffer.size(); n++ )
{
delete m_cpDFPBuffer.get( n );
m_cpDFPBuffer.set( n, NULL );
}
RNOK( m_cpDFPBuffer.uninit() );
m_bInitDone = false;
return Err::m_nOK;
}
// for SVC to AVC rewrite
ErrVal
MbDataCtrl::copyTCoeffs( MbDataCtrl& rcMbDataCtrl )
{
for( UInt n = 0; n < m_uiSize; n++ )
{
RNOK( m_pcMbData[n].copyTCoeffs( rcMbDataCtrl.m_pcMbData[n] ) );
}
return Err::m_nOK;
}
// for SVC to AVC rewrite
ErrVal
MbDataCtrl::copyIntraPred( MbDataCtrl& rcMbDataCtrl )
{
for( UInt n = 0; n < m_uiSize; n++ )
{
RNOK( m_pcMbData[n].copyIntraPred( rcMbDataCtrl.m_pcMbData[n] ) );
}
return Err::m_nOK;
}
ErrVal MbDataCtrl::reset()
{
m_ucLastMbQp = 0;
m_uiMbProcessed = 0;
m_uiSliceId = 0;
m_pcMbDataCtrl0L1 = 0;
return Err::m_nOK;
}
ErrVal MbDataCtrl::initSlice( SliceHeader& rcSH,
ProcessingState eProcessingState,
Bool bDecoder,
MbDataCtrl* pcMbDataCtrl )
{
AOF_DBG( m_bInitDone );
m_eProcessingState = eProcessingState;
m_pcMbDataCtrl0L1 = NULL;
m_iColocatedOffset = 0;
m_bUseTopField = false;
m_bPicCodedField = rcSH.getFieldPicFlag();
if( rcSH.isInterB() )
{
if( rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE &&
rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_SCALABLE && bDecoder
&& rcSH.getRefListSize( LIST_1 ) )
{
const RefPic& rcRefPic0L1 = rcSH.getRefPic( 1, rcSH.getPicType(), LIST_1 );
//EIDR bug-fix
// const RefPic& rcRefPic0L1 = ( rcSH.getRefListSize(LIST_1) > 1 && rcSH.getRefPic(2, rcSH.getPicType(), LIST_1).getFrame()->getPoc() < rcSH.getRefPic(1, rcSH.getPicType(), LIST_1).getFrame()->getPoc() && rcSH.getRefPic(2, rcSH.getPicType(), LIST_1).getFrame()->getPoc() > rcSH.getPoc()) ?
// rcSH.getRefPic( 2, rcSH.getPicType(), LIST_1 ) : rcSH.getRefPic( 1, rcSH.getPicType(), LIST_1 );
AOF_DBG( rcRefPic0L1.isAvailable() );
const FrameUnit* pcFU = rcRefPic0L1.getFrame()->getFrameUnit();
Int iCurrPoc = rcSH.getPoc();
Int iTopDiffPoc = iCurrPoc - pcFU->getPic( TOP_FIELD )->getPoc();
Int iBotDiffPoc = iCurrPoc - pcFU->getPic( BOT_FIELD )->getPoc();
m_bUseTopField = ( abs( iTopDiffPoc ) < abs( iBotDiffPoc ) );
m_pcMbDataCtrl0L1 = pcFU->getMbDataCtrl();
if( FRAME != rcSH.getPicType() )
{
if( rcRefPic0L1.getFrame()->getPicType() != rcSH.getPicType() && m_pcMbDataCtrl0L1->isPicCodedField() )
{
m_iColocatedOffset = m_iMbPerLine;
}
}
}
if( pcMbDataCtrl )
{
m_pcMbDataCtrl0L1 = pcMbDataCtrl;
}
}
if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState )
{
m_uiSliceId++;
//manu.mathew@samsung : memory leak fix
if( m_cpDFPBuffer.get( m_uiSliceId ) )
{
delete m_cpDFPBuffer.get( m_uiSliceId );
m_cpDFPBuffer.set( m_uiSliceId, NULL );
}
//--
m_cpDFPBuffer.set( m_uiSliceId, rcSH.getDeblockingFilterParameterScalable().getCopy() );
m_bDirect8x8InferenceFlag = rcSH.getSPS().getDirect8x8InferenceFlag();
}
m_pcSliceHeader = &rcSH;
Int iMbPerColumn = rcSH.getSPS().getFrameHeightInMbs ();
m_iMbPerLine = rcSH.getSPS().getFrameWidthInMbs ();
m_uiMbOffset = rcSH.getBottomFieldFlag() ? 1 * m_iMbPerLine : 0;
m_uiMbStride = rcSH.getFieldPicFlag () ? 2 * m_iMbPerLine : m_iMbPerLine;
m_iMbPerColumn = rcSH.getFieldPicFlag () ? iMbPerColumn>>1 : iMbPerColumn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -