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

📄 sampleweighting.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  }
}


Void SampleWeighting::xMixB4x( Pel* pucDest, Int iDestStride, Pel* pucSrc, Int iSrcStride, Int iSizeY )
{
  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < 4; x++)
    {
      pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}


Void SampleWeighting::xWeight( Pel* pucDest, Int iDestStride, Int iSizeY, Int iSizeX, Int iWeight, Int iOffset, UInt uiDenom )
{
  Int iAdd = ((1+iOffset*2)<<uiDenom)>>1;

  AOT_DBG( iWeight >  128 );
  AOT_DBG( iWeight < -128 );

  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < iSizeX; x++)
    {
      Int iTemp  = (( iWeight * pucDest[x] + iAdd) >> uiDenom);
      pucDest[x] = gClip( iTemp );
    }
    pucDest += iDestStride;
  }
}


Void SampleWeighting::xMixBWeight( Pel* pucDest, Int iDestStride, Pel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX, Int iWD, Int iWS, Int iOffset, UInt uiDenom )
{
  Int iAdd = (1<<uiDenom);

  AOT_DBG( (iWD + iWS) > ((uiDenom == 7) ? 127 : 128));
  AOT_DBG( iWD + iWS < -128 );

  uiDenom++;
  iOffset = (iOffset+1) >> 1;
  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < iSizeX; x++)
    {
      Int iTemp = (( iWD * pucDest[x] + iWS * pucSrc[x] + iAdd) >> uiDenom) + iOffset;
      pucDest[x] = gClip( iTemp );
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}



__inline Void SampleWeighting::xMixB(Pel* pucDest, Int iDestStride, Pel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX)
{
  m_afpMixSampleFunc[iSizeX>>2]( pucDest, iDestStride, pucSrc, iSrcStride, iSizeY );
}




Void SampleWeighting::xXMixB16x( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY )
{
  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < 16; x++)
    {
      pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}

Void SampleWeighting::xXMixB8x( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY)
{
  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < 8; x++)
    {
      pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}


Void SampleWeighting::xXMixB4x( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY )
{
  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < 4; x++)
    {
      pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}

Void SampleWeighting::xWeight( XPel* pucDest, Int iDestStride, Int iSizeY, Int iSizeX, Int iWeight, Int iOffset, UInt uiDenom )
{
  Int iAdd = ((1+iOffset*2)<<uiDenom)>>1;

  AOT_DBG( iWeight >  128 );
  AOT_DBG( iWeight < -128 );

  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < iSizeX; x++)
    {
      Int iTemp  = (( iWeight * pucDest[x] + iAdd) >> uiDenom);
      pucDest[x] = gClip( iTemp );
    }
    pucDest += iDestStride;
  }
}


Void SampleWeighting::xMixBWeight( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX, Int iWD, Int iWS, Int iOffset, UInt uiDenom )
{
  Int iAdd = (1<<uiDenom);

  AOT_DBG( (iWD + iWS) > ((uiDenom == 7) ? 127 : 128));
  AOT_DBG( iWD + iWS < -128 );

  uiDenom++;
  iOffset = (iOffset+1) >> 1;
  for( Int y = 0; y < iSizeY; y++)
  {
    for( Int x = 0; x < iSizeX; x++)
    {
      Int iTemp = (( iWD * pucDest[x] + iWS * pucSrc[x] + iAdd) >> uiDenom) + iOffset;
      pucDest[x] = gClip( iTemp );
    }
    pucDest += iDestStride;
    pucSrc  += iSrcStride;
  }
}


__inline Void SampleWeighting::xMixB(XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX)
{
  m_afpXMixSampleFunc[iSizeX>>2]( pucDest, iDestStride, pucSrc, iSrcStride, iSizeY );
}


Void
SampleWeighting::weightInverseLumaSamples( YuvMbBuffer*  pcDesBuffer,
                                           YuvMbBuffer*  pcOrgBuffer,
                                           YuvMbBuffer*  pcFixBuffer,
                                           const PredWeight*        pcSearchPW,
                                           const PredWeight*        pcFixPW,
                                           Double&          rdWeight,
                                           Int              iYSize,
                                           Int              iXSize )
{
  XPel* pFix        = pcFixBuffer->getLumBlk();
  XPel* pOrg        = pcOrgBuffer->getLumBlk();
  XPel* pDes        = pcDesBuffer->getLumBlk();
  Int   iStride     = pcDesBuffer->getLStride();

  Int   iFixWeight  = pcFixPW   ->getLumaWeight();
  Int   iWeight     = pcSearchPW->getLumaWeight();
  Int   iOffset     = ( pcFixPW ->getLumaOffset() + pcSearchPW->getLumaOffset() + 1 ) >> 1;
  Int   iLWD        = m_uiLumaLogWeightDenom;
  Int   iAdd        = ( 1 << iLWD );

  AOT_DBG( m_bExplicit && iWeight >  128 );
  AOT_DBG( m_bExplicit && iWeight < -128 );

  if( iWeight == 0 ) // doesn't make sense to transmit a motion vector for that case
  {
    for( Int iLine = 0, y = 0; y < iYSize; y++, iLine += iStride )
    for( Int            x = 0; x < iXSize; x++ )
    {
      pDes[x+iLine] = 128;
    }
    rdWeight        = 1.0;
  }
  else
  {
    Int iShift      = ( iLWD + 8 );
    Int iInvWeight  = ( 1    << iShift ) / iWeight;
    Int iInvAdd     = ( iAdd << iShift ) / iWeight;

    for( Int iLine = 0, y = 0; y < iYSize; y++, iLine += iStride )
    for( Int            x = 0; x < iXSize; x++ )
    {
      Int iTemp     = ( iInvWeight * ( ( ( pOrg[x+iLine] - iOffset ) << (iLWD+1) ) - iFixWeight * pFix[x+iLine] ) - iInvAdd ) >> iShift;
      pDes[x+iLine] = gClip( iTemp );
    }
    rdWeight = 128.0 / abs(iInvWeight);
  }
}




Void
SampleWeighting::weightInverseLumaSamples( YuvMbBuffer* pcDesBuffer,
                                           YuvMbBuffer* pcOrgBuffer,
                                           const PredWeight*       pcPW,
                                           Double&         rdWeight,
                                           Int             iYSize,
                                           Int             iXSize )
{
  XPel* pOrg      = pcOrgBuffer->getLumBlk();
  XPel* pDes      = pcDesBuffer->getLumBlk();
  Int   iStride   = pcDesBuffer->getLStride();

  Int   iWeight   = pcPW->getLumaWeight();
  Int   iOffset   = pcPW->getLumaOffset();
  Int   iAdd      = ( 1 << m_uiLumaLogWeightDenom ) >> 1;

  AOT_DBG( iWeight >  127 );
  AOT_DBG( iWeight < -128 );

  if( iWeight == 0 ) // motion vector doesn't make sense
  {
    for( Int y = 0; y < iYSize; y++, pDes+=iStride )
    for( Int x = 0; x < iXSize; x++)
    {
      pDes[x]       = 128;
    }
    rdWeight        = 1.0;
  }
  else if( ! pcPW->getLumaWeightFlag() )
  {
    //===== unweighted copy =====
    for( Int y = 0; y < iYSize; y++, pDes+=iStride )
    for( Int x = 0; x < iXSize; x++)
    {
      pDes[x]       = pOrg[x];
    }
    rdWeight        = 1.0;
  }
  else
  {
    Int iInvWeight  = ( 1    << ( m_uiLumaLogWeightDenom + 8 ) ) / iWeight;
    Int iInvAdd     = ( iAdd <<                            8   ) / iWeight;

    for( Int y = 0; y < iYSize; y++, pDes+=iStride, pOrg+=iStride )
    for( Int x = 0; x < iXSize; x++)
    {
      Int iTemp     = ( iInvWeight * ( pOrg[x] - iOffset ) - iInvAdd ) >> 8;
      pDes[x]       = gClip( iTemp );
    }
    rdWeight        = 256.0 / abs(iInvWeight);
  }
}



Void
SampleWeighting::weightInverseChromaSamples( YuvMbBuffer* pcDesBuffer,
                                             YuvMbBuffer* pcOrgBuffer,
                                             const PredWeight*       pcPW,
                                             Double*         padWeight,
                                             Int             iYSize,
                                             Int             iXSize )
{
  iYSize >>= 1;
  iXSize >>= 1;

  for( Int C = 0; C < 2; C++ )
  {
    XPel* pOrg      = ( C ? pcOrgBuffer->getCrBlk() : pcOrgBuffer->getCbBlk() );
    XPel* pDes      = ( C ? pcDesBuffer->getCrBlk() : pcDesBuffer->getCbBlk() );
    Int   iStride   = pcDesBuffer->getCStride();

    Int   iWeight   = ( C ? pcPW->getChromaCrWeight() : pcPW->getChromaCbWeight() );
    Int   iOffset   = ( C ? pcPW->getChromaCrOffset() : pcPW->getChromaCbOffset() );
    Int   iAdd      = ( 1 << m_uiChromaLogWeightDenom ) >> 1;

    AOT_DBG( iWeight >  127 );
    AOT_DBG( iWeight < -128 );

    if( iWeight == 0 ) // motion vector doesn't make sense
    {
      for( Int y = 0; y < iYSize; y++, pDes+=iStride )
      for( Int x = 0; x < iXSize; x++)
      {
        pDes[x]       = 128;
      }
      padWeight[C]    = 1.0;
    }
    else if( ! pcPW->getChromaWeightFlag() )
    {
      //===== unweighted copy =====
      for( Int y = 0; y < iYSize; y++, pDes+=iStride )
      for( Int x = 0; x < iXSize; x++)
      {
        pDes[x]       = pOrg[x];
      }
      padWeight[C]    = 1.0;
    }
    else
    {
      Int iInvWeight  = ( 1    << ( m_uiChromaLogWeightDenom + 8 ) ) / iWeight;
      Int iInvAdd     = ( iAdd <<                              8   ) / iWeight;

      for( Int y = 0; y < iYSize; y++, pDes+=iStride, pOrg+=iStride )
      for( Int x = 0; x < iXSize; x++)
      {
        Int iTemp     = ( iInvWeight * ( pOrg[x] - iOffset ) - iInvAdd ) >> 8;
        pDes[x]       = gClip( iTemp );
      }
      padWeight[C]    = 256.0 / abs(iInvWeight);
    }
  }
}


//TMM_WP
ErrVal SampleWeighting::initSliceForWeighting( const SliceHeader& rcSliceHeader)
{
  if( rcSliceHeader.isIntraSlice() )
  {
    m_bWeightedPredDisableP = true;
    m_bWeightedPredDisableB = true;
    m_bExplicit             = false;
    return Err::m_nOK;
  }

  if( rcSliceHeader.isPSlice() )
  {
    m_bExplicit             = rcSliceHeader.getPPS().getWeightedPredFlag();
    m_bWeightedPredDisableP = ! m_bExplicit;
    m_bWeightedPredDisableB = true;

    if( m_bExplicit )
    {
      m_uiLumaLogWeightDenom   = rcSliceHeader.getLumaLog2WeightDenom();
      m_uiChromaLogWeightDenom = rcSliceHeader.getChromaLog2WeightDenom();
    }

    return Err::m_nOK;
  }


  else if( rcSliceHeader.isBSlice() )
  {
    switch( rcSliceHeader.getPPS().getWeightedBiPredIdc() )
    {
    case 0:
      {
        m_bExplicit               = false;
        m_bWeightedPredDisableP   = true;
        m_bWeightedPredDisableB   = true;
        m_uiLumaLogWeightDenom    = 0;
        m_uiChromaLogWeightDenom  = 0;
      }
      break;
    case 1:
      {
        m_bExplicit               = true;
        m_bWeightedPredDisableP   = false;
        m_bWeightedPredDisableB   = false;
        m_uiLumaLogWeightDenom    = rcSliceHeader.getLumaLog2WeightDenom();
        m_uiChromaLogWeightDenom  = rcSliceHeader.getChromaLog2WeightDenom();
      }
      break;
    case 2:
      {
        m_bExplicit               = false;
        m_bWeightedPredDisableP   = true;
        m_bWeightedPredDisableB   = false;
        m_uiLumaLogWeightDenom    = 5;
        m_uiChromaLogWeightDenom  = 5;
      }
      break;
    default:
      {
        AF();
      }
      break;
    }
  }

  return Err::m_nOK;
}

//TMM_WP

H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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