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

📄 mbdataaccess.h

📁 JVT-S203 contains the JSVM 6 reference software. It corresponds to CVS tag “JSVM_5_12_1”. For obt
💻 H
📖 第 1 页 / 共 3 页
字号:
#endif
  if( rcMbData.isIntra16x16() )
  {
    return rcMbData.getCbpChroma16x16();
  }
  return rcMbData.getMbCbp() >> 4;
}

__inline UInt MbDataAccess::getAboveChromaCbp()  const
{
  const MbData& rcMbData = xGetMbAbove();

#if INDEPENDENT_PARSING
  if( m_rcSliceHeader.getSPS().getIndependentParsing() )
  {
    if( !rcMbData.getBLSkipFlag() && !rcMbData.getBLQRefFlag() && rcMbData.isIntra16x16() )
    {
      return rcMbData.getCbpChroma16x16();
    }
  }
  else
#endif
  if( rcMbData.isIntra16x16() )
  {
    return rcMbData.getCbpChroma16x16();
  }
  return rcMbData.getMbCbp() >> 4;
}


__inline UInt MbDataAccess::getAutoCbp() const
{
  UInt  uiCbp = m_rcMbCurr.getMbCbp();

  if( m_rcMbCurr.isIntra16x16() )
  {
    uiCbp  = ( m_rcMbCurr.isAcCoded() ? 15 : 0 ); //luma
    uiCbp += ( m_rcMbCurr.getCbpChroma16x16() << 4 ); //chroma
  }

  return uiCbp;
}

__inline UInt MbDataAccess::getLeftLumaCbpFGS( LumaIdx cIdx )  const
{
  const MbData& rcMbData = xGetBlockLeft( cIdx );

  if( ! xIsAvailable( rcMbData ) )
  {
    return 1;
  }
  return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}

__inline UInt MbDataAccess::getAboveLumaCbpFGS( LumaIdx cIdx )  const
{
  const MbData& rcMbData = xGetBlockAbove( cIdx );

  if( ! xIsAvailable( rcMbData ) )
  {
    return 1;
  }
  return ( rcMbData.getMbCbp() >> m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] ) & 1;
}

__inline UInt MbDataAccess::getLeftChromaCbpFGS()  const
{
  const MbData& rcMbData = xGetMbLeft();

  return rcMbData.getMbCbp() >> 4;
}

__inline UInt MbDataAccess::getAboveChromaCbpFGS()  const
{
  const MbData& rcMbData = xGetMbAbove();

  return rcMbData.getMbCbp() >> 4;
}


__inline UInt MbDataAccess::xGetLeftCodedBlockBit( UInt uiBit )  const
{
  AOT_DBG( uiBit > 30 );
  if( uiBit > 26 )
  {
    B4x4Idx       cIdx( m_aucChroma2LumaIdx[ uiBit - 27 ] );
    const MbData& rcMbData  = xGetBlockLeft( cIdx );
    if( ! xIsAvailable( rcMbData ) )
    {
#if INDEPENDENT_PARSING
      if( m_rcSliceHeader.getSPS().getIndependentParsing() )
      {
        return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
      }
#endif
      return m_rcMbCurr.isIntra() ? 1 : 0;
    }
    return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + 27 );
  }

  if( uiBit >= 24 ) // macroblock based stuff
  {
    const MbData& rcMbData = xGetMbLeft();
    if( ! xIsAvailable( rcMbData ) )
    {
#if INDEPENDENT_PARSING
      if( m_rcSliceHeader.getSPS().getIndependentParsing() )
      {
        return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
      }
#endif
      return m_rcMbCurr.isIntra() ? 1 : 0;
    }
    return rcMbData.getBCBP( uiBit );
  }

  if( uiBit < 16 ) // luma block based
  {
    B4x4Idx       cIdx( uiBit );
    const MbData& rcMbData = xGetBlockLeft( cIdx );
    if( ! xIsAvailable( rcMbData ) )
    {
#if INDEPENDENT_PARSING
      if( m_rcSliceHeader.getSPS().getIndependentParsing() )
      {
        return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
      }
#endif
      return m_rcMbCurr.isIntra() ? 1 : 0;
    }
    return rcMbData.getBCBP( cIdx.b4x4() );
  }
  // chroma block based
  B4x4Idx       cIdx( m_aucChroma2LumaIdx[ uiBit - 16 ] );
  Int           iOffset   = ( uiBit >= 20 ? 20 : 16 );
  const MbData& rcMbData  = xGetBlockLeft( cIdx );
  if( ! xIsAvailable( rcMbData ) )
  {
#if INDEPENDENT_PARSING
    if( m_rcSliceHeader.getSPS().getIndependentParsing() )
    {
      return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
    }
#endif
    return m_rcMbCurr.isIntra() ? 1 : 0;
  }
  return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}

__inline UInt MbDataAccess::xGetAboveCodedBlockBit( UInt uiBit )  const
{
  AOT_DBG( uiBit > 30 );
  if( uiBit > 26 )
  {
    B4x4Idx       cIdx( m_aucChroma2LumaIdx[ uiBit - 27 ] );
    const MbData& rcMbData  = xGetBlockAbove( cIdx );
    if( ! xIsAvailable( rcMbData ) )
    {
#if INDEPENDENT_PARSING
      if( m_rcSliceHeader.getSPS().getIndependentParsing() )
      {
        return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
      }
#endif
      return m_rcMbCurr.isIntra() ? 1 : 0;
    }
    return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + 27 );
  }

  if( uiBit >= 24 ) // macroblock based stuff
  {
    const MbData& rcMbData = xGetMbAbove();
    if( ! xIsAvailable( rcMbData ) )
    {
#if INDEPENDENT_PARSING
      if( m_rcSliceHeader.getSPS().getIndependentParsing() )
      {
        return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
      }
#endif
      return m_rcMbCurr.isIntra() ? 1 : 0;
    }
    return rcMbData.getBCBP( uiBit );
  }
  if( uiBit < 16 ) // luma block based
  {
    B4x4Idx       cIdx( uiBit );
    const MbData& rcMbData = xGetBlockAbove( cIdx );
    if( ! xIsAvailable( rcMbData ) )
    {
#if INDEPENDENT_PARSING
      if( m_rcSliceHeader.getSPS().getIndependentParsing() )
      {
        return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
      }
#endif
      return m_rcMbCurr.isIntra() ? 1 : 0;
    }
    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 ) )
  {
#if INDEPENDENT_PARSING
    if( m_rcSliceHeader.getSPS().getIndependentParsing() )
    {
      return ( !m_rcMbCurr.getBLSkipFlag() && !m_rcMbCurr.getBLQRefFlag() && m_rcMbCurr.isIntra() ? 1 : 0 );
    }
#endif
    return m_rcMbCurr.isIntra() ? 1 : 0;
  }
  return rcMbData.getBCBP( m_auc4x4Idx28x8Idx[ cIdx.b4x4() ] + iOffset );
}


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


__inline Void MbDataAccess::xGetColocatedMvRefIdx( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
  ListIdx         eListIdx         = LIST_0;

  if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx ) ) < 1 )
  {
    eListIdx  = LIST_1;
    rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx );
  }
  if( rscRefIdx < 1 )
  {
    rcMv = Mv::ZeroMv();
  }
  else
  {
    rcMv = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( cIdx );
  }
}



__inline Void MbDataAccess::xGetColocatedMvsRefIdxNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
  ListIdx         eListIdx         = LIST_0;

  if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx ) ) < 1 )
  {
    eListIdx  = LIST_1;
    rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx );
  }
  if( rscRefIdx < 1 )
  {
    acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
  }
  else
  {
    acMv[0] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
    acMv[1] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
    acMv[2] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
    acMv[3] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
  }
}


__inline const RefPic& MbDataAccess::xGetColocatedMvRefPic( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const
{
  ListIdx         eListIdx         = LIST_0;

  if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx ) ) < 1 )
  {
    eListIdx  = LIST_1;
    rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( cIdx );
  }
  if( rscRefIdx < 1 )
  {
    rcMv = Mv::ZeroMv();
  }
  else
  {
    rcMv = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( cIdx );
  }

  return m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefPic( cIdx );
}

__inline const RefPic& MbDataAccess::xGetColocatedMvsRefPicNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const
{
  ListIdx         eListIdx         = LIST_0;

  if( ( rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx ) ) < 1 )
  {
    eListIdx  = LIST_1;
    rscRefIdx = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefIdx( eParIdx );
  }
  if( rscRefIdx < 1 )
  {
    acMv[0] = acMv[1] = acMv[2] = acMv[3] = Mv::ZeroMv();
  }
  else
  {
    acMv[0] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_0 );
    acMv[1] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_1 );
    acMv[2] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_2 );
    acMv[3] = m_rcMbColocated.getMbMotionDataBase( eListIdx ).getMv( eParIdx, SPART_4x4_3 );
  }

  return m_rcMbColocated.getMbMotionDataBase( eListIdx ).getRefPic( eParIdx );
}


__inline const MbData& MbDataAccess::xGetMbLeft() const
{
  return m_rcMbLeft;
}

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


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

  rcIdx = rcIdx + LEFT_MB_LEFT_NEIGHBOUR;
  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;
  return m_rcMbAbove;
}


__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 + ABOVE_MB_ABOVE_NEIGHBOUR + CURR_MB_LEFT_NEIGHBOUR;
    return m_rcMbAbove;
  }
  if( cIdx.y() ) // inside left macroblock
  {
    cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + LEFT_MB_LEFT_NEIGHBOUR;
    return m_rcMbLeft;
  }
  // inside above left macroblock
  cIdx = B4x4Idx( 15 );
  return m_rcMbAboveLeft;
}

__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 + ABOVE_MB_ABOVE_NEIGHBOUR + CURR_MB_RIGHT_NEIGHBOUR;
    return m_rcMbAbove;
  }
  if( cIdx.y() )
  {
    cIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR + RIGHT_MB_RIGHT_NEIGHBOUR;
    return m_rcMbUnavailable;
  }
  // inside above rigth macroblock pair
  cIdx = B4x4Idx( 12 );
  return m_rcMbAboveRight;
}



H264AVC_NAMESPACE_END


#endif // !defined(AFX_MBDATAACCESS_H__710205A4_CFE9_496D_A469_C47EC8D2FBD2__INCLUDED_)

⌨️ 快捷键说明

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