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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? arith-n.cpp

?? 是算術(shù)編碼界碼的程序
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):

//------------------------------------------------------------
// 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 范圍中符號(hào)的所在位置
// scale 指 0 到 1 范圍內(nèi)的總量程,即有多少字符要記數(shù)
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)
				table->links = (LINKS*)calloc(new_size, 1);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩av一区二区三区粉嫩 | 亚洲电影视频在线| 91精品国产综合久久久久久久 | 丝袜诱惑制服诱惑色一区在线观看| 精品免费国产二区三区| 色婷婷av一区二区三区之一色屋| 精品在线免费观看| 亚洲一区二区三区国产| 中文无字幕一区二区三区 | 99国产欧美另类久久久精品| 精品一区二区免费视频| 亚洲国产sm捆绑调教视频| 国产精品成人免费 | 天堂一区二区在线免费观看| 中文字幕一区二区三区在线播放| 日韩精品在线网站| 欧美日韩国产综合草草| www.欧美日韩| 懂色av一区二区夜夜嗨| 裸体一区二区三区| 日韩vs国产vs欧美| 亚洲影院免费观看| 一二三四区精品视频| 综合久久久久久久| 国产精品美女久久久久高潮| 欧美精品一区二区蜜臀亚洲| 91麻豆精品国产无毒不卡在线观看 | 婷婷成人综合网| 亚洲精品乱码久久久久久久久| 亚洲国产成人自拍| 久久综合国产精品| 久久综合一区二区| 久久你懂得1024| 久久欧美中文字幕| 久久久噜噜噜久噜久久综合| 久久综合丝袜日本网| 久久亚洲私人国产精品va媚药| 日韩一级片网站| 日韩欧美123| 精品福利av导航| 久久婷婷色综合| 国产午夜精品一区二区三区嫩草| 国产午夜精品久久久久久久| 国产视频一区在线播放| 久久精品亚洲乱码伦伦中文| 国产三级一区二区| 亚洲欧洲韩国日本视频| 一区二区三区四区亚洲| 亚洲一区二区三区四区不卡| 香蕉加勒比综合久久| 日日摸夜夜添夜夜添精品视频| 免费精品视频在线| 国产精品一线二线三线| 福利电影一区二区| 色94色欧美sute亚洲线路二 | 欧美一区二区三区影视| 日韩欧美一区二区不卡| 久久亚洲私人国产精品va媚药| 欧美国产日韩一二三区| 亚洲精品成a人| 午夜免费久久看| 精品亚洲aⅴ乱码一区二区三区| 国产在线一区二区| 本田岬高潮一区二区三区| 在线影视一区二区三区| 91精品国产综合久久福利软件| 欧美xxxxxxxx| 国产精品高潮呻吟| 午夜激情一区二区| 国产在线日韩欧美| 91丨porny丨首页| 5858s免费视频成人| 国产午夜久久久久| 亚洲成人你懂的| 国产一区二区三区免费在线观看| aa级大片欧美| 日韩久久久精品| 国产精品国产三级国产| 亚洲电影中文字幕在线观看| 久久av资源网| 欧美伊人久久久久久久久影院 | 亚洲视频1区2区| 免费成人美女在线观看.| 国产v综合v亚洲欧| 欧美日韩不卡一区| 国产农村妇女精品| 天天爽夜夜爽夜夜爽精品视频| 国产精品中文欧美| 91精品国产丝袜白色高跟鞋| 国产精品乱码人人做人人爱| 五月天婷婷综合| 不卡av电影在线播放| 欧美一区二区大片| 亚洲精品免费播放| 风间由美中文字幕在线看视频国产欧美| 欧美亚洲一区二区在线| 欧美国产激情一区二区三区蜜月| 亚洲a一区二区| 94-欧美-setu| 久久老女人爱爱| 石原莉奈一区二区三区在线观看| 97se亚洲国产综合在线| 久久免费的精品国产v∧| 午夜电影网一区| 日本电影欧美片| 欧美激情在线免费观看| 久久国产剧场电影| 欧美丰满美乳xxx高潮www| 亚洲欧洲日产国产综合网| 国产精品综合在线视频| 日韩欧美在线综合网| 一区二区久久久| 99久久婷婷国产综合精品电影| 久久久精品国产免大香伊| 蜜臀久久久99精品久久久久久| 欧美亚洲日本国产| 亚洲免费av网站| www.亚洲色图| 国产精品美女www爽爽爽| 国产黄色精品视频| 久久伊人蜜桃av一区二区| 久久电影网电视剧免费观看| 欧美二区乱c少妇| 午夜私人影院久久久久| 欧美在线一区二区| 一区二区三区四区不卡视频| 色综合久久天天| 自拍偷拍欧美精品| 91欧美一区二区| 亚洲人成网站影音先锋播放| 成人免费高清在线观看| 国产精品天天看| 94色蜜桃网一区二区三区| 中文字幕综合网| 97久久久精品综合88久久| 国产精品嫩草影院com| www.亚洲免费av| 亚洲伦理在线免费看| 色哟哟欧美精品| 亚洲成av人片在线观看无码| 欧美性xxxxx极品少妇| 亚洲不卡在线观看| 欧美挠脚心视频网站| 奇米影视在线99精品| 欧美一区二区福利在线| 国产自产v一区二区三区c| 日本一区二区三区电影| aaa国产一区| 一区二区三区加勒比av| 欧美日韩精品二区第二页| 日韩精品成人一区二区在线| 欧美成人伊人久久综合网| 国产又黄又大久久| 国产精品少妇自拍| 欧美亚洲国产一区在线观看网站| 亚洲成人动漫在线免费观看| 欧美一级生活片| 国产91在线看| 亚洲综合在线五月| 日韩午夜在线观看视频| 国产精品白丝av| 亚洲欧美日韩国产一区二区三区| 欧美亚洲动漫另类| 久久99精品国产麻豆婷婷| 中文字幕成人av| 欧美日韩精品是欧美日韩精品| 久久成人久久鬼色| 国产精品毛片无遮挡高清| 欧美体内she精高潮| 九九精品一区二区| 亚洲品质自拍视频网站| 91精品国产综合久久蜜臀| 国产成人免费在线视频| 亚洲线精品一区二区三区| 精品久久久久久综合日本欧美| www.亚洲激情.com| 日韩成人精品在线| 自拍偷拍国产精品| 精品理论电影在线| 91视视频在线观看入口直接观看www | 亚洲黄色免费电影| 精品久久人人做人人爽| 91污片在线观看| 精品一二三四区| 亚洲一二三四在线观看| 久久久久久亚洲综合| 色香色香欲天天天影视综合网| 麻豆国产精品官网| 亚洲女同ⅹxx女同tv| 久久久久国产一区二区三区四区| 91成人网在线| 成人综合在线观看| 久久精品国产精品青草| 亚洲一区二区三区四区的| 中文字幕av资源一区| 欧美xxxxx裸体时装秀| 欧美色网一区二区| www.在线欧美| 国产一区二区0| 日本视频一区二区三区|