⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diff.c

📁 经典的MP4编解码核心库
💻 C
字号:
/*
 * Add SSE2 support for Pentium 4
 * David, Sigma Designs Inc
 */

#include "../mp4v.h"
#include "../global.h"

#include "mefunctions.h"

uint32_t sad16x16_c(const uint8_t * const cur,
		 const uint8_t * const ref,
		 const uint32_t stride)
{

	uint32_t sad = 0;
	uint32_t j;
	uint8_t const *ptr_cur = cur;
	uint8_t const *ptr_ref = ref;

	for (j = 0; j < 16; j++) {
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));

			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));

			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));

			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
			sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
	

		ptr_cur += stride - 16;
		ptr_ref += stride - 16;

	}

	return sad;

}



uint32_t sad8_c(const uint8_t * const cur,
					const uint8_t * const ref,
					const uint32_t stride)
{
	uint32_t sad = 0;
	uint32_t j;
	uint8_t const *ptr_cur = cur;
	uint8_t const *ptr_ref = ref;

	for (j = 0; j < 8; j++) {

		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));

		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));
		sad += ABS(*(ptr_cur ++) - *(ptr_ref ++));

		ptr_cur += stride - 8;
		ptr_ref += stride - 8;

	}

	return sad;
}




/* Purpose: get average deviation from mean, and return both dev and mean */
/* Assumption: only work for MB with all positive value					*/
/* Author: David, 2002, Sigma Designs, Inc. */
uint32_t dev16_c(const uint8_t * const cur,
				 const uint32_t stride,
				 int32_t * const mean)
{
	uint8_t const *ptr_cur = cur;

	uint32_t dev = 0;		// result
	uint32_t x,y;
	int32_t  avg;

	*mean = 0;

	for (y = 0; y < 16; y++) {
		*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);
		*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);
		*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);
		*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);	*mean += *(ptr_cur ++);

		ptr_cur += stride - 16;

	}

	*mean >>= 8;		//( Total 256 pixels in a MB)
	avg = *mean;
	ptr_cur = cur;

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

		for (x = 0; x < 16; x++)
			dev += ABS(*(ptr_cur + x) - avg);

		ptr_cur += stride;

	}

	return dev;
}

/* mean of macroblock 16x16*/

uint32_t mean16_c(const uint8_t * const cur,
				const uint32_t stride)
{
	uint32_t mean = 0;
	uint32_t i,j;
	uint8_t const *ptr_cur = cur;

	for (j = 0; j < 16; j++) {

		for (i = 0; i < 16; i++)
			mean += *(ptr_cur + i);

		ptr_cur += stride;

	}

	mean /= (16 * 16);

	return mean;
}

/* average deviation from mean for mv0*/
// Added by David, 2002

uint32_t dev16_mv0_c(const uint8_t * const cur, const uint8_t * const ref,
				const uint32_t stride)
{

	int32_t mean = 0;
	uint32_t dev = 0;
	uint32_t i,j;
	uint8_t const *ptr_cur = cur;
	uint8_t const *ptr_ref = ref;

	for (j = 0; j < 16; j++) {

		for (i = 0; i < 16; i++)
			mean += *(ptr_cur + i)-*(ptr_ref + i);

		ptr_cur += stride;
		ptr_ref += stride;
	}

	mean/=(16 * 16);

	ptr_cur = cur;
	ptr_ref = ref;

	for (j = 0; j < 16; j++) {

		for (i = 0; i < 16; i++)
			dev += ABS(*(ptr_cur + i)-*(ptr_ref + i) - mean);

		ptr_cur += stride;
		ptr_ref += stride;
	}

	return dev;
}
/*
uint32_t dev16_mv0_c(const uint8_t * const cur, const uint8_t * const ref,
				const uint32_t stride)
{

	int32_t mean;
	uint32_t dev;
	uint32_t dev_mb = 0;

	uint32_t i,j;
	int32_t	 blk;
	uint8_t const *ptr_cur;
	uint8_t const *ptr_ref;

	for(blk=0; blk<4; blk++)
	{
	  ptr_cur = cur + ((blk&2)?8:0)*stride + (blk&1?8:0);
	  ptr_ref = ref + ((blk&2)?8:0)*stride + (blk&1?8:0);
	  mean = 0;
	  dev = 0;

	  for (j = 0; j < 8; j++) {

		for (i = 0; i < 8; i++)
			mean += *(ptr_cur + i)-*(ptr_ref + i);

		ptr_cur += stride;
		ptr_ref += stride;
	  }

	  mean/=(8 * 8);
	  ptr_cur = cur + ((blk&2)?8:0)*stride + (blk&1?8:0);
	  ptr_ref = ref + ((blk&2)?8:0)*stride + (blk&1?8:0);

	  for (j = 0; j < 8; j++) {

		for (i = 0; i < 8; i++)
			dev += ABS(*(ptr_cur + i)-*(ptr_ref + i) - mean);

		ptr_cur += stride;
		ptr_ref += stride;
	  }

	  dev_mb += dev;

	}

	return dev_mb;
}
*/
/* to get the prediction error for the input mv*/
// Added by David, 2002

void MB_err(const uint32_t x, const uint32_t y, const uint8_t * const cur, const uint8_t * const ref,
			int32_t mv_x, int32_t mv_y, uint8_t * MB, const uint32_t stride)
{

	uint32_t i,j;
	uint8_t const *ptr_cur = cur+x*16+y*16*stride;
	uint8_t const *ptr_ref = ref+(x+mv_x)*16+(y+mv_y)*16*stride;

	for (j = 0; j < 16; j++) {
		for (i = 0; i < 16; i++)
			*MB++ = *(ptr_cur + i)-*(ptr_ref + i);

		ptr_cur += stride;
		ptr_ref += stride;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -