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

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

?? optenc.c

?? windows gzip source code
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * optenc.c
 *
 * Optimal encoder
 *
 * BUGBUG  Can improve compression by using the "redo" method of LZX; after the first 32K bytes,
 * reset the compressor but keep the tables, and start over.
 */
#include <string.h>
#include <stdio.h>
#include <crtdbg.h>
#include "deflate.h"


//
// If we get a match this good, take it automatically
//
// Note: FAST_DECISION_THRESHOLD can be set to anything; it's been set to BREAK_LENGTH
//       arbitrarily
//
#define FAST_DECISION_THRESHOLD BREAK_LENGTH


//
// After we have this many literals, create a tree to get updated statistical estimates
//
#define FIRST_TREE_UPDATE 1024


//
// Verifies that all of the hash pointers in the hash table are correct, and that
// the tree structure is valid.
//
#define DISABLE_VERIFY_HASHES

#ifdef _DEBUG
#ifndef DISABLE_VERIFY_HASHES
#define VERIFY_HASHES(bufpos) verifyHashes(context, bufpos)
#else
#define VERIFY_HASHES(bufpos) ;
#endif
#else
#define VERIFY_HASHES(bufpos) ;
#endif


#define CHECK_FLUSH_RECORDING_BUFFER() \
	if (recording_bitcount >= 16) \
	{ \
		*recording_bufptr++ = (BYTE) recording_bitbuf; \
		*recording_bufptr++ = (BYTE) (recording_bitbuf >> 8); \
		recording_bitbuf >>= 16; \
		recording_bitcount -= 16; \
	}


#define OUTPUT_RECORDING_DATA(count,data) \
	recording_bitbuf |= ((data) << recording_bitcount); \
	recording_bitcount += (count);


//
// Record unmatched symbol c
//
#define RECORD_CHAR(c) \
    context->outputting_block_num_literals++; \
    encoder->literal_tree_freq[c]++; \
	_ASSERT(encoder->recording_literal_tree_len[c] != 0); \
	OUTPUT_RECORDING_DATA(encoder->recording_literal_tree_len[c], encoder->recording_literal_tree_code[c]); \
	CHECK_FLUSH_RECORDING_BUFFER();


//
// Record a match with length match_len (>= MIN_MATCH) and displacement match_pos
//
#define RECORD_MATCH(match_len, match_pos) \
{ \
	int pos_slot = POS_SLOT(match_pos); \
	int len_slot = g_LengthLookup[match_len - MIN_MATCH]; \
	int item = (NUM_CHARS+1) + len_slot; \
	int extra_dist_bits = g_ExtraDistanceBits[pos_slot]; \
	int extra_len_bits = g_ExtraLengthBits[len_slot]; \
	_ASSERT(match_len >= MIN_MATCH && match_len <= MAX_MATCH); \
	_ASSERT(context->outputting_block_num_literals >= 0 && context->outputting_block_num_literals < OPT_ENCODER_MAX_ITEMS); \
	_ASSERT(encoder->recording_literal_tree_len[item] != 0); \
	_ASSERT(encoder->recording_dist_tree_len[pos_slot] != 0); \
    context->outputting_block_num_literals++; \
    encoder->literal_tree_freq[(NUM_CHARS + 1) + len_slot]++; \
    encoder->dist_tree_freq[pos_slot]++; \
	OUTPUT_RECORDING_DATA(encoder->recording_literal_tree_len[item], encoder->recording_literal_tree_code[item]); \
	CHECK_FLUSH_RECORDING_BUFFER(); \
	if (extra_len_bits > 0) \
	{ \
		OUTPUT_RECORDING_DATA(extra_len_bits, (match_len-MIN_MATCH) & ((1 << extra_len_bits)-1)); \
		CHECK_FLUSH_RECORDING_BUFFER(); \
	} \
	OUTPUT_RECORDING_DATA(encoder->recording_dist_tree_len[pos_slot], encoder->recording_dist_tree_code[pos_slot]); \
	CHECK_FLUSH_RECORDING_BUFFER(); \
	if (extra_dist_bits > 0) \
	{ \
		OUTPUT_RECORDING_DATA(extra_dist_bits, match_pos & ((1 << extra_dist_bits)-1)); \
		CHECK_FLUSH_RECORDING_BUFFER(); \
	} \
}


