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

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

?? bits.c

?? 這是算術編碼的源程序
?? C
字號:
/******************************************************************************
File:		bits.c

Authors: 	John Carpinelli   (johnfc@ecr.mu.oz.au)
	 	Wayne Salamonsen  (wbs@mundil.cs.mu.oz.au)

Purpose:	Data compression using a nth order binary model and revised 
		arithmetic coding method.

Based on: 	A. Moffat, R. Neal, I.H. Witten, "Arithmetic Coding Revisited",
		Proc. IEEE Data Compression Conference, Snowbird, Utah, 
		March 1995.


Copyright 1995 John Carpinelli and Wayne Salamonsen, All Rights Reserved.

These programs are supplied free of charge for research purposes only,
and may not sold or incorporated into any commercial product.  There is
ABSOLUTELY NO WARRANTY of any sort, nor any undertaking that they are
fit for ANY PURPOSE WHATSOEVER.  Use them at your own risk.  If you do
happen to find a bug, or have modifications to suggest, please report
the same to Alistair Moffat, alistair@cs.mu.oz.au.  The copyright
notice above and this statement of conditions must remain an integral
part of each and every copy made of these files.

******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "stats.h"
#include "coder.h"
#ifdef SYSV
#include <sys/times.h>
#include <limits.h>
#endif

#define MAX_CONTEXT_BITS	20    	/* max. number of bits for context */
#define MIN_CONTEXT_BITS	0	/* min. number of bits for context */
#define DEFAULT_BITS_CONTEXT 	16	/* default value for bits_context */
#define ENCODE          	0
#define DECODE          	1
#define MAGICNO         	"123b"  /* Magic Number for files */
#define MAGICNO_LENGTH		4	/* length of magic number */
#define BREAK_INTERVAL		10000	/* every round off to bit boundary */
#define MEGABYTE		(1<<20)	/* size of one megabyte */
#define NOMEMLEFT		-1	/* flag set when mem runs out */
#define DEFAULT_MEM		1	/* default 1 megabyte limit */
#define MIN_MBYTES        	1	/* minimum allowable memory size */
#define MAX_MBYTES        	255	/* maximum no for 8 bit int */


/* function prototypes */
void *do_malloc(size_t size);
int get_memory(size_t size);
void encode_file(unsigned char tempstring[], int templength);
void decode_file();
void print_results(int operation);


/* global variables */
int verbose = 0;			/* flag for printing statistics  */
int bits_context=DEFAULT_BITS_CONTEXT;	/* no. bits in binary contexts */
unsigned int non_null_contexts = 0;	/* count of contexts used */
unsigned int total_memory = 0;		/* total memory used by all contexts */
int mbytes = DEFAULT_MEM;		/* memory limit in megabytes */


/* 
 * parse command line arguments. Decide whether to decode or encode
 * and optional memory size. Also sets filename to stdin if none specified 
 */
int main(int argc, char *argv[])
{	
    int i;			
    int what = ENCODE;		/* flag as to whether to encode or decode */
    unsigned char tempstore[MAGICNO_LENGTH];	/* stores magic number */
    int templength=0;		/* number of magic number bytes read */
    int	selected = -1;		/* stores if decode set at command line */

    for (i=1; i<argc; ) 
    {
	if (argv[i][0] == '-') 
	{
	    switch(argv[i][1]) {
	      case 'e':		/* do encode */
		selected = ENCODE;
		i++;
		break;
	      case 'd':		/* do decode */
		selected = DECODE;
		i++;
		break;
	      case 'm':		/* set memory size */
		i++;
		mbytes = atoi(argv[i]);
		i++;
		break;
	      case 'v':		/* set verbose flag to print stats */
		verbose = 1;
		i++;
		break;
	      case 'f':		/* set number of F bits */
		i++;
		f_bits = atoi(argv[i]);
		max_frequency = 1 << f_bits;
		i++;
		break;
	      case 'c':
		i++;
		bits_context = atoi(argv[i]);
		i++;
		break;
	      default:		/* incorrect args */
		fprintf(stderr, "usage: %s [-e [-m n] | -d] [-v] [-f n] [-c n] [file]\n", argv[0]);
		exit(1);
	    }
	}
	else if (freopen(argv[i++], "r", stdin) == (FILE *)NULL) 
	{
	    fprintf(stderr, "%s: cannot read %s\n",
		    argv[0], argv[--i]);
	    exit(1);
	}
    }

    /* check if bits_context is within allowable range */
    if (bits_context < MIN_CONTEXT_BITS || bits_context > MAX_CONTEXT_BITS)
    {
	fprintf(stderr, "%s: context bits must be between %d and %d\n",
		argv[0], MIN_CONTEXT_BITS, MAX_CONTEXT_BITS);
	exit(1);
    }
    
    /* check if f_bits is within allowable range */
    if (f_bits < MIN_F_BITS || f_bits > MAX_F_BITS)
    {
	fprintf(stderr, "%s: number of f bits must be between %d and %d\n",
		argv[0] ,MIN_F_BITS, MAX_F_BITS);
	exit(1);
    }

    /* check if memory limit is within allowable range */ 
    if (mbytes < MIN_MBYTES || mbytes > MAX_MBYTES)
    {
	fprintf(stderr, "memory limit must be between %d and %d\n", 
		MIN_MBYTES, MAX_MBYTES);
	exit(1);
    }


    /* Check input file for Magic Number. */
    if (selected != ENCODE)
    {
 	templength=fread(tempstore, 1, MAGICNO_LENGTH, stdin);
	bytes_input += templength;
	if (memcmp(tempstore, MAGICNO, MAGICNO_LENGTH) == 0)
	    what = DECODE;
	else if (selected == DECODE)
	{
	    fprintf(stderr, 
		 "bits: bad magic number... incompatible compressed file\n");
	    exit(1);
	}
    }
	
    if (what == ENCODE)	
    {
	/* print magic number in output */
	fwrite(MAGICNO, 1, MAGICNO_LENGTH, stdout);
	bytes_output += MAGICNO_LENGTH;

	/* store memory limit being used in output */
	putc(mbytes, stdout);
	bytes_output += 1;
	
	/* print number of f_bits being used in output */
	putc(f_bits, stdout);
	bytes_output += 1;

	/* print bits_context in output */
	putc(bits_context, stdout);
	bytes_output += 1;
	encode_file(tempstore, templength);
    }
    else
    {
	/* read memory limit to be used and store in mbytes */
	mbytes = getc(stdin);
        bytes_input += 1;

	/* get number of f_bits to be used and store in f_bits */
	f_bits = getc(stdin);
	max_frequency = 1<<f_bits;
	bytes_input++;

	/* get number of bits_context to be used and store */
	bits_context = getc(stdin);
	bytes_input++;

	decode_file();
    }
    if (verbose)
	print_results(what);
    return 0;			/* exited cleanly */
}



/*
 *
 * print the results of compressing/decompressing a file
 *
 */
void print_results(int operation)
{
    fprintf(stderr, "Context bits           : %10d\n", bits_context);
    fprintf(stderr, "Number of contexts     : %10u\n", 
	    non_null_contexts);
    fprintf(stderr, "Memory used            : %10.1f Kbytes\n", 
	total_memory*1.0/1024);
    if (operation == ENCODE)
	fprintf(stderr, "Input file size        : %10u bytes\n", bytes_input);
    fprintf(stderr, "Output file size       : %10u bytes\n", bytes_output);
    if ((operation == ENCODE) && (bytes_input > 0))
	fprintf(stderr, "Compression rate       : %10.3f bpc (%0.2f%%) \n", 
		8.0 * bytes_output / bytes_input, 
		(float)bytes_output/bytes_input*100);

    /* only provide timing details if times function is available */
#ifdef SYSV
{
    struct tms cpu_usage;
    float cpu_used, comp_rate;

    times(&cpu_usage);    	/* determine the cpu time used */
    cpu_used = ((float) cpu_usage.tms_utime) / sysconf(_SC_CLK_TCK);

    if (cpu_used == 0)
	comp_rate = 0;
    else
    {
	if (operation == ENCODE)
	    comp_rate = ((float) bytes_input) / (1024 * cpu_used);
	else
	    comp_rate = ((float) bytes_output) / (1024 * cpu_used);
    }
    fprintf(stderr, "Compression time       : %10.2f seconds (%0.2f Kb/s)\n",
	    cpu_used, comp_rate);
}
#endif
}





/*
 *
 * call the standard C function malloc after checking against the memory
 * limit. If the limit is exceeded return NULL
 *
 */
void 
*do_malloc(size_t size)
{
    total_memory += size;
    if ((total_memory / MEGABYTE) >= mbytes)
	return NULL;
    else
        return (malloc(size));
}


/*
 *
 * adds specified memory to current memory count
 * returns 0 if successful, NOMEMLEFT if memory limit is reached
 */
int 
get_memory(size_t size)
{
    total_memory += size;
    if ((total_memory / MEGABYTE) >= mbytes)
	return NOMEMLEFT;
    else
	return 0;
      
}

/*
 *
 * compress data from stdin to a file on stdout by encoding
 * each bit with probabilities derived from the previous bits
 *
 */
void encode_file(unsigned char tempstring[], int templength)
{
    unsigned int	i, j, cur_context, closest_context;
    unsigned int 	mask, bit, next_break, buffer;
    int			bits_to_go;
    binary_context	**contexts;
    binary_context	*still_coding;		

    /* initialise context array */
    contexts = (binary_context **)do_malloc(sizeof(binary_context *) * 
					  (1 << bits_context));
    if (contexts == NULL)
    {
	fprintf(stderr, "bits: not enough memory to allocate context array\n");
	exit(1);
    }
    still_coding = create_binary_context();
    
    /* initialise contexts to NULL */
    for (i=0; i < 1 << bits_context; i++)
	contexts[i] = NULL;

    /* initalise variables */
    cur_context = 0;
    mask = (1 << bits_context) - 1;
    next_break = BREAK_INTERVAL;
    start_encode();
    startoutputtingbits();

    /* encode the first characters read for testing MAGIC_NO */
    for (i=0; ; i++)
    {
	if (i < templength)
	    buffer = tempstring[i];
	else 
	{
	    if ((buffer = getchar()) == EOF)
		break;
	    bytes_input++;
	}
	binary_encode(still_coding, 1);
	   
	for (bits_to_go = 7; bits_to_go >= 0; bits_to_go--)
	{
	    if (contexts[cur_context] == NULL)
	    {
		if (get_memory(sizeof(binary_context)) != NOMEMLEFT)
		{
		    contexts[cur_context] = create_binary_context();
		    non_null_contexts++;
		}
		else 
		    /* 
		     * determine closest existing context to current one
		     * by stripping off the leading bits of the context
		     * guaranteed to get contexts[0] if nothing closer
		     */
		{
		    closest_context = cur_context;
		    j = 1;
		    do
		    {
			closest_context &= (mask >> j);
			j++;
		    } while (contexts[closest_context] == NULL);
		    contexts[cur_context] = contexts[closest_context];
		}
	    }
	    bit = (buffer >> bits_to_go) & 1;
	    binary_encode(contexts[cur_context], bit);
	    cur_context = ((cur_context << 1) | bit) & mask;
	}
	if (next_break-- == 0)
	{
	    finish_encode();
	    start_encode();
	    next_break = BREAK_INTERVAL;
	}
    
    }
    /* encode end of message flag */
    binary_encode(still_coding, 0);
    finish_encode();
    doneoutputtingbits();
}


/*
 *
 * decode a compressed file to stdout
 *
 */
void decode_file()
{
    int			i, j, cur_context, closest_context, buffer, bits_to_go;
    int 		mask, bit, next_break;
    binary_context	**contexts;
    binary_context	*still_coding;		

    /* initialise context array */
    contexts = (binary_context **)do_malloc(sizeof(binary_context *) * 
					  (1 << bits_context));
    if (contexts == NULL)
    {
	fprintf(stderr, "bits: unable to malloc %d bytes\n",
		sizeof(binary_context *) * (1 << bits_context)); 
	exit(1);
    }
    still_coding = create_binary_context();
    
    /* initialise contexts to NULL */
    for (i=0; i < 1 << bits_context; i++)
	contexts[i] = (binary_context *)NULL;

    /* initalise variables */
    cur_context = 0;
    mask = (1 << bits_context) - 1;
    next_break = BREAK_INTERVAL;

    start_decode();
    startinputtingbits();

    /* decode the file */
    while (binary_decode(still_coding))
    {
	buffer = 0;
	for (bits_to_go = 7; bits_to_go >= 0; bits_to_go--)
	{
	    if (contexts[cur_context] == (binary_context *)NULL)
	    {
		if (get_memory(sizeof(binary_context)) != NOMEMLEFT)
		{
		    contexts[cur_context] = create_binary_context();
		    non_null_contexts++;
		}
		else 
		{   /* 
		     * determine closest existing context to current one
		     * by stripping off the leading bits of the context
		     * guaranteed to get contexts[0] if nothing closer
		     */
		    closest_context = cur_context;
		    j = 1;
		    do
		    {
			closest_context &= (mask >> j);
			j++;
		    } while (contexts[closest_context] == NULL);
		    contexts[cur_context] = contexts[closest_context];
		}
	    }
	    bit = binary_decode(contexts[cur_context]);
	    buffer = (buffer << 1) | bit;
	    cur_context = ((cur_context << 1) | bit) & mask;
	}	    
	putchar(buffer);
	bytes_output++;

	if (next_break-- == 0)
	{
	    finish_decode();
	    start_decode();
	    next_break = BREAK_INTERVAL;
	}
    }
    finish_decode();
    doneinputtingbits();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品成人在线视频| 国产精品毛片大码女人| 美腿丝袜亚洲三区| 欧美精品视频www在线观看| 亚洲大片在线观看| 欧美精品18+| 精品一区二区三区免费| 久久蜜臀精品av| 东方aⅴ免费观看久久av| 中国av一区二区三区| 97精品久久久午夜一区二区三区| 亚洲欧美在线观看| 欧美日韩精品一区二区天天拍小说| 天天综合日日夜夜精品| 精品美女一区二区| av网站一区二区三区| 亚洲国产精品影院| 亚洲精品一区二区三区四区高清 | 日韩精品一区国产麻豆| 国产在线视频一区二区| 亚洲欧洲日韩在线| 欧美裸体bbwbbwbbw| 国产乱子轮精品视频| 亚洲欧洲国产专区| 欧美一区二区三区影视| 成人少妇影院yyyy| 日韩高清在线观看| 亚洲国产精品成人综合色在线婷婷| 色哟哟国产精品| 日韩二区在线观看| 成人免费在线播放视频| 欧美丰满嫩嫩电影| av中文字幕在线不卡| 夜夜爽夜夜爽精品视频| 精品成人私密视频| 在线精品亚洲一区二区不卡| 国内久久精品视频| 亚洲主播在线观看| 国产精品系列在线| 欧美videos中文字幕| 不卡的电影网站| 蜜桃精品视频在线| 亚洲一二三四久久| 中文字幕的久久| 欧美一区二区免费| 日本韩国欧美一区| 成人精品免费看| 久久99深爱久久99精品| 亚洲精品欧美二区三区中文字幕| 精品成人a区在线观看| 欧美性色综合网| 成人动漫一区二区| 激情图区综合网| 三级欧美韩日大片在线看| 中文字幕一区二区三中文字幕| 日韩欧美国产小视频| 欧美日韩国产高清一区二区三区| 成人免费视频视频| 国产乱理伦片在线观看夜一区| 日韩国产成人精品| 五月综合激情婷婷六月色窝| 专区另类欧美日韩| 欧美国产视频在线| 精品不卡在线视频| 日韩精品中文字幕一区二区三区| 欧美日韩一二三| 91视频在线观看| 成人av一区二区三区| 国产传媒久久文化传媒| 激情久久五月天| 精品一区二区三区视频| 久草中文综合在线| 紧缚奴在线一区二区三区| 蜜臀精品久久久久久蜜臀| 日本午夜一本久久久综合| 日本麻豆一区二区三区视频| 爽好多水快深点欧美视频| 亚洲影院久久精品| 亚洲va国产va欧美va观看| 亚洲va在线va天堂| 亚洲www啪成人一区二区麻豆| 亚洲成av人片观看| 麻豆国产欧美一区二区三区| 麻豆精品国产传媒mv男同| 国产一区视频网站| 国产传媒一区在线| 色综合天天综合狠狠| 欧日韩精品视频| 欧美日韩国产成人在线91| 欧美乱妇一区二区三区不卡视频| 99riav一区二区三区| 国产一区二区主播在线| 国产成人av电影在线| 成人免费高清视频| 色哟哟一区二区在线观看| 在线观看日韩高清av| 欧美精品vⅰdeose4hd| 日韩久久免费av| 国产亚洲综合色| 一二三区精品视频| 麻豆精品久久久| 99久久免费视频.com| 色婷婷一区二区| 成人永久免费视频| 97精品国产97久久久久久久久久久久| caoporm超碰国产精品| 色噜噜狠狠色综合欧洲selulu| 欧美日韩一区小说| 欧美xxxxxxxx| 亚洲桃色在线一区| 欧美a级理论片| jiyouzz国产精品久久| 欧美性极品少妇| 久久综合五月天婷婷伊人| 1024国产精品| 日本美女一区二区| 91在线视频免费观看| 91精品婷婷国产综合久久| 久久久久久亚洲综合| 亚洲国产毛片aaaaa无费看| 国产精品69久久久久水密桃| 91香蕉国产在线观看软件| 欧美一区二区三区色| 中文字幕亚洲区| 蜜桃一区二区三区在线| av一二三不卡影片| 精品国产露脸精彩对白 | 欧美最新大片在线看| 欧美精品一区二区三区蜜桃| 亚洲色图在线播放| 精品一区二区三区影院在线午夜| 在线观看日韩一区| 国产午夜精品一区二区三区视频| 亚洲国产aⅴ成人精品无吗| 国产一区二区精品久久99| 欧美日韩高清在线播放| 国产精品久久久久久久久动漫| 日韩专区欧美专区| 色综合久久久久综合体| 久久亚区不卡日本| 日韩中文字幕1| 欧美在线一区二区三区| 国产精品区一区二区三区| 美国三级日本三级久久99| 一本久道中文字幕精品亚洲嫩| 久久看人人爽人人| 九色综合国产一区二区三区| 欧美羞羞免费网站| 亚洲情趣在线观看| 成人精品一区二区三区四区| 日韩一级二级三级| 午夜在线电影亚洲一区| 日本高清无吗v一区| 国产精品美女久久久久aⅴ| 国内精品国产成人国产三级粉色 | 91免费观看国产| 中文子幕无线码一区tr| 国产福利一区二区三区视频在线| 91精品国产一区二区人妖| 亚洲成av人片一区二区梦乃 | 色欧美日韩亚洲| 亚洲欧洲日韩av| 色综合久久中文综合久久97| 中文字幕日本不卡| 94-欧美-setu| 亚洲乱码国产乱码精品精的特点| 91在线无精精品入口| 亚洲精品日日夜夜| 91色视频在线| 亚洲综合色在线| 欧美日韩一卡二卡| 午夜精品久久久久久| 欧美精品在线一区二区| 青青草成人在线观看| 精品国产乱码久久久久久免费 | 国产美女视频一区| 久久影院视频免费| 国产一区美女在线| 中文字幕av免费专区久久| 91在线播放网址| 一区二区三区久久久| 欧美日韩中文精品| 日本免费新一区视频| 久久久久高清精品| 99久久精品国产麻豆演员表| 亚洲免费在线视频一区 二区| 日本精品裸体写真集在线观看 | 综合激情成人伊人| 欧美无乱码久久久免费午夜一区| 午夜精品福利一区二区蜜股av| 日韩一区二区三区在线视频| 国产乱子伦视频一区二区三区| 国产精品欧美综合在线| 欧美日韩免费在线视频| 久久精品国产精品亚洲红杏| 国产精品理伦片| 欧美福利视频导航| 国产99久久久国产精品潘金 | 7777精品伊人久久久大香线蕉完整版 | 欧美性猛片aaaaaaa做受|