⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbdataaccess.h

📁 SVC最新更新代码
💻 H
📖 第 1 页 / 共 4 页
字号:
    if( ! xIsAvailable( rcMbData ) )
    {
      return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
    }
    if( rcMbData.isPCM() )
    {
      return 1;
    }
    if( bReCalc )
    {
      return rcMbData.calcBCBP( uiStart, uiStop, cIdx.b4x4() );
    }
    return rcMbData.getBCBP( cIdx.b4x4() );
  }
  // chroma block based
  B4x4Idx       cIdx( m_aucChroma2LumaIdx[ uiBit - 16 ] );
  Int           iOffset   = ( uiBit >= 20 ? 20 : 16 );
  const MbData& rcMbData  = xGetBlockAbove( cIdx );
  if( ! xIsAvailable( rcMbData ) )
  {
    return ( !m_rcMbCurr.getBLSkipFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
  }
  if( rcMbData.isPCM() )
  {
    return 1;
  }
  if( bReCalc )
  {
    return rcMbData.calcBCBP( uiStart, uiStop, m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
  }
  return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}


__inline UInt MbDataAccess::getCtxCodedBlockBit( UInt uiBitPos, UInt uiStart, UInt uiStop, Bool bReCalc ) const
{
  UInt uiCtx;
  uiCtx  = xGetLeftCodedBlockBit ( uiBitPos, uiStart, uiStop, bReCalc );
  uiCtx += xGetAboveCodedBlockBit( uiBitPos, uiStart, uiStop, bReCalc ) << 1;
  return uiCtx;
}


__inline Void MbDataAccess::xGetColocatedMvRefIdx( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
  ListIdx         eListIdx         = LIST_0;
  MvRefConversion eMvRefConversion = ONE_TO_ONE;
  const MbData&   rcMbColocated    = xGetBlockColocated( cIdx, eMvRefConversion );

  if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx ) ) < BLOCK_NOT_AVAILABLE )
  {
    eListIdx  = LIST_1;
    rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx );
  }
  if( rscRefIdx < BLOCK_NOT_AVAILABLE )
  {
    rcMv = Mv::ZeroMv();
  }
  else
  {
    rcMv = rcMbColocated.getMbMotionData( eListIdx ).getMv( cIdx );
  }
}



__inline Void MbDataAccess::xGetColocatedMvsRefIdxNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
  ListIdx         eListIdx         = LIST_0;
  const MbData&   rcMbColocated    = xGetBlockColocatedNonInterlaced();
  if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx ) ) < BLOCK_NOT_AVAILABLE )
  {
    eListIdx  = LIST_1;
    rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx );
  }
  if( rscRefIdx < BLOCK_NOT_AVAILABLE )
  {
    acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
  }
  else
  {
    acMv[0] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
    acMv[1] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
    acMv[2] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
    acMv[3] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
  }
}


__inline
const RefPicIdc&
MbDataAccess::xGetColocatedMvRefPic( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
  ListIdx         eListIdx         = LIST_0;
  MvRefConversion eMvRefConversion = ONE_TO_ONE;
  const MbData&   rcMbColocated    = xGetBlockColocated( cIdx, eMvRefConversion );
  if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx ) ) < BLOCK_NOT_AVAILABLE  )
  {
    eListIdx  = LIST_1;
    rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( cIdx );
  }
  if( rscRefIdx < BLOCK_NOT_AVAILABLE  )
  {
    rcMv = Mv::ZeroMv();
  }
  else
  {
    rcMv = rcMbColocated.getMbMotionData( eListIdx ).getMv( cIdx );
  }

  //--- mv scaling ----
  if( eMvRefConversion == FRM_TO_FLD )
  {
    rcMv.setFrameToFieldPredictor();
  }
  else if( eMvRefConversion == FLD_TO_FRM )
  {
    rcMv.setFieldToFramePredictor();
  }
  return rcMbColocated.getMbMotionData( eListIdx ).getRefPicIdc( cIdx );
}

__inline
const RefPicIdc&
MbDataAccess::xGetColocatedMvsRefPicNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
  ListIdx         eListIdx         = LIST_0;
  const MbData&   rcMbColocated    = xGetBlockColocatedNonInterlaced();
  if( ( rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx ) ) < BLOCK_NOT_AVAILABLE )
  {
    eListIdx  = LIST_1;
    rscRefIdx = rcMbColocated.getMbMotionData( eListIdx ).getRefIdx( eParIdx );
  }
  if( rscRefIdx < BLOCK_NOT_AVAILABLE )
  {
    acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
  }
  else
  {
    acMv[0] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
    acMv[1] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
    acMv[2] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
    acMv[3] = rcMbColocated.getMbMotionData( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
  }

  return rcMbColocated.getMbMotionData( eListIdx ).getRefPicIdc( eParIdx );
}


__inline const MbData& MbDataAccess::xGetMbLeft() const
{
  if( m_rcMbCurr.getFieldFlag() == m_rcMbLeft.getFieldFlag() ) // same frame/field mode
  {
  return m_rcMbLeft;
}
  return ( isTopMb() ? m_rcMbLeft : m_rcMbAboveLeft );
}

__inline const MbData& MbDataAccess::xGetMbAbove() const
{
  if( ! m_bMbAff )
  {
    return m_rcMbAbove;
  }

  if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAbove.getFieldFlag() ) )
  {
  return m_rcMbAbove;
}
  return m_rcMbAboveAbove;
}


__inline const MbData& MbDataAccess::xGetBlockLeft( LumaIdx& rcIdx ) const
{
  if( rcIdx.x() )  // inside current macroblock
  {
    rcIdx = rcIdx + CURR_MB_LEFT_NEIGHBOUR;
    return m_rcMbCurr;
  }

  if( ! m_bMbAff )
  {
  rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
  return m_rcMbLeft;
}

  if( m_rcMbCurr.getFieldFlag() == m_rcMbLeft.getFieldFlag() ) // same frame/field mode
  {
  rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
  return m_rcMbLeft;
}
  if( m_rcMbCurr.getFieldFlag() && ! m_rcMbLeft.getFieldFlag() ) // current field, neighbour frame
  {
    Int i4x4 = rcIdx.b4x4();
    rcIdx = B4x4Idx( i4x4 % 8 ? 11 : 3 );
    return ( i4x4 > 4 && isTopMb() ? m_rcMbBelowLeft : i4x4 <= 4 && ! isTopMb() ? m_rcMbAboveLeft : m_rcMbLeft );
  }
  // current frame, neighbour field
  if( isTopMb() )
  {
    rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ?  7 :  3 );
    return m_rcMbLeft;
  }
  rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ? 15 : 11 );
  return m_rcMbAboveLeft;
}

__inline const MbData& MbDataAccess::xGetBlockLeftBottom( LumaIdx& rcIdx ) const
{
  if( rcIdx.x() )  // inside current macroblock
  {
    rcIdx = rcIdx + CURR_MB_LEFT_NEIGHBOUR;
    return m_rcMbCurr;
  }

  if( ! m_bMbAff )
  {
    rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
    return m_rcMbLeft;
  }

  if( m_rcMbCurr.getFieldFlag() == m_rcMbLeft.getFieldFlag() ) // same frame/field mode
  {
    rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
    return m_rcMbLeft;
  }
  if( m_rcMbCurr.getFieldFlag() && ! m_rcMbLeft.getFieldFlag() ) // current field, neighbour frame
  {
    Int i4x4 = rcIdx.b4x4();
    rcIdx = B4x4Idx( i4x4 % 8 ? 15 : 7 );
    return ( i4x4 > 4 && isTopMb() ? m_rcMbBelowLeft : i4x4 <= 4 && ! isTopMb() ? m_rcMbAboveLeft : m_rcMbLeft );
  }
  // current frame, neighbour field
  if( isTopMb() )
  {
    rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ?  7 :  3 );
    return m_rcMbBelowLeft;
  }
  rcIdx = B4x4Idx( rcIdx.b4x4() > 4 ? 15 : 11 );
  return m_rcMbLeft;
}

__inline const MbData& MbDataAccess::xGetBlockAbove( LumaIdx& rcIdx ) const
{
  if( rcIdx.y() ) // inside current macroblock
  {
    rcIdx = rcIdx + CURR_MB_ABOVE_NEIGHBOUR;
    return m_rcMbCurr;
  }
  // outside current macroblock
  rcIdx = rcIdx + ABOVE_MB_ABOVE_NEIGHBOUR;

  if( ! m_bMbAff )
  {
  return m_rcMbAbove;
}

  if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAbove.getFieldFlag() ) )
  {
    return m_rcMbAbove;
  }
  return m_rcMbAboveAbove;
}

