mbdatactrl.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,133 行 · 第 1/3 页
CPP
1,133 行
Int iMbX,iMbY,iBaseMbY,iBaseMbX,iPar;
UInt uiBaseMbStride=rcBaseMbDataCtrl.m_uiMbStride;
Int iMbOrigX = pcParameters->m_iPosX/16;
Int iMbOrigY = pcParameters->m_iPosY/16;
Int iMbEndX = iMbOrigX + pcParameters->m_iOutWidth/16;
Int iMbEndY = iMbOrigY + pcParameters->m_iOutHeight/16;
//loop on scaled base window MBs
for( iMbY = iMbOrigY,iBaseMbY = 0 ; iMbY < iMbEndY; iMbY+=2,iBaseMbY++)
for( iMbX = iMbOrigX,iBaseMbX = 0 ; iMbX < iMbEndX; iMbX+=2,iBaseMbX++)
for( iPar = 0; iPar < 4; iPar++ )
{
MbData& rcMbDes = m_pcMbData[(iMbY+(iPar/2))*m_uiMbStride+(iMbX+(iPar%2))];
MbData& rcMbSrc = rcBaseMbDataCtrl.m_pcMbData[iBaseMbY*uiBaseMbStride+iBaseMbX];
Par8x8 ePar = Par8x8( iPar );
rcMbDes.setInCropWindowFlag( true );
RNOK( rcMbDes.upsampleMotion( rcMbSrc, ePar, bDirect8x8 ) );
}
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 iScaledBaseWidth = pcParameters->m_iOutWidth;
Int iScaledBaseHeight = pcParameters->m_iOutHeight;
Int aiPelOrig[2];
// loop on MBs of high res picture
//--------------------------------
for( Int iMbY = 0; iMbY < m_iMbPerColumn; iMbY++ )
{
for( Int iMbX = 0; iMbX < m_iMbPerLine; iMbX++ )
{
// get current high res MB and upsampling
MbData& rcMbDes = m_pcMbData[iMbY*m_uiMbStride+iMbX];
// check if MB is inside cropping window - if not, no upsampling is performed
if ( (iMbX >= (iScaledBaseOrigX+15) / 16) && (iMbX < (iScaledBaseOrigX+iScaledBaseWidth) / 16) &&
(iMbY >= (iScaledBaseOrigY+15) / 16) && (iMbY < (iScaledBaseOrigY+iScaledBaseHeight) / 16) )
{
aiPelOrig[0]=(Int)16*iMbX-iScaledBaseOrigX;
aiPelOrig[1]=(Int)16*iMbY-iScaledBaseOrigY;
RNOK(rcMbDes.upsampleMotionESS(rcBaseMbDataCtrl.m_pcMbData,
rcBaseMbDataCtrl.m_uiMbStride,
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++ )
return Err::m_nOK;
}
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;
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;
}
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;
if( rcSH.isInterB() )
{
if( ((rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE &&
rcSH.getNalUnitType() != NAL_UNIT_CODED_SLICE_SCALABLE) || rcSH.getSvcMvcFlag() ) && bDecoder)
{
const RefPic& rcRefPic0L1 = rcSH.getRefPic( 1, LIST_1 );
AOF_DBG( rcRefPic0L1.isAvailable() );
const FrameUnit* pcFU = rcRefPic0L1.getPic().getFrameUnit();
m_pcMbDataCtrl0L1 = pcFU->getMbDataCtrl();
}
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.getDeblockingFilterParameter().getCopy() );
m_bDirect8x8InferenceFlag = rcSH.getSPS().getDirect8x8InferenceFlag();
}
m_pcSliceHeader = &rcSH;
Int iMbPerColumn = rcSH.getSPS().getFrameHeightInMbs ();
m_iMbPerLine = rcSH.getSPS().getFrameWidthInMbs ();
m_uiMbOffset = 0;
m_uiMbStride = m_iMbPerLine;
m_iMbPerColumn = iMbPerColumn;
m_ucLastMbQp = rcSH.getPicQp();
H264AVC_DELETE_CLASS( m_pcMbDataAccess );
return Err::m_nOK;
}
const MbData& MbDataCtrl::xGetColMbData( UInt uiIndex )
{
return (( m_pcMbDataCtrl0L1 == NULL ) ? xGetOutMbData() : m_pcMbDataCtrl0L1->getMbData( uiIndex ));
}
const MbData& MbDataCtrl::xGetRefMbData( UInt uiSliceId, Int uiCurrSliceID, Int iMbY, Int iMbX, Bool bLoopFilter )
{
// check whether ref mb is inside
ROTRS( iMbX < 0, xGetOutMbData() );
ROTRS( iMbY < 0, xGetOutMbData() );
ROTRS( iMbX >= m_iMbPerLine, xGetOutMbData() );
ROTRS( iMbY >= m_iMbPerColumn, xGetOutMbData() );
//--ICU/ETRI FMO Implementation
ROTRS( uiCurrSliceID != getSliceGroupIDofMb(iMbY * m_uiMbStride + iMbX + m_uiMbOffset ) , xGetOutMbData() );
// get the ref mb data
const MbData& rcMbData = getMbData( iMbY * m_uiMbStride + iMbX + m_uiMbOffset );
// test slice id
return (( rcMbData.getSliceId() == uiSliceId || bLoopFilter ) ? rcMbData : xGetOutMbData() );
}
ErrVal MbDataCtrl::initMb( MbDataAccess*& rpcMbDataAccess, UInt uiMbY, UInt uiMbX, const Int iForceQp )
{
ROF( m_bInitDone );
AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize );
Bool bLf = (m_eProcessingState == POST_PROCESS);
UInt uiCurrIdx = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
MbData& rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
if( m_pcMbDataAccess )
{
m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp();
}
UInt uiSliceId = rcMbDataCurr.getSliceId();
if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState)
{
if( 0 == uiSliceId )
{
uiSliceId = m_uiSliceId;
rcMbDataCurr.getMbTCoeffs().clear();
rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId );
rcMbDataCurr.clear();
m_uiMbProcessed++;
}
else
{
//allready assigned;
if( ENCODE_PROCESS != m_eProcessingState )
{
AF();
}
else
{
if( iForceQp != -1 )
{
m_ucLastMbQp = iForceQp;
}
}
}
}
Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset);
m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess(
rcMbDataCurr, // current
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY, uiMbX-1, bLf ), // left //--ICU/ETRI FMO Implementation
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX , bLf ), // above //--ICU/ETRI FMO Implementation
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX-1, bLf ), // above left //--ICU/ETRI FMO Implementation
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf ), // above right //--ICU/ETRI FMO Implementation
xGetOutMbData(), // unvalid
xGetColMbData( uiCurrIdx ),
*m_pcSliceHeader,
*m_cpDFPBuffer.get( uiSliceId ),
uiMbX,
uiMbY,
m_ucLastMbQp );
ROT( NULL == m_pcMbDataAccess );
rpcMbDataAccess = m_pcMbDataAccess;
return Err::m_nOK;
}
//TMM_EC {{
ErrVal MbDataCtrl::initMbTDEnhance( MbDataAccess*& rpcMbDataAccess, MbDataCtrl *pcMbDataCtrl, MbDataCtrl *pcMbDataCtrlRef, UInt uiMbY, UInt uiMbX, const Int iForceQp )
{
ROF( m_bInitDone );
AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize );
Bool bLf = (m_eProcessingState == POST_PROCESS);
UInt uiCurrIdx = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset;
MbData& rcMbDataCurr = m_pcMbData[ uiCurrIdx ];
if( m_pcMbDataAccess )
{
m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp();
}
UInt uiSliceId = rcMbDataCurr.getSliceId();
if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState)
{
if( 0 == uiSliceId )
{
uiSliceId = m_uiSliceId;
rcMbDataCurr.getMbTCoeffs().clear();
rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId );
rcMbDataCurr.clear();
m_uiMbProcessed++;
}
else
{
//allready assigned;
if( ENCODE_PROCESS != m_eProcessingState )
{
AF();
}
else
{
if( iForceQp != -1 )
{
m_ucLastMbQp = iForceQp;
}
}
}
}
Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset);
m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess(
rcMbDataCurr, // current
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY, uiMbX-1, bLf ), // left
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX , bLf ), // above
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX-1, bLf ), // above left
xGetRefMbData( uiSliceId, icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf ), // above right
xGetOutMbData(), // unvalid
pcMbDataCtrlRef->getMbData( uiMbX, uiMbY),
*m_pcSliceHeader,
*m_cpDFPBuffer.get( uiSliceId ),
uiMbX,
uiMbY,
m_ucLastMbQp );
ROT( NULL == m_pcMbDataAccess );
rpcMbDataAccess = m_pcMbDataAccess;
return Err::m_nOK;
}
//TMM_EC }}
ErrVal
MbDataCtrl::storeFgsBQLayerQpAndCbp()
{
ROF( m_pacFgsBQMbQP );
ROF( m_pauiFgsBQMbCbp );
ROF( m_pauiFgsBQBCBP );
ROF( m_pabFgsBQ8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ )
{
m_pacFgsBQMbQP [uiMbIndex] = getMbData( uiMbIndex ).getQp();
m_pauiFgsBQMbCbp [uiMbIndex] = getMbData( uiMbIndex ).getMbExtCbp();
m_pauiFgsBQBCBP [uiMbIndex] = getMbData( uiMbIndex ).getBCBP();
m_pabFgsBQ8x8Trafo [uiMbIndex] = getMbData( uiMbIndex ).isTransformSize8x8();
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::switchFgsBQLayerQpAndCbp()
{
ROF( m_pacFgsBQMbQP );
ROF( m_pauiFgsBQMbCbp );
ROF( m_pauiFgsBQBCBP );
ROF( m_pabFgsBQ8x8Trafo );
for( UInt uiMbIndex = 0; uiMbIndex < getSize(); uiMbIndex++ )
{
UChar ucQP = getMbData( uiMbIndex ).getQp();
UInt uiCbp = getMbData( uiMbIndex ).getMbExtCbp();
UInt uiBCBP= getMbData( uiMbIndex ).getBCBP();
Bool bT8x8 = getMbData( uiMbIndex ).isTransformSize8x8();
getMbDataByIndex( uiMbIndex ).setQp ( m_pacFgsBQMbQP [uiMbIndex] );
getMbDataByIndex( uiMbIndex ).setMbExtCbp ( m_pauiFgsBQMbCbp [uiMbIndex] );
getMbDataByIndex( uiMbIndex ).setBCBP ( m_pauiFgsBQBCBP [uiMbIndex] );
getMbDataByIndex( uiMbIndex ).setTransformSize8x8 ( m_pabFgsBQ8x8Trafo [uiMbIndex] );
m_pacFgsBQMbQP [uiMbIndex] = ucQP;
m_pauiFgsBQMbCbp [uiMbIndex] = uiCbp;
m_pauiFgsBQBCBP [uiMbIndex] = uiBCBP;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?