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

📄 modelorder0c.cpp

📁 The implementaion of CABAC encoding and decoding process in H264 standard.
💻 CPP
字号:
#include "ModelOrder0C.h"

ModelOrder0C::ModelOrder0C()
{
	// initialize probabilities with 1
	mTotal = 257; // 256 + escape symbol for termination
	for( unsigned int i=0; i<257; i++ )
		mCumCount[i] = 1;
}

void ModelOrder0C::Encode()
{

	while( !mSource->eof() )
	{
		unsigned char symbol;

		// read symbol
		mSource->read( reinterpret_cast<char*>(&symbol), sizeof( symbol ) );

		if( !mSource->eof() )
		{
			// cumulate frequencies
			unsigned int low_count = 0;
			for( unsigned char j=0; j<symbol; j++ )
				low_count += mCumCount[j];

			// encode symbol
			mAC.Encode( low_count, low_count + mCumCount[j], mTotal );

			// update model
			mCumCount[ symbol ]++;
			mTotal++;
		}
	}

	// write escape symbol for termination
	mAC.Encode( mTotal-1, mTotal, mTotal );
}

void ModelOrder0C::Decode()
{
	unsigned int symbol;

	do
	{
		unsigned int value;

		// read value
		value = mAC.DecodeTarget( mTotal );

		unsigned int low_count = 0;

		// determine symbol
		for( symbol=0; low_count + mCumCount[symbol] <= value; symbol++ )
			low_count += mCumCount[symbol];

		// write symbol
		if( symbol < 256 )
			mTarget->write( reinterpret_cast<char*>(&symbol), sizeof( char ) );

		// adapt decoder
		mAC.Decode( low_count, low_count + mCumCount[ symbol ] );

		// update model
		mCumCount[ symbol ]++;
		mTotal++;
	}
	while( symbol != 256 ); // until termination symbol read
}

⌨️ 快捷键说明

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