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

📄 uvlcwriter.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  ETRACE_TH( pcTraceString );

  RNOK( xWriteUvlcCode( uiCode ) );

  ETRACE_N;
  return Err::m_nOK;
}


ErrVal UvlcWriter::writeSvlc( Int iCode, Char* pcTraceString )
{
  UInt uiCode;

  ETRACE_TH( pcTraceString );

  uiCode = xConvertToUInt( iCode );
  RNOK( xWriteUvlcCode( uiCode ) );

  ETRACE_TY( "se(v)" );
  ETRACE_CODE( iCode );

  ETRACE_N;
  return Err::m_nOK;
}

ErrVal UvlcWriter::writeFlag( Bool bFlag, Char* pcTraceString )
{
  ETRACE_TH( pcTraceString );
  ETRACE_TY( " u(1)" );

  RNOK( xWriteFlag( bFlag ? 1:0) );

  ETRACE_N;
  return Err::m_nOK;
}


ErrVal UvlcWriter::writeSCode( Int iCode, UInt uiLength, Char* pcTraceString )
{
  AOT_DBG(uiLength<1);
  ETRACE_TH( pcTraceString );
  ETRACE_TY( " i(v)" );

  UInt uiShift = 32 - uiLength;
  UInt uiCode = ((UInt)(iCode << uiShift)) >> uiShift;
  RNOK( m_pcBitWriteBufferIf->write( uiCode, uiLength ) );

  ETRACE_POS;
  ETRACE_CODE (iCode);
  ETRACE_BITS (uiCode, uiLength );
  ETRACE_COUNT(uiLength);
  ETRACE_N;
  return Err::m_nOK;
}

ErrVal UvlcWriter::writeCode( UInt uiCode, UInt uiLength, Char* pcTraceString )
{
  AOT_DBG(uiLength<1);
  ETRACE_TH( pcTraceString );
  ETRACE_TY( " u(v)" );

  RNOK( m_pcBitWriteBufferIf->write( uiCode, uiLength ) );

  ETRACE_POS;
  ETRACE_CODE (uiCode);
  ETRACE_BITS (uiCode, uiLength );
  ETRACE_COUNT(uiLength);
  ETRACE_N;
  return Err::m_nOK;
}



ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
  UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx();
  RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
  return Err::m_nOK;
}

ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx  )
{
  UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx( eParIdx );
  RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
  return Err::m_nOK;
}

ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx  )
{
  UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx( eParIdx );
  RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
  return Err::m_nOK;
}

ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx  )
{
  UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx( eParIdx );
  RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
  return Err::m_nOK;
}


ErrVal  UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
  return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag() );
}
ErrVal  UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx   )
{
  return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag( eParIdx ) );
}
ErrVal  UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx   )
{
  return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag( eParIdx ) );
}
ErrVal  UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx   )
{
  return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag( eParIdx ) );
}



ErrVal UvlcWriter::blockModes( MbDataAccess& rcMbDataAccess )
{
  for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
  {
    ETRACE_T( "BlockMode" );

    UInt uiBlockMode = rcMbDataAccess.getConvertBlkMode( c8x8Idx.b8x8Index() );

    AOT_DBG( uiBlockMode > 12);

    RNOK( xWriteUvlcCode( uiBlockMode ) );

    ETRACE_N;
  }
  return Err::m_nOK;
}

ErrVal UvlcWriter::fieldFlag( MbDataAccess& rcMbDataAccess )
{
  ETRACE_T( "MbFieldFlag" );

  UInt uiBit = rcMbDataAccess.getMbData().getFieldFlag() ? 1 : 0;

  RNOK( xWriteFlag( uiBit ) );

  ETRACE_N;

  return Err::m_nOK;
}
ErrVal UvlcWriter::skipFlag( MbDataAccess& rcMbDataAccess, Bool bNotAllowed )
{
  rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );

  ROFRS( m_bRunLengthCoding, Err::m_nOK );

  if( ! bNotAllowed && rcMbDataAccess.isSkippedMb() )
  {
    m_uiRun++;
  }
  else
  {
    ETRACE_T( "Run" );
    RNOK( xWriteUvlcCode( m_uiRun ) );
    ETRACE_N;

    m_uiRun = 0;
  }

  rcMbDataAccess.getMbData().setSkipFlag( m_uiRun > 0 );

  return Err::m_nOK;
}


ErrVal UvlcWriter::BLSkipFlag( MbDataAccess& rcMbDataAccess )
{
  UInt  uiCode = ( rcMbDataAccess.getMbData().getBLSkipFlag() ? 1 : 0 );

  ETRACE_T( "BLSkipFlag" );
  RNOK( xWriteFlag( uiCode ) );
  ETRACE_N;

  rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );

  return Err::m_nOK;
}


ErrVal UvlcWriter::mbMode( MbDataAccess& rcMbDataAccess )
{
  UInt uiMbMode = rcMbDataAccess.getConvertMbType( );

  if( m_bRunLengthCoding )
  {
    uiMbMode--;
  }
  rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
	 
	ETRACE_T( "MbMode" );
  RNOK( xWriteUvlcCode( uiMbMode ) );
  ETRACE_N;

  return Err::m_nOK;
}


ErrVal UvlcWriter::resPredFlag( MbDataAccess& rcMbDataAccess )
{
  UInt uiCode = ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) ? 1 : 0 );

  ETRACE_T( "ResidualPredFlag" );
  RNOK( xWriteFlag( uiCode ) );
  ETRACE_N;

  return Err::m_nOK;
}

ErrVal UvlcWriter::resPredFlag_FGS( MbDataAccess& rcMbDataAccess, Bool bBaseCoeff )
{
  UInt uiCode = ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) ? 1 : 0 );

  ETRACE_T( "ResidualPredFlag" );
  RNOK( xWriteFlag( uiCode ) );
  ETRACE_N;

  return Err::m_nOK;
}


//-- JVT-R091
ErrVal UvlcWriter::smoothedRefFlag( MbDataAccess& rcMbDataAccess )
{
  UInt uiCode = ( rcMbDataAccess.getMbData().getSmoothedRefFlag() ? 1 : 0 );

  ETRACE_T( "SmoothedRefFlag" );
  RNOK( xWriteFlag( uiCode ) );
  ETRACE_N;

  return Err::m_nOK;
}
//--

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv();
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx  )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx  )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx  )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx, SParIdx8x4 eSParIdx )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx, SParIdx4x8 eSParIdx )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}

ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8  eParIdx, SParIdx4x4 eSParIdx )
{
  Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
  RNOK( xWriteMvd( cMv ) );
  return Err::m_nOK;
}


ErrVal UvlcWriter::xWriteMvd( Mv cMv )
{
  ETRACE_T( "Mvd: x" );

  UInt  uiTemp;
  Short sHor   = cMv.getHor();
  Short sVer   = cMv.getVer();

  uiTemp = xConvertToUInt( sHor );
  RNOK( xWriteUvlcCode( uiTemp ) );

  ETRACE_CODE( sHor );
  ETRACE_TY("se(v)");
  ETRACE_N;

  ETRACE_T( "Mvd: y" );

  uiTemp = xConvertToUInt( sVer );
  RNOK( xWriteUvlcCode( uiTemp ) );

  ETRACE_CODE( sVer );
  ETRACE_TY("se(v)");
  ETRACE_N;
  return Err::m_nOK;
}

ErrVal UvlcWriter::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{
  ETRACE_T( "IntraPredModeChroma" );

  AOT_DBG( 4 < rcMbDataAccess.getMbData().getChromaPredMode() );
  RNOK( xWriteUvlcCode( rcMbDataAccess.getMbData().getChromaPredMode() ) );

  ETRACE_N;

  return Err::m_nOK;
}