__inline const MbData& MbDataAccess::xGetBlockAboveLeft( LumaIdx& cIdx ) const
{
  if( cIdx.x() )
  {
    if( cIdx.y() ) // inside current macroblock
    {
      cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + CURR_MB_LEFT_NEIGHBOUR;
      return m_rcMbCurr;
    }
    // inside above macroblock
    cIdx = cIdx + CURR_MB_LEFT_NEIGHBOUR;
    return xGetBlockAbove( cIdx );
  }
  if( cIdx.y() ) // inside left macroblock
  {
    cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR;
    return xGetBlockLeftBottom( cIdx );
  }
  // inside above left macroblock
  cIdx = B4x4Idx( ! m_rcMbCurr.getFieldFlag() && ! isTopMb() && m_rcMbAboveLeft.getFieldFlag() ? 7 : 15 );

  if( ! m_rcMbCurr.getFieldFlag() && ! isTopMb() && m_rcMbAboveLeft.getFieldFlag() )
  {
    return m_rcMbLeft;
  }
  if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAboveLeft.getFieldFlag() ) )
  {
  return m_rcMbAboveLeft;
}
  return m_rcMbAboveAboveLeft;
}

__inline const MbData& MbDataAccess::xGetBlockAboveRight( LumaIdx& cIdx ) const
{
  if( cIdx.x() < 3 )
  {
    if( cIdx.y() ) // inside current macroblock
    {
      cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + CURR_MB_RIGHT_NEIGHBOUR;

      if( cIdx.b4x4() == 2 || cIdx.b4x4() == 10 )
      {
        return m_rcMbUnavailable;
      }
      return m_rcMbCurr;
    }
    // inside above macroblock pair
    cIdx = cIdx + CURR_MB_RIGHT_NEIGHBOUR;
    return xGetBlockAbove( cIdx );
  }

  if( cIdx.y() || ( ! m_rcMbCurr.getFieldFlag() && ! isTopMb() ) ) // not available ( inside right mb or inside above right macroblock for a bottom macroblock )
  {
    cIdx = cIdx + RIGHT_MB_RIGHT_NEIGHBOUR;
    return m_rcMbUnavailable;
  }
  // inside above rigth macroblock pair
  cIdx = B4x4Idx( 12 );
  if( ! m_rcMbCurr.getFieldFlag() || ( isTopMb() && ! m_rcMbAboveRight.getFieldFlag() ) )
  {
  return m_rcMbAboveRight;
}
  return m_rcMbAboveAboveRight;
}

__inline const MbData& MbDataAccess::xGetBlockColocated( LumaIdx& rcIdx, MvRefConversion& eMvRefConversion ) const
{
  Bool bCurrField = getSH().getFieldPicFlag() || m_rcMbCurr.        getFieldFlag();
  Bool bColField  = m_bColocatedField         || m_rcMbColocatedTop.getFieldFlag();

  if( bCurrField == bColField )
  {
    eMvRefConversion = ONE_TO_ONE;
    return ( m_bIsTopRowMb ? m_rcMbColocatedTop : m_rcMbColocatedBot );
  }

  if( bCurrField )
  {
    eMvRefConversion    = FRM_TO_FLD;
    const MbData& rcCol = ( rcIdx.b4x4() < 8 ? m_rcMbColocatedTop : m_rcMbColocatedBot );
    rcIdx               = B4x4Idx( rcIdx.x() + 4 * ( ( 2 * rcIdx.y() ) % 4 ) );
    return rcCol;
  }

  eMvRefConversion  = FLD_TO_FRM;
  rcIdx             = B4x4Idx( rcIdx.x() + 4 * ( rcIdx.y() / 2 ) + ( m_bIsTopRowMb ? 0 : 8 ) );
  return ( m_bUseTopField ? m_rcMbColocatedTop : m_rcMbColocatedBot );
}

__inline const MbData& MbDataAccess::xGetBlockColocatedNonInterlaced() const
{
  return ( m_bIsTopRowMb ? m_rcMbColocatedTop : m_rcMbColocatedBot );
}

H264AVC_NAMESPACE_END


#endif // !defined(AFX_MBDATAACCESS_H__710205A4_CFE9_496D_A469_C47EC8D2FBD2__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -