📄 pred.c
字号:
} } } else { /* xh && yh */ for (n = 0; n < 8; n++)
{ for (m = 0; m < 8; m++)
{ ofx = x + xint + m; ofy = y + yint + n; pel=(*(prev->Cr+ofx + (ofy )*lx)+ *(prev->Cr+ofx+xh + (ofy )*lx)+ *(prev->Cr+ofx + (ofy+yh)*lx)+ *(prev->Cr+ofx+xh + (ofy+yh)*lx)+ 2)>>2; data->Cr[n][m] += pel; pel=(*(prev->Cb+ofx + (ofy )*lx)+ *(prev->Cb+ofx+xh + (ofy )*lx)+ *(prev->Cb+ofx + (ofy+yh)*lx)+ *(prev->Cb+ofx+xh + (ofy+yh)*lx)+ 2)>>2; data->Cb[n][m] += pel; } } } return;}void FindChromBlock_P(int x_curr, int y_curr, int dx, int dy, PictImage *prev, MB_Structure *data){ int m,n; int x, y, ofx, ofy, pel,lx; int xint, yint; int xh, yh; lx = cpels; x = x_curr>>1; y = y_curr>>1; xint = dx>>1; xh = dx & 1; yint = dy>>1; yh = dy & 1; if (!xh && !yh)
{ for (n = 0; n < 8; n++)
{ for (m = 0; m < 8; m++)
{ ofx = x + xint + m; ofy = y + yint + n; pel=*(prev->Cr+ofx + (ofy )*lx); data->Cr[n][m] = pel; pel=*(prev->Cb+ofx + (ofy )*lx); data->Cb[n][m] = pel; } } } else if (!xh && yh)
{ for (n = 0; n < 8; n++)
{ for (m = 0; m < 8; m++)
{ ofx = x + xint + m; ofy = y + yint + n; pel=(*(prev->Cr+ofx + (ofy )*lx)+ *(prev->Cr+ofx + (ofy+yh)*lx) + 1)>>1; data->Cr[n][m] = pel; pel=(*(prev->Cb+ofx + (ofy )*lx)+ *(prev->Cb+ofx + (ofy+yh)*lx) + 1)>>1; data->Cb[n][m] = pel; } } } else if (xh && !yh)
{ for (n = 0; n < 8; n++)
{ for (m = 0; m < 8; m++)
{ ofx = x + xint + m; ofy = y + yint + n; pel=(*(prev->Cr+ofx + (ofy )*lx)+ *(prev->Cr+ofx+xh + (ofy )*lx) + 1)>>1; data->Cr[n][m] = pel; pel=(*(prev->Cb+ofx + (ofy )*lx)+ *(prev->Cb+ofx+xh + (ofy )*lx) + 1)>>1; data->Cb[n][m] = pel; } } } else { /* xh && yh */ for (n = 0; n < 8; n++)
{ for (m = 0; m < 8; m++)
{ ofx = x + xint + m; ofy = y + yint + n; pel=(*(prev->Cr+ofx + (ofy )*lx)+ *(prev->Cr+ofx+xh + (ofy )*lx)+ *(prev->Cr+ofx + (ofy+yh)*lx)+ *(prev->Cr+ofx+xh + (ofy+yh)*lx)+ 2)>>2; data->Cr[n][m] = pel; pel=(*(prev->Cb+ofx + (ofy )*lx)+ *(prev->Cb+ofx+xh + (ofy )*lx)+ *(prev->Cb+ofx + (ofy+yh)*lx)+ *(prev->Cb+ofx+xh + (ofy+yh)*lx)+ 2)>>2; data->Cb[n][m] = pel; } } } return;}int ModifyMode(int Mode, int dquant){ if (Mode == MODE_INTRA)
{ if(dquant!=0) return MODE_INTRA_Q; else return MODE_INTRA; } else
{ if(dquant!=0) return MODE_INTER_Q; else return Mode; }}
int ChooseMode_MY(unsigned char *curr, int x_pos, int y_pos, int min_SAD)
{
int i,j;
int MB_mean = 0, A = 0;
int y_off;
unsigned int t0, t1, t2, t3;
unsigned int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
unsigned char *p1;
unsigned int *p2;
p1 = curr + x_pos + y_pos * pels;
for (i=0; i<MB_SIZE; i++)
{
temp0 = p1[0] + p1[1];
temp1 = p1[2] + p1[3];
temp2 = p1[4] + p1[5];
temp3 = p1[6] + p1[7];
temp4 = p1[8] + p1[9];
temp5 = p1[10] + p1[11];
temp6 = p1[12] + p1[13];
temp7 = p1[14] + p1[15];
MB_mean += temp0 + temp1 + temp2 + temp3 + temp4 + temp5 + temp6 + temp7;
p1 += pels;
}
MB_mean /= (MB_SIZE*MB_SIZE);
p2 = (unsigned int *)(curr + x_pos + y_pos * pels);
temp0 = MB_mean & 0x000000ff;
temp1 = temp0 << 8;
temp2 = temp0 << 16;
temp3 = temp0 << 24;
t0 = t1 = t2 = t3 = temp0 | temp1 | temp2 | temp3;
for (i= 0; i<MB_SIZE; i++)
{
temp0 = UME8UU( p2[0], t0 );
temp1 = UME8UU( p2[1], t1 );
temp2 = UME8UU( p2[2], t2 );
temp3 = UME8UU( p2[3], t3 );
A += temp0 + temp1 + temp2 + temp3;
p2 += (pels>>2);
}
if (A < (min_SAD - 500))
return MODE_INTRA;
else
return MODE_INTER;
}
void FindHalfPel_MY(int x, int y, MotionVector *fr, unsigned char *prev,
short int *curr, int bs, int comp)
{
fr->min_error = 100;
fr->x_half = 0;
fr->y_half = 0;
return;
}
void FindPred_MY(int x, int y, MotionVector *fr, unsigned char *prev,
short int *pred, int bs, int comp)
{
int m, n;
int new_x, new_y;
int lx;
int *p1, *p2;
int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
int s0=0, s1=0, s2=0, s3=0;
lx = pels;
new_x = x + fr->x;
new_y = y + fr->y;
p1 = (int *)( prev+new_x*2+fr->x_half+(new_y*2+fr->y_half)*lx*2 );
p2 = (int *)pred;
switch( new_x-(new_x>>1<<1) )
{
case 0:
{
for (n = 0; n < bs; n++)
{
t0 = UBYTESEL( p1[0], 0 );
t1 = UBYTESEL( p1[1], 0 );
t2 = UBYTESEL( p1[2], 0 );
t3 = UBYTESEL( p1[3], 0 );
t4 = UBYTESEL( p1[0], 2 );
t5 = UBYTESEL( p1[1], 2 );
t6 = UBYTESEL( p1[2], 2 );
t7 = UBYTESEL( p1[3], 2 );
t8 = UBYTESEL( p1[4], 0 );
t9 = UBYTESEL( p1[5], 0 );
t10 = UBYTESEL( p1[6], 0 );
t11 = UBYTESEL( p1[7], 0 );
t12 = UBYTESEL( p1[4], 2 );
t13 = UBYTESEL( p1[5], 2 );
t14 = UBYTESEL( p1[6], 2 );
t15 = UBYTESEL( p1[7], 2 );
p2[0] = PACK16LSB( t4, t0 );
p2[1] = PACK16LSB( t5, t1 );
p2[2] = PACK16LSB( t6, t2 );
p2[3] = PACK16LSB( t7, t3 );
p2[4] = PACK16LSB( t12, t8 );
p2[5] = PACK16LSB( t13, t9 );
p2[6] = PACK16LSB( t14, t10 );
p2[7] = PACK16LSB( t15, t11 );
p1 += lx;
p2 += 8;
}
break;
}
case 1:
{
for (n = 0; n < bs; n++)
{
t0 = UBYTESEL( p1[0], 2 );
t1 = UBYTESEL( p1[1], 0 );
t2 = UBYTESEL( p1[1], 2 );
t3 = UBYTESEL( p1[2], 0 );
t4 = UBYTESEL( p1[2], 2 );
t5 = UBYTESEL( p1[3], 0 );
t6 = UBYTESEL( p1[3], 2 );
t7 = UBYTESEL( p1[4], 0 );
t8 = UBYTESEL( p1[4], 2 );
t9 = UBYTESEL( p1[5], 0 );
t10 = UBYTESEL( p1[5], 2 );
t11 = UBYTESEL( p1[6], 0 );
t12 = UBYTESEL( p1[6], 2 );
t13 = UBYTESEL( p1[7], 0 );
t14 = UBYTESEL( p1[7], 2 );
t15 = UBYTESEL( p1[8], 0 );
p2[0] = PACK16LSB( t1, t0 );
p2[1] = PACK16LSB( t3, t2 );
p2[2] = PACK16LSB( t5, t4 );
p2[3] = PACK16LSB( t7, t6 );
p2[4] = PACK16LSB( t9, t8 );
p2[5] = PACK16LSB( t11, t10 );
p2[6] = PACK16LSB( t13, t12 );
p2[7] = PACK16LSB( t15, t14 );
p1 += lx;
p2 += 8;
}
break;
}
default:
{
printf( "FindPred switch error!\n" );
exit(35);
}
}
return;
}
void FindPred_MY2(int x, int y, MotionVector *fr, unsigned char *prev,
short int *pred, int bs, int comp)
{
int m, n;
int new_x, new_y;
int lx;
int *p1, *p2;
int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
int s0=0, s1=0, s2=0, s3=0;
lx = pels>>1;
new_x = x + fr->x;
new_y = y + fr->y;
p1 = (int *)( prev + new_x + (new_y)*lx );
p2 = (int *)pred;
switch( new_x-(new_x>>1<<1) )
{
case 0:
{
for (n = 0; n < bs; n++)
{
p2[0] = p1[0];
p2[1] = p1[1];
p2[2] = p1[2];
p2[3] = p1[3];
p2[4] = p1[4];
p2[5] = p1[5];
p2[6] = p1[6];
p2[7] = p1[7];
p1 += lx;
p2 += 8;
}
break;
}
case 1:
{
for (n = 0; n < bs; n++)
{
t0 = UBYTESEL( p1[0], 2 );
t1 = UBYTESEL( p1[1], 0 );
t2 = UBYTESEL( p1[1], 2 );
t3 = UBYTESEL( p1[2], 0 );
t4 = UBYTESEL( p1[2], 2 );
t5 = UBYTESEL( p1[3], 0 );
t6 = UBYTESEL( p1[3], 2 );
t7 = UBYTESEL( p1[4], 0 );
t8 = UBYTESEL( p1[4], 2 );
t9 = UBYTESEL( p1[5], 0 );
t10 = UBYTESEL( p1[5], 2 );
t11 = UBYTESEL( p1[6], 0 );
t12 = UBYTESEL( p1[6], 2 );
t13 = UBYTESEL( p1[7], 0 );
t14 = UBYTESEL( p1[7], 2 );
t15 = UBYTESEL( p1[8], 0 );
p2[0] = PACK16LSB( t1, t0 );
p2[1] = PACK16LSB( t3, t2 );
p2[2] = PACK16LSB( t5, t4 );
p2[3] = PACK16LSB( t7, t6 );
p2[4] = PACK16LSB( t9, t8 );
p2[5] = PACK16LSB( t11, t10 );
p2[6] = PACK16LSB( t13, t12 );
p2[7] = PACK16LSB( t15, t14 );
p1 += lx;
p2 += 8;
}
break;
}
default:
{
printf( "FindPred switch error!\n" );
exit(35);
}
}
return;
}
void ReconLumBlock_P_MY(int x, int y, MotionVector *fr,
unsigned char *prev, short int *data, int bs, int comp)
{
int m, n;
int x1, y1;
int lx;
int *p1, *p2;
int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
int s0, s1, s2, s3, s4, s5, s6, s7;
lx = pels;
x1 = x + fr->x;
y1 = y + fr->y;
p1 = (int *)( prev+x1*2+fr->x_half + (y1*2+fr->y_half)*2*lx );
p2 = (int *)data;
switch( x1-(x1>>1<<1) )
{
case 0:
{
for (n = 0; n < bs; n++)
{
t0 = UBYTESEL( p1[0], 0 );
t1 = UBYTESEL( p1[1], 0 );
t2 = UBYTESEL( p1[2], 0 );
t3 = UBYTESEL( p1[3], 0 );
t4 = UBYTESEL( p1[0], 2 );
t5 = UBYTESEL( p1[1], 2 );
t6 = UBYTESEL( p1[2], 2 );
t7 = UBYTESEL( p1[3], 2 );
t8 = UBYTESEL( p1[4], 0 );
t9 = UBYTESEL( p1[5], 0 );
t10 = UBYTESEL( p1[6], 0 );
t11 = UBYTESEL( p1[7], 0 );
t12 = UBYTESEL( p1[4], 2 );
t13 = UBYTESEL( p1[5], 2 );
t14 = UBYTESEL( p1[6], 2 );
t15 = UBYTESEL( p1[7], 2 );
s0 = PACK16LSB( t4, t0 );
s1 = PACK16LSB( t5, t1 );
s2 = PACK16LSB( t6, t2 );
s3 = PACK16LSB( t7, t3 );
s4 = PACK16LSB( t12, t8 );
s5 = PACK16LSB( t13, t9 );
s6 = PACK16LSB( t14, t10 );
s7 = PACK16LSB( t15, t11 );
p2[0] = DSPIDUALADD( s0, p2[0] );
p2[1] = DSPIDUALADD( s1, p2[1] );
p2[2] = DSPIDUALADD( s2, p2[2] );
p2[3] = DSPIDUALADD( s3, p2[3] );
p2[4] = DSPIDUALADD( s4, p2[4] );
p2[5] = DSPIDUALADD( s5, p2[5] );
p2[6] = DSPIDUALADD( s6, p2[6] );
p2[7] = DSPIDUALADD( s7, p2[7] );
p1 += lx;
p2 += 8;
}
break;
}
case 1:
{
for (n = 0; n < bs; n++)
{
t0 = UBYTESEL( p1[0], 2 );
t1 = UBYTESEL( p1[1], 0 );
t2 = UBYTESEL( p1[1], 2 );
t3 = UBYTESEL( p1[2], 0 );
t4 = UBYTESEL( p1[2], 2 );
t5 = UBYTESEL( p1[3], 0 );
t6 = UBYTESEL( p1[3], 2 );
t7 = UBYTESEL( p1[4], 0 );
t8 = UBYTESEL( p1[4], 2 );
t9 = UBYTESEL( p1[5], 0 );
t10 = UBYTESEL( p1[5], 2 );
t11 = UBYTESEL( p1[6], 0 );
t12 = UBYTESEL( p1[6], 2 );
t13 = UBYTESEL( p1[7], 0 );
t14 = UBYTESEL( p1[7], 2 );
t15 = UBYTESEL( p1[8], 0 );
s0 = PACK16LSB( t1, t0 );
s1 = PACK16LSB( t3, t2 );
s2 = PACK16LSB( t5, t4 );
s3 = PACK16LSB( t7, t6 );
s4 = PACK16LSB( t9, t8 );
s5 = PACK16LSB( t11, t10 );
s6 = PACK16LSB( t13, t12 );
s7 = PACK16LSB( t15, t14 );
p2[0] = DSPIDUALADD( s0, p2[0] );
p2[1] = DSPIDUALADD( s1, p2[1] );
p2[2] = DSPIDUALADD( s2, p2[2] );
p2[3] = DSPIDUALADD( s3, p2[3] );
p2[4] = DSPIDUALADD( s4, p2[4] );
p2[5] = DSPIDUALADD( s5, p2[5] );
p2[6] = DSPIDUALADD( s6, p2[6] );
p2[7] = DSPIDUALADD( s7, p2[7] );
p1 += lx;
p2 += 8;
}
break;
}
default:
{
printf( "ReconLumBlock_P switch error!\n" );
exit(36);
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -