亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? arith-n.cpp

?? 算術編碼c程序實現
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

//------------------------------------------------------------
// arith-n.cpp - order-n arithmetic coding module

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "errhand.h"
#include "bitio.h"

// low_count 和 high_count 唯一地定義了在 0 到 1 范圍中符號的所在位置
// scale 指 0 到 1 范圍內的總量程,即有多少字符要記數
typedef struct
{
	unsigned short int low_count;
	unsigned short int high_count;
	unsigned short int scale;
}SYMBOL;

#define MAXIMUM_SCALE	16383		// maximum allowed frequency count 
#define ESCAPE			256			// the escape symbol
#define DONE			( -1 )		// the output stream empty symbol
#define FLUSH			( -2 )		// the symbol to flush the model

void initialize_options( int argc, char ** argv );
int check_compression( FILE* input, BIT_FILE* output );
void initialize_model( void );
void update_model( int symbol );
int convert_int_to_symbol( int symbol, SYMBOL* s );
void get_symbol_scale( SYMBOL* s);
int convert_symbol_to_int( int count, SYMBOL* s );
void add_character_to_model( int c );
void flush_model( void );
void initialize_arithmetic_decoder( BIT_FILE* stream );
void remove_symbol_from_stream( BIT_FILE* stream, SYMBOL* s );
void initialize_arithmetic_encoder( void );
void encode_symbol( BIT_FILE* stream, SYMBOL* s );
void flush_arithmetic_encoder( BIT_FILE* stream );
short int get_current_count( SYMBOL* s );

char* CompressionName	= "Adaptive order n moder with arithmetic coding";
char* Usage				= "in-file out-file [-o order]\n\n";
int max_order			= 3;

void CompressFile( FILE* input, BIT_FILE* output, int argc, char * argv[] )
{
	SYMBOL s;
	int c;
	int escaped;
	int flush = 0;
	long int text_count = 0;

	initialize_options( argc, argv );
	initialize_model();
	initialize_arithmetic_encoder();
	for(;;)
	{
		if (( ++ text_count & 0xff ) == 0 )
			flush = check_compression( input, output );
		if (!flush)
			c = getc( input );
		else
			c = FLUSH;
		if (c == EOF)
			c = DONE;
		do 
		{
			escaped = convert_int_to_symbol( c, &s );
			encode_symbol( output, &s );
		}while(escaped);

		if ( c == DONE )
			break;
		if ( c == FLUSH )
		{
			flush_model();
			flush = 0;
		}
		update_model( c );
		add_character_to_model( c );
	}
	flush_arithmetic_encoder( output );	
}

void ExpandFile( BIT_FILE* input, FILE* output, int argc, char* argv[])
{
	SYMBOL s;
	int c;
	int count;

	initialize_options( argc, argv );
	initialize_model();
	initialize_arithmetic_decoder( input );
	for (;;)
	{
		do 
		{
			get_symbol_scale( &s );
			count = get_current_count( &s );
			c = convert_symbol_to_int( count, &s );
			remove_symbol_from_stream( input, &s );
		}while( c == ESCAPE );
		if ( c == DONE )
			break;
		if ( c != FLUSH )
			putc( (char) c, output );
		else
			flush_model();
		update_model( c );
		add_character_to_model( c );
	}
}

void initialize_options( int argc, char* argv[] )
{
	while ( argc-- > 0)
	{
		if (strcmp( *argv, "-o" ) == 0)
		{
			argc--;
			max_order = atoi(*++argv);
		}
		else
			printf("Uknown argument on command line: %s\n", *argv);
		argc--;
		argv++;
	}
}

int check_compression( FILE* input, BIT_FILE* output )
{
	static long local_input_marker = 0L;
	static long local_output_marker = 0L;
	long total_input_bytes;
	long total_output_bytes;
	int local_ratio;

	total_input_bytes = ftell( input ) - local_input_marker;
	total_output_bytes = ftell( output->file );
	total_output_bytes -= local_output_marker;
	if (total_output_bytes == 0)
		total_output_bytes = 1;
	local_ratio = (int)(( total_output_bytes * 100 ) / total_input_bytes );
	local_input_marker = ftell( input );
	local_output_marker = ftell( output->file );

	return (local_ratio > 90);
}


//----------------------------------------------------------
// the next few routines contain all of the code and data used to
// perfoem modeling for thes program.

// a context table contains a list of the counts for all symbols
// that have been seen in the defined context.  for example, a 
// context of "Zor" might have only had 2 different characters 
// appear.   't' might have appeared 10 times, and 'l' might have 
// appeared once. these two counts are stored in and array of STATS.
// as new characters are added to a particular contexts, the STATS
// array will grow.  sometimes, the STATS array will shrink 
// after flushing the model.
typedef struct
{
	unsigned char symbol;
	unsigned char counts;
}STATS;


// each context has to have links to higher order contexts. These
// links are used to navigate through the context tables. For example, 
// to find the context table for "ABC", I start at the roder 0 table.
// then find the pointer to the "A" context table by looking through
// the LINKS array.  At that table, we find the "B" link  and go to 
// that table. The process continues until the destination table is 
// found.  The table pointed to by the LINKS array corresponds to the 
// symbol found at the same offset in the STATS table.  The reason that
// LINKS is in a separate structure instead of being combined with 
// STATS is to save space.  All of the leaf context nodes don't need
// next pointers, since they are in the highest order context.  In the 
// leaf nodes, the LINKS array is a NULL pointers.
typedef struct
{
	struct context* next;
}LINKS;


// The CONTEXT structure holds all of the known information about
// a particular context.  The links and stats pointers are discussed 
// immediately above here.  The max_index element gives the maximum
// index that can be applied to the stats or link array. When the 
// table is first created, and stats is set to NULL, max_index si set 
// to -1. As soon as single element is added to stats, max_index is 
// incremented to 0.
//
// The lesser context pointer is a navigational aid. It points to 
// the context that is one less than the current order. For example
// if the current is "ABC", the lesser_context pointer will 
// point to "BC". The reason for maintaining this pointer is that 
// this particular bit of table searching is done frequently, but
// the pointer only needs to be built once, when the context is 
// created.
//
typedef struct context
{
	int max_index;
	LINKS* links;
	STATS* stats;
	struct context* lesser_context;
}CONTEXT;

CONTEXT ** contexts;

// current_order contains the current order of the model. it starts 
// at max_order, and is decremented every time an ESCAPE is sent. it
// will only go down to -1 for normal symbols, but can go to -2 for
// EOF and FLUSH
int current_order;

// this table contains the cumulative totals for the current context.
// because this program is using exclusion, totals has to be calculated 
// every time a context is used. the scoreboard array keeps track of
// symbols that have appeared in higher order models, so that they
// can be excluded from lower order context total calculations.
short int totals[258];
char scoreboard[256];

void update_table( CONTEXT* table, int symbol );
void rescale_table( CONTEXT* table );
void totalize_table( CONTEXT* table );
CONTEXT* shift_to_next_context( CONTEXT* table, int c, int order );
CONTEXT* allocate_next_order_table( CONTEXT* table, int symbol, CONTEXT* lesser_context );
void recursive_flush( CONTEXT* table );

void initialize_model()
{
	int i;
	CONTEXT* null_table;
	CONTEXT* control_table;

	current_order = max_order;
	contexts = (CONTEXT**)calloc(sizeof(CONTEXT*), 10);
	if (contexts == NULL)
		fatal_error("Failure #1: allocating context table!");
	contexts += 2;
	null_table = (CONTEXT*)calloc(sizeof(CONTEXT), 1);
	if (null_table == NULL)
		fatal_error("Failure #2: allocating null table!");
	null_table->max_index = -1;
	contexts[-1] = null_table;
	for (i = 0; i <= max_order; i++)
		contexts[i] = allocate_next_order_table(contexts[i - 1], 0, contexts[i - 1]);
	free((char*)null_table->stats);
	null_table->stats = (STATS*)calloc(sizeof(STATS), 256);
	if(null_table->stats == NULL)
		fatal_error("Failure #3: allocating null table!");
	null_table->max_index = 255;
	for (i = 0; i < 256; i ++)
	{
		null_table->stats[i].symbol = (unsigned char)i;
		null_table->stats[i].counts = 1;
	}

	control_table = (CONTEXT*)calloc(sizeof(CONTEXT), 1);
	if (control_table == NULL)
		fatal_error("Failure #4: allocating control table!");
	control_table->stats = (STATS*)calloc(sizeof(STATS), 2);
	if ( control_table->stats == NULL)
		fatal_error("Failure #5: allocating control table!");
	contexts[-2] = control_table;
	control_table->max_index = 1;
	control_table->stats[0].symbol = -FLUSH;
	control_table->stats[0].counts = 1;
	control_table->stats[1].symbol = -DONE;
	control_table->stats[1].counts = 1;

	for (i = 0; i < 256; i++)
		scoreboard[i] = 0;
}

CONTEXT* allocate_next_order_table( CONTEXT* table, int symbol, CONTEXT* lesser_context )
{
	CONTEXT* new_table;
	int i;
	unsigned int new_size;

	for ( i = 0; i <= table->max_index; i++)
		if (table->stats[i].symbol == ( unsigned char )symbol)
			break;
	if ( i > table->max_index )
	{
		table->max_index++;
		new_size = sizeof(LINKS);
		new_size *= table->max_index + 1;
		if (table->links == NULL)
			table->links = (LINKS*)calloc(new_size, 1);
		else
			table->links = (LINKS*)realloc((char*)table->links, new_size);
		new_size = sizeof(STATS);
		new_size *= table->max_index + 1;
		if (table->stats == NULL)
			table->stats = (STATS*)calloc(new_size, 1);
		else
			table->stats = (STATS*)realloc((char*)table->stats, new_size);
		if (table->links == NULL)
			fatal_error("Failure #6: allocating new talbe");
		if (table->stats == NULL)
			fatal_error("Failure #7: allocating new table");
		table->stats[i].symbol = (unsigned char)symbol;
		table->stats[i].counts = 0;
	}
	new_table = (CONTEXT*)calloc(sizeof(CONTEXT), 1);
	if (new_table == NULL)
		fatal_error("Failure #8: allocating new table");
	new_table->max_index = -1;
	table->links[i].next = new_table;
	new_table->lesser_context = lesser_context;
	return (new_table);
}

// the routine is called to increment the counts for the current 
// contexts. It is called after a character has been encoded or 
// decoded. All it does is call update_table for each of the 
// current contexts, which does the work of incrementing the count.
// This particular version of update_model() practices update exclusion.
// which means that if lower order models weren't used to encode 
// or decode the character, they don't get their counts updated.
// this seems to improve compression performance quite a bit.
// to disable update exclusion, the loop would be changed to run 
// from 0 to max_order, instead of current_order to max_order
void update_model( int symbol )
{
	int i;
	int local_order;

	if (current_order < 0)
		local_order = 0;
	else
		local_order = current_order;
	if (symbol >= 0)
	{
		while ( local_order <= max_order )
		{
			if (symbol >= 0)
				update_table( contexts[local_order], symbol );
			local_order++;
		}
	}
	current_order = max_order;
	for( i = 0; i < 256; i++ )
		scoreboard[i] = 0;
}

void update_table( CONTEXT* table, int symbol )
{
	int i;
	int index;
	unsigned char temp;
	CONTEXT* temp_ptr;
	unsigned int new_size;

	// first, find the symbol in the apropriate context table. The first
	// symbol in the table is the most active. so start there.
	index = 0;
	while( index <= table->max_index && 
			table->stats[index].symbol != (unsigned char)symbol )
		index++;
	if ( index > table->max_index )
	{
		table->max_index++;
		new_size = sizeof(LINKS);
		new_size *= table->max_index + 1;
		if (current_order < max_order)
		{
			if (table->max_index == 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲品质自拍视频| 国产区在线观看成人精品| 精品一区精品二区高清| 国产精品激情偷乱一区二区∴| 欧美色电影在线| 风间由美一区二区三区在线观看| 亚洲国产视频网站| 国产精品嫩草影院com| 欧美xxxx在线观看| 欧美日韩国产一二三| 成人白浆超碰人人人人| 美脚の诱脚舐め脚责91 | 久久久久久日产精品| 欧美在线观看视频在线| 成人综合在线观看| 久久99国产精品成人| 亚洲狠狠爱一区二区三区| 国产精品久久久久久久久动漫 | 国产精品久久久久久久久久久免费看| 欧美一区二区黄| 欧美午夜在线一二页| 91欧美一区二区| 成人免费观看av| 国产精品一二三区在线| 久久99精品久久久久久动态图| 亚洲国产成人高清精品| 亚洲激情综合网| 亚洲色图欧美在线| 中文字幕精品三区| 欧美韩国日本一区| 欧美激情在线看| 欧美韩日一区二区三区四区| 久久九九久久九九| 久久色中文字幕| 久久久亚洲精品石原莉奈| 精品av综合导航| 精品国产乱子伦一区| 欧美一区二区免费观在线| 欧美日韩视频专区在线播放| 在线观看三级视频欧美| 欧美在线|欧美| 精品视频一区 二区 三区| 在线观看视频一区二区| 欧美日韩久久一区| 欧美精品日韩一区| 日韩欧美激情一区| 欧美videossexotv100| 欧美xxxxx裸体时装秀| 久久免费精品国产久精品久久久久| 欧美精品一区二区三区一线天视频| 日韩精品一区二区三区在线观看 | 欧美日本乱大交xxxxx| 欧美三级日韩在线| 91精品黄色片免费大全| 欧美r级在线观看| 国产亚洲精久久久久久| 中文字幕不卡在线| 亚洲最大成人综合| 日本中文字幕一区二区视频 | 国内成人自拍视频| 国产盗摄视频一区二区三区| 暴力调教一区二区三区| 色偷偷久久人人79超碰人人澡| 欧美无乱码久久久免费午夜一区| 9191国产精品| 久久精品在线免费观看| 日韩一区在线播放| 五月婷婷综合在线| 国产盗摄精品一区二区三区在线| 99在线精品观看| 欧美嫩在线观看| 久久九九国产精品| 亚洲一区二区在线播放相泽| 蜜桃久久久久久| 波多野结衣精品在线| 欧美放荡的少妇| 亚洲国产经典视频| 三级欧美韩日大片在线看| 国产在线国偷精品免费看| 色老汉av一区二区三区| 欧美成人猛片aaaaaaa| 1024精品合集| 日本aⅴ亚洲精品中文乱码| 大白屁股一区二区视频| 在线播放亚洲一区| 中文字幕一区二区三区精华液| 午夜a成v人精品| 99精品久久久久久| 日韩精品专区在线| 伊人色综合久久天天| 国内成人自拍视频| 欧美日韩大陆在线| 国产精品区一区二区三| 热久久国产精品| 91免费观看视频在线| 精品免费视频一区二区| 一区二区三区av电影| 国产盗摄精品一区二区三区在线| 欧美另类高清zo欧美| 1000部国产精品成人观看| 国产在线视频精品一区| 欧美日韩国产中文| 亚洲少妇30p| 国产乱码精品一区二区三区av | 精品国产一区二区三区久久久蜜月| 国产精品久久久久精k8| 久久国产视频网| 欧美日韩精品一区二区| 亚洲欧美一区二区三区极速播放| 国产在线看一区| 欧美一级一区二区| 亚洲国产成人高清精品| 色婷婷亚洲精品| 国产人成一区二区三区影院| 精品一区二区三区影院在线午夜 | 成人精品视频一区| 久久亚洲一区二区三区明星换脸| 午夜精品一区在线观看| 99热99精品| 国产精品国产三级国产a| 国产大陆a不卡| 国产亚洲婷婷免费| 精品一区二区三区免费| 日韩欧美在线网站| 男人操女人的视频在线观看欧美| 欧洲精品在线观看| 亚洲综合激情另类小说区| 色综合久久综合网97色综合| 国产精品卡一卡二卡三| 成人精品一区二区三区中文字幕 | 亚洲欧洲av另类| 北岛玲一区二区三区四区| 国产精品久久久久久久久晋中| 成人免费精品视频| 亚洲天堂免费在线观看视频| 9人人澡人人爽人人精品| 成人欧美一区二区三区1314| 成人av在线看| 日韩毛片在线免费观看| 91丨九色丨蝌蚪丨老版| 一区二区三区在线播| 欧美中文一区二区三区| 首页综合国产亚洲丝袜| 777欧美精品| 韩国av一区二区三区四区 | 欧美va亚洲va| 国产成人综合亚洲91猫咪| 国产欧美精品一区二区色综合朱莉| 国产精品亚洲午夜一区二区三区| 国产视频在线观看一区二区三区 | 337p粉嫩大胆色噜噜噜噜亚洲| 久久不见久久见免费视频7| 精品国产乱码久久久久久图片| 国产老妇另类xxxxx| 欧美高清在线一区| 91在线播放网址| 亚洲成人激情社区| 欧美tickling网站挠脚心| 国产91丝袜在线播放九色| 亚洲欧美综合在线精品| 欧美日韩三级一区二区| 激情文学综合网| 亚洲色图欧美在线| 欧美一区二区视频观看视频 | 成年人国产精品| 亚洲国产欧美在线| 精品人在线二区三区| 99精品欧美一区二区蜜桃免费| 亚洲成在人线免费| 精品久久久久久久人人人人传媒| 成人一区二区三区| 亚洲国产精品欧美一二99| 欧美电影免费提供在线观看| 成人免费视频视频在线观看免费| 亚洲综合免费观看高清完整版在线 | 色婷婷综合久久久中文一区二区 | 国产精品99久久久| 亚洲另类春色国产| 2019国产精品| 一本色道a无线码一区v| 裸体一区二区三区| 亚洲日本免费电影| 日韩精品在线看片z| 色婷婷激情综合| 激情成人午夜视频| 一区二区三区免费在线观看| 精品日韩99亚洲| 欧美色老头old∨ideo| 国产一区二区在线免费观看| 一区二区三区免费看视频| 久久久www成人免费毛片麻豆| 日本国产一区二区| 国产精品资源网| 五月天久久比比资源色| 国产精品国产自产拍在线| 欧美精品一区二区三区蜜桃视频| 色吧成人激情小说| 成人性生交大片免费| 精品伊人久久久久7777人| 亚洲国产精品久久一线不卡|