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

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

?? encore.c

?? 用VC++實現的MPEG4視頻編碼和視頻解碼,很好用的
?? C
字號:

/**************************************************************************
MPEG-4 CODEC組件之一:  MPEG-4編碼器的核心引擎
包括了主函數體、參數初始化和數據輸出的管理
 **************************************************************************/



#include "encore.h"

#include "vop_code.h"
#include "text_dct.h"
//#include "rc_q2.h"
#include "bitstream.h"
#include "vm_common_defs.h"

#include "rate_ctl.h"

typedef struct _REFERENCE
{
	unsigned long handle;
	float framerate;
	long bitrate;
	long rc_period;
	long rc_reaction_period;
	long rc_reaction_ratio;
	long max_key_interval;
	int x_dim, y_dim;
	int prev_rounding;
	int search_range;
	int max_quantizer;
	int min_quantizer;

	long seq;
	long curr_run;       /* the current run before the last key frame */

	Vop *current;        /* the current frame to be encoded */
	Vop *reference;      /* the reference frame - reconstructed previous frame */
	Vop *reconstruct;    /* intermediate reconstructed frame - used in inter */
	Vop *error;          /* intermediate error frame - used in inter to hold prediction error */

	struct _REFERENCE *pnext;
} REFERENCE;

FILE *ftrace = NULL;
int max_quantizer, min_quantizer;

/* private functions used only in this file */
void init_vol_config(VolConfig *vol_config);
void init_vop(Vop *vop);
Int get_fcode (Int sr);
int PutVoVolHeader(int vol_width, int vol_height, int time_increment_resolution, float frame_rate);
int YUV2YUV (int x_dim, int y_dim, void *yuv, void *y_out, void *u_out, void *v_out);

int encore(unsigned long handle, unsigned long enc_opt, void *param1, void *param2)
{
	static REFERENCE *ref = NULL;
	static VolConfig *vol_config;
	// a link list to keep the reference frame for all instances

	REFERENCE *ref_curr, *ref_last = NULL;
	int x_dim, y_dim, size, length;
	int headerbits = 0;
	Vop *curr;

	ref_curr = ref_last = ref;
	while (ref_curr != NULL)
	{
		if (ref_curr->handle == handle) break;
		ref_last = ref_curr;
		ref_curr = ref_last->pnext;
	}
	// create a reference for the new handle when no match is found
	if (ref_curr == NULL)
	{
		if (enc_opt & ENC_OPT_RELEASE) return ENC_OK;
		ref_curr = (REFERENCE *)malloc(sizeof(REFERENCE));
		ref_curr->handle = handle;
		ref_curr->seq = 0;
		ref_curr->curr_run = 0;
		ref_curr->pnext = NULL;
		if (ref) ref_last->pnext = ref_curr;
		else ref = ref_curr;
	}
	// initialize for a handle if requested
	if (enc_opt & ENC_OPT_INIT)
	{
#ifdef _RC_
		ftrace = fopen("trace.txt", "w");
		fflush(ftrace);
#endif

		init_fdct_enc();
		init_idct_enc();

		// initializing rate control
		ref_curr->framerate = ((ENC_PARAM *)param1)->framerate;
		ref_curr->bitrate = ((ENC_PARAM *)param1)->bitrate;
		ref_curr->rc_period = ((ENC_PARAM *)param1)->rc_period;
		ref_curr->rc_reaction_period = ((ENC_PARAM *)param1)->rc_reaction_period;
		ref_curr->rc_reaction_ratio = ((ENC_PARAM *)param1)->rc_reaction_ratio;
		ref_curr->x_dim = ((ENC_PARAM *)param1)->x_dim;
		ref_curr->y_dim = ((ENC_PARAM *)param1)->y_dim;
		ref_curr->max_key_interval = ((ENC_PARAM *)param1)->max_key_interval;
		ref_curr->search_range = ((ENC_PARAM *)param1)->search_range;
		ref_curr->max_quantizer = ((ENC_PARAM *)param1)->max_quantizer;
		ref_curr->min_quantizer = ((ENC_PARAM *)param1)->min_quantizer;

		ref_curr->current = AllocVop(ref_curr->x_dim, ref_curr->y_dim);
		ref_curr->reference = AllocVop(ref_curr->x_dim + 2 * 16, 
			ref_curr->y_dim + 2 * 16);
		ref_curr->reconstruct = AllocVop(ref_curr->x_dim, ref_curr->y_dim);
		ref_curr->error = AllocVop(ref_curr->x_dim, ref_curr->y_dim);
		init_vop(ref_curr->current);
		init_vop(ref_curr->reference);
		init_vop(ref_curr->reconstruct);
		init_vop(ref_curr->error);
		ref_curr->reference->hor_spat_ref = -16;
		ref_curr->reference->ver_spat_ref = -16;
		SetConstantImage(ref_curr->reference->y_chan, 0);

		vol_config = (VolConfig *)malloc(sizeof(VolConfig));
		init_vol_config(vol_config);
		vol_config->frame_rate = ref_curr->framerate;
		vol_config->bit_rate = ref_curr->bitrate;

		RateCtlInit(8 /* initial quant*/, vol_config->bit_rate / vol_config->frame_rate,
			ref_curr->rc_period, ref_curr->rc_reaction_period, ref_curr->rc_reaction_ratio);

		return ENC_OK;
	}
	// release the reference associated with the handle if requested
	if (enc_opt & ENC_OPT_RELEASE)
	{
		if (ref_curr == ref) ref = NULL;
		else ref_last->pnext = ref_curr->pnext;

		if (ref_curr->current) FreeVop(ref_curr->current);
		if (ref_curr->reference) FreeVop(ref_curr->reference);
		if (ref_curr->reconstruct) FreeVop(ref_curr->reconstruct);
		if (ref_curr->error) FreeVop(ref_curr->error);

		free(ref_curr);
		free(vol_config);
		if (ftrace) {
			fclose(ftrace);
			ftrace = NULL;
		};
		return ENC_OK;
	}

	// initialize the parameters (need to be cleaned later)

	max_quantizer = ref_curr->max_quantizer;
	min_quantizer = ref_curr->min_quantizer;

	x_dim = ref_curr->x_dim;
	y_dim = ref_curr->y_dim;
	size = x_dim * y_dim;

	curr = ref_curr->current;
	curr->width = x_dim;
	curr->height = y_dim;
	curr->sr_for = ref_curr->search_range;
	curr->fcode_for = get_fcode(curr->sr_for);

	// do transformation for the input image
	// this is needed because the legacy MoMuSys code uses short int for each data
	YUV2YUV(x_dim, y_dim, ((ENC_FRAME *)param1)->image,
		curr->y_chan->f, curr->u_chan->f, curr->v_chan->f);

	// adjust the rounding_type for the current image
	curr->rounding_type = 1 - ref_curr->prev_rounding;

	Bitstream_Init((void *)(((ENC_FRAME *)param1)->bitstream));

	if (ref_curr->seq == 0) {
		headerbits = PutVoVolHeader(x_dim, y_dim, curr->time_increment_resolution, ref_curr->framerate);
	}
	
#ifdef _RC_
	fflush(ftrace);
	fprintf(ftrace, "\nCoding frame #%d\n", ref_curr->seq);
#endif

	if (ref_curr->curr_run % ref_curr->max_key_interval == 0) {
		curr->prediction_type = I_VOP;
#ifdef _RC_
	fprintf(ftrace, "This frame is forced to be coded in INTRA.\n");
	fprintf(ftrace, "It has been %d frame since the last INTRA.\n", ref_curr->curr_run);
#endif
	}
	else curr->prediction_type = P_VOP;


	// Code the image data (YUV) of the current image
	VopCode(curr,
		ref_curr->reference,
		ref_curr->reconstruct,
		ref_curr->error,
		1, //enable_8x8_mv,
		(float)ref_curr->seq/ref_curr->framerate,  // time
		vol_config);

	length = Bitstream_Close();
	((ENC_FRAME *)param1)->length = length;

	// update the rate control parameters
	RateCtlUpdate(length * 8);

	ref_curr->prev_rounding = curr->rounding_type;
	ref_curr->seq ++;
	ref_curr->curr_run ++;

	if (curr->prediction_type == I_VOP) {
		((ENC_RESULT *)param2)->isKeyFrame = 1;
		ref_curr->curr_run = 1;
	} else 
		((ENC_RESULT *)param2)->isKeyFrame = 0;

	return ENC_OK;
}


void init_vol_config(VolConfig *vol_config)
{
	/* configure VOL */
	vol_config->M = 1;
	vol_config->frame_skip = 1;
	vol_config->quantizer = 8;
	vol_config->intra_quantizer = 8;
	vol_config->modulo_time_base[0] =0;
	vol_config->modulo_time_base[1] =0;
	vol_config->frame_rate = 30;
	vol_config->bit_rate = 800000;
}


void init_vop(Vop *vop)
{
	/* initialize VOPs */
	vop->quant_precision = 5;
	vop->bits_per_pixel = 8;
//	vop->time_increment_resolution = 15 ;
	vop->time_increment_resolution = 30000;
	vop->intra_acdc_pred_disable = 0;
	vop->intra_dc_vlc_thr = 0;

	vop->sr_for = 512;
	vop->fcode_for = get_fcode(512);

	vop->y_chan->type = SHORT_TYPE;
	vop->u_chan->type = SHORT_TYPE;
	vop->v_chan->type = SHORT_TYPE;

	vop->hor_spat_ref = 0;
	vop->ver_spat_ref = 0;

}

Int get_fcode (Int sr)
{
	if (sr<=16) return 1;
	else if (sr<=32) return 2;
	else if (sr<=64) return 3;
	else if (sr<=128) return 4;
	else if (sr<=256) return 5;
	else if (sr<=512) return 6;
	else if (sr<=1024) return 7;
	else return (-1);
}

int PutVoVolHeader(int vol_width, int vol_height, int time_increment_resolution, float frame_rate)
{
	int written = 0;
	int bits, fixed_vop_time_increment;

	Bitstream_PutBits(VO_START_CODE_LENGTH, VO_START_CODE);
	Bitstream_PutBits(5, 0);				/* vo_id = 0								*/
	written += VO_START_CODE_LENGTH + 5;

	Bitstream_PutBits(VOL_START_CODE_LENGTH, VOL_START_CODE);
	Bitstream_PutBits(4, 0);				/* vol_id = 0								*/
	written += VOL_START_CODE_LENGTH + 4;

	Bitstream_PutBits(1, 0);				/* random_accessible_vol = 0				*/
	Bitstream_PutBits(8, 1);				/* video_object_type_indication = 1 video	*/
	Bitstream_PutBits(1, 1);				/* is_object_layer_identifier = 1			*/
	Bitstream_PutBits(4, 2);				/* visual_object_layer_ver_id = 2			*/
	Bitstream_PutBits(3, 1);				/* visual_object_layer_priority = 1			*/
	written += 1 + 8 + 1 + 4 + 3;

	Bitstream_PutBits(4, 1);				/* aspect_ratio_info = 1					*/
	Bitstream_PutBits(1, 0);				/* vol_control_parameter = 0				*/
	Bitstream_PutBits(2, 0);				/* vol_shape = 0 rectangular				*/
	Bitstream_PutBits(1, 1);				/* marker									*/
	written += 4 + 1 + 2 + 1;

	Bitstream_PutBits(16, time_increment_resolution);
	Bitstream_PutBits(1, 1);				/* marker									*/
	Bitstream_PutBits(1, 1);				/* fixed_vop_rate = 1						*/
	bits = (int)ceil(log((double)time_increment_resolution)/log(2.0));
    if (bits<1) bits=1;
	fixed_vop_time_increment = (int)(time_increment_resolution / frame_rate + 0.1);
	Bitstream_PutBits(bits, fixed_vop_time_increment);
	Bitstream_PutBits(1, 1);				/* marker									*/
	written += 16 + 1 + 1 + bits + 1;

	Bitstream_PutBits(13, vol_width);
	Bitstream_PutBits(1, 1);				/* marker									*/
	Bitstream_PutBits(13, vol_height);
	Bitstream_PutBits(1, 1);				/* marker									*/
	written += 13 + 1 + 13 + 1;

	Bitstream_PutBits(1, 0);				/* interlaced = 0							*/
	Bitstream_PutBits(1, 1);				/* OBMC_disabled = 1						*/
	Bitstream_PutBits(2, 0);				/* vol_sprite_usage = 0						*/
	Bitstream_PutBits(1, 0);				/* not_8_bit = 0							*/
	written += 1 + 1 + 2 + 1;

	Bitstream_PutBits(1, 0);				/* vol_quant_type = 0						*/
	Bitstream_PutBits(1, 0);				/* vol_quarter_pixel = 0					*/
	Bitstream_PutBits(1, 1);				/* complexity_estimation_disabled = 1		*/
	Bitstream_PutBits(1, 1);				/* resync_marker_disabled = 1				*/
	Bitstream_PutBits(1, 0);				/* data_partitioning_enabled = 0			*/
	Bitstream_PutBits(1, 0);				/* scalability = 0							*/
	written += 1 + 1 + 1 + 1 + 1 + 1;

	written += Bitstream_NextStartCode();

	return(written);
}

int YUV2YUV (int x_dim, int y_dim, void *yuv, void *y_out, void *u_out, void *v_out)
{
	// All this conversion does is to turn data from unsigned char to short int,
	// since legacy MoMuSys uses short int.
	unsigned char *in;
	short int *out;
	long size;

	in = yuv;
	
	out = y_out;
	size = x_dim * y_dim;
	while (size --) *(out ++) = *(in ++);

	out = u_out;
	size = x_dim * y_dim / 4;
	while (size --) *(out ++) = *(in ++);

	out = v_out;
	size = x_dim * y_dim / 4;
	while (size --) *(out ++) = *(in ++);

	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产喂奶挤奶一区二区三区| www.视频一区| 欧美一区国产二区| 日本欧美大码aⅴ在线播放| 69堂精品视频| 狠狠网亚洲精品| 国产欧美视频在线观看| 成人精品一区二区三区四区| 国产伦精品一区二区三区免费| 精品久久久久99| 国产一区二区日韩精品| 国产精品国产自产拍高清av王其| 色一区在线观看| 婷婷国产v国产偷v亚洲高清| 欧美一级高清片| 色www精品视频在线观看| 国产精品丝袜久久久久久app| 在线视频你懂得一区二区三区| 亚洲精品免费在线播放| 一区二区理论电影在线观看| 欧美大片一区二区| 久久精品一区蜜桃臀影院| 色综合激情久久| 欧美婷婷六月丁香综合色| 亚洲手机成人高清视频| 美女视频第一区二区三区免费观看网站| 97精品久久久久中文字幕 | 欧美一卡二卡三卡四卡| 国产精品久久久久国产精品日日| 国产精品久久久久久久久免费樱桃| 亚洲永久免费视频| 在线电影院国产精品| 欧美国产日韩亚洲一区| 色综合久久久久综合99| 美女久久久精品| www久久精品| 亚洲欧美日韩在线| 亚洲午夜免费视频| 久久久久亚洲蜜桃| 国产精品久久二区二区| 91麻豆精品国产91久久久久久| 成人一区二区三区视频在线观看| 91国在线观看| 成人自拍视频在线| 91精品国产色综合久久不卡蜜臀| 国产精品毛片大码女人| 日本精品视频一区二区三区| 亚洲电影视频在线| 蜜桃一区二区三区在线| 国产精品一区二区久久精品爱涩| 成人免费毛片aaaaa**| 精品国产三级电影在线观看| 99精品视频在线免费观看| 亚洲影视资源网| 色激情天天射综合网| 国产日韩精品一区二区浪潮av| 亚洲精品一区在线观看| 不卡区在线中文字幕| 日韩国产欧美在线观看| 中文字幕第一区综合| 91在线高清观看| 成人视屏免费看| 激情六月婷婷久久| 国产精品国产a| 日韩精品一区二区三区蜜臀| 欧美一区二区福利在线| 国产精品传媒视频| 亚洲精品乱码久久久久久久久| 一区二区在线观看免费视频播放| www国产精品av| 色哟哟欧美精品| 欧美亚洲禁片免费| 青青青伊人色综合久久| 五月婷婷色综合| 成人精品一区二区三区四区 | 国产在线日韩欧美| 日韩一区二区三区免费观看| 国产女人aaa级久久久级 | 国产一区二区视频在线播放| 欧美在线制服丝袜| 91视频在线观看免费| 日韩午夜在线播放| 成人免费不卡视频| 欧美乱妇一区二区三区不卡视频| 日韩一区二区三区四区| 亚洲免费观看高清完整版在线观看| 韩国精品免费视频| 一本色道综合亚洲| 欧美日韩在线精品一区二区三区激情| 亚洲精品欧美激情| 精品国产乱码久久久久久图片| 99久久99久久精品免费观看| 视频精品一区二区| 美女视频一区在线观看| 久久免费精品国产久精品久久久久| 国产欧美日韩麻豆91| 免费观看在线综合色| 国产高清久久久| 日韩精品一二三区| 毛片av一区二区| 99久久久久免费精品国产| 国产凹凸在线观看一区二区| 《视频一区视频二区| 欧美中文字幕一区| 99久久精品国产一区二区三区| 91性感美女视频| 欧美一区二区三区视频免费播放| 亚洲摸摸操操av| 国产亚洲综合在线| 国产一区视频导航| 国模少妇一区二区三区| 欧美日韩dvd在线观看| 亚洲视频你懂的| 欧美人与性动xxxx| 日韩一区二区三区av| 欧美在线free| 亚洲久草在线视频| 欧美日韩aaaaaa| 色噜噜偷拍精品综合在线| 欧美tickling网站挠脚心| 国产一区二区在线影院| 亚洲精品一二三四区| 欧美精品一区二区三区蜜桃| 99re热这里只有精品视频| 欧美揉bbbbb揉bbbbb| 美女久久久精品| 99精品1区2区| 日韩欧美美女一区二区三区| 国产精品国产a级| 精品一区二区在线免费观看| 色婷婷精品久久二区二区蜜臀av | 精品视频色一区| 精品成人一区二区三区四区| 一区二区高清在线| 国产精品18久久久久久久久| 欧美日韩国产成人在线91| 国产日韩精品一区| 一区二区三区产品免费精品久久75| 精一区二区三区| 欧美乱熟臀69xxxxxx| 亚洲人成网站精品片在线观看| 国产一区二区在线影院| 日韩欧美在线综合网| 一区二区三区中文字幕| 国产mv日韩mv欧美| 欧美大片在线观看一区二区| 亚洲成a人v欧美综合天堂| 99麻豆久久久国产精品免费| 欧美精品一区二区三区蜜桃视频 | 中文字幕在线不卡一区二区三区 | 午夜电影久久久| 色88888久久久久久影院野外| 中文字幕乱码久久午夜不卡| 久久99国产精品麻豆| 欧美喷潮久久久xxxxx| 亚洲另类色综合网站| 99久久综合国产精品| 国产欧美在线观看一区| 精品一区二区三区蜜桃| 日韩欧美一二三四区| 日韩国产欧美三级| 在线不卡的av| 天天色 色综合| 在线电影欧美成精品| 婷婷综合五月天| 欧美日韩精品久久久| 一区二区理论电影在线观看| 在线区一区二视频| 亚洲一区在线电影| 在线免费观看一区| 亚洲午夜电影网| 欧美日韩免费一区二区三区| 亚洲五码中文字幕| 欧美日韩和欧美的一区二区| 一片黄亚洲嫩模| 欧美精品一卡两卡| 麻豆91在线看| 久久免费电影网| 成人免费视频视频在线观看免费| 国产精品久久久久久久久久久免费看 | 一本大道综合伊人精品热热| 一区二区三区在线视频播放| 在线视频一区二区三区| 婷婷中文字幕综合| 日韩女优电影在线观看| 国产一区二区三区蝌蚪| 日本一区二区免费在线 | 91猫先生在线| 亚洲成av人影院在线观看网| 欧美久久一二三四区| 精品一区二区三区在线观看国产| 久久五月婷婷丁香社区| 粉嫩av一区二区三区| 亚洲欧美激情小说另类| 欧美久久久久久久久中文字幕| 麻豆精品一二三| 欧美激情综合五月色丁香小说| 一本色道久久综合狠狠躁的推荐| 视频在线观看91| 国产午夜精品久久|