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

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

?? postprocess.c

?? MPEG4的壓縮和解壓縮代碼
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/**************************************************************************
 *                                                                        *
 * This code has been developed by John Funnell. 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
 *
 * John Funnell
 *
 * DivX Advanced Research Center <darc@projectmayo.com>
**/
// postprocess.c //

/* Currently this contains only the deblocking filter.  The vertical    */
/* deblocking filter operates over eight pixel-wide columns at once.  The  */
/* horizontal deblocking filter works on four horizontals row at a time. */


#include "postprocess.h"

#ifdef PP_SELF_CHECK
#include <stdio.h>
#endif


#define ABS(a)     ( (a)>0 ? (a) : -(a) )
#define SIGN(a)    ( (a)<0 ? -1 : 1 )
#define MIN(a, b)  ( (a)<(b) ? (a) : (b) )
#define MAX(a, b)  ( (a)>(b) ? (a) : (b) )




/***** H O R I Z O N T A L   D E B L O C K I N G   F I L T E R *****/



/* decide DC mode or default mode for the horizontal filter */
static int deblock_horiz_useDC(uint8_t *v, int stride) {
	int eq_cnt, useDC;
	int x, y;
	#ifdef PP_SELF_CHECK
	int eq_cnt2, j, k;
	#endif

	eq_cnt = 0;
	for (y=0; y<4; y++) {
		for (x=1; x<=7; x++) {
			if (ABS(v[x+y*stride]-v[1+x+y*stride]) <= 1) eq_cnt--;
		}
	}

	#ifdef PP_SELF_CHECK
	eq_cnt2 = 0;
	for (k=0; k<4; k++) {
		for (j=1; j<=7; j++) {
			if (ABS(v[j+k*stride]-v[1+j+k*stride]) <= 1) eq_cnt2--;
		}
	}
	if (eq_cnt2 != eq_cnt) printf("ERROR: C version of useDC is incorrect\n");
	#endif

	useDC = eq_cnt <= -DEBLOCK_HORIZ_USEDC_THR;

	return useDC;
}


/* decide whether the DC filter should be turned on accoding to QP */
static int deblock_horiz_DC_on(uint8_t *v, int stride, int QP) {
	/* 99% of the time, this test turns out the same as the |max-min| strategy in the standard */
	return (ABS(v[1]-v[8]) < 2*QP);
}





/* The 9-tap low pass filter used in "DC" regions */
static void deblock_horiz_lpf9(uint8_t *v, int stride, int QP) {
	int x, y, p1, p2, psum;
	uint8_t *vv, vnew[9];
	#ifdef PP_SELF_CHECK
	uint8_t selfcheck[9];
	int psum2;
	uint8_t *vv2; 
	#endif

	for (y=0; y<4; y++) {
		p1 = (ABS(v[0+y*stride]-v[1+y*stride]) < QP ) ?  v[0+y*stride] : v[1+y*stride];
		p2 = (ABS(v[8+y*stride]-v[9+y*stride]) < QP ) ?  v[9+y*stride] : v[8+y*stride];


		#ifdef PP_SELF_CHECK
		/* generate a self-check version of the filter result in selfcheck[9] */
		/* low pass filtering (LPF9: 1 1 2 2 4 2 2 1 1) */
		vv2 = &(v[y*stride]);
		psum2 = p1 + p1 + p1 + vv2[1] + vv2[2] + vv2[3] + vv2[4] + 4;
		selfcheck[1] = (((psum2 + vv2[1]) << 1) - (vv2[4] - vv2[5])) >> 4;
		psum2 += vv2[5] - p1; 
		selfcheck[2] = (((psum2 + vv2[2]) << 1) - (vv2[5] - vv2[6])) >> 4;
		psum2 += vv2[6] - p1; 
		selfcheck[3] = (((psum2 + vv2[3]) << 1) - (vv2[6] - vv2[7])) >> 4;
		psum2 += vv2[7] - p1; 
		selfcheck[4] = (((psum2 + vv2[4]) << 1) + p1 - vv2[1] - (vv2[7] - vv2[8])) >> 4;
		psum2 += vv2[8] - vv2[1]; 
		selfcheck[5] = (((psum2 + vv2[5]) << 1) + (vv2[1] - vv2[2]) - vv2[8] + p2) >> 4;
		psum2 += p2 - vv2[2]; 
		selfcheck[6] = (((psum2 + vv2[6]) << 1) + (vv2[2] - vv2[3])) >> 4;
		psum2 += p2 - vv2[3]; 
		selfcheck[7] = (((psum2 + vv2[7]) << 1) + (vv2[3] - vv2[4])) >> 4;
		psum2 += p2 - vv2[4]; 
		selfcheck[8] = (((psum2 + vv2[8]) << 1) + (vv2[4] - vv2[5])) >> 4;
		#endif

		/* C implementation of horizontal LPF */
		vv = &(v[y*stride]);
		psum = p1 + p1 + p1 + vv[1] + vv[2] + vv[3] + vv[4] + 4;
		vnew[1] = (((psum + vv[1]) << 1) - (vv[4] - vv[5])) >> 4;
		psum += vv[5] - p1; 
		vnew[2] = (((psum + vv[2]) << 1) - (vv[5] - vv[6])) >> 4;
		psum += vv[6] - p1; 
		vnew[3] = (((psum + vv[3]) << 1) - (vv[6] - vv[7])) >> 4;
		psum += vv[7] - p1; 
		vnew[4] = (((psum + vv[4]) << 1) + p1 - vv[1] - (vv[7] - vv[8])) >> 4;
		psum += vv[8] - vv[1]; 
		vnew[5] = (((psum + vv[5]) << 1) + (vv[1] - vv[2]) - vv[8] + p2) >> 4;
		psum += p2 - vv[2]; 
		vnew[6] = (((psum + vv[6]) << 1) + (vv[2] - vv[3])) >> 4;
		psum += p2 - vv[3]; 
		vnew[7] = (((psum + vv[7]) << 1) + (vv[3] - vv[4])) >> 4;
		psum += p2 - vv[4]; 
		vnew[8] = (((psum + vv[8]) << 1) + (vv[4] - vv[5])) >> 4;
		for (x=1; x<=8; x++) {
			vv[x] = vnew[x];
		}
	
		#ifdef PP_SELF_CHECK
		for (x=1; x<=8; x++) {
			if (selfcheck[x] != v[x+y*stride]) printf("ERROR: C version of horiz lpf9 is incorrect\n");
		}
		#endif

	}

}





/* horizontal deblocking filter used in default (non-DC) mode */
static void deblock_horiz_default_filter(uint8_t *v, int stride, int QP) {
	int a3_0, a3_1, a3_2, d;
	int q1, q;
	int y;

	for (y=0; y<4; y++) {

		q1 = v[4] - v[5];
		q = q1 / 2;
		if (q) {
			
			a3_0 = 2*(v[3]-v[6]) - 5*q1;
			
			/* apply the 'delta' function first and check there is a difference to avoid wasting time */
			if (ABS(a3_0) < 8*QP) {
		
				a3_1 = 2*(v[1]-v[4]) + 5*(v[3]-v[2]);
				a3_2 = 2*(v[5]-v[8]) + 5*(v[7]-v[8]);
				d = ABS(a3_0) - MIN(ABS(a3_1), ABS(a3_2));
		
				if (d > 0) { /* energy across boundary is greater than in one or both of the blocks */
					d += d<<2;
					d = (d + 32) >> 6; 
	
					if (d > 0) {
	
						d *= SIGN(-a3_0);
					
						/* clip d in the range 0 ... q */
						if (q > 0) {
							d = d<0 ? 0 : d;
							d = d>q ? q : d;
						} else {
							d = d>0 ? 0 : d;
							d = d<q ? q : d;
						}
						
						v[4] -= d;
						v[5] += d;
		
					}
				}
			}
		}

		#ifdef PP_SELF_CHECK
		/* no selfcheck written for this yet */
		#endif;

		v += stride;
	}


}




/* this is a horizontal deblocking filter - i.e. it will smooth _vertical_ block edges */
void deblock_horiz(uint8_t *image, int width, int height, int stride, QP_STORE_T *QP_store, int QP_stride, int chroma) {
	int x, y;
	int QP;
	uint8_t *v;
	int useDC, DC_on;

	/* loop over image's pixel rows , four at a time */
	for (y=0; y<height; y+=4) {	
		
		/* loop over every block boundary in that row */
		for (x=8; x<width; x+=8) {
		
			/* extract QP from the decoder's array of QP values */
			QP = chroma ? QP_store[y/8*QP_stride+x/8]
			                : QP_store[y/16*QP_stride+x/16];	

			/* v points to pixel v0, in the left-hand block */
			v = &(image[y*stride + x]) - 5;

			/* first decide whether to use default or DC offet mode */ 
			useDC = deblock_horiz_useDC(v, stride);

			if (useDC) { /* use DC offset mode */
				
				DC_on = deblock_horiz_DC_on(v, stride, QP);

				if (DC_on) {

					deblock_horiz_lpf9(v, stride, QP); 

					#ifdef SHOWDECISIONS_H
					if (!chromaFlag) {
						v[0*stride + 4] = 
						v[1*stride + 4] = 
						v[2*stride + 4] = 
						v[3*stride + 4] = 255;  
					}
					#endif
				}

			} else {     /* use default mode */
			
				deblock_horiz_default_filter(v, stride, QP);

				#ifdef SHOWDECISIONS_H
				if (!chromaFlag) {
					v[0*stride + 4] = 
					v[1*stride + 4] = 
					v[2*stride + 4] = 
					v[3*stride + 4] = 0;  
				}
				#endif

			}
		}
	}
}





/***** V E R T I C A L   D E B L O C K I N G   F I L T E R *****/


/* decide DC mode or default mode in assembler */
static int deblock_vert_useDC(uint8_t *v, int stride) {
	int eq_cnt, useDC, x, y;
	#ifdef PP_SELF_CHECK
	int useDC2, j, i;
	#endif

	#ifdef PP_SELF_CHECK
	/* C-code version for testing */
	eq_cnt = 0;
	for (j=1; j<8; j++) {
		for (i=0; i<8; i++) {
			if (ABS(v[j*stride+i] - v[(j+1)*stride+i]) <= 1) eq_cnt++;
		}
	}
	useDC2 = (eq_cnt > DEBLOCK_VERT_USEDC_THR); 
	#endif
			
	/* C-code imlementation of vertial useDC */
	eq_cnt = 0;
	for (y=1; y<8; y++) {
		for (x=0; x<8; x++) {
			if (ABS(v[y*stride+x] - v[(y+1)*stride+x]) <= 1) eq_cnt++;
		}
	}
	useDC = (eq_cnt  > DEBLOCK_VERT_USEDC_THR);			
			
	#ifdef PP_SELF_CHECK
	if (useDC != useDC2) printf("ERROR: C version of useDC is incorrect\n");
	#endif
	
	return useDC;
}





/* decide whether the DC filter should be turned on accoding to QP */
static int deblock_vert_DC_on(uint8_t *v, int stride, int QP) {
	int DC_on, x;
	#ifdef PP_SELF_CHECK
	int i, DC_on2;
	#endif

	#ifdef PP_SELF_CHECK
	DC_on2 = 1;
	for (i=0; i<8; i++) {
		if (ABS(v[i+1*stride]-v[i+8*stride]) > 2 *QP) DC_on2 = 0;
	}
	#endif
	
	/* C implementation of vertical DC_on */
	DC_on = 1;
	for (x=0; x<8; x++) {
		if (ABS(v[x+1*stride]-v[x+8*stride]) > 2 *QP) DC_on = 0;
	}
				
	#ifdef PP_SELF_CHECK
	if (DC_on != DC_on2) printf("ERROR: C version of DC_on is incorrect\n");
	#endif

	return DC_on;
}







/* Vertical 9-tap low-pass filter for use in "DC" regions of the picture */
void deblock_vert_lpf9(uint64_t *v_local, uint64_t *p1p2, uint8_t *v, int stride, int QP) {
	int x, y;
	int p1, p2, psum;
	uint8_t  *vv, vnew[9];
	/* define semi-constants to enable us to move up and down the picture easily... */
	int l1 = 1 * stride;
	int l2 = 2 * stride;
	int l3 = 3 * stride;
	int l4 = 4 * stride;
	int l5 = 5 * stride;
	int l6 = 6 * stride;
	int l7 = 7 * stride;
	int l8 = 8 * stride;
	#ifdef PP_SELF_CHECK
	int j, k;
	uint8_t selfcheck[64];
	#endif


	#ifdef PP_SELF_CHECK
	/* generate a self-check version of the filter result in selfcheck[64] */
	for (j=0; j<8; j++) { /* loop left->right */
		vv = &(v[j]);
		p1 = (ABS(vv[0*stride]-vv[1*stride]) < QP ) ?  vv[0*stride] : vv[1*stride];
		p2 = (ABS(vv[8*stride]-vv[9*stride]) < QP ) ?  vv[9*stride] : vv[8*stride];
		/* the above may well be endian-fussy */
		psum = p1 + p1 + p1 + vv[l1] + vv[l2] + vv[l3] + vv[l4] + 4; 
		selfcheck[j+8*0] = (((psum + vv[l1]) << 1) - (vv[l4] - vv[l5])) >> 4; 
		psum += vv[l5] - p1; 
		selfcheck[j+8*1] = (((psum + vv[l2]) << 1) - (vv[l5] - vv[l6])) >> 4; 
		psum += vv[l6] - p1; 
		selfcheck[j+8*2] = (((psum + vv[l3]) << 1) - (vv[l6] - vv[l7])) >> 4; 
		psum += vv[l7] - p1; 
		selfcheck[j+8*3] = (((psum + vv[l4]) << 1) + p1 - vv[l1] - (vv[l7] - vv[l8])) >> 4; 
		psum += vv[l8] - vv[l1];  
		selfcheck[j+8*4] = (((psum + vv[l5]) << 1) + (vv[l1] - vv[l2]) - vv[l8] + p2) >> 4; 
		psum += p2 - vv[l2];  
		selfcheck[j+8*5] = (((psum + vv[l6]) << 1) + (vv[l2] - vv[l3])) >> 4; 
		psum += p2 - vv[l3]; 
		selfcheck[j+8*6] = (((psum + vv[l7]) << 1) + (vv[l3] - vv[l4])) >> 4; 
		psum += p2 - vv[l4]; 
		selfcheck[j+8*7] = (((psum + vv[l8]) << 1) + (vv[l4] - vv[l5])) >> 4; 
	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡一区在线观看| 欧美日本一区二区| 午夜精品视频一区| 国产三级一区二区| 欧美日韩一区二区欧美激情| 国产在线乱码一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 久久久久久久久久久电影| 欧美三级视频在线观看| 成人高清视频在线观看| 久久er99精品| 五月婷婷久久丁香| 1024成人网| 国产欧美日韩精品a在线观看| 欧美一区二区三区小说| 欧美在线观看视频一区二区 | 不卡的av网站| 韩国成人福利片在线播放| 日韩电影一二三区| 一区二区久久久久久| 国产精品网友自拍| 精品欧美一区二区久久 | 欧美日韩中文一区| 99re66热这里只有精品3直播 | 欧美一级日韩不卡播放免费| 在线日韩av片| 91在线你懂得| 91麻豆精品视频| 成人va在线观看| 国产凹凸在线观看一区二区| 视频在线观看91| 亚洲午夜久久久| 亚洲一区二区三区四区在线| 亚洲免费观看在线观看| 亚洲精品一卡二卡| 亚洲伦在线观看| 国产精品美日韩| 国产精品网站在线| 综合久久久久久久| 亚洲同性同志一二三专区| 国产精品久久久久久亚洲毛片 | 精品国产乱码久久久久久蜜臀| 91精品国产品国语在线不卡| 这里只有精品免费| 欧美一级欧美一级在线播放| 欧美一区三区四区| 日韩欧美一级片| 久久亚洲精品国产精品紫薇| 国产婷婷精品av在线| 亚洲国产精品精华液ab| 中文字幕一区二区三区视频| 亚洲欧美日韩一区| 亚洲一线二线三线视频| 日韩国产欧美视频| 九一久久久久久| 风间由美一区二区三区在线观看 | 91在线国产福利| 色综合中文字幕国产| 91免费国产视频网站| 色婷婷精品久久二区二区蜜臀av | 国产成人三级在线观看| 99精品久久只有精品| 色综合视频一区二区三区高清| 欧洲亚洲国产日韩| 91精品在线观看入口| 精品美女一区二区三区| 国产精品久久久久久妇女6080 | 蜜臀av性久久久久蜜臀av麻豆| 国产专区欧美精品| 99v久久综合狠狠综合久久| 色天天综合色天天久久| 日韩精品中文字幕一区二区三区| 久久久99久久| 亚洲尤物视频在线| 国产一区二区在线观看免费| 色综合久久88色综合天天免费| 3d动漫精品啪啪一区二区竹菊| 久久综合精品国产一区二区三区| 亚洲欧美一区二区三区极速播放 | 亚洲电影第三页| 国产又粗又猛又爽又黄91精品| www.欧美.com| 777午夜精品免费视频| 亚洲国产精品激情在线观看 | 99在线精品免费| 91精品国产乱码久久蜜臀| 日本一区二区成人在线| 日韩在线播放一区二区| 成人听书哪个软件好| 宅男在线国产精品| 国产精品不卡一区| 精品在线免费观看| 欧美在线观看禁18| 亚洲国产精品黑人久久久| 亚洲成人7777| 色综合天天在线| 2023国产精华国产精品| 亚洲高清免费视频| 成年人国产精品| 欧美成人精品3d动漫h| 夜夜嗨av一区二区三区网页| 国产精品资源在线看| 欧美日韩国产综合一区二区三区| 中文字幕不卡三区| 久久97超碰国产精品超碰| 欧亚洲嫩模精品一区三区| 国产精品萝li| 国产精品亚洲专一区二区三区| 91麻豆精品国产91久久久久| 亚洲精品你懂的| 成人手机电影网| 久久众筹精品私拍模特| 日韩不卡一区二区三区| 欧美色综合网站| 亚洲色图另类专区| 国产1区2区3区精品美女| 日韩精品中文字幕在线一区| 日日夜夜免费精品视频| 91久久久免费一区二区| |精品福利一区二区三区| 国产精品91一区二区| 欧美精品一区二区高清在线观看| 日日嗨av一区二区三区四区| 欧美亚洲日本国产| 一区二区高清免费观看影视大全| jlzzjlzz国产精品久久| 欧美激情一区二区三区在线| 经典一区二区三区| 欧美成人乱码一区二区三区| 蜜桃精品视频在线| 91精品国产欧美日韩| 麻豆成人免费电影| 精品日韩欧美在线| 国内欧美视频一区二区| 精品国产电影一区二区| 国产在线精品一区二区不卡了| 精品国产91亚洲一区二区三区婷婷| 琪琪一区二区三区| 欧美岛国在线观看| 蜜臀久久99精品久久久画质超高清| 欧美一区二区三区性视频| 久久99国产精品麻豆| 欧美精品一区二区精品网| 国产成人夜色高潮福利影视| 国产欧美精品一区二区三区四区 | 欧美疯狂做受xxxx富婆| 亚洲成av人在线观看| 91精品国产一区二区| 麻豆极品一区二区三区| 国产午夜精品理论片a级大结局 | 成人在线一区二区三区| 国产精品沙发午睡系列990531| 成人美女视频在线观看18| 综合欧美亚洲日本| 欧美日韩www| 九九国产精品视频| 国产女人水真多18毛片18精品视频 | 亚洲国产欧美另类丝袜| 91麻豆精品国产综合久久久久久| 另类人妖一区二区av| 国产喂奶挤奶一区二区三区 | wwwwww.欧美系列| 成+人+亚洲+综合天堂| 亚洲在线免费播放| 欧美tickle裸体挠脚心vk| 国产盗摄女厕一区二区三区| 亚洲天堂精品在线观看| 欧美乱妇一区二区三区不卡视频 | 色综合久久久久久久| 日韩av一区二区三区四区| 久久久久久影视| 日本黄色一区二区| 麻豆精品在线视频| 中文字幕在线一区免费| 6080日韩午夜伦伦午夜伦| 国产一区二区剧情av在线| 亚洲日本一区二区三区| 欧美一级片在线看| 91无套直看片红桃| 蜜桃免费网站一区二区三区| 1024成人网| 久久午夜羞羞影院免费观看| 色综合久久99| 国产伦精品一区二区三区免费迷| 亚洲精品视频在线观看免费| 欧美大片在线观看一区| 91久久精品一区二区三区| 狠狠色狠狠色综合系列| 一区二区三区国产精品| 久久色中文字幕| 精品婷婷伊人一区三区三| 国产一区二区精品久久91| 午夜视频一区二区三区| 国产精品视频免费看| 日韩视频一区二区三区| 在线精品视频一区二区三四 | 日本韩国精品在线| 国产精品自拍三区| 奇米影视一区二区三区| 一区二区三区中文免费|