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

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

?? dl1quant.cpp

?? MPEG4解碼程序源代碼(能夠?qū)Ω鞣NMPEG4文件進(jìn)行解碼)
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//
//	This has been modified from Dennis Lee's original version
//	

/*
 * DL1 Quantization
 * ================
 *
 * File: dl1quant.c
 * Author: Dennis Lee   E-mail: denlee@ecf.utoronto.ca
 *
 * Copyright (C) 1993-1997 Dennis Lee
 *
 * C implementation of DL1 Quantization.
 * DL1 Quantization is a 2-pass color quantizer optimized for speed.
 * The method was designed around the steps required by a 2-pass
 * quantizer and constructing a model that would require the least
 * amount of extra work.  The resulting method is extremely fast --
 * about half the speed of a memcpy.  That should make DL1 Quant the
 * fastest 2-pass color quantizer.
 *
 * This quantizer's quality is also among the best, slightly
 * better than Wan et al's marginal variance based quantizer.  For
 * more on DL1 Quant's performance and other related information,
 * see DLQUANT.TXT included in this distribution.
 *
 *
 * NOTES
 * =====
 *
 * The dithering code is based on code from the IJG's jpeg library.
 *
 * This source code may be freely copied, modified, and redistributed,
 * provided this copyright notice is attached.
 * Compiled versions of this code, modified or not, are free for
 * personal use.  Compiled versions used in distributed software
 * is also free, but a notification must be sent to the author.
 * An e-mail to denlee@ecf.utoronto.ca will do.
 *
 */

#include "stdafx.h"

#ifdef __cplusplus
extern "C" {
#endif


#include <stdlib.h>
#include "dl1quant.h"

//#define FAST        /* improves speed but uses a lot of memory */
#define QUAL1       /* slightly improves quality */
//#define QUAL2       /* slightly improves quality */

/* define *one* of the following dither options */
//#define DITHER1     /* 1-val error diffusion dither */
#define DITHER2     /* 2-val error diffusion dither */
//#define DITHER4     /* 4-val error diffusion dither (Floyd-Steinberg) */

#define DITHER_MAX  20

LOCAL uchar palette[3][256];
LOCAL CUBE *rgb_table[6];
LOCAL ushort r_offset[256], g_offset[256], b_offset[256];
LOCAL CLOSEST_INFO c_info;
LOCAL int tot_colors, pal_index;
LOCAL ulong *squares;
LOCAL FCUBE *heap = NULL;
LOCAL short *dl_image = NULL;

/* returns 1 on success, 0 on failure */
GLOBAL int dl1quant(uchar *inbuf, 
					uchar *outbuf, 
					int width, 
					int height, 
					int quant_to,
					int dither, 
					uchar userpal[3][256]) {

	dlq_init();

    if (dlq_start() == 0) {
		dlq_finish();
		return 0;
	}

    if (build_table(inbuf, (ulong)width * (ulong)height) == 0) {
		dlq_finish();
		return 0;
    }
    
	reduce_table(quant_to);
    set_palette(0, 0);
    
	if (quantize_image(inbuf, outbuf, width, height, dither) == 0) {
		dlq_finish();
		return 0;
    }

    dlq_finish();
    copy_pal(userpal);

    return 1;
}

LOCAL void copy_pal(uchar userpal[3][256]) 
{
    int i;

    for (i = 0; i < 256; i++) {
		userpal[0][i] = palette[0][i];
		userpal[1][i] = palette[1][i];
		userpal[2][i] = palette[2][i];
    }
}

LOCAL void dlq_init(void) 
{
    int i;

	for (i=0;i<6;i++) {
		rgb_table[i]=NULL;
	}

	tot_colors=0;
	pal_index=0;

	heap = NULL;
	dl_image = NULL;

    for (i = 0; i < 256; i++) {
		r_offset[i] = (i & 128) << 7 | (i & 64) << 5 | (i & 32) << 3 |
				  (i & 16)  << 1 | (i & 8)  >> 1;
		g_offset[i] = (i & 128) << 6 | (i & 64) << 4 | (i & 32) << 2 |
				  (i & 16)  << 0 | (i & 8)  >> 2;
		b_offset[i] = (i & 128) << 5 | (i & 64) << 3 | (i & 32) << 1 |
				  (i & 16)  >> 1 | (i & 8)  >> 3;
    }


	c_info.palette_index=0;
	c_info.red=0;
	c_info.green=0;
	c_info.blue=0;
    c_info.distance=0;

    for (i = (-255); i <= 255; i++)
		c_info.squares[i+255] = i*i;

	for (i=0;i<256;i++) {
		palette[0][i]=0;
		palette[1][i]=0;
		palette[2][i]=0;
	}

    squares = c_info.squares + 255;
}

/* returns 1 on success, 0 on failure */
LOCAL int dlq_start(void) 
{
    int i;

    rgb_table[0] = (CUBE *) calloc(sizeof(CUBE), 1);
    rgb_table[1] = (CUBE *) calloc(sizeof(CUBE), 8);
    rgb_table[2] = (CUBE *) calloc(sizeof(CUBE), 64);
    rgb_table[3] = (CUBE *) calloc(sizeof(CUBE), 512);
    rgb_table[4] = (CUBE *) calloc(sizeof(CUBE), 4096);
    rgb_table[5] = (CUBE *) calloc(sizeof(CUBE), 32768);

    for (i = 0; i <= 5; i++)
		if (rgb_table[i] == NULL)
		    return 0;

    pal_index = 0;
    return 1;
}

LOCAL void dlq_finish(void) 
{
	int i;

	for (i=0;i<6;i++) {
		if (rgb_table[i] != NULL) {
			free(rgb_table[i]);
			rgb_table[i]=NULL;
		}
	}

    if (heap != NULL) {
		free(heap);
		heap=NULL;
	}
    
	if (dl_image != NULL) {
		free(dl_image);
		dl_image=NULL;
	}

	memset(&c_info, 0, sizeof(CLOSEST_INFO));

	tot_colors=pal_index=0;

}

/* returns 1 on success, 0 on failure */
LOCAL int build_table(uchar *image, ulong pixels) 
{
    ulong i=0;
	ulong index=0;
	ulong cur_count=0;
	ulong head=0;
	ulong tail=0;
    slong j=0;

    heap = (FCUBE *) malloc(sizeof(FCUBE) * 32769);
    if (heap == NULL)
		return 0;

#ifdef FAST
    dl_image = malloc(sizeof(short) * pixels);
    if (dl_image == NULL)
		return 0;
#endif

    for (i = 0; i < pixels; i++) {
#ifdef FAST
		dl_image[i] = index = r_offset[image[0]] + g_offset[image[1]] + b_offset[image[2]];
#else
		index = r_offset[image[0]] + g_offset[image[1]] + b_offset[image[2]];
#endif
#ifdef QUAL1
		rgb_table[5][index].r += image[0];
		rgb_table[5][index].g += image[1];
		rgb_table[5][index].b += image[2];
#endif
		rgb_table[5][index].pixel_count++;
		image += 3;
    }

    tot_colors = 0;
		for (i = 0; i < 32768; i++) {
		cur_count = rgb_table[5][i].pixel_count;
		if (cur_count) {
			heap[++tot_colors].level = 5;
			heap[tot_colors].index = (ushort)i;
			rgb_table[5][i].pixels_in_cube = cur_count;
#ifndef QUAL1
			rgb_table[5][i].r = cur_count * (((i & 0x4000) >> 7 |
					(i & 0x0800) >> 5 | (i & 0x0100) >> 3 |
					(i & 0x0020) >> 1 | (i & 0x0004) << 1) + 4);
			rgb_table[5][i].g = cur_count * (((i & 0x2000) >> 6 |
					(i & 0x0400) >> 4 | (i & 0x0080) >> 2 |
					(i & 0x0010) >> 0 | (i & 0x0002) << 2) + 4);
			rgb_table[5][i].b = cur_count * (((i & 0x1000) >> 5 |
					(i & 0x0200) >> 3 | (i & 0x0040) >> 1 |
					(i & 0x0008) << 1 | (i & 0x0001) << 3) + 4);
#endif
			head = i;
			for (j = 4; j >= 0; j--) {
				tail = head & 0x7;
				head >>= 3;
				rgb_table[j][head].pixels_in_cube += cur_count;
				rgb_table[j][head].children |= 1 << tail;
			}
		}
    }

    for (i = tot_colors; i > 0; i--)
		fixheap(i);

    return 1;
}

LOCAL void fixheap(ulong id) 
{
    uchar thres_level = heap[id].level;
    ulong thres_index = heap[id].index;
	ulong index=0;
	ulong half_totc = tot_colors >> 1;
	ulong thres_val = rgb_table[thres_level][thres_index].pixels_in_cube;

    while (id <= half_totc) {
		index = id << 1;

		if (index < (ulong)tot_colors)
			if (rgb_table[heap[index].level][heap[index].index].pixels_in_cube
			  > rgb_table[heap[index+1].level][heap[index+1].index].pixels_in_cube)
			index++;

		if (thres_val <= rgb_table[heap[index].level][heap[index].index].pixels_in_cube)
			break;
		else {
			heap[id] = heap[index];
			id = index;
		}
    }
    heap[id].level = thres_level;
    heap[id].index = (ushort)thres_index;
}

LOCAL void reduce_table(int num_colors) 
{
	while (tot_colors > num_colors) {

		uchar tmp_level = heap[1].level, t_level = max(0,tmp_level - 1);
		ulong tmp_index = heap[1].index, t_index = tmp_index >> 3;

		if (rgb_table[t_level][t_index].pixel_count)
			heap[1] = heap[tot_colors--];
		else {
			heap[1].level = t_level;
			heap[1].index = (ushort)t_index;
		}

		rgb_table[t_level][t_index].pixel_count += rgb_table[tmp_level][tmp_index].pixel_count;
		rgb_table[t_level][t_index].r += rgb_table[tmp_level][tmp_index].r;
		rgb_table[t_level][t_index].g += rgb_table[tmp_level][tmp_index].g;
		rgb_table[t_level][t_index].b += rgb_table[tmp_level][tmp_index].b;
		rgb_table[t_level][t_index].children &= ~(1 << (tmp_index & 0x7));

		fixheap(1);
    }
}

LOCAL void set_palette(int index, int level) 
{
    int i;

    if (rgb_table[level][index].children) {
		for (i = 7; i >= 0; i--) {
			if (rgb_table[level][index].children & (1 << i)) {
				set_palette((index << 3) + i, level + 1);
			}
		}
	}

    if (rgb_table[level][index].pixel_count) {
		ulong r_sum, g_sum, b_sum, sum;

		rgb_table[level][index].palette_index = pal_index;
		
		r_sum = rgb_table[level][index].r;
		g_sum = rgb_table[level][index].g;
		b_sum = rgb_table[level][index].b;
		
		sum = rgb_table[level][index].pixel_count;

		palette[0][pal_index] = (BYTE)((r_sum + (sum >> 1)) / sum);
		palette[1][pal_index] = (BYTE)((g_sum + (sum >> 1)) / sum);
		palette[2][pal_index] = (BYTE)((b_sum + (sum >> 1)) / sum);

		pal_index++;
    }

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品麻豆一区二区| 亚洲欧洲成人精品av97| 成人激情小说网站| 婷婷国产v国产偷v亚洲高清| 国产欧美一区二区精品性色超碰| 欧美性高清videossexo| 国产夫妻精品视频| 午夜激情综合网| 国产精品初高中害羞小美女文| 欧美精品自拍偷拍动漫精品| 99re免费视频精品全部| 久久国产精品99精品国产| 亚洲男人天堂一区| 国产欧美日韩综合精品一区二区| 欧美日韩黄视频| 97久久精品人人爽人人爽蜜臀| 精品一区二区三区免费| 午夜精品久久久久久久 | 欧美一级日韩一级| 色欧美片视频在线观看| 大胆亚洲人体视频| 久久99国产乱子伦精品免费| 水野朝阳av一区二区三区| 日韩美女视频19| 中文字幕免费不卡在线| 精品国产网站在线观看| 制服丝袜中文字幕亚洲| 欧美在线|欧美| 99国产精品99久久久久久| 成人午夜av电影| 国产乱码字幕精品高清av| 日本在线不卡一区| 性欧美疯狂xxxxbbbb| 一区二区在线观看免费| 最近日韩中文字幕| 国产精品国产三级国产有无不卡| 久久免费看少妇高潮| 日韩女优制服丝袜电影| 欧美精品xxxxbbbb| 欧美精三区欧美精三区| 欧美久久一二三四区| 欧美午夜影院一区| 欧美三级日本三级少妇99| 91官网在线免费观看| 欧美在线视频日韩| 欧美性大战久久久久久久| 欧洲亚洲精品在线| 色狠狠色噜噜噜综合网| 欧美性欧美巨大黑白大战| 欧美日韩久久久久久| 欧美日韩精品一区二区三区| 欧美精品视频www在线观看| 欧美久久久一区| 91精品国产入口| 欧美成人aa大片| 欧美精品一区二区三区久久久| 精品国产91乱码一区二区三区| 精品动漫一区二区三区在线观看| 精品国产免费久久| 久久久精品欧美丰满| 国产精品免费丝袜| 亚洲精品亚洲人成人网| 日韩国产欧美视频| 久久99精品国产麻豆婷婷| 国产91在线看| 色悠悠久久综合| 欧美日韩五月天| 日韩一卡二卡三卡| 国产欧美一区二区精品久导航 | 欧美日韩成人激情| 欧美不卡在线视频| 亚洲欧美综合网| 亚洲电影一级黄| 狠狠色丁香久久婷婷综合_中| 福利电影一区二区三区| 一本久久精品一区二区| 欧美一区二区国产| 中文字幕精品—区二区四季| 亚洲国产欧美另类丝袜| 久久成人久久鬼色| av在线一区二区| 4438x亚洲最大成人网| 国产婷婷色一区二区三区四区| 一区二区三区不卡在线观看| 日韩av午夜在线观看| 国产精品1区2区| 欧美色综合影院| 精品第一国产综合精品aⅴ| 亚洲免费色视频| 国内久久精品视频| 欧美性生活大片视频| 久久久久久亚洲综合| 亚洲黄色尤物视频| 国产一区二区三区精品视频| 在线观看亚洲一区| 国产欧美精品国产国产专区| 日韩精品视频网站| 成人动漫中文字幕| 欧美一区二区美女| 亚洲精品日韩一| 国产黄色91视频| 91精品欧美综合在线观看最新 | 亚洲午夜精品在线| 成人午夜av在线| 精品久久免费看| 亚洲高清一区二区三区| voyeur盗摄精品| 日韩欧美久久久| 亚洲国产cao| 91在线视频观看| 久久久久久99精品| 婷婷综合五月天| 一本久久综合亚洲鲁鲁五月天| 久久精品亚洲精品国产欧美| 日韩av二区在线播放| 欧美色偷偷大香| 亚洲欧洲综合另类| 成人国产精品免费观看视频| 欧美成人一区二区三区片免费 | 色婷婷狠狠综合| 国产精品视频第一区| 国产综合色精品一区二区三区| 欧美日韩精品一区二区天天拍小说| 国产精品久久免费看| 国产精品中文字幕一区二区三区| 欧美人狂配大交3d怪物一区| 亚洲精品乱码久久久久久黑人| 成人久久久精品乱码一区二区三区| 日韩欧美色综合| 麻豆精品一区二区三区| 69堂精品视频| 视频在线观看91| 777奇米四色成人影色区| 亚洲制服丝袜一区| 欧美性生活大片视频| 亚洲午夜久久久| 欧美色区777第一页| 午夜精品久久久| 欧美日韩成人综合| 日韩高清欧美激情| 51久久夜色精品国产麻豆| 奇米精品一区二区三区在线观看| 欧美挠脚心视频网站| 香蕉影视欧美成人| 7777精品伊人久久久大香线蕉最新版| 爽好多水快深点欧美视频| 欧美日韩不卡在线| 蜜桃视频一区二区| 久久免费精品国产久精品久久久久| 国产乱码一区二区三区| 国产精品每日更新在线播放网址 | 国产自产2019最新不卡| 久久影视一区二区| 国产成人免费在线视频| 国产精品久久福利| 91久久香蕉国产日韩欧美9色| 一区二区三区不卡视频在线观看| 欧美视频中文字幕| 久久精品国产77777蜜臀| 欧美精品一区二区三区蜜臀| 国产成人久久精品77777最新版本| 亚洲国产激情av| 色综合网站在线| 日韩精品一二三| 亚洲精品一区二区在线观看| 成人一区二区三区| 亚洲欧美偷拍三级| 91麻豆精品国产91久久久久久久久 | 成人av网址在线观看| 亚洲精品国产一区二区精华液| 欧美婷婷六月丁香综合色| 青青青伊人色综合久久| 久久久久久毛片| 色综合久久综合网| 日韩av不卡在线观看| 精品久久一区二区三区| bt7086福利一区国产| 亚洲国产va精品久久久不卡综合| 欧美成人在线直播| 91色porny蝌蚪| 日韩成人一区二区| 国产欧美一二三区| 欧美日韩一卡二卡| 国产高清不卡一区二区| 亚洲午夜免费电影| 国产日本欧洲亚洲| 欧美日本免费一区二区三区| 国产在线精品一区二区三区不卡| 日韩久久一区二区| 欧美v亚洲v综合ⅴ国产v| 色哟哟欧美精品| 韩国欧美国产一区| 一区二区三区精品在线观看| 久久综合五月天婷婷伊人| 色诱亚洲精品久久久久久| 国产一区二区三区免费看| 亚洲主播在线观看| 日本一区二区动态图| 这里只有精品免费| 91国产福利在线|