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

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

?? mp4_block.c

?? MPEG4的壓縮和解壓縮代碼
?? C
字號:
/**************************************************************************
 *                                                                        *
 * This code has been developed by Andrea Graziani. This software is an   *
 * implementation of a part of one or more MPEG-4 Video tools as          *
 * specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
 * software module in hardware or software products are advised that its  *
 * use may infringe existing patents or copyrights, and any such use      *
 * would be at such party's own risk.  The original developer of this     *
 * software module and his/her company, and subsequent editors and their  *
 * companies (including Project Mayo), will have no liability for use of  *
 * this software or modifications or derivatives thereof.                 *
 *                                                                        *
 * Project Mayo gives users of the Codec a license to this software       *
 * module or modifications thereof for use in hardware or software        *
 * products claiming conformance to the MPEG-4 Video Standard as          *
 * described in the Open DivX license.                                    *
 *                                                                        *
 * The complete Open DivX license can be found at                         *
 * http://www.projectmayo.com/opendivx/license.php                        *
 *                                                                        *
 **************************************************************************/
/**
*  Copyright (C) 2001 - Project Mayo
 *
 * Andrea Graziani (Ag)
 *
 * DivX Advanced Research Center <darc@projectmayo.com>
*
**/
/// mp4_block.c //

#include <math.h>
#include <stdlib.h>
#include <assert.h>

#include "mp4_vars.h"

#include "getbits.h"
#include "clearblock.h"
#include "mp4_iquant.h"
#include "mp4_predict.h"
#include "mp4_vld.h"
#include "debug.h"
#include "mp4_block.h"

/**
 *
**/

static int getDCsizeLum();
static int getDCsizeChr();
static int getDCdiff();
static void setDCscaler(int block_num);

static int getACdir();

/***/

// Purpose: texture decoding of block_num
int block(int block_num, int coded)
{
	int i;
	int dct_dc_size, dct_dc_diff;
	int intraFlag = ((mp4_state->hdr.derived_mb_type == INTRA) || 
		(mp4_state->hdr.derived_mb_type == INTRA_Q)) ? 1 : 0;
	event_t event;

	clearblock(ld->block); // clearblock

	if (intraFlag)
	{
		setDCscaler(block_num); // calculate DC scaler

		if (block_num < 4) {
			dct_dc_size = getDCsizeLum();
			if (dct_dc_size != 0) 
				dct_dc_diff = getDCdiff(dct_dc_size);
			else 
				dct_dc_diff = 0;
			if (dct_dc_size > 8)
				getbits1(); // marker bit
		}
		else {
			dct_dc_size = getDCsizeChr();
			if (dct_dc_size != 0)
				dct_dc_diff = getDCdiff(dct_dc_size);
			else 
				dct_dc_diff = 0;
			if (dct_dc_size > 8)
				getbits1(); // marker bit
		}

		ld->block[0] = (short) dct_dc_diff;
//		_Print("DC diff: %d\n", dct_dc_diff);
	}
	if (intraFlag)
	{
		// dc reconstruction, prediction direction
		dc_recon(block_num, &ld->block[0]);
	}

	if (coded) 
	{
		unsigned int * zigzag; // zigzag scan dir

		if ((intraFlag) && (mp4_state->hdr.ac_pred_flag == 1)) {

			if (mp4_state->coeff_pred.predict_dir == TOP)
				zigzag = mp4_tables->alternate_horizontal_scan;
			else
				zigzag = mp4_tables->alternate_vertical_scan;
		}
		else {
			zigzag = mp4_tables->zig_zag_scan;
		}

		i = intraFlag ? 1 : 0;
		do // event vld
		{
			event = vld_event(intraFlag);
/***
			if (event.run == -1)
			{
				printf("Error: invalid vld code\n");
				exit(201);
			}
***/			
			i+= event.run;
			ld->block[zigzag[i]] = (short) event.level;

//			_Print("Vld Event: Run Level Last %d %d %d\n", event.run, event.level, event.last);

			i++;
		} while (! event.last);
	}

	if (intraFlag)
	{
		// ac reconstruction
		// ac_rescaling(...)
		ac_recon(block_num, &ld->block[0]);
	}

#ifdef _DEBUG_B_ACDC
	if (intraFlag)
	{
		int i;
		_Print("After AcDcRecon:\n");
		_Print("   x ");
		for (i = 1; i < 64; i++) {
			if ((i != 0) && ((i % 8) == 0))
				_Print("\n");
			_Print("%4d ", ld->block[i]);
		}
		_Print("\n");
	}
#endif // _DEBUG_ACDC

	if (mp4_state->hdr.quant_type == 0)
	{
		// inverse quantization
		iquant(ld->block, intraFlag);
	}
	else 
	{
		_Error("Error: MPEG-2 inverse quantization NOT implemented\n");
		exit(110);
	}

#ifdef _DEBUG_B_QUANT
	{
		int i;
		_Print("After IQuant:\n");
		_Print("   x ");
		for (i = 1; i < 64; i++) {
			if ((i != 0) && ((i % 8) == 0))
				_Print("\n");
			_Print("%4d ", ld->block[i]);
		}
		_Print("\n");
	}
#endif // _DEBUG_B_QUANT

	// inverse dct
	idct(ld->block);

	return 1;
}

/***/

int blockIntra(int block_num, int coded)
{
	int i;
	int dct_dc_size, dct_dc_diff;
	event_t event;

	clearblock(ld->block); // clearblock

	// dc coeff
	setDCscaler(block_num); // calculate DC scaler

	if (block_num < 4) {
		dct_dc_size = getDCsizeLum();
		if (dct_dc_size != 0) 
			dct_dc_diff = getDCdiff(dct_dc_size);
		else 
			dct_dc_diff = 0;
		if (dct_dc_size > 8)
			getbits1(); // marker bit
	}
	else {
		dct_dc_size = getDCsizeChr();
		if (dct_dc_size != 0)
			dct_dc_diff = getDCdiff(dct_dc_size);
		else 
			dct_dc_diff = 0;
		if (dct_dc_size > 8)
			getbits1(); // marker bit
	}

	ld->block[0] = (short) dct_dc_diff;

	// dc reconstruction, prediction direction
	dc_recon(block_num, &ld->block[0]);

	if (coded) 
	{
		unsigned int * zigzag; // zigzag scan dir

		if (mp4_state->hdr.ac_pred_flag == 1) {

			if (mp4_state->coeff_pred.predict_dir == TOP)
				zigzag = mp4_tables->alternate_horizontal_scan;
			else
				zigzag = mp4_tables->alternate_vertical_scan;
		}
		else {
			zigzag = mp4_tables->zig_zag_scan;
		}

		i = 1;
		do // event vld
		{
			event = vld_intra_dct();
/***
			if (event.run == -1)
			{
				printf("Error: invalid vld code\n");
				exit(201);
			}
***/			
			i+= event.run;
			ld->block[zigzag[i]] = (short) event.level;

//			_Print("Vld Event: Run Level Last %d %d %d\n", event.run, event.level, event.last);

			i++;
		} while (! event.last);
	}

	// ac reconstruction
	mp4_state->hdr.intrablock_rescaled = ac_rescaling(block_num, &ld->block[0]);
	if (! mp4_state->hdr.intrablock_rescaled)
	{
		ac_recon(block_num, &ld->block[0]);
	}
	ac_store(block_num, &ld->block[0]);

	if (mp4_state->hdr.quant_type == 0)
	{
		iquant(ld->block, 1);
	}
	else 
	{
		iquant_typefirst(ld->block);
	}

	// inverse dct
	idct(ld->block);

	return 1;
}

/***/

int blockInter(int block_num, int coded)
{
	event_t event;
	unsigned int * zigzag = mp4_tables->zig_zag_scan; // zigzag scan dir
	int i;
	
	clearblock(ld->block); // clearblock

	// inverse quant type
	if (mp4_state->hdr.quant_type == 0) 
	{
		int q_scale = mp4_state->hdr.quantizer;
		int q_2scale = q_scale << 1;
		int q_add = (q_scale & 1) ? q_scale : (q_scale - 1);
			
		i = 0;
		do // event vld
		{
			event = vld_inter_dct();

			/***
			if (event.run == -1)
			{
			printf("Error: invalid vld code\n");
			exit(201);
			}
			***/			
			i+= event.run;
			if (event.level > 0) {
				ld->block[zigzag[i]] = (q_2scale * event.level) + q_add;
			}
			else {
				ld->block[zigzag[i]] = (q_2scale * event.level) - q_add;
			}
			
			// _Print("Vld Event: Run Level Last %d %d %d\n", event.run, event.level, event.last);
			
			i++;
		} while (! event.last);
	}
	else 
	{
		int k, m = 0;
		i = 0;

		// event vld
		do 
		{
			event = vld_inter_dct();

			i+= event.run;
	
			k = (event.level > 0) ? 1 : -1;

			assert(ld->block[zigzag[i]] < 2047);
			assert(ld->block[zigzag[i]] > -2048);

			ld->block[zigzag[i]] = ((2 * event.level + k) * mp4_state->hdr.quantizer * 
				mp4_tables->nonintra_quant_matrix[zigzag[i]]) >> 4;

			assert(ld->block[zigzag[i]] < 2047);
			assert(ld->block[zigzag[i]] > -2048);

			m ^= ld->block[zigzag[i]];
			
			// _Print("Vld Event: Run Level Last %d %d %d\n", event.run, event.level, event.last);
			
			i++;
		} while (! event.last);

		if (!(m%2)) ld->block[63] ^= 1;
	}

	// inverse dct
	idct(ld->block);
		
	return 1;
}

/***/

static int getDCsizeLum()
{
	int code;

	// [Ag][note] bad code

	if (showbits(11) == 1) {
		flushbits(11);
		return 12;
	}
  if (showbits(10) == 1) {
    flushbits(10);
    return 11;
  }
  if (showbits(9) == 1) {
    flushbits(9);
    return 10;
	}
	if (showbits(8) == 1) {
		flushbits(8);
		return 9;
	}
	if (showbits(7) == 1) {
		flushbits(7);
		return 8;
	}
	if (showbits(6) == 1) {
		flushbits(6);
		return 7;
	}  
	if (showbits(5) == 1) {
		flushbits(5);
		return 6;
	}
	if (showbits(4) == 1) {
		flushbits(4);
		return 5;
	}

	code = showbits(3);

	if (code == 1) {
		flushbits(3);
		return 4;
	} else if (code == 2) {
		flushbits(3);
		return 3;
	} else if (code == 3) {
		flushbits(3);
		return 0;
	}

  code = showbits(2);

  if (code == 2) {
		flushbits(2);
		return 2;
	} else if (code == 3) {
		flushbits(2);
		return 1;
	}     

	return 0;
}

static int getDCsizeChr()
{
	// [Ag][note] bad code

	if (showbits(12) == 1) {
		flushbits(12);
		return 12;
	}
	if (showbits(11) == 1) {
		flushbits(11);
		return 11;
	}
	if (showbits(10) == 1) {
		flushbits(10);
		return 10;
	}
	if (showbits(9) == 1) {
		flushbits(9);
		return 9;
	}
	if (showbits(8) == 1) {
		flushbits(8);
		return 8;
	}
	if (showbits(7) == 1) {
		flushbits(7);
		return 7;
	}
	if (showbits(6) == 1) {
		flushbits(6);
		return 6;
	}
	if (showbits(5) == 1) {
		flushbits(5);
		return 5;
	}
	if (showbits(4) == 1) {
		flushbits(4);
		return 4;
	} 
	if (showbits(3) == 1) {
		flushbits(3);
		return 3;
	} 

	return (3 - getbits(2));
}

/***/

static int getDCdiff(int dct_dc_size)
{
	int code = getbits(dct_dc_size);
	int msb = code >> (dct_dc_size - 1);

	if (msb == 0) {
		return (-1 * (code^((int) pow(2.0,(double) dct_dc_size) - 1)));
	}
  else { 
		return code;
	}
}

/***/

static void setDCscaler(int block_num) 
{
	int type = (block_num < 4) ? 0 : 1;
	int quant = mp4_state->hdr.quantizer;

	if (type == 0) {
		if (quant > 0 && quant < 5) 
			mp4_state->hdr.dc_scaler = 8;
		else if (quant > 4 && quant < 9) 
			mp4_state->hdr.dc_scaler = (2 * quant);
		else if (quant > 8 && quant < 25) 
			mp4_state->hdr.dc_scaler = (quant + 8);
		else 
			mp4_state->hdr.dc_scaler = (2 * quant - 16);
	}
  else {
		if (quant > 0 && quant < 5) 
			mp4_state->hdr.dc_scaler = 8;
		else if (quant > 4 && quant < 25) 
			mp4_state->hdr.dc_scaler = ((quant + 13) / 2);
		else 
			mp4_state->hdr.dc_scaler = (quant - 6);
	}
}

/***/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产手机| 99re热这里只有精品视频| 亚洲影视在线播放| 亚洲日本va在线观看| 一区在线中文字幕| 亚洲欧美电影院| 亚洲午夜一区二区| 天堂成人国产精品一区| 免费在线观看不卡| 国产一区在线观看麻豆| 懂色av一区二区夜夜嗨| a在线欧美一区| 99精品欧美一区二区三区综合在线| 不卡的看片网站| 欧美主播一区二区三区美女| 91成人在线观看喷潮| 欧美麻豆精品久久久久久| 中文av一区特黄| 久久久久久电影| 中文字幕色av一区二区三区| 国产精品狼人久久影院观看方式| 国产三级久久久| 亚洲人成网站影音先锋播放| 亚洲国产成人av网| 久久电影网站中文字幕| 国产成人一区二区精品非洲| 99在线热播精品免费| 欧美日韩一区二区在线观看| 日韩欧美电影一二三| 中文成人综合网| 天堂在线一区二区| 成人一二三区视频| 91福利国产成人精品照片| 精品国产区一区| 亚洲三级在线播放| 日本不卡一二三| 大陆成人av片| 日韩一区二区视频在线观看| 中文字幕中文字幕一区二区| 视频一区视频二区中文| 国产福利一区二区三区视频| 91久久精品网| 国产偷国产偷精品高清尤物| 一区二区三区四区在线免费观看| 麻豆精品一区二区三区| 色菇凉天天综合网| 久久久久国产精品麻豆ai换脸| 一区二区三区在线观看欧美| 国产乱子轮精品视频| 欧美日韩国产综合草草| 国产女同性恋一区二区| 午夜精品福利在线| 99国产精品99久久久久久| 欧美久久婷婷综合色| 国产精品国产三级国产普通话99| 蜜臀91精品一区二区三区| 色综合色综合色综合| 久久久国产综合精品女国产盗摄| 午夜视频在线观看一区| 91蝌蚪porny成人天涯| 国产亚洲女人久久久久毛片| 蜜臀av一区二区三区| 欧美色图片你懂的| 日韩电影一区二区三区四区| 色综合天天视频在线观看| 国产精品色噜噜| 国产精品自产自拍| 久久噜噜亚洲综合| 精品午夜一区二区三区在线观看| 欧美精品一二三| 亚洲一区二区五区| 欧洲精品中文字幕| 亚洲综合一区二区三区| 97se亚洲国产综合自在线不卡 | caoporen国产精品视频| 久久久久久久久久久99999| 蜜桃视频第一区免费观看| 色爱区综合激月婷婷| 亚洲三级久久久| 91小视频在线免费看| 日韩毛片在线免费观看| 94-欧美-setu| 亚洲精品网站在线观看| 91国产丝袜在线播放| 一区二区三区中文字幕在线观看| 色香蕉久久蜜桃| 偷偷要91色婷婷| 日韩欧美成人午夜| 国产福利精品一区二区| 中文字幕av一区二区三区高| 99久久精品免费精品国产| 亚洲天堂网中文字| 欧美丝袜自拍制服另类| 成人免费高清在线观看| 亚洲私人影院在线观看| 91极品视觉盛宴| 婷婷久久综合九色综合绿巨人 | 色哟哟欧美精品| 图片区小说区国产精品视频 | 国产福利不卡视频| 亚洲三级在线观看| 制服丝袜av成人在线看| 国产又粗又猛又爽又黄91精品| 欧美韩国日本综合| 在线中文字幕不卡| 久久国产精品99精品国产| 国产女人aaa级久久久级| 欧美影片第一页| 麻豆精品一区二区综合av| 国产精品乱码人人做人人爱| 日本电影亚洲天堂一区| 久久精品国产99国产| 国产精品青草综合久久久久99| 色呦呦网站一区| 精品一区二区三区免费播放| 中文字幕一区不卡| 日韩视频一区在线观看| aaa欧美色吧激情视频| 日日摸夜夜添夜夜添亚洲女人| 欧美精品一区二区三区蜜桃视频| 91色|porny| 国产99久久久国产精品| 日日夜夜精品视频天天综合网| 欧美国产一区二区| 欧美精品一区二区三区四区| 在线看日韩精品电影| 国产激情视频一区二区在线观看| 亚洲高清中文字幕| 国产精品麻豆久久久| 亚洲男人的天堂av| 国产视频一区二区在线观看| 欧美精品日韩精品| 日本丶国产丶欧美色综合| 国产在线播放一区三区四| 天天综合日日夜夜精品| 一区二区久久久久久| 国产精品白丝在线| 国产清纯美女被跳蛋高潮一区二区久久w | 99久久精品免费看国产 | 91久久免费观看| 成人午夜免费av| 美女久久久精品| 香蕉成人啪国产精品视频综合网 | 波多野结衣精品在线| 国产揄拍国内精品对白| 日韩不卡一区二区三区| 午夜亚洲国产au精品一区二区| 综合久久国产九一剧情麻豆| 国产精品污网站| 久久精品一区二区| 久久久美女毛片| 国产欧美日韩精品在线| 国产日韩欧美精品一区| 精品福利一区二区三区免费视频| 日韩你懂的在线观看| 日韩一区二区三区视频在线| 欧美精选在线播放| 欧美人妇做爰xxxⅹ性高电影 | 国产欧美日韩在线观看| 欧美国产一区二区| 欧美经典一区二区三区| 国产色一区二区| 国产女主播视频一区二区| 国产精品的网站| 亚洲欧美在线另类| 亚洲资源在线观看| 日韩高清一区在线| 久久精品国产第一区二区三区| 国内久久精品视频| 成人精品一区二区三区四区| 色婷婷综合在线| 欧美高清性hdvideosex| 日韩你懂的电影在线观看| 国产日韩欧美综合在线| 国产精品精品国产色婷婷| 一区二区三区高清不卡| 日本欧美韩国一区三区| 国产成人综合精品三级| 色婷婷亚洲综合| 欧美一区二区久久| 国产精品三级久久久久三级| 亚洲欧美激情视频在线观看一区二区三区 | 国产欧美一区视频| 亚洲黄色小说网站| 久久精品国产亚洲5555| jlzzjlzz亚洲女人18| 欧美日韩国产片| 欧美—级在线免费片| 一区二区日韩av| 国产酒店精品激情| 在线视频欧美精品| 久久夜色精品国产噜噜av | 亚洲国产sm捆绑调教视频| 日韩电影在线一区二区三区| 国产精品一区在线观看你懂的| 在线国产电影不卡| 久久尤物电影视频在线观看| 亚洲一级二级在线| 成人禁用看黄a在线| 日韩欧美一区二区视频|