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

📄 mvcscalablemodifycode.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 2 页
字号:

ErrVal
MVCScalableModifyCode::Write( UInt uiBits, UInt uiNumberOfBits )
{
	m_uiBitsWritten += uiNumberOfBits;

	if( (Int)uiNumberOfBits < m_iValidBits)  // one word
	{
		m_iValidBits -= uiNumberOfBits;

		m_ulCurrentBits |= uiBits << m_iValidBits;

		return Err::m_nOK;
	}


	ROT( 0 == m_uiDWordsLeft );
	m_uiDWordsLeft--;

	UInt uiShift = uiNumberOfBits - m_iValidBits;

	// add the last bits
	m_ulCurrentBits |= uiBits >> uiShift;

	*m_pulStreamPacket++ = xSwap( m_ulCurrentBits );


	// note: there is a problem with left shift with 32
	m_iValidBits = 32 - uiShift;

	m_ulCurrentBits = uiBits << m_iValidBits;

	if( 0 == uiShift )
	{
		m_ulCurrentBits = 0;
	}

	return Err::m_nOK;
}
ErrVal
MVCScalableModifyCode::WritePayloadHeader( enum h264::SEI::MessageType eType, UInt uiSize )
{
	//type
	{
		UInt uiTemp = eType;
		UInt uiByte = 0xFF;	
		while( 0xFF == uiByte )
		{
			uiByte  = (0xFF > uiTemp) ? uiTemp : 0xff;
			uiTemp -= 0xFF;
			RNOK( WriteCode( uiByte, 8 ) );
		}
	}

	// size
	{
		UInt uiTemp = uiSize;
		UInt uiByte = 0xFF;

		while( 0xFF == uiByte )
		{
			uiByte  = (0xFF > uiTemp) ? uiTemp : 0xff;
			uiTemp -= 0xFF;
			RNOK( WriteCode( uiByte, 8 ) );
		}
	}
	return Err::m_nOK;
}

ErrVal
MVCScalableModifyCode::WriteAlignZero()
{
	return Write( 0, m_iValidBits & 0x7 );
}

ErrVal
MVCScalableModifyCode::WriteTrailingBits()
{
	RNOK( WriteFlag( 1 ) );
	RNOK( WriteAlignZero() );
	return Err::m_nOK;
}

ErrVal 
MVCScalableModifyCode::flushBuffer()
{
	*m_pulStreamPacket = xSwap( m_ulCurrentBits );

	m_uiBitsWritten = (m_uiBitsWritten+7)/8;

	m_uiBitsWritten *= 8;

	return Err::m_nOK;
}

ErrVal
MVCScalableModifyCode::ConvertRBSPToPayload( UChar* m_pucBuffer,
																				 UChar pulStreamPacket[],
																			UInt& ruiBytesWritten,
																			UInt  uiHeaderBytes )
{
	UInt uiZeroCount    = 0;
	UInt uiReadOffset   = uiHeaderBytes;
	UInt uiWriteOffset  = uiHeaderBytes;

	//===== NAL unit header =====
	for( UInt uiIndex = 0; uiIndex < uiHeaderBytes; uiIndex++ )
	{
		m_pucBuffer[uiIndex] = (UChar)pulStreamPacket[uiIndex];
	}

	//===== NAL unit payload =====
	for( ; uiReadOffset < ruiBytesWritten ; uiReadOffset++, uiWriteOffset++ )
	{
		if( 2 == uiZeroCount && 0 == ( pulStreamPacket[uiReadOffset] & 0xfc ) )
		{
			uiZeroCount                   = 0;
			m_pucBuffer[uiWriteOffset++]  = 0x03;
		}

		m_pucBuffer[uiWriteOffset] = (UChar)pulStreamPacket[uiReadOffset];

		if( 0 == pulStreamPacket[uiReadOffset] )
		{
			uiZeroCount++;
		}
		else
		{
			uiZeroCount = 0;
		}
	}
	if( ( 0x00 == m_pucBuffer[uiWriteOffset-1] ) && ( 0x00 == m_pucBuffer[uiWriteOffset-2] ) )
	{
		m_pucBuffer[uiWriteOffset++] = 0x03;
	}
	ruiBytesWritten = uiWriteOffset;

	return Err::m_nOK;
}




ErrVal
MVCScalableModifyCode::SEICode( h264::SEI::ViewScalabilityInfoSei* pcViewScalInfoSei, MVCScalableModifyCode *pcScalableModifyCode )
{
	UInt uiNumOperationPointsMinus1 = pcViewScalInfoSei->getNumOperationPointsMinus1();
	pcScalableModifyCode->WriteUVLC( uiNumOperationPointsMinus1 );
	for( UInt uiOpId = 0; uiOpId <= uiNumOperationPointsMinus1; uiOpId++ )
	{
		pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getOperationPointId( uiOpId ) );
		pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getPriorityId( uiOpId ), 5 );
		pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getTemporalId( uiOpId ), 3 );

		UInt uiNumActiveViewsMinus1 = pcViewScalInfoSei->getNumActiveViewsMinus1( uiOpId );
		pcScalableModifyCode->WriteUVLC( uiNumActiveViewsMinus1 );

		for( UInt j = 0; j <= uiNumActiveViewsMinus1; j++ )
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getViewId( uiOpId, j ) );

		pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getProfileLevelInfoPresentFlag( uiOpId ) );
		pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getBitRateInfoPresentFlag( uiOpId ) );
		pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getFrmRateInfoPresentFlag( uiOpId ) );
		pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpDependencyInfoPresentFlag( uiOpId ) );
		pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getInitParameterSetsInfoPresentFlag( uiOpId ) );


		if( pcViewScalInfoSei->getProfileLevelInfoPresentFlag( uiOpId ) )
		{
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getOpProfileIdc( uiOpId ), 8 );
			pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet0Flag( uiOpId ) );
			pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet1Flag( uiOpId ) );
			pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet2Flag( uiOpId ) );
			pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet3Flag( uiOpId ) );
			pcScalableModifyCode->WriteCode( 0, 4 );
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getOpLevelIdc( uiOpId ), 8 );
		}
		else
		{
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getProfileLevelInfoSrcOpIdDelta( uiOpId ) );
		}

		if( pcViewScalInfoSei->getBitRateInfoPresentFlag( uiOpId ) )
		{
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getAvgBitrate( uiOpId ), 16 );
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getMaxBitrate( uiOpId ), 16 );
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getMaxBitrateCalcWindow( uiOpId ), 16 );
		}

		if( pcViewScalInfoSei->getFrmRateInfoPresentFlag( uiOpId ) )
		{
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getConstantFrmRateIdc( uiOpId ), 2 );
			pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getAvgFrmRate( uiOpId ), 16 );
		}
		else
		{
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getFrmRateInfoSrcOpIdDela( uiOpId ) );
		}

		if( pcViewScalInfoSei->getOpDependencyInfoPresentFlag( uiOpId ) )
		{
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getNumDirectlyDependentOps( uiOpId ) );
			for( UInt j = 0; j < pcViewScalInfoSei->getNumDirectlyDependentOps( uiOpId ); j++ )
				pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getDirectlyDependentOpIdDeltaMinus1( uiOpId, j ) );
		}
		else
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getOpDependencyInfoSrcOpIdDelta( uiOpId ) );

		if( pcViewScalInfoSei->getInitParameterSetsInfoPresentFlag( uiOpId ) )
		{
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getNumInitSeqParameterSetMinus1( uiOpId ) );
			for( UInt j = 0; j <= pcViewScalInfoSei->getNumInitSeqParameterSetMinus1( uiOpId ); j++ )
				pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getInitSeqParameterSetIdDelta( uiOpId, j ) );

			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getNumInitPicParameterSetMinus1( uiOpId ) );
			for( UInt j = 0; j <= pcViewScalInfoSei->getNumInitPicParameterSetMinus1( uiOpId ); j++ )
				pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getInitPicParameterSetIdDelta( uiOpId, j ) );
		}
		else
			pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getInitParameterSetsInfoSrcOpIdDelta( uiOpId ) );

	}// for

	return Err::m_nOK;
}

⌨️ 快捷键说明

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