**/
#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
i