资源简介
算术编码解码,内附论文,完整源代码,论文相关ppt,还有个exe相关程序。
代码片段和文件信息
#include “ArithmeticCoderC.h“
#include “tools.h“
// Konstanten zur Bereichsunterteilung bei 32-Bit-Integern
// oberstes Bit wird zur Vermeidung von 躡erl鋟fen freigehalten
const unsigned int g_FirstQuarter = 0x20000000;
const unsigned int g_ThirdQuarter = 0x60000000;
const unsigned int g_Half = 0x40000000;
ArithmeticCoderC::ArithmeticCoderC()
{
mBitCount = 0;
mBitBuffer = 0;
mLow = 0;
mHigh = 0x7FFFFFFF; // arbeite nur mit den unteren 31 bit
mScale = 0;
mBuffer = 0;
mStep = 0;
}
void ArithmeticCoderC::SetFile( fstream *file )
{
mFile = file;
}
void ArithmeticCoderC::SetBit( const unsigned char bit )
{
// Bit dem Puffer hinzuf黦en
mBitBuffer = (mBitBuffer << 1) | bit;
mBitCount++;
if(mBitCount == 8) // Puffer voll
{
v_char.push_back(mBitBuffer);//
// schreiben
mFile->write(reinterpret_cast(&mBitBuffer)sizeof(mBitBuffer));
mBitCount = 0;
}
}
void ArithmeticCoderC::SetBitFlush()
{
// Puffer bis zur n鋍hsten Byte-Grenze mit Nullen auff黮len
while( mBitCount != 0 )
SetBit( 0 );
}
unsigned char ArithmeticCoderC::GetBit()
{
if(mBitCount == 0) // Puffer leer
{
if( !( mFile->eof() ) ) // Datei komplett eingelesen?
mFile->read(reinterpret_cast(&mBitBuffer)sizeof(mBitBuffer));
else
mBitBuffer = 0; // Nullen anh鋘gen
mBitCount = 8;
}
// Bit aus Puffer extrahieren
unsigned char bit = mBitBuffer >> 7;
mBitBuffer <<= 1;
mBitCount--;
return bit;
}
void ArithmeticCoderC::Encode( const unsigned int low_count
const unsigned int high_count
const unsigned int total )
// total < 2^29
{
// Bereich in Schritte unterteilen
mStep = ( mHigh - mLow + 1 ) / total; // oben offenes intervall => +1
// obere Grenze aktualisieren
mHigh = mLow + mStep * high_count - 1; // oben offenes intervall => -1
// untere Grenze aktualisieren
mLow = mLow + mStep * low_count;
v_mStep.push_back(mStep);
v_mHigh.push_back(mHigh);
v_mLow.push_back(mLow);
// e1/e2 Mapping durchf黨ren
while( ( mHigh < g_Half ) || ( mLow >= g_Half ) )
{
if( mHigh < g_Half )
{
SetBit( 0 );
mLow = mLow * 2;
mHigh = mHigh * 2 + 1;
// e3
for(; mScale > 0; mScale-- )
SetBit( 1 );
}
else if( mLow >= g_Half )
{
SetBit( 1 );
mLow = 2 * ( mLow - g_Half );
mHigh = 2 * ( mHigh - g_Half ) + 1;
// e3
for(; mScale > 0; mScale-- )
SetBit( 0 );
}
}
// e3
while( ( g_FirstQuarter <= mLow ) && ( mHigh < g_ThirdQuarter ) )
{
mScale++;
mLow = 2 * ( mLow - g_FirstQuarter );
mHigh = 2 * ( mHigh - g_FirstQuarter ) + 1;
}
v_mScale.push_back(mScale);
}
void ArithmeticCoderC::EncodeFinish()
{
// Es gibt zwei M鰃lichkeiten wie mLow und mHigh liegen d.h.
// zwei Bits reichen zur Entscheidung aus.
if( mLow < g_FirstQuarter ) // mLow < FirstQuarter < Half <= mHigh
{
SetBit( 0 );
for( int i=0; i
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4733 2011-10-23 22:22 code\ac.dsp
文件 555 2001-11-15 17:51 code\ac.dsw
文件 58368 2011-11-06 15:00 code\ac.ncb
文件 56832 2011-11-06 15:00 code\ac.opt
文件 1759 2011-10-26 20:36 code\ac.plg
文件 4634 2011-10-26 20:36 code\ArithmeticCoderC.cpp
文件 1167 2011-10-26 20:41 code\ArithmeticCoderC.h
文件 72 2011-10-26 20:24 code\data.txt
文件 480 2011-10-26 20:45 code\main.cpp
文件 331 2011-10-26 20:25 code\ModelI.cpp
文件 377 2001-11-27 18:26 code\ModelI.h
文件 1401 2001-11-27 23:29 code\ModelOrder0C.cpp
文件 270 2001-11-27 18:25 code\ModelOrder0C.h
文件 638 2011-10-26 20:24 code\outdata.txt
文件 109 2001-11-15 18:50 code\tools.h
文件 22528 2002-02-24 14:39 scale\acvis.dll
文件 637952 2002-03-15 14:10 scale\ACVis.exe
文件 371 2002-02-18 19:48 scale\NO.gif
文件 245 2002-02-18 19:54 scale\NOs.gif
文件 78 2002-02-18 19:43 scale\O.gif
文件 434 2002-02-18 19:48 scale\SO.gif
文件 243 2002-02-18 19:54 scale\SOs.gif
文件 4565 2003-06-23 14:50 source_en\ArithmeticCoderC.cpp
文件 923 2001-11-27 17:25 source_en\ArithmeticCoderC.h
文件 1312 2003-06-23 14:51 source_en\Main.cpp
文件 365 2003-06-23 14:51 source_en\ModelI.cpp
文件 377 2001-11-27 17:26 source_en\ModelI.h
文件 1448 2003-06-23 14:54 source_en\ModelOrder0C.cpp
文件 270 2001-11-27 17:25 source_en\ModelOrder0C.h
文件 109 2001-11-15 17:50 source_en\Tools.h
............此处省略9个文件信息
评论
共有 条评论