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

📄 nalunitencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            ROT( pcCurrentWriteBuffer->nextBitWriteBufferActive() );
            for(ULong uiBitIdx = 0; uiBitIdx< 16; uiBitIdx++)
            {
              uicrcMsb = ( uicrcVal >> 15 ) & 1;
              BitVal = 0;
              uicrcVal = (((uicrcVal<<1) + BitVal ) & 0xffff)^(uicrcMsb*0x1021);
            }
            pcH264AVCEncoder->m_uicrcVal[uiLayerCGSSNR] = uicrcVal;
            pcH264AVCEncoder->m_pcIntegrityCheckSEI->setNumInfoEntriesMinus1(uiLayerCGSSNR);
            pcH264AVCEncoder->m_pcIntegrityCheckSEI->setEntryDependencyId(uiLayerCGSSNR,uiLayerCGSSNR);
            pcH264AVCEncoder->m_pcIntegrityCheckSEI->setQualityLayerCRC(uiLayerCGSSNR,uicrcVal);
          }
        }

        //JVT-W052 bug_fixed
        if(pcH264AVCEncoder->getCodingParameter()->getNumberOfLayers() == 1)
        {
          pcH264AVCEncoder->m_pcIntegrityCheckSEI->setNumInfoEntriesMinus1(0);
          pcH264AVCEncoder->m_pcIntegrityCheckSEI->setEntryDependencyId(0,0);
          pcH264AVCEncoder->m_pcIntegrityCheckSEI->setQualityLayerCRC(0,0);
        }
        //JVT-W052 bug_fixed
      }
      //JVT-W052
    }

    ExtBinDataAccessor* pcNewExtBinDataAccessor = new ExtBinDataAccessor;
    ROF( pcNewExtBinDataAccessor );

    rcBinData               .reset          ();
    rcBinData               .set            (  pucNewBuffer, uiBytes );
    rcBinData               .setMemAccessor ( *pcNewExtBinDataAccessor );
    rcExtBinDataAccessorList.push_back      (  pcNewExtBinDataAccessor );

    rcBinData               .reset          ();
    rcBinData               .setMemAccessor ( *pcExtBinDataAccessor );

    if( !pcCurrentWriteBuffer->nextBitWriteBufferActive() )
    {
      break;
    }
    pucRBSP              = pcCurrentWriteBuffer->getNextBuffersPacket();
    pcCurrentWriteBuffer = pcCurrentWriteBuffer->getNextBitWriteBuffer();
    uiFragment++;
  }

  RNOK( m_pcBitWriteBuffer->uninit() );

  //==== reset parameters =====
  m_bIsUnitActive     = false;
  m_pucBuffer         = NULL;
  m_pcBinDataAccessor = NULL;
  m_eNalUnitType      = NAL_UNIT_UNSPECIFIED_0;
  m_eNalRefIdc        = NAL_REF_IDC_PRIORITY_LOWEST;
  return Err::m_nOK;
}



ErrVal
NalUnitEncoder::closeNalUnit( UInt& ruiBits )
{
  ROF( m_bIsUnitActive );

  //===== write trailing bits =====
  if( NAL_UNIT_END_OF_SEQUENCE != m_eNalUnitType &&
      NAL_UNIT_END_OF_STREAM   != m_eNalUnitType &&
     (NAL_UNIT_PREFIX          != m_eNalUnitType || m_eNalRefIdc != NAL_REF_IDC_PRIORITY_LOWEST) )
  {
    RNOK ( xWriteTrailingBits() );
  }
  RNOK( m_pcBitWriteBuffer->flushBuffer() );

  //===== convert to payload and add header =====
  UInt  uiHeaderBytes = 1;
  if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE || m_eNalUnitType == NAL_UNIT_PREFIX )
  {
    uiHeaderBytes += NAL_UNIT_HEADER_SVC_EXTENSION_BYTES;
  }

  UInt  uiBits = ( m_pcBitWriteBuffer->getNumberOfWrittenBits() + 7 ) >> 3;

  RNOK( convertRBSPToPayload( uiBits, uiHeaderBytes, m_pucBuffer, m_pucTempBuffer, m_uiPacketLength ) );
  RNOK( m_pcBinDataAccessor->decreaseEndPos( m_pcBinDataAccessor->size() - uiBits ) );
  ruiBits             = 8*uiBits;

  //==== reset parameters =====
  m_bIsUnitActive     = false;
  m_pucBuffer         = NULL;
  m_pcBinDataAccessor = NULL;
  m_eNalUnitType      = NAL_UNIT_UNSPECIFIED_0;
  m_eNalRefIdc        = NAL_REF_IDC_PRIORITY_LOWEST;
  return Err::m_nOK;
}

ErrVal
NalUnitEncoder::convertRBSPToPayload( UInt         &ruiBytesWritten,
                                       UInt          uiHeaderBytes,
                                       UChar        *pcPayload,
                                       const UChar  *pcRBSP,
                                       UInt          uiPayloadBufferSize )
{
  UInt uiZeroCount    = 0;
  UInt uiReadOffset   = uiHeaderBytes;
  UInt uiWriteOffset  = uiHeaderBytes;

  //===== NAL unit header =====
  for( UInt uiIndex = 0; uiIndex < uiHeaderBytes; uiIndex++ )
  {
    pcPayload[uiIndex] = pcRBSP[uiIndex];
  }

  //===== NAL unit payload =====
  for( ; uiReadOffset < ruiBytesWritten ; uiReadOffset++, uiWriteOffset++ )
  {
    ROT( uiWriteOffset >= uiPayloadBufferSize );

    if( 2 == uiZeroCount && 0 == ( pcRBSP[uiReadOffset] & 0xfc ) )
    {
      uiZeroCount                   = 0;
      pcPayload[uiWriteOffset++]  = 0x03;
    }

    pcPayload[uiWriteOffset] = pcRBSP[uiReadOffset];

    if( 0 == pcRBSP[uiReadOffset] )
    {
      uiZeroCount++;
    }
    else
    {
      uiZeroCount = 0;
    }
  }
  if( ( 0x00 == pcPayload[uiWriteOffset-1] ) && ( 0x00 == pcPayload[uiWriteOffset-2] ) )
  {
    ROT( uiWriteOffset >= uiPayloadBufferSize );
    pcPayload[uiWriteOffset++] = 0x03;
  }
  ruiBytesWritten = uiWriteOffset;

  return Err::m_nOK;
}

ErrVal NalUnitEncoder::xWriteTrailingBits( )
{
  RNOK( m_pcBitWriteBuffer->write( 1 ) );
  RNOK( m_pcBitWriteBuffer->writeAlignZero() );

  BitWriteBufferIf* pcCurrentBitWriter = m_pcBitWriteBuffer;
  while( pcCurrentBitWriter->nextBitWriteBufferActive() )
  {
    pcCurrentBitWriter = pcCurrentBitWriter->getNextBitWriteBuffer();
    RNOK( pcCurrentBitWriter->write( 1 ) );
    RNOK( pcCurrentBitWriter->writeAlignZero() );
  }
  return Err::m_nOK;
}


ErrVal
NalUnitEncoder::write( const SequenceParameterSet& rcSPS )
{
  RNOK( rcSPS.write( m_pcHeaderSymbolWriteIf ) );
  m_eNalUnitType  = rcSPS.getNalUnitType();
  m_eNalRefIdc    = NAL_REF_IDC_PRIORITY_HIGHEST;
  return Err::m_nOK;
}


ErrVal
NalUnitEncoder::write( const PictureParameterSet& rcPPS )
{
  RNOK( rcPPS.write( m_pcHeaderSymbolWriteIf ) );

  m_eNalUnitType  = rcPPS.getNalUnitType();
  m_eNalRefIdc    = NAL_REF_IDC_PRIORITY_HIGHEST;
  return Err::m_nOK;
}


ErrVal
NalUnitEncoder::writePrefix( const SliceHeader& rcSH )
{
  RNOK( rcSH.writePrefix( *m_pcHeaderSymbolWriteIf ) );
  m_eNalUnitType  = NAL_UNIT_PREFIX;
  m_eNalRefIdc    = rcSH.getNalRefIdc();
  return Err::m_nOK;
}


ErrVal
NalUnitEncoder::write( const SliceHeader& rcSH )
{
  SliceHeader           cSH           = rcSH;
  HeaderSymbolWriteIf*  pcCurrWriteIf = m_pcHeaderSymbolWriteIf;
  UInt                  uiSourceLayer = g_nLayer;

  for( UInt uiMGSFragment = 0; true; uiMGSFragment++ )
  {
    ETRACE_DECLARE( Bool m_bTraceEnable = true );

    //----- modify copy of slice header -----
    cSH.setDependencyId                   ( rcSH.getLayerCGSSNR         () );
    cSH.setQualityId                      ( rcSH.getQualityLevelCGSSNR  () + uiMGSFragment );
    cSH.setDiscardableFlag                ( rcSH.getDiscardableFlag     () );
    cSH.setNoInterLayerPredFlag           ( rcSH.getNoInterLayerPredFlag() && cSH.getQualityId() == 0 );
    cSH.setScanIdxStart                   ( rcSH.getSPS().getMGSCoeffStart( uiMGSFragment ) );
    cSH.setScanIdxStop                    ( rcSH.getSPS().getMGSCoeffStop ( uiMGSFragment ) );
    cSH.setRefLayerDQId                   ( uiMGSFragment == 0 ? rcSH.getRefLayerDQId                   () : ( rcSH.getLayerCGSSNR() << 4 ) + rcSH.getQualityLevelCGSSNR() + uiMGSFragment - 1 );
    cSH.setAdaptiveBaseModeFlag           ( uiMGSFragment == 0 ? rcSH.getAdaptiveBaseModeFlag           () : false  );
    cSH.setAdaptiveMotionPredictionFlag   ( uiMGSFragment == 0 ? rcSH.getAdaptiveMotionPredictionFlag   () : false  );
    cSH.setAdaptiveResidualPredictionFlag ( uiMGSFragment == 0 ? rcSH.getAdaptiveResidualPredictionFlag () : false  );
    cSH.setDefaultBaseModeFlag            ( uiMGSFragment == 0 ? rcSH.getDefaultBaseModeFlag            () : true   );
    cSH.setDefaultMotionPredictionFlag    ( uiMGSFragment == 0 ? rcSH.getDefaultMotionPredictionFlag    () : true   );
    cSH.setDefaultResidualPredictionFlag  ( uiMGSFragment == 0 ? rcSH.getDefaultResidualPredictionFlag  () : true   );

    //----- write copy of slice header -----
    RNOK( cSH.write( *pcCurrWriteIf ) );
    if( rcSH.getSPS().getMGSCoeffStop( uiMGSFragment ) == 16 )
    {
      break;
    }

    //----- update -----
    g_nLayer++;
    ETRACE_LAYER( g_nLayer );
    pcCurrWriteIf = pcCurrWriteIf->getHeaderSymbolWriteIfNextSlice( true );
  }

  ETRACE_DECLARE( Bool m_bTraceEnable = true );
  g_nLayer = uiSourceLayer;
  ETRACE_LAYER( g_nLayer );

  m_eNalUnitType  = rcSH.getNalUnitType ();
  m_eNalRefIdc    = rcSH.getNalRefIdc   ();
  return Err::m_nOK;
}


ErrVal
NalUnitEncoder::write( SEI::MessageList& rcSEIMessageList )
{
  RNOK( SEI::write( m_pcHeaderSymbolWriteIf, m_pcHeaderSymbolTestIf, &rcSEIMessageList ) );

  m_eNalUnitType  = NAL_UNIT_SEI;
  m_eNalRefIdc    = NAL_REF_IDC_PRIORITY_LOWEST;
  return Err::m_nOK;
}

// JVT-T073 {
ErrVal
NalUnitEncoder::writeNesting( SEI::MessageList& rcSEIMessageList )
{
  RNOK( SEI::writeNesting( m_pcHeaderSymbolWriteIf, m_pcHeaderSymbolTestIf, &rcSEIMessageList ) );
  m_eNalUnitType  = NAL_UNIT_SEI;
  m_eNalRefIdc    = NAL_REF_IDC_PRIORITY_LOWEST;
  return Err::m_nOK;
}
// JVT-T073 }

// JVT-V068 {
ErrVal
NalUnitEncoder::writeScalableNestingSei( SEI::MessageList& rcSEIMessageList )
{
  RNOK( SEI::writeScalableNestingSei( m_pcHeaderSymbolWriteIf, m_pcHeaderSymbolTestIf, &rcSEIMessageList ) );
  m_eNalUnitType  = NAL_UNIT_SEI;
  m_eNalRefIdc    = NAL_REF_IDC_PRIORITY_LOWEST;
  return Err::m_nOK;
}
// JVT-V068 }

H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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