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

📄 basic_prediction_mmx.c

📁 本程序介绍MPEG-4解码技术
💻 C
📖 第 1 页 / 共 2 页
字号:

**/

#include "basic_prediction.h"

void CopyBlock(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy;

	long *lpSrc = (long *) Src;
	long *lpDst = (long *) Dst;
	int lpStride = Stride >> 2;

	for (dy = 0; dy < 8; dy++) {
		lpDst[0] = lpSrc[0];
		lpDst[1] = lpSrc[1];
		lpSrc += lpStride;
		lpDst += lpStride;
	}
}
/**/
void CopyBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 xor eax, eax
		 mov ebx, Stride
		 sub ebx, 7
		 xor ecx, ecx
		 mov edx, 8
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again10:
		 // 0
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 1
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 2
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 3
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 4
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 5
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 6
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 7
		 mov al, [esi]
		 mov cl, [esi+1]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al

		 add esi, ebx
		 add edi, ebx
		 dec edx
		 jnz start_again10
	}
}

/**/
void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 xor eax, eax
		 mov ebx, Stride
		 xor ecx, ecx
		 mov edx, 8
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again10:
		 // 0
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 1
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 2
		 //xor eax, eax
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 3
		 //xor eax, eax
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 4
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 5
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 6
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 7
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al

		 add esi, ebx
		 sub esi, 7
		 add edi, ebx
		 sub edi, 7
		 dec edx
		 jnz start_again10
	}
}
/**/
void CopyBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 0; dy < 8; dy++) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1] + 
								Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 xor eax, eax
		 mov ebx, Stride
		 sub ebx, 7
		 xor ecx, ecx
		 mov edx, 8
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again1:
		 // 0
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 1
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 2
		 //xor eax, eax
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 3
		 //xor eax, eax
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 4
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 5
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 6
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 7
		 mov al, [esi]
		 mov cl, [esi+1]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al

		 add esi, ebx
		 add edi, ebx
		 dec edx
		 jnz start_again1
	} 
}
/**/
void CopyBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 xor eax, eax
		 mov ebx, Stride
		 xor ecx, ecx
		 mov edx, 8
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again1:
		 // 0
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 1
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 2
		 //xor eax, eax
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 3
		 //xor eax, eax
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 4
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 5
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 6
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 7
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 shr eax, 1
		 mov [edi], al

		 add esi, ebx
		 sub esi, 7
		 add edi, ebx
		 sub edi, 7
		 dec edx
		 jnz start_again1
	}
}
/**/
void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 0; dy < 8; dy++) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1] + 
								Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/** *** **/
void CopyMBlock(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 mov ebx, Stride
		 sub ebx, 12
		 mov edx, 16
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again:
		 mov eax, [esi]
		 mov [edi], eax
		 add esi, 4
		 add edi, 4

		 mov eax, [esi]
		 mov [edi], eax
		 add esi, 4
		 add edi, 4

		 mov eax, [esi]
		 mov [edi], eax
		 add esi, 4
		 add edi, 4

		 mov eax, [esi]
		 mov [edi], eax

		 add esi, ebx
		 add edi, ebx
		 dec edx
		 jnz start_again
	}
}
/**/
void CopyMBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 xor eax, eax
		 mov ebx, Stride
		 sub ebx, 15
		 xor ecx, ecx
		 mov edx, 16
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again0:
		 // 0
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 1
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 2
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 3
		 //xor eax, eax
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 4
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 5
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 6
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 7
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 8
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 9
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 10
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 // 11
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 //12
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 //13 
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 //14
		 mov al, [esi]
		 inc esi
		 mov cl, [esi]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc edi

		 //15
		 mov al, [esi]
		 mov cl, [esi+1]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al

		 add esi, ebx
		 add edi, ebx
		 dec edx
		 jnz start_again0
	}
}
/**/
void CopyMBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	_asm {
		 xor eax, eax
		 mov ebx, Stride
		 xor ecx, ecx
		 mov edx, 16
		 mov esi, dword ptr [Src]
		 mov edi, dword ptr [Dst]

start_again0:
		 // 0
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 1
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 2
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 3
		 //xor eax, eax
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 4
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 5
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 6
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 7
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 8
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 9
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 10
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 // 11
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 //12
		 mov al, [esi]
		 mov cl, [esi+ebx]
		 add eax, ecx
		 inc eax
		 shr eax, 1
		 mov [edi], al
		 inc esi
		 inc edi

		 //13 
		 mov al, [esi]

⌨️ 快捷键说明

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