loopfilter.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,794 行 · 第 1/5 页
CPP
1,794 行
cBuffer.loadSurrounding( pcFrame->getFullPelYuvBuffer() );
RNOK( m_pcReconstructionBypass->padRecMb( &cBuffer, uiMask ) );
pcFrame->getFullPelYuvBuffer()->loadBuffer( &cBuffer );
}
}
uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress );
}
}
//<- ICU/ETRI DS
// Hanke@RWTH: Reset pointer
setHighpassFramePointer();
return Err::m_nOK;
}
__inline ErrVal LoopFilter::xFilterMb( const MbDataAccess* pcMbDataAccessMot,
const MbDataAccess* pcMbDataAccessRes,
IntYuvPicBuffer* pcYuvBuffer,
RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
bool spatial_scalable_flg) // SSUN@SHARP
{
const DFP& rcDFP = pcMbDataAccessRes->getDeblockingFilterParameter();
const Int iFilterIdc = rcDFP.getDisableDeblockingFilterIdc();
ROTRS( iFilterIdc == 1, Err::m_nOK );
ROTRS( (m_eLFMode & LFM_NO_INTER_FILTER) && ! pcMbDataAccessRes->getMbData().isIntra(), Err::m_nOK );
Bool b8x8 = pcMbDataAccessRes->getMbData().isTransformSize8x8();
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( !b8x8 || ( ( cIdx.x() & 1 ) == 0 ) )
{
m_aaaucBs[VER][cIdx.x()][cIdx.y()] = xGetVerFilterStrength_RefIdx( pcMbDataAccessMot,
pcMbDataAccessRes,
cIdx,
iFilterIdc,
pcRefFrameList0,
pcRefFrameList1,
spatial_scalable_flg ); // SSUN@SHARP
}
else
{
m_aaaucBs[VER][cIdx.x()][cIdx.y()] = 0;
}
if( !b8x8 || ( ( cIdx.y() & 1 ) == 0 ) )
{
m_aaaucBs[HOR][cIdx.x()][cIdx.y()] = xGetHorFilterStrength_RefIdx( pcMbDataAccessMot,
pcMbDataAccessRes,
cIdx,
iFilterIdc,
pcRefFrameList0,
pcRefFrameList1,
spatial_scalable_flg ); // SSUN@SHARP
}
else
{
m_aaaucBs[HOR][cIdx.x()][cIdx.y()] = 0;
}
}
RNOK( xLumaVerFiltering( *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
RNOK( xLumaHorFiltering( *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
RNOK( xChromaVerFiltering( *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
RNOK( xChromaHorFiltering( *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
return Err::m_nOK;
}
__inline UInt LoopFilter::xGetVerFilterStrength_RefIdx( const MbDataAccess* pcMbDataAccessMot,
const MbDataAccess* pcMbDataAccessRes,
LumaIdx cIdx,
Int iFilterIdc,
RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
bool spatial_scalable_flg ) // SSUN@SHARP
{
// SSUN@SHARP JVT-P013r1
if(spatial_scalable_flg)
{
if( cIdx.x() )
{
const MbData& rcMbDataCurr = pcMbDataAccessRes->getMbDataCurr();
if( rcMbDataCurr.isIntra_BL() )
{
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 1 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 1 );
return( 0 );
}
}
else if(pcMbDataAccessRes->isAvailableLeft() || ( pcMbDataAccessRes->isLeftMbExisting() && iFilterIdc != 2 )){
const MbData& rcMbDataCurr = pcMbDataAccessRes->getMbDataCurr();
const MbData& rcMbDataLeft = pcMbDataAccessRes->getMbDataLeft();
if(rcMbDataCurr.isIntra_BL() && rcMbDataLeft.isIntra_BL()){
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 1 );
ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 1 );
return(0);
}
else if(rcMbDataCurr.isIntra_BL()){
ROTRS( rcMbDataLeft.isIntra_nonBL(), 4 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
if( m_pcHighpassYuvBuffer && !rcMbDataLeft.isIntra()) {
ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero ( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
}
else{
ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 2 );
}
return(1);
}
else if(rcMbDataLeft.isIntra_BL()){
ROTRS( rcMbDataCurr.isIntra_nonBL(), 4 );
ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 2 );
if( m_pcHighpassYuvBuffer ) {
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
}
else {
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
}
return(1);
}
}
}
// SSUN@SHARP end of JVT-P013r1
else{
//-- Samsung 2005.02.xx
if(pcMbDataAccessRes->getMbDataCurr().getMbMode() == INTRA_BL)
{
if( cIdx.x() )
{
return 1; // if not MB_boundary
}
// is either in same slice or deblocking across slice boundaries is enabled (and the XXX macroblock is inside the picture)
if( ( pcMbDataAccessRes->isAvailableLeft() || ( pcMbDataAccessRes->isLeftMbExisting() && iFilterIdc != 2 ) ) &&
pcMbDataAccessRes->getMbDataLeft().getMbMode() == INTRA_BL )
{
return 1;
}
}
//--
}
ROFRS( pcMbDataAccessMot, cIdx.x() ? 3 : ((iFilterIdc==2 && !pcMbDataAccessRes->isAvailableLeft())|| !pcMbDataAccessRes->isLeftMbExisting()) ? 0 : 4 );
const MbData& rcMbDataCurrMot = pcMbDataAccessMot->getMbDataCurr();
const MbData& rcMbDataCurrRes = pcMbDataAccessRes->getMbDataCurr();
Short sHorMvThr = 4;
Short sVerMvThr = 4;
if( cIdx.x() )
{
// this is a edge inside of a macroblock
ROTRS( rcMbDataCurrMot.isIntra(), 3 );
// Hanke@RWTH
if( m_pcHighpassYuvBuffer ) {
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 );
}else{
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 );
}
if( rcMbDataCurrMot.isInterPMb() )
{
return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_LEFT_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0 );
}
return xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_LEFT_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0, *pcRefFrameList1 );
}
// if we get here we are on a macroblock edge
ROTRS( iFilterIdc == 2 && ! pcMbDataAccessMot->isAvailableLeft(), 0 );
ROTRS( ! pcMbDataAccessMot->isLeftMbExisting(), 0 );
const MbData& rcMbDataLeftMot = pcMbDataAccessMot->getMbDataLeft();
const MbData& rcMbDataLeftRes = pcMbDataAccessRes->getMbDataLeft();
ROTRS( LFM_DEFAULT_FILTER != m_eLFMode && rcMbDataCurrMot.isIntra() ^ rcMbDataLeftMot.isIntra(), 0 );
ROTRS( rcMbDataCurrMot.isIntra(), 4 );
ROTRS( rcMbDataLeftMot.isIntra(), 4 );
// Hanke@RWTH
if( m_pcHighpassYuvBuffer ) {
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
ROTRS( rcMbDataLeftRes.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero ( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
}else{
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataLeftRes.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
}
if( rcMbDataCurrMot.isInterPMb() && rcMbDataLeftMot.isInterPMb())
{
return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataLeftMot, cIdx + LEFT_MB_LEFT_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0);
}
return xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataLeftMot, cIdx + LEFT_MB_LEFT_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0, *pcRefFrameList1 );
}
__inline UInt LoopFilter::xGetHorFilterStrength_RefIdx( const MbDataAccess* pcMbDataAccessMot,
const MbDataAccess* pcMbDataAccessRes,
LumaIdx cIdx,
Int iFilterIdc,
RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
bool spatial_scalable_flg ) // SSUN@SHARP
{
// SSUN@SHARP JVT-P013r1
if(spatial_scalable_flg){
if( cIdx.y() )
{
const MbData& rcMbDataCurr = pcMbDataAccessRes->getMbDataCurr();
if( rcMbDataCurr.isIntra_BL() )
{
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 1 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 1 );
return( 0 );
}
}
else if(pcMbDataAccessRes->isAvailableAbove() || ( pcMbDataAccessRes->isAboveMbExisting() && iFilterIdc != 2 )){
const MbData& rcMbDataCurr = pcMbDataAccessRes->getMbDataCurr();
const MbData& rcMbDataAbove = pcMbDataAccessRes->getMbDataAbove();
if(rcMbDataCurr.isIntra_BL() && rcMbDataAbove.isIntra_BL()){
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 1 );
ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 1 );
return(0);
}
if(rcMbDataCurr.isIntra_BL()){
ROTRS( rcMbDataAbove.isIntra_nonBL(), 4 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
if( m_pcHighpassYuvBuffer && !rcMbDataAbove.isIntra() ) {
ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isAbove4x4BlkNotZero ( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
}
else{
ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 2 );
}
return(1);
}
else if(rcMbDataAbove.isIntra_BL()){
ROTRS( rcMbDataCurr.isIntra_nonBL(), 4 );
ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 2 );
if( m_pcHighpassYuvBuffer ) {
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
}
else {
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
}
return(1);
}
}
}
// SSUN@SHARP end of JVT-P013r1
else{
//-- Samsung 2005.02.xx
if(pcMbDataAccessRes->getMbDataCurr().getMbMode() == INTRA_BL)
{
if( cIdx.y() )
{
return 1; // if not MB_boundary
}
// is either in same slice or deblocking across slice boundaries is enabled (and the XXX macroblock is inside the picture)
if( ( pcMbDataAccessRes->isAvailableAbove() || ( pcMbDataAccessRes->isAboveMbExisting() && iFilterIdc != 2 ) ) &&
pcMbDataAccessRes->getMbDataAbove().getMbMode() == INTRA_BL )
{
return 1;
}
}
//--
}
ROFRS( pcMbDataAccessMot, cIdx.y() ? 3 : ((iFilterIdc==2 && !pcMbDataAccessRes->isAvailableAbove())|| !pcMbDataAccessRes->isAboveMbExisting()) ? 0 : 4 );
const MbData& rcMbDataCurrMot = pcMbDataAccessMot->getMbDataCurr();
const MbData& rcMbDataCurrRes = pcMbDataAccessRes->getMbDataCurr();
Short sHorMvThr = 4;
Short sVerMvThr = 4;
if( cIdx.y() )
{
// internal edge
ROTRS( rcMbDataCurrMot.isIntra(), 3 );
// Hanke@RWTH
if( m_pcHighpassYuvBuffer ) {
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 );
}else{
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 );
}
if( rcMbDataCurrMot.isInterPMb() )
{
return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_ABOVE_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0 );
}
return xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_ABOVE_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0, *pcRefFrameList1 );
}
// if we get here we are on a macroblock edge
ROTRS( iFilterIdc == 2 && ! pcMbDataAccessMot->isAvailableAbove(), 0 );
ROTRS( ! pcMbDataAccessMot->isAboveMbExisting(), 0 );
const MbData& rcMbDataAboveMot = pcMbDataAccessMot->getMbDataAbove();
const MbData& rcMbDataAboveRes = pcMbDataAccessRes->getMbDataAbove();
ROTRS( LFM_DEFAULT_FILTER != m_eLFMode && rcMbDataCurrMot.isIntra() ^ rcMbDataAboveMot.isIntra(), 0 );
ROTRS( rcMbDataCurrMot. isIntra(), 4 );
ROTRS( rcMbDataAboveMot.isIntra(), 4 );
// Hanke@RWTH
if( m_pcHighpassYuvBuffer ) {
ROTRS( rcMbDataCurrRes. is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
ROTRS( rcMbDataAboveRes.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
ROTRS( m_pcHighpassYuvBuffer->isAbove4x4BlkNotZero ( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
}else{
ROTRS( rcMbDataCurrRes. is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataAboveRes.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
}
if( rcMbDataCurrMot.isInterPMb() && rcMbDataAboveMot.isInterPMb())
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?