#define FLUSH_RECORDING_BITBUF() \
    *recording_bufptr++ = (BYTE) recording_bitbuf; \
	*recording_bufptr++ = (BYTE) (recording_bitbuf >> 8); 


static void calculateUpdatedEstimates(t_encoder_context *context);
static void OptimalEncoderMoveWindows(t_encoder_context *context);


static int match_est(t_optimal_encoder *encoder, int match_length, unsigned int match_pos)
{
	int dist_slot;
	int len_slot;

	// output match position
	len_slot = g_LengthLookup[match_length-MIN_MATCH];
	dist_slot = POS_SLOT(match_pos);

	return	encoder->literal_tree_len[NUM_CHARS + 1 + len_slot] +
			g_ExtraLengthBits[len_slot] +
			encoder->dist_tree_len[dist_slot] + 
			g_ExtraDistanceBits[dist_slot];
}


//
// Create initial estimations to output each element
//
static void initOptimalEstimates(t_encoder_context *context)
{
	int i, p;
    t_optimal_encoder *encoder = context->optimal_encoder;

	for (i = 0; i < NUM_CHARS; i++)
		encoder->literal_tree_len[i] = 8;

	p = NUM_CHARS+1;
	encoder->literal_tree_len[p] = 3;
	encoder->literal_tree_len[p+1] = 4;
	encoder->literal_tree_len[p+2] = 5;

	for (; p < MAX_LITERAL_TREE_ELEMENTS; p++)
		encoder->literal_tree_len[p] = 6;

	for (i = 0; i < MAX_DIST_TREE_ELEMENTS; i++)
		encoder->dist_tree_len[i] = (i/2)+1;
}


//
// Fix optimal estimates; if bitlen == 0 it doesn't mean that the element takes 0
// bits to output, it means that the element didn't occur, so come up with some estimate.
//
static void fixOptimalEstimates(t_encoder_context *context)
{
	int i;
    t_optimal_encoder *encoder = context->optimal_encoder;

	for (i = 0; i < NUM_CHARS; i++)
	{
		if (encoder->literal_tree_len[i] == 0)
			encoder->literal_tree_len[i] = 13;
	}

	for (i = NUM_CHARS+1; i < MAX_LITERAL_TREE_ELEMENTS; i++)
	{
		if (encoder->literal_tree_len[i] == 0)
			encoder->literal_tree_len[i] = 12;
	}

	for (i = 0; i < MAX_DIST_TREE_ELEMENTS; i++)
	{
		if (encoder->dist_tree_len[i] == 0)
			encoder->dist_tree_len[i] = 10;
	}
}


/*
 * Returns an estimation of how many bits it would take to output
 * a given character
 */
#define CHAR_EST(c) (numbits_t) (encoder->literal_tree_len[(c)])


/*
 * Returns an estimation of how many bits it would take to output
 * a given match.
 */
#define MATCH_EST(ml,mp,result) result = match_est(encoder, ml,mp);


//
// Returns whether the literal buffers are just about full
//
// Since we could output a large number of matches/chars in between these checks, we
// have to be careful.
//
// BUGBUG should check after each item output, so we don't have to be so careful; this
//        means we will utilise more of the recording buffer
//
#define LITERAL_BUFFERS_FULL() \
    (context->outputting_block_num_literals >= OPT_ENCODER_MAX_ITEMS-4-LOOK-MAX_MATCH || \
            recording_bufptr + 3*(MAX_MATCH + LOOK) >= end_recording_bufptr)


void OptimalEncoderDeflate(t_encoder_context *context)
{
	unsigned long	bufpos_end;
	unsigned long	MatchPos;
	unsigned long	i;
	int				EncMatchLength; /* must be a signed number */
	unsigned long	bufpos;
	unsigned long	recording_bitbuf;
	int				recording_bitcount;
	byte *			recording_bufptr;
    byte *          end_recording_bufptr;
    t_optimal_encoder *encoder = context->optimal_encoder;

    _ASSERT(encoder != NULL);
	_ASSERT(context->state == STATE_NORMAL);

	// reinsert the up to BREAK_LENGTH nodes we removed the last time we exit this function
	VERIFY_HASHES(context->bufpos);
	reinsertRemovedNodes(context);
	VERIFY_HASHES(context->bufpos);

	// restore literal/match bitmap variables
    end_recording_bufptr = &encoder->lit_dist_buffer[OPT_ENCODER_LIT_DIST_BUFFER_SIZE-8];
	recording_bufptr = encoder->recording_bufptr;
    recording_bitbuf = encoder->recording_bitbuf;
    recording_bitcount = encoder->recording_bitcount;

    bufpos			= context->bufpos;
	bufpos_end		= context->bufpos_end;

	/*
	 * While we haven't reached the end of the data
	 */
after_output_block:

	while (bufpos < bufpos_end)
	{
		// time to update our stats?
		if (context->outputting_block_num_literals >= encoder->next_tree_update)
		{
			encoder->next_tree_update += 1024;

            calculateUpdatedEstimates(context);
			fixOptimalEstimates(context);
		}

		// literal buffer or distance buffer filled up (or close to filling up)?
		if (LITERAL_BUFFERS_FULL())
			break;

		/*
		 * Search for matches of all different possible lengths, at bufpos
		 */
		EncMatchLength = optimal_find_match(context, bufpos); 

		if (EncMatchLength < MIN_MATCH)
		{

output_literal:
			/*
			 * No match longer than 1 character exists in the history 
			 * window, so output the character at bufpos as a symbol.
			 */
			RECORD_CHAR(encoder->window[bufpos]);
			bufpos++;
			continue;
		}

		/*
		 * Found a match.
		 *
		 * Make sure it cannot exceed the end of the buffer.
		 */
		if ((unsigned long) EncMatchLength + bufpos > bufpos_end)
		{
			EncMatchLength = bufpos_end - bufpos;    

			/*
			 * Oops, not enough for even a small match, so we 
			 * have to output a literal
			 */
			if (EncMatchLength < MIN_MATCH)
				goto output_literal;
		}

		if (EncMatchLength < FAST_DECISION_THRESHOLD)
		{
			/*
			 *  A match has been found that is between MIN_MATCH and 
			 *  FAST_DECISION_THRESHOLD bytes in length.  The following 
			 *  algorithm is the optimal encoder that will determine the 
			 *  most efficient order of matches and unmatched characters 
			 *  over a span area defined by LOOK.  
			 *
			 *  The code is essentially a shortest path determination 
			 *  algorithm.  A stream of data can be encoded in a vast number 
			 *  of different ways depending on the match lengths and offsets
			 *  chosen.  The key to good compression ratios is to chose the 
			 *  least expensive path.
			 */
			unsigned long	span;
			unsigned long	epos, bpos, NextPrevPos, MatchPos;
			t_decision_node *decision_node_ptr;
			t_decision_node *context_decision_node = encoder->decision_node;
			t_match_pos *matchpos_table = encoder->matchpos_table;
			long		iterations;

			/*
			 * Points to the end of the area covered by this match; the span
			 * will continually be extended whenever we find more matches
			 * later on.  It will stop being extended when we reach a spot
			 * where there are no matches, which is when we decide which
			 * path to take to output the matches.
			 */
			span = bufpos + EncMatchLength;

			/*
			 * The furthest position into which we will do our lookahead parsing 
			 */
			epos = bufpos + LOOK;

			/*
			 * Temporary bufpos variable
			 */
			bpos = bufpos;

			/* 
			 * Calculate the path to the next character if we output
			 * an unmatched symbol.
			 */

			/* bits required to get here */
			context_decision_node[1].numbits = CHAR_EST(encoder->window[bufpos]);
				
			/* where we came from */
			context_decision_node[1].path    = bufpos;

			/* bits required to get here */
			context_decision_node[2].numbits = CHAR_EST(encoder->window[bufpos+1]) + context_decision_node[1].numbits;
				
			/* where we came from */
			context_decision_node[2].path    = bufpos+1;

			/*
			 * For the match found, estimate the cost of encoding the match
			 * for each possible match length, shortest offset combination.
			 *
			 * The cost, path and offset is stored at bufpos + Length.  
			 */
			for (i = MIN_MATCH; i <= (unsigned long) EncMatchLength; i++)
			{
				/*
				 * Get estimation of match cost given match length = i,
				 * match position = matchpos_table[i], and store
				 * the result in numbits[i]
				 */
				MATCH_EST(i, matchpos_table[i], context_decision_node[i].numbits);

				/*
				 * Where we came from 
				 */
				context_decision_node[i].path = bufpos;

				/*
				 * Associated match position with this path
				 */
				context_decision_node[i].link = matchpos_table[i];
			}

			/*
			 * Set bit counter to zero at the start 
			 */
			context_decision_node[0].numbits = 0;

			decision_node_ptr = &context_decision_node[-(long) bpos];

			while (1)
			{
				numbits_t est, cum_numbits;

				bufpos++;
	
				/* 
				 *  Set the proper repeated offset locations depending on the
				 *  shortest path to the location prior to searching for a 
				 *  match.
				 */

				/*
				 * The following is one of the two possible break points from
				 * the inner encoding loop.  This break will exit the loop if 
				 * a point is reached that no match can incorporate; i.e. a
				 * character that does not match back to anything is a point 
				 * where all possible paths will converge and the longest one
				 * can be chosen.
				 */
				if (span == bufpos)
					break;
					
				/*
				 * Search for matches at bufpos 
				 */
				EncMatchLength = optimal_find_match(context, bufpos); 

				/* 
				 * Make sure that the match does not exceed the stop point
				 */
				if ((unsigned long) EncMatchLength + bufpos > bufpos_end)
				{
					EncMatchLength = bufpos_end - bufpos; 
					
					if (EncMatchLength < MIN_MATCH)
						EncMatchLength = 0;
				}

				/*
				 * If the match is very long or it exceeds epos (either 
				 * surpassing the LOOK area, or exceeding past the end of the
				 * input buffer), then break the loop and output the path.
				 */
				if (EncMatchLength > FAST_DECISION_THRESHOLD || 
					bufpos + (unsigned long) EncMatchLength >= epos)
				{
					MatchPos = matchpos_table[EncMatchLength];

					decision_node_ptr[bufpos+EncMatchLength].link = MatchPos;
					decision_node_ptr[bufpos+EncMatchLength].path = bufpos;

					/*
					 * Quickly insert data into the search tree without
					 * returning match positions/lengths
					 */
#ifndef INSERT_NEAR_LONG_MATCHES

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费的成人av| 伊人开心综合网| 国产综合一区二区| 久久中文字幕电影| 国产精品538一区二区在线| 国产亚洲人成网站| av毛片久久久久**hd| 亚洲午夜久久久久久久久电影网| 欧美久久久久久久久中文字幕| 免费成人在线视频观看| 欧美国产在线观看| 欧洲亚洲精品在线| 蜜桃一区二区三区在线观看| 久久久久国产成人精品亚洲午夜| 欧美日本乱大交xxxxx| 午夜精品免费在线观看| 久久中文字幕电影| 欧美在线视频全部完| 免费视频一区二区| 国产精品视频观看| 制服丝袜亚洲网站| www..com久久爱| 日韩成人免费在线| 中文字幕在线不卡一区| 欧美高清一级片在线| 成人精品小蝌蚪| 日韩精品亚洲一区二区三区免费| 久久精品亚洲乱码伦伦中文| 欧美综合色免费| 国产精品一线二线三线精华| 亚洲影院在线观看| 欧美韩日一区二区三区| 欧美日韩高清影院| 9i看片成人免费高清| 欧美aaaaaa午夜精品| 亚洲视频香蕉人妖| 欧美精品一区二区三| 日本韩国精品在线| 国产精品18久久久久久久久久久久| 亚洲精选一二三| 久久久99精品久久| 日韩午夜激情视频| 在线看一区二区| 国产不卡在线播放| 日本成人在线网站| 一二三四区精品视频| 国产三级欧美三级日产三级99 | 亚洲国产成人高清精品| 久久精品男人天堂av| 3d成人动漫网站| 欧美色视频一区| 91最新地址在线播放| 国产精品一区二区视频| 蜜臀av一级做a爰片久久| 亚洲一区视频在线| 亚洲人成精品久久久久| 欧美国产精品中文字幕| 精品国产91久久久久久久妲己| 欧美色欧美亚洲另类二区| 99国产精品99久久久久久| 国产不卡高清在线观看视频| 久国产精品韩国三级视频| 日韩电影在线一区| 日韩精品一级二级| 日韩在线一二三区| 五月天激情综合| 性久久久久久久久| 午夜视频在线观看一区二区三区| 亚洲精品国产a久久久久久| 成人欧美一区二区三区在线播放| 国产精品午夜在线| 国产精品久久久久久久浪潮网站 | 国产精品午夜电影| 欧美经典一区二区| 国产欧美va欧美不卡在线| 国产亚洲欧美色| 国产欧美一区二区精品秋霞影院| 久久久综合九色合综国产精品| 欧美精品一区二区久久婷婷| 欧美一级电影网站| 精品国精品国产| 久久久综合网站| 国产精品二区一区二区aⅴ污介绍| 国产精品久久毛片a| 最新日韩av在线| 亚洲一区日韩精品中文字幕| 视频一区在线播放| 久久精品国产秦先生| 国精产品一区一区三区mba视频| 国产成人在线观看| av日韩在线网站| 欧美色图天堂网| 日韩午夜激情电影| 国产精品三级视频| 一区二区在线观看免费视频播放| 亚洲福利电影网| 精品一区二区国语对白| 成人毛片视频在线观看| 欧美无砖砖区免费| 精品少妇一区二区三区免费观看| 久久久久久久网| 亚洲欧美日本在线| 日韩高清在线电影| 欧美一级xxx| 欧美亚洲综合一区| 日韩高清不卡在线| 91丨porny丨国产| 成人一区在线观看| 制服丝袜在线91| 国产91精品一区二区麻豆网站| 国产成人精品亚洲777人妖 | 在线观看一区日韩| 欧美日韩日日骚| 久久久久国色av免费看影院| 亚洲蜜臀av乱码久久精品蜜桃| 日韩国产一二三区| 成人免费黄色在线| 欧美一三区三区四区免费在线看 | 亚洲国产成人av| 国产精品18久久久久久久网站| 在线视频国内自拍亚洲视频| www成人在线观看| 亚洲最新视频在线观看| 国产麻豆成人传媒免费观看| 欧美午夜精品一区二区三区| 欧美国产日韩在线观看| 日韩激情一二三区| 成人久久视频在线观看| 精品国产污污免费网站入口| 国产盗摄精品一区二区三区在线| 日韩免费高清av| 中文字幕一区二区在线观看| 蜜臀av国产精品久久久久| 在线视频一区二区三| 国产欧美视频一区二区| 日韩不卡免费视频| 91视频国产资源| 日本一区二区三区视频视频| 免费一级片91| 欧美男人的天堂一二区| 亚洲精品美国一| 丁香激情综合五月| 久久亚洲一级片| 美国欧美日韩国产在线播放| 欧美日韩视频在线观看一区二区三区 | 亚洲一区二区三区精品在线| 岛国精品在线播放| 国产精品99久久久久久宅男| 91污片在线观看| 欧美国产精品一区| 久久精品国产77777蜜臀| 欧美日本国产视频| 亚洲国产一区二区在线播放| 一本一道久久a久久精品综合蜜臀| 国产亚洲制服色| 国产91丝袜在线播放0| 久久午夜色播影院免费高清| 韩国欧美国产1区| 精品女同一区二区| 久久国产综合精品| 欧美xxxx在线观看| 久久69国产一区二区蜜臀| 精品国产乱码久久久久久夜甘婷婷| 日韩精品一二三| 精品日韩在线观看| 国产一区二区三区免费在线观看| 久久综合五月天婷婷伊人| 久久99久久99精品免视看婷婷| 337p粉嫩大胆噜噜噜噜噜91av| 韩国一区二区视频| 国产日本亚洲高清| 成人黄色综合网站| 欧美韩日一区二区三区四区| av激情综合网| 中文字幕在线观看一区二区| 成人精品视频一区二区三区尤物| 久久综合久久综合久久| 精品在线免费观看| 91麻豆精品国产91久久久| 午夜在线成人av| 欧美日韩精品一区二区天天拍小说| 一区二区三区免费| 欧美亚洲一区三区| 午夜视频一区二区三区| 欧美日韩精品一二三区| 日韩电影在线观看一区| 欧美老年两性高潮| 青青草视频一区| 欧美精品一区二区三区四区 | 亚洲一区二区三区在线看| 在线观看网站黄不卡| 亚洲综合丁香婷婷六月香| 欧美婷婷六月丁香综合色| 亚洲制服丝袜在线| 欧美日韩一区二区欧美激情| 日韩成人午夜电影| 精品国产伦一区二区三区免费| 国产传媒欧美日韩成人| 亚洲午夜一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲|