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

📄 transform.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  piQCoeff[0]  = iLevel;
    

  UInt uiAcAbs = 0;
  for( Int n = 1; n < 16; n++ )
  {
    iLevel      = piCoeff[n];
    Int iSign   = iLevel;

    iLevel      = abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n];
    if( pucScale )
    {
      iLevel    = ( iLevel << 4 ) / pucScale[n];
    }
    iLevel      = ( iLevel + rcQp.add() ) >> rcQp.bits();

    if( 0 != iLevel )
    {
      iSign       >>= 31;
      Int iDeScale  = g_aaiDequantCoef[rcQp.rem()][n];
      uiAcAbs      += iLevel;
      iLevel       ^= iSign;
      iLevel       -= iSign;
      piQCoeff[n]   = iLevel;
      if( pucScale )
      {
        piCoeff[n] = ( ( iLevel*iDeScale*pucScale[n] + iAdd ) << rcQp.per() ) >> 4;
      }
      else
      {
        piCoeff[n]  = iLevel*iDeScale << rcQp.per();
      }
    }
    else
    {
      piQCoeff[n] = 0;
      piCoeff [n] = 0;
    }
  }

  ruiAcAbs += uiAcAbs;
  return;
}


Void Transform::xQuantDequantNonUniformChroma( TCoeff* piQCoeff,
                                               TCoeff* piCoeff,
                                               RefCtx* pcRefCtx,
                                               const QpParameter& rcQp,
                                               const UChar* pucScale,
                                               UInt& ruiDcAbs,
                                               UInt& ruiAcAbs )
{
  Int   iAdd    = ( 1 << 3 ) >> rcQp.per();
  {
    Int   iLevel  = piCoeff[0];
    UInt  uiSign  = ((UInt)iLevel)>>31;

    iLevel        = ( abs( iLevel ) * g_aaiQuantCoef[ rcQp.rem() ][0] );
    if( pucScale )
    {
      iLevel      = ( iLevel << 4 ) / pucScale[0];
    }
    iLevel        = ( iLevel + 2*rcQp.add() ) >> ( rcQp.bits() + 1 );
  
    ruiDcAbs   += iLevel;
    iLevel      = ( uiSign ? -iLevel : iLevel );
    piQCoeff[0] = iLevel;
    piCoeff [0] = iLevel;
    if( pcRefCtx && iLevel )
      pcRefCtx[0] = 1;
  }
  

  UInt uiAcAbs = 0;
  for( int n = 1; n < 16; n++ )
  {
    Int iLevel  = piCoeff[n];
    Int iSign   = iLevel;

    iLevel      = ( abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n] );
    if( pucScale )
    {
      iLevel    = ( iLevel << 4 ) / pucScale[n];
    }
    iLevel = ( iLevel + rcQp.add() ) >> rcQp.bits();

    if( 0 != iLevel )
    {
      if( pcRefCtx )
        pcRefCtx[g_aucInvFrameScan[n]] = 1;

      iSign      >>= 31;
      Int iDeScale = g_aaiDequantCoef[rcQp.rem()][n];
      uiAcAbs     += iLevel;
      iLevel      ^= iSign;
      iLevel      -= iSign;
      piQCoeff[n]  = iLevel;
      if( pucScale )
      {
        piCoeff[n] = ( ( iLevel*iDeScale*pucScale[n] + iAdd ) << rcQp.per() ) >> 4;
      }
      else
      {
        piCoeff[n]  = iLevel*iDeScale << rcQp.per();
      }
    }
    else
    {
      piQCoeff[n] = 0;
      piCoeff[n] = 0;
    }
  }

  ruiAcAbs += uiAcAbs;
  return;
}





Void Transform::xQuantDequantUniform4x4( TCoeff*                      piQCoeff,
                                         TCoeff*                      piCoeff,
                                         RefCtx*                      pcRefCtx,
                                         const QpParameter&           rcQp,
                                         const UChar*                 pucScale,
                                         UInt&                        ruiAbsSum )
{
  Int n     = 0;
  ruiAbsSum = 0;
  Int iAdd  = ( 1 << 3 ) >> rcQp.per();

  for( ; n < 16; n++ )
  {
    Int iLevel  = piCoeff[n];
    Int iSign   = iLevel;
    
    iLevel      = abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n];
    if( pucScale )
    {
      iLevel    = ( iLevel << 4 ) / pucScale[n];
    }
    iLevel      = ( iLevel + rcQp.add() ) >> rcQp.bits();

    if( 0 != iLevel )
    {
      iSign      >>= 31;
      Int iDeScale = g_aaiDequantCoef[ rcQp.rem() ][ n ];
      ruiAbsSum   += iLevel;
      iLevel      ^= iSign;
      iLevel      -= iSign;
      piQCoeff[n]  = iLevel;
      if( pcRefCtx )
        pcRefCtx[g_aucInvFrameScan[n]] = 1;

      if( pucScale )
      {
        piCoeff[n]   = ( ( iLevel*iDeScale*pucScale[n] + iAdd ) << rcQp.per() ) >> 4;
      }
      else
      {
        piCoeff[n]   = iLevel*iDeScale << rcQp.per();
      }
    }
    else
    {
      piQCoeff[n] = 0;
      piCoeff [n] = 0;
    }
  }
}


// for SVC to AVC rewrite
ErrVal Transform::predict4x4Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiRefQp, UInt& ruiAbsSum  )
{	
	// DECLARATIONS
	TCoeff cPredCoeff[16];
	
	// PREDICT THE COEFFICIENTS	
	ScaleCoeffLevels( cPredCoeff, piRefCoeff, getLumaQp().value(), uiRefQp, 16 );

	// ADJUST THE TRANSMITTED COEFFICIENTS
	for( Int n=0; n<16; n++ )
	{
    ruiAbsSum -= (piCoeff[n] >0) ? piCoeff[n].getCoeff() : (-1*piCoeff[n].getCoeff());
		piCoeff[n] -= cPredCoeff[n];
		ruiAbsSum += (piCoeff[n]>0) ? piCoeff[n].getCoeff() : (-1*piCoeff[n].getCoeff());
	}
	
	return Err::m_nOK;
}

ErrVal Transform::predict8x8Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiRefQp, UInt& ruiAbsSum  )
{
	// DECLARATIONS
	TCoeff cPredCoeff[64];

	// PREDICT THE COEFFICIENTS		
    ScaleCoeffLevels( cPredCoeff, piRefCoeff, getLumaQp().value(), uiRefQp, 64 );
	

	// ADJUST THE TRANSMITTED COEFFICIENTS
	for( Int n=0; n<64; n++ )
	{
    ruiAbsSum -= (piCoeff[n] >0) ? piCoeff[n].getCoeff() : -1*piCoeff[n].getCoeff();
		piCoeff[n] -= cPredCoeff[n];
		ruiAbsSum += (piCoeff[n]>0) ? piCoeff[n].getCoeff() : -1*piCoeff[n].getCoeff();
	}
	
	return Err::m_nOK;
}

ErrVal Transform::predictMb16x16( TCoeff* piCoeff, TCoeff* piRef, UInt uiRefQp, UInt& ruiDcAbs, UInt& ruiAcAbs )
{
	UInt uiAbs = 0;

	for( UInt n=0; n<16; n++ )
		predict4x4Blk( &piCoeff[n<<4], &piRef[n<<4], uiRefQp, uiAbs );

	return Err::m_nOK;

}

ErrVal Transform::predictChromaBlocks( TCoeff* piCoeff, TCoeff* piRef, UInt uiRefQp, UInt& ruiDcAbs, UInt& ruiAcAbs )
{

	// DECLARATIONS
	TCoeff cScaledRef[64];

	for( UInt x=0; x<0x40; x+=0x10 )
	{		
		ScaleCoeffLevels( &cScaledRef[x], &piRef[x], getChromaQp().value(), uiRefQp, 16 );

		for( UInt n=0; n<16; n++ )
		{			
			piCoeff[x+n] -= cScaledRef[x+n];		
		}
  }

	// RECOMPUTE THE COEFFICIENT COUNTS
	ruiAcAbs = 0;
	ruiDcAbs = 0;

	for( int i=0; i<64; i++ )
		ruiAcAbs += abs( (Int)piCoeff[i] );
    
	for( i=0; i<64; i+=16 )
		ruiDcAbs += abs( (Int)piCoeff[i] );
	  
	ruiAcAbs -= ruiDcAbs;

	return Err::m_nOK;

}
ErrVal
Transform::predictScaledACCoeffs(  TCoeff *piCoeff, 
								   TCoeff *piRef,
								   UInt uiRefQp )
{

	// DECLARATIONS
	TCoeff cPredCoeff[64] = {0};
	UInt uiDcAbs=0, uiAcAbs=0;

	// Predict the chroma coefficients
	predictChromaBlocks( cPredCoeff, piRef, uiRefQp, uiDcAbs, uiAcAbs  );

	for( UInt i=0; i<64; i++ )
		cPredCoeff[i] = -cPredCoeff[i];

	// Scale the coefficients
	x4x4Dequant( &cPredCoeff[0x00], &cPredCoeff[0x00], m_cChromaQp );
	x4x4Dequant( &cPredCoeff[0x10], &cPredCoeff[0x10], m_cChromaQp );
	x4x4Dequant( &cPredCoeff[0x20], &cPredCoeff[0x20], m_cChromaQp );
	x4x4Dequant( &cPredCoeff[0x30], &cPredCoeff[0x30], m_cChromaQp );

	// Substitute
	for( UInt x=0x00; x<0x40; x+=0x10 )
		for( UInt n=1; n<16; n++ )
			piCoeff[x+n] = cPredCoeff[x+n];	


	return Err::m_nOK;
}


ErrVal Transform::addPrediction4x4Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiQp, UInt uiRefQp, UInt &uiCoded  )
{	
	// DECLARATIONS
	TCoeff cPredCoeff[16];
	
	// PREDICT THE COEFFICIENTS
	ScaleCoeffLevels( cPredCoeff, piRefCoeff, uiQp, uiRefQp, 16 );

	// ADJUST THE TRANSMITTED COEFFICIENTS
	for( Int n=0; n<16; n++ )
	{
		piCoeff[n] += cPredCoeff[n];
		if( piCoeff[n] )
			uiCoded++;
	}
	
	return Err::m_nOK;
}

ErrVal Transform::addPrediction8x8Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiQp, UInt uiRefQp, Bool& bCoded  )
{
	// DECLARATIONS
	TCoeff cPredCoeff[64];

	// PREDICT THE COEFFICIENTS	
	ScaleCoeffLevels( cPredCoeff, piRefCoeff, uiQp, uiRefQp, 64 );

	// ADJUST THE TRANSMITTED COEFFICIENTS
	for( Int n=0; n<64; n++ )
	{
		piCoeff[n] += cPredCoeff[n];
		if( piCoeff[n] )
			bCoded = true;
	}
	
	return Err::m_nOK;
}

ErrVal Transform::addPredictionChromaBlocks( TCoeff* piCoeff, TCoeff* piRef, UInt uiQp, UInt uiRefQp, Bool& bDCflag, Bool& bACflag )
{

	// DECLARATIONS
	TCoeff cScaledRef[64];	

	for( UInt x=0; x<0x40; x+=0x10 )
	{
		ScaleCoeffLevels( &cScaledRef[x], &piRef[x], uiQp, uiRefQp, 16 );

		for( UInt n=0; n<16; n++ )
		{			
			piCoeff[x+n] += cScaledRef[x+n];

			if( piCoeff[x+n] )
			{
				if( n%16 )
					bACflag = true;
				else
					bDCflag = true;
			}			
		}
	}	

	return Err::m_nOK;

}


Void Transform::xRequantUniform4x4( TCoeff*             piCoeff,
                                    TCoeff*             piCoeffBase,
                                    RefCtx*             pcRefCtx,
                                    Bool                bFirstIsDc,
                                    const QpParameter&  rcQp,
                                    const UChar*        pucScale,
                                    UInt&               ruiAbsSum )
{
  Int normAdjust[] = { 4, 5, 4, 5 };

  ruiAbsSum  = 0;
  for( Int m = bFirstIsDc ? 1 : 0; m < 16; m++ )
  {
    Int n = g_aucFrameScan[m];
    Int iLevel  = piCoeff[n];
    Int iSign   = iLevel;

    iLevel     -= ( normAdjust[n/4] * normAdjust[n%4] * (Int)piCoeffBase[n] + ( 1 << 5 ) ) >> 6;

    iSign         = iLevel >> 31;
    Int iBaseSign = piCoeffBase[n] >> 15;

    iLevel      = abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n];
    if( pucScale )
    {
      iLevel    = ( iLevel << 4 ) / pucScale[n];
    }
    Int iQLevel = ( iLevel + rcQp.add() ) >> rcQp.bits();

    pcRefCtx[m] <<= 2;

    if( iQLevel )
    {
      // Clip refinement symbols
      if( piCoeffBase[n] )
        iQLevel = 1;

      ruiAbsSum   += iQLevel;
      iQLevel     ^= iSign;
      iQLevel     -= iSign;
      piCoeff[n]   = iQLevel;

      pcRefCtx[m] += 1;
      if( piCoeffBase[n] )
        pcRefCtx[m] += ( iSign ^ iBaseSign ) & 1;
    }
    else
    {
      piCoeff [n] = 0;
    }
  }
}





Void Transform::xRequantNonUniformChroma( TCoeff*             piCoeff,
                                          TCoeff*             piCoeffBase,
                                          RefCtx*             pcRefCtx,
                                          const QpParameter&  rcQp,
                                          const UChar*        pucScale,
                                          UInt&               ruiDcAbs,
                                          UInt&               ruiAcAbs )
{
  Int normAdjust[] = { 4, 5, 4, 5 };

  Int   iLevel    = piCoeff[0];
  iLevel         -= ( (Int)piCoeffBase[0] + 1 ) >> 1;
  Int iSign     = iLevel >> 31;
  Int iBaseSign = piCoeffBase[0] >> 15;

  iLevel          = ( abs( iLevel ) * g_aaiQuantCoef[ rcQp.rem() ][0] );
  if( pucScale )
  {
    iLevel        = ( iLevel << 4 ) / pucScale[0];
  }
  Int iQLevel = ( iLevel + ( rcQp.add() << 1 ) ) >> ( rcQp.bits() + 1 );
  
  pcRefCtx[0] <<= 2;
  if( iQLevel )
  {
    // Clip refinement symbols
    if( piCoeffBase[0] )
      iQLevel = 1;

    ruiDcAbs    += iQLevel;
    iQLevel     ^= iSign;
    iQLevel     -= iSign;
    piCoeff[0]   = iQLevel;

    pcRefCtx[0] += 1;
    if( piCoeffBase[0] )
      pcRefCtx[0] += ( iSign ^ iBaseSign ) & 1;
  }
  else
  {
    piCoeff[0] = 0;
  }

  UInt uiAcAbs = 0;
  for( Int m = 1; m < 16; m++ )
  {
    Int n = g_aucFrameScan[m];
    iLevel      = piCoeff[n];
    iLevel     -= ( normAdjust[n/4] * normAdjust[n%4] * (Int)piCoeffBase[n] + ( 1 << 5 ) ) >> 6;
    iSign       = iLevel >> 31;
    iBaseSign   = piCoeffBase[n] >> 15;

⌨️ 快捷键说明

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