mbdatactrl.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,073 行 · 第 1/3 页
CPP
1,073 行
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::copyBaseResidualAvailFlags( MbDataCtrl& rcSrcMbDataCtrl )
{
for( UInt uiMbIdx = 0 ; uiMbIdx < m_uiSize; uiMbIdx ++ )
m_pcMbData[uiMbIdx].setResidualAvailFlagsBase( rcSrcMbDataCtrl.m_pcMbData[uiMbIdx].getResidualAvailFlagsBase() );
return Err::m_nOK;
}
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 && 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;
m_pabFgsBQ8x8Trafo [uiMbIndex] = bT8x8;
}
return Err::m_nOK;
}
ErrVal
MbDataCtrl::initFgsBQData( UInt uiNumMb )
{
ROT( m_pacFgsBQMbQP );
ROT( m_pauiFgsBQMbCbp );
ROT( m_pauiFgsBQBCBP );
ROT( m_pabFgsBQ8x8Trafo );
ROFS( ( m_pacFgsBQMbQP = new UChar [uiNumMb] ) );
ROFS( ( m_pauiFgsBQMbCbp = new UInt [uiNumMb] ) );
ROFS( ( m_pauiFgsBQBCBP = new UInt [uiNumMb] ) );
ROFS( ( m_pabFgsBQ8x8Trafo = new Bool [uiNumMb] ) );
return Err::m_nOK;
}
ErrVal
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?