ErrVal UvlcWriter::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
  ETRACE_T( "IntraPredModeLuma" );
  ETRACE_POS;

  Int iIntraPredModeLuma = rcMbDataAccess.encodeIntraPredMode(cIdx);
  ROT( iIntraPredModeLuma > 7);

  UInt uiBits = (iIntraPredModeLuma < 0) ? 1 : 0;

  RNOK( m_pcBitWriteBufferIf->write( uiBits, 1 ) );
  ETRACE_BITS( uiBits,1 );
  ETRACE_DO( m_uiBitCounter = 1 );

  if( ! uiBits )
  {
    RNOK( m_pcBitWriteBufferIf->write( iIntraPredModeLuma, 3 ) );
    ETRACE_BITS( iIntraPredModeLuma, 3 );
    ETRACE_DO( m_uiBitCounter = 4 );
  }

  ETRACE_COUNT(m_uiBitCounter);
  ETRACE_CODE(iIntraPredModeLuma);
  ETRACE_N;

  return Err::m_nOK;
}


ErrVal UvlcWriter::cbp( MbDataAccess& rcMbDataAccess )
{
  UInt uiCbp = rcMbDataAccess.getMbData().getMbCbp();
  ETRACE_T( "Cbp: " );
  ETRACE_X ( uiCbp );

  AOT_DBG( 48 < uiCbp );

  Bool bIntra = ( !rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.getMbData().isIntra() );
  UInt uiTemp = ( bIntra ? g_aucCbpIntra[uiCbp]: g_aucCbpInter[uiCbp] );

  RNOK( xWriteUvlcCode( uiTemp ) );

  ETRACE_N;

  return Err::m_nOK;
}



const UChar g_aucTcoeffCDc[3][2]=
{
  {0,0},
  {2,6},
  {4,1}
};
const UChar g_aucRunCDc[4]=
{
  2,1,0,0
};



const UChar g_aucRunSScan[16]=
{
  4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0
};
const UChar g_aucTcoeffSScan[4][10]=
{
  { 1, 3, 5, 9,11,13,21,23,25,27},
  { 7,17,19, 0, 0, 0, 0, 0, 0, 0},
  {15, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {29, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};




const UChar g_aucRunDScan[8]=
{
  9,3,1,1,1,0,0,0
};
const UChar g_aucTcoeffDScan[9][5] =
{
  { 1, 3, 7,15,17},
  { 5,19, 0, 0, 0},
  { 9,21, 0, 0, 0},
  {11, 0, 0, 0, 0},
  {13, 0, 0, 0, 0},
  {23, 0, 0, 0, 0},
  {25, 0, 0, 0, 0},
  {27, 0, 0, 0, 0},
  {29, 0, 0, 0, 0},
};



ErrVal UvlcWriter::residualBlock( MbDataAccess& rcMbDataAccess,
                                  LumaIdx       cIdx,
                                  ResidualMode  eResidualMode )
{
  const UChar*  pucScan;
  TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
  const Bool    bFrame  = ( FRAME == rcMbDataAccess.getMbPicType());

  Int   iLevel;
  Int   iRun      = 0;
  UInt  uiPos     = 0;
  UInt  uiMaxPos  = 16;

  switch( eResidualMode )
  {
  case LUMA_I16_DC:
    {
      pucScan = (bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan;
      uiMaxPos = 16;
      break;
    }
  case LUMA_I16_AC:
    {
      pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
      uiPos=1;
      break;
    }
  case LUMA_SCAN:
    {
      pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
      break;
    }
  default:
    return Err::m_nERR;
  }

  Int   aiLevelRun[32];
  UInt  uiTrailingOnes = 0;
  UInt  uiTotalRun     = 0;
  UInt  uiCoeffCnt     = 0;

  while( uiPos < uiMaxPos )
  {
    if( ( iLevel = piCoeff[ pucScan [ uiPos++ ] ]) )
    {
      if( abs(iLevel) == 1 )
      {
        m_uiCoeffCost += COEFF_COST[iRun];
        uiTrailingOnes++;
      }
      else
      {
        m_uiCoeffCost += MAX_VALUE;                // set high cost, shall not be discarded
        uiTrailingOnes = 0;
      }

      aiLevelRun[uiCoeffCnt]      = iLevel;
      aiLevelRun[uiCoeffCnt+0x10] = iRun;
      uiTotalRun += iRun;
      uiCoeffCnt++;
      iRun = 0;
    }
    else
    {
      iRun++;
    }
  }

  if( uiTrailingOnes > 3 )
  {
    uiTrailingOnes = 3;
  }


  switch( eResidualMode )

⌨️ 快捷键说明

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