loopfilter.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,792 行 · 第 1/5 页
CPP
1,792 行
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())
{
return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataAboveMot, cIdx + ABOVE_MB_ABOVE_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0 );
}
return xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataAboveMot, cIdx + ABOVE_MB_ABOVE_NEIGHBOUR,
sHorMvThr, sVerMvThr,
*pcRefFrameList0, *pcRefFrameList1 );
}
UChar LoopFilter::xCheckMvDataP_RefIdx( const MbData& rcQMbData,
const LumaIdx cQIdx,
const MbData& rcPMbData,
const LumaIdx cPIdx,
const Short sHorMvThr,
const Short sVerMvThr,
RefFrameList& rcRefFrameList0 )
{
const MbMotionData& rcMbMotionDataL0Q = rcQMbData.getMbMotionData( LIST_0 );
const MbMotionData& rcMbMotionDataL0P = rcPMbData.getMbMotionData( LIST_0 );
IntFrame* pcRefPicL0Q = rcRefFrameList0[ rcMbMotionDataL0Q.getRefIdx( cQIdx ) ];
IntFrame* pcRefPicL0P = rcRefFrameList0[ rcMbMotionDataL0P.getRefIdx( cPIdx ) ];
// different reference pictures
ROTRS( pcRefPicL0Q != pcRefPicL0P, 1 );
// check the motion vector distance
const Mv& cMvQ = rcMbMotionDataL0Q.getMv( cQIdx );
const Mv& cMvP = rcMbMotionDataL0P.getMv( cPIdx );
ROTRS( cMvP.getAbsHorDiff( cMvQ ) >= sHorMvThr, 1 );
ROTRS( cMvP.getAbsVerDiff( cMvQ ) >= sVerMvThr, 1 );
return 0;
}
UChar LoopFilter::xCheckMvDataB_RefIdx( const MbData& rcQMbData,
const LumaIdx cQIdx,
const MbData& rcPMbData,
const LumaIdx cPIdx,
const Short sHorMvThr,
const Short sVerMvThr,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1 )
{
const MbMotionData& rcMbMotionDataL0Q = rcQMbData.getMbMotionData( LIST_0 );
const MbMotionData& rcMbMotionDataL1Q = rcQMbData.getMbMotionData( LIST_1 );
const MbMotionData& rcMbMotionDataL0P = rcPMbData.getMbMotionData( LIST_0 );
const MbMotionData& rcMbMotionDataL1P = rcPMbData.getMbMotionData( LIST_1 );
IntFrame* pcRefPicL0Q = rcRefFrameList0[ rcMbMotionDataL0Q.getRefIdx( cQIdx ) ];
IntFrame* pcRefPicL1Q = rcRefFrameList1[ rcMbMotionDataL1Q.getRefIdx( cQIdx ) ];
IntFrame* pcRefPicL0P = rcRefFrameList0[ rcMbMotionDataL0P.getRefIdx( cPIdx ) ];
IntFrame* pcRefPicL1P = rcRefFrameList1[ rcMbMotionDataL1P.getRefIdx( cPIdx ) ];
UInt uiNumberOfUsedPic;
{
// check the number of used ref frames
UInt uiQNumberOfUsedPic = ( pcRefPicL0Q ? 1 : 0 ) + ( pcRefPicL1Q ? 1 : 0 );
UInt uiPNumberOfUsedPic = ( pcRefPicL0P ? 1 : 0 ) + ( pcRefPicL1P ? 1 : 0 );
ROTRS( uiPNumberOfUsedPic != uiQNumberOfUsedPic, 1 );
uiNumberOfUsedPic = uiPNumberOfUsedPic;
}
if( 1 == uiNumberOfUsedPic )
{
// this is the easy part
// check whether they ref diff ref pic or not
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?