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

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

?? cdfstat.c

?? 一個(gè)簡(jiǎn)單而且快速的無損壓縮算法。包含源代碼實(shí)現(xiàn)
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/* kod podzielony na 2 czesci, gorna do zoptymalizowana, dolna nie-krytyczna */


/* funkcje krytyczne dla predkosci, nie eksportowane */

#include "tabrand.h"
#include "cdfstat.h"
#include "cfamily.h"
#include <assert.h>

#include "encodecodeword.h"


/* uzywane w findbucket() */
static p_s_bucket * b_ptr_lo;	/* tablica wskaznikow na kubelki - czesc lo */
static p_s_bucket * b_ptr_hi;	/* tablica wskaznikow na kubelki - czesc hi */
static unsigned int
			b_lo_ptrs;		/* rozmiar tablicy b_lo_ptrs */
static unsigned int
			b_hi_ptrs;

/* uzywane w updatemodel() */
static unsigned int 
			wm_trigger;	/* prog dla polowienia licznikow, jezeli trigger z taskparams<>0 */
						/* to wm_trigger=trigger, else wm_trigger wyznaczany funkcja set_wm_trigger dla evol i wm */

/* uzywany w statdecompressrow() i statcompressrow() */
static unsigned int 
			waitcnt;		/* globalny licznik pominiec aktualizacji modelu */
							
static unsigned int 
			_bpp;			/* lokalna kopia bpp z taskparams */


/*zwraca wskaznik do kubelka, ktory zawiera kontekst val */
static s_bucket * findbucket(const unsigned int val)
{
	assert(val<(0x1U<<_bpp));

	if (val<b_lo_ptrs)
		return b_ptr_lo[val];
	else
		return b_ptr_hi[(val-b_lo_ptrs)>>8];
}


/* aktualizacja kubelka modelu na podstawie zakodowanego symbolu curval */
static void updatemodel(s_bucket * const bucket, const unsigned int curval, 
						const unsigned int bpp)
{ 
	COUNTER * const pcounters=bucket->pcounters;
	unsigned int i;		
	unsigned int bestcode;
	unsigned int bestcodelen;

	/* uaktualnij liczniki i wyznacz wartosc i indeks najmniejszego */
	/* zaczynajac od najwiekszego indeksu  --  bpp==ncodes*/

	bestcode=bpp-1;
	bestcodelen=( pcounters[bestcode]+=GolombCodeLen(curval, bestcode) );

	for (i=bpp-2; i<bpp; i--) /* UWAGA: warunek i<bpp dla signed int i bylby i>=0 !!! */
	{
		const unsigned int ithcodelen=( pcounters[i]+=GolombCodeLen(curval, i) );

		if (ithcodelen<bestcodelen)
		{
			bestcode=i;
			bestcodelen=ithcodelen;
		}
	}

	bucket->bestcode=bestcode; /* zapamietaj wyznaczony */

	if(bestcodelen>wm_trigger)	/* czy polowic liczniki? */
		for (i=0; i<bpp; i++) /* polowimy */
			pcounters[i]>>=1;
}


/* dla stalego waitmask przeprowadz kompresje */
/* argumenty: kontekst pierwszego piksela, tablica pikseli, dlugosc tablicy, waitmask */
/* tablica na bitowo zapisane slowa kodowe i jej zmienne stanu */
static void statcompressrowwm(const PIXEL firstcontext, const PIXEL uncompressedrow[],  
							  const unsigned int width, const unsigned int waitmask,
							  BYTE compressedrow[], 
							  unsigned int * const fullbytes, unsigned int * const bitsused)
{
	unsigned int i;

	unsigned int stopidx; /* piksel na ktorym zatrzymuje sie petla wewnetrzna */

	ENCODE_START(compressedrow, fullbytes, bitsused)

	
	assert(width);

	{	/* element zerowy */
			unsigned int codeword, codewordlen ;

			GolombCoding(uncompressedrow[0], 
						 findbucket(firstcontext)->bestcode, 
						 &codeword, &codewordlen);
			ENCODE(codeword, codewordlen)

			if (waitcnt)
				waitcnt--;
			else
			{
				waitcnt=(tabrand() & waitmask);
				updatemodel(findbucket(firstcontext), 
							uncompressedrow[0] , _bpp);
			}
	}

	i=1;
	stopidx=i+waitcnt;

	while (stopidx<width) /* kodujemy grupe pikseli i aktualizujemy model po ostatnim z grupy */
	{
		for (; i<=stopidx; i++)
		{
			unsigned int codeword, codewordlen ;

			GolombCoding(uncompressedrow[i], 
						findbucket(uncompressedrow[i-1])->bestcode, 
						&codeword, &codewordlen);
			ENCODE(codeword, codewordlen)
		}

		updatemodel(findbucket(uncompressedrow[stopidx-1]), 
						uncompressedrow[stopidx] , _bpp);
		stopidx=i+(tabrand() & waitmask);
	}

	for (; i<width; i++)	/* ewentualna ostatnia grupa pikseli, po ktorej nie ma aktualizacji */
	{
		unsigned int codeword, codewordlen ;

		GolombCoding(uncompressedrow[i], 
					findbucket(uncompressedrow[i-1])->bestcode, 
					&codeword, &codewordlen);
		ENCODE(codeword, codewordlen)
	}

	ENCODE_STOP(compressedrow, fullbytes, bitsused)

	waitcnt=stopidx-width;
}


/* powyzsze w wariancie dla do 8 bpp */
static s_bucket * findbucket8bpp(const unsigned int val)
{
	assert(val<(0x1U<<_bpp));

	return b_ptr_lo[val];
}


static void updatemodel8bpp(s_bucket * const bucket, const unsigned int curval, 
							const unsigned int bpp)
{ 
	COUNTER * const pcounters=bucket->pcounters;
	unsigned int i;		
	unsigned int bestcode;
	unsigned int bestcodelen;

	/* uaktualnij liczniki i wyznacz wartosc i indeks najmniejszego */
	/* zaczynajac od najwiekszego indeksu  --  bpp==ncodes*/

	bestcode=bpp-1;
	bestcodelen=( pcounters[bestcode]+=GolombCodeLen(curval, bestcode) );

	for (i=bpp-2; i<bpp; i--) /* UWAGA: warunek i<bpp dla signed int i bylby i>=0 !!! */
	{
		const unsigned int ithcodelen=( pcounters[i]+=GolombCodeLen(curval, i) );

		if (ithcodelen<bestcodelen)
		{
			bestcode=i;
			bestcodelen=ithcodelen;
		}
	}

	bucket->bestcode=bestcode; /* zapamietaj wyznaczony */

	if(bestcodelen>wm_trigger)	/* czy polowic liczniki? */
		for (i=0; i<bpp; i++) /* polowimy */
			pcounters[i]>>=1;
}


static void statcompressrowwm8bpp(const BYTE firstcontext, const BYTE uncompressedrow[],  
							  const unsigned int width, const unsigned int waitmask,
							  BYTE compressedrow[], 
							  unsigned int * const fullbytes, unsigned int * const bitsused)
{
	unsigned int i;
	unsigned int stopidx; /* piksel na ktorym zatrzymuje sie petla wewnetrzna */

	ENCODE_START(compressedrow, fullbytes, bitsused)

	assert(width);

	{	/* element zerowy */
			unsigned int codeword, codewordlen ;

			GolombCoding(uncompressedrow[0], 
						 findbucket8bpp(firstcontext)->bestcode, 
						 &codeword, &codewordlen);
			ENCODE(codeword, codewordlen)

			if (waitcnt)
				waitcnt--;
			else
			{
				waitcnt=(tabrand() & waitmask);
				updatemodel8bpp(findbucket8bpp(firstcontext), 
								uncompressedrow[0] , _bpp);
			}
	}

	i=1;
	stopidx=i+waitcnt;

	while (stopidx<width) /* kodujemy grupe pikseli i aktualizujemy model po ostatnim z grupy */
	{
		for (; i<=stopidx; i++)
		{
			unsigned int codeword, codewordlen ;

			GolombCoding(uncompressedrow[i], 
						findbucket8bpp(uncompressedrow[i-1])->bestcode, 
						&codeword, &codewordlen);
			ENCODE(codeword, codewordlen)
		}

		updatemodel8bpp(findbucket8bpp(uncompressedrow[stopidx-1]), 
						uncompressedrow[stopidx] , _bpp);
		stopidx=i+(tabrand() & waitmask);
	}

	for (; i<width; i++)	/* ewentualna ostatnia grupa pikseli, po ktorej nie ma aktualizacji */
	{
		unsigned int codeword, codewordlen ;

		GolombCoding(uncompressedrow[i], 
					findbucket8bpp(uncompressedrow[i-1])->bestcode, 
					&codeword, &codewordlen);
		ENCODE(codeword, codewordlen)
	}

	ENCODE_STOP(compressedrow, fullbytes, bitsused)

	waitcnt=stopidx-width;
}


/* obszar nie-krytyczny */

#include "cfamily.h"
#include "cdftypes.h"
#include "exitit.h"
#include "bppmask.h"
#include "ceillog2.h"
#include "taskparams.h" 
#include "clalloc.h" 


static COUNTER * pc=NULL;	/* pomocniczy do dealokacji i alokacji tablic licznikow (hurtem) */

static s_bucket * pb=NULL;	/* tablica kubelkow */


/* ustawiane przez findmodelparams(), uzywane przez statfillstructures() */
static unsigned int 
			repfirst,		/* ile kubelkow takich jak pierwszy */
			firstsize,		/* rozmiar pierwszego kubelka */
			repnext,			/* po ile razy powtarzac kolejne rozmiary */
			mulsize,			/* skok wielkosci rozmiaru */
			levels;			/* liczba poziomow jasnosci piksela */
static unsigned int
			nbuckets;		/* liczba kubelkow */

static unsigned int
			ncounters;		/* liczba licznikow alokowanych dla kubelka */

static unsigned int 
			wmidx,	/* aktualny index waitmask */
			wmileft;	/* ile jeszcze symboli zakodowac z aktualnym wmidx */

static const unsigned short besttrigtab[4][11]={ /* tablica wartosci do wyznaczenia wm_trigger przez set_wm_trigger() */
											     /*w komentatrzach evol */
	/* 1 */	{ 550, 900, 800, 700, 500, 350, 300, 200, 180, 180, 160 },
	/* 3 */	{ 110, 550, 900, 800, 550, 400, 350, 250, 140, 160, 140 },
	/* 5 */	{ 100, 120, 550, 900, 700, 500, 400, 300, 220, 250, 160 },
	/* 6 */	{  30,	30,  30,  30,  30, 250, 400, 400, 300, 220, 220 }
	};



/* dla stalego waitmask przeprowadz de kompresje, wskaznik do tablicy pikseli i jej dlugosc */
/* zwroc 0-ok, 1-blad */
static int statdecompressrowwm(PIXEL context, PIXEL * uncompressedrow, 
						const unsigned int width, const unsigned int waitmask,
						struct bitinstatus *bs)
{
	unsigned int 
			_waitcnt=waitcnt;
	struct bitinstatus
			_bs=*bs;

	unsigned int i;

	for (i=0; i<width; i++)
	{
		s_bucket * const bucket=findbucket(context);

		context=uncompressedrow[i]=GolombDecoding(bucket->bestcode, &_bs);

		if (_waitcnt) 
			_waitcnt--;
		else
		{
			_waitcnt=(tabrand() & waitmask);
			updatemodel(bucket, context, _bpp);
		}
	}

	waitcnt=_waitcnt;
	*bs=_bs;
	return 0;
}


/* ustaw wm_trigger dla danego waitmask */
void set_wm_trigger(unsigned int wm)
{
	if (trigger)
	{
		wm_trigger=trigger;
		return;
	}

	if (wm>10)
		wm=10;

	assert(evol<7);

	wm_trigger=besttrigtab[evol/2][wm];

	assert(wm_trigger<=2000);
	assert(wm_trigger>=1);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一卡两卡| 精品视频在线视频| 中文字幕中文在线不卡住| 丁香婷婷综合色啪| 国产精品私人自拍| 欧美主播一区二区三区| 性感美女极品91精品| 精品国产一二三| 成人黄色网址在线观看| 亚洲人成精品久久久久久| 欧美日韩激情一区| 激情五月激情综合网| 国产精品美女视频| 欧美无乱码久久久免费午夜一区| 三级影片在线观看欧美日韩一区二区| 日韩午夜在线观看| 国产99精品国产| 亚洲成人7777| 国产欧美日韩综合| 欧美日韩成人激情| 国产一区二区毛片| 一二三四区精品视频| 精品少妇一区二区三区在线视频| 大胆亚洲人体视频| 婷婷中文字幕综合| 国产日韩精品视频一区| 欧美亚洲图片小说| 国产99久久久国产精品潘金网站| 亚洲国产精品久久久久婷婷884| 日韩精品最新网址| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产最新精品免费| 国产精品久久99| 欧美老肥妇做.爰bbww视频| 精品中文av资源站在线观看| 亚洲欧美国产77777| 欧美大尺度电影在线| 色偷偷88欧美精品久久久| 精品亚洲免费视频| 亚洲一区二区三区视频在线| 中文字幕第一区二区| 欧美一区二区视频网站| 91丝袜呻吟高潮美腿白嫩在线观看| 青青草原综合久久大伊人精品 | 亚洲乱码精品一二三四区日韩在线| 欧美日韩国产片| 成人午夜av电影| 免费看日韩a级影片| 亚洲欧美日韩精品久久久久| 久久免费电影网| 日韩一区二区在线看片| 在线视频亚洲一区| 成人av网站大全| 国产ts人妖一区二区| 老司机精品视频线观看86| 亚洲国产美女搞黄色| 亚洲日本va在线观看| 国产精品丝袜一区| 久久免费电影网| 精品99一区二区三区| 欧美一区二区三区公司| 欧美少妇性性性| 在线免费观看日本欧美| 91香蕉视频在线| 99久久伊人久久99| 成人免费看片app下载| 国产精品1区二区.| 国产精品伊人色| 国产精品66部| 国产成人aaa| 成人中文字幕在线| 成人免费va视频| 福利91精品一区二区三区| 国产麻豆欧美日韩一区| 国产一区二三区好的| 韩国视频一区二区| 国产成人丝袜美腿| 成人免费三级在线| 91亚洲精华国产精华精华液| 97久久精品人人做人人爽50路| 91视频观看免费| 日本韩国欧美在线| 欧美综合在线视频| 欧美精品国产精品| 欧美精品久久一区二区三区| 日韩午夜三级在线| 欧美精品一区二区在线播放 | 欧美一区二区三区在| 在线播放欧美女士性生活| 欧美一区二区日韩| 精品伦理精品一区| 国产日韩欧美精品一区| 国产精品久久久久影院亚瑟| 亚洲美女免费在线| 天堂va蜜桃一区二区三区| 另类综合日韩欧美亚洲| 国产精品一区二区91| 97精品超碰一区二区三区| 91国产免费看| 日韩欧美色综合网站| 国产日韩精品一区二区三区在线| 亚洲欧美日韩国产手机在线| 天使萌一区二区三区免费观看| 韩国精品主播一区二区在线观看| 国产成人亚洲综合a∨婷婷| 91热门视频在线观看| 欧美久久久久免费| 久久婷婷国产综合精品青草| 自拍av一区二区三区| 石原莉奈在线亚洲二区| 国产高清亚洲一区| 精品视频在线视频| 久久久久国产一区二区三区四区| 国产精品女主播av| 天堂影院一区二区| 成人高清视频在线观看| 欧美肥妇毛茸茸| 国产精品美女视频| 男人的天堂亚洲一区| 91蜜桃传媒精品久久久一区二区| 4438x成人网最大色成网站| 欧美韩国日本不卡| 青青草97国产精品免费观看| av午夜精品一区二区三区| 日韩一级免费观看| 一区二区三区蜜桃网| 国产又粗又猛又爽又黄91精品| 日本二三区不卡| 久久亚洲免费视频| 日韩高清不卡一区二区三区| av日韩在线网站| 久久蜜桃av一区二区天堂| 午夜电影网亚洲视频| av网站免费线看精品| 久久女同性恋中文字幕| 日韩二区在线观看| 欧洲一区二区三区免费视频| 国产女同性恋一区二区| 免费一级片91| 欧美特级限制片免费在线观看| 国产亚洲欧美在线| 久久 天天综合| 欧美一区二区三区四区高清| 一区二区三区中文字幕电影| 成人v精品蜜桃久久一区| 久久免费偷拍视频| 久久精工是国产品牌吗| 91麻豆精品久久久久蜜臀| 夜夜嗨av一区二区三区中文字幕| 不卡一区中文字幕| 国产精品免费久久久久| 国产精品香蕉一区二区三区| 精品福利av导航| 蜜桃视频在线观看一区| 91精品国产综合久久久久| 亚洲大片在线观看| 欧美日韩视频在线观看一区二区三区 | 国产午夜精品久久久久久免费视| 毛片av一区二区| 欧美成人精品二区三区99精品| 婷婷国产v国产偷v亚洲高清| 欧美午夜一区二区| 亚洲一级不卡视频| 欧美探花视频资源| 亚洲一区二区三区四区的| 欧美性猛交xxxx黑人交| 一区二区三区91| 欧美视频一区二区在线观看| 亚洲综合丝袜美腿| 欧美熟乱第一页| 日韩中文字幕1| 精品视频在线看| 免费观看日韩av| 欧美精品一区二区久久婷婷| 国产精品自产自拍| 久久久久久久性| av不卡免费电影| 一区二区三区成人在线视频| 欧美视频中文字幕| 蜜臀99久久精品久久久久久软件| 精品国产一区二区精华| 粉嫩av一区二区三区粉嫩| 国产精品麻豆一区二区| 在线观看不卡一区| 日韩精品午夜视频| 精品国产乱子伦一区| 国产成人精品免费网站| 中文字幕在线观看不卡| 在线中文字幕不卡| 蜜桃久久久久久| 国产香蕉久久精品综合网| 99久久精品国产网站| 亚洲国产日韩一级| 欧美成人精品3d动漫h| 成人a免费在线看| 婷婷开心久久网| 中文字幕欧美日韩一区| 欧美日韩一区二区三区免费看| 韩国视频一区二区| 伊人开心综合网|