📄 edge.cpp
字号:
prevBuf = curBuf;
curBuf ^= 1;
pLuma +=pitchSrc;
DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
case 5:
//(2)
prevBuf = curBuf;
curBuf ^= 1;
pLuma +=pitchSrc;
DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
case 4:
//(3)
prevBuf = curBuf;
curBuf ^= 1;
pLuma +=pitchSrc;
DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
case 3:
//(4)
prevBuf = curBuf;
curBuf ^= 1;
pLuma +=pitchSrc;
DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
case 2:
//(5)
prevBuf = curBuf;
curBuf ^= 1;
pLuma +=pitchSrc;
DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
case 1:
//(6)
prevBuf = curBuf;
curBuf ^= 1;
pLuma +=pitchSrc;
DiffNonLin2Duniform( &pLuma[pitchSrc], &pLuma[1], helper[curBuf][0], inwidth-1 );
DiffNonLin2Duniform( &pLuma[pitchSrc+1], &pLuma[0], helper[curBuf][1], inwidth-1 );
Add2DHelper( (int *)helper[curBuf], (int *)helper[prevBuf], &pLuma[1], inwidth-2 );
case 0:
break;
}
return ;
}
int Add2DHelper( int *cur, int *prev, unsigned char *pic, int n )
{
int i;
int tmp=n>>1;
int tmp1=n-((n>>1)<<1);
if(n<2)
{
return 1;
}
for (i = 0; i < n-1; i=i+2)
{
pic[i] = clip_softcore_post[OFFSET_CLIP_SOFTCORE + pic[i]
+ prev[i+1]
+ prev[i + HELPER_MAXLEN]
- cur[i]
- cur[i+1 + HELPER_MAXLEN] ];
pic[i+1] = clip_softcore_post[OFFSET_CLIP_SOFTCORE + pic[i+1]
+ prev[i+2]
+ prev[i+1+ HELPER_MAXLEN]
- cur[i+1]
- cur[i+2 + HELPER_MAXLEN] ];
}
if(tmp1)
{
pic[n-1] = clip_softcore_post[OFFSET_CLIP_SOFTCORE + pic[n-1]
+ prev[n]
+ prev[n-1+ HELPER_MAXLEN]
- cur[n-1]
- cur[n + HELPER_MAXLEN] ];
}
return 1;
}
int DiffNonLin2D( unsigned char* pos, unsigned char* neg, int* out, int n )
{
int i;
int tmpv;
if(n<16)
{
return 1;
}
out[0]=lut_soft_core_2d[pos[0] - neg[0]];
for (i = 1; i < n-9; i=i+8)
{
register int tmp0, tmp1;
tmp0 = pos[i] - neg[i];
tmp1 = pos[i+1] - neg[i+1];
out[i]=lut_soft_core_2d[tmp0];
out[i+1]=lut_soft_core_2d[tmp1];
tmp0 = pos[i+2] - neg[i+2];
tmp1 = pos[i+3] - neg[i+3];
out[i+2]=lut_soft_core_2d[tmp0];
out[i+3]=lut_soft_core_2d[tmp1];
tmp0 = pos[i+4] - neg[i+4];
tmp1 = pos[i+5] - neg[i+5];
out[i+4]=lut_soft_core_2d[tmp0];
out[i+5]=lut_soft_core_2d[tmp1];
tmp0 = pos[i+6] - neg[i+6];
tmp1 = pos[i+7] - neg[i+7];
out[i+6]=lut_soft_core_2d88[tmp0];
out[i+7]=lut_soft_core_2d88[tmp1];
}
tmpv=(n-((n>>3)<<3))-1;
switch(tmpv)
{
case 6:
out[n-6]=lut_soft_core_2d[pos[n-6]-neg[n-6]];
case 5:
out[n-5]=lut_soft_core_2d[pos[n-5]-neg[n-5]];
case 4:
out[n-4]=lut_soft_core_2d[pos[n-4]-neg[n-4]];
case 3:
out[n-3]=lut_soft_core_2d[pos[n-3]-neg[n-3]];
case 2:
out[n-2]=lut_soft_core_2d[pos[n-2]-neg[n-2]];
case 1:
out[n-1]=lut_soft_core_2d[pos[n-1]-neg[n-1]];
case 0:
break;
}
return 1;
}
int DiffNonLin2Duniform( unsigned char* pos, unsigned char* neg, int* out, int n )
{
int i;
int tmpv;
if(n<16)
{
return 1;
}
out[0]=lut_soft_core_2d[pos[0] - neg[0]];
for (i = 1; i < n-9; i=i+8)
{
register int tmp0, tmp1;
tmp0 = pos[i] - neg[i];
tmp1 = pos[i+1] - neg[i+1];
out[i]=lut_soft_core_2d[tmp0];
out[i+1]=lut_soft_core_2d[tmp1];
tmp0 = pos[i+2] - neg[i+2];
tmp1 = pos[i+3] - neg[i+3];
out[i+2]=lut_soft_core_2d[tmp0];
out[i+3]=lut_soft_core_2d[tmp1];
tmp0 = pos[i+4] - neg[i+4];
tmp1 = pos[i+5] - neg[i+5];
out[i+4]=lut_soft_core_2d[tmp0];
out[i+5]=lut_soft_core_2d[tmp1];
tmp0 = pos[i+6] - neg[i+6];
tmp1 = pos[i+7] - neg[i+7];
out[i+6]=lut_soft_core_2d[tmp0];
out[i+7]=lut_soft_core_2d[tmp1];
}
tmpv=(n-((n>>3)<<3))-1;
switch(tmpv)
{
case 6:
out[n-6]=lut_soft_core_2d[pos[n-6]-neg[n-6]];
case 5:
out[n-5]=lut_soft_core_2d[pos[n-5]-neg[n-5]];
case 4:
out[n-4]=lut_soft_core_2d[pos[n-4]-neg[n-4]];
case 3:
out[n-3]=lut_soft_core_2d[pos[n-3]-neg[n-3]];
case 2:
out[n-2]=lut_soft_core_2d[pos[n-2]-neg[n-2]];
case 1:
out[n-1]=lut_soft_core_2d[pos[n-1]-neg[n-1]];
case 0:
break;
}
return 1;
}
int DiffNonLin2Dconst( unsigned char* pos, unsigned char* neg, int* out, int n )
{
int i;
int tmpv;
if(n<16)
{
return 1;
}
out[0]=lut_soft_core_2d88[pos[0] - neg[0]];
for (i = 1; i < n-9; i=i+8)
{
register int tmp0, tmp1;
tmp0 = pos[i] - neg[i];
tmp1 = pos[i+1] - neg[i+1];
out[i]=lut_soft_core_2d88[tmp0];
out[i+1]=lut_soft_core_2d88[tmp1];
tmp0 = pos[i+2] - neg[i+2];
tmp1 = pos[i+3] - neg[i+3];
out[i+2]=lut_soft_core_2d88[tmp0];
out[i+3]=lut_soft_core_2d88[tmp1];
tmp0 = pos[i+4] - neg[i+4];
tmp1 = pos[i+5] - neg[i+5];
out[i+4]=lut_soft_core_2d88[tmp0];
out[i+5]=lut_soft_core_2d88[tmp1];
tmp0 = pos[i+6] - neg[i+6];
tmp1 = pos[i+7] - neg[i+7];
out[i+6]=lut_soft_core_2d88[tmp0];
out[i+7]=lut_soft_core_2d88[tmp1];
}
tmpv=(n-((n>>3)<<3))-1;
switch(tmpv)
{
case 6:
out[n-6]=lut_soft_core_2d88[pos[n-6]-neg[n-6]];
case 5:
out[n-5]=lut_soft_core_2d88[pos[n-5]-neg[n-5]];
case 4:
out[n-4]=lut_soft_core_2d88[pos[n-4]-neg[n-4]];
case 3:
out[n-3]=lut_soft_core_2d88[pos[n-3]-neg[n-3]];
case 2:
out[n-2]=lut_soft_core_2d88[pos[n-2]-neg[n-2]];
case 1:
out[n-1]=lut_soft_core_2d88[pos[n-1]-neg[n-1]];
case 0:
break;
}
return 1;
}
int Inittriangleluts(float c, float a, float b)
{
int i;
//nonlinearity triangle lut
for (i=1; i<256; i++)
soft_core_2d[i+255] = (int)soft_triangle_lut_2d((float)i,c,a,b);
soft_core_2d[255+(int)(c/2)] =int(-a);
soft_core_2d[511-int((255-c)/2)]=int(b);
for (i=0; i<255; i++)
soft_core_2d[i] = -soft_core_2d[510-i];
soft_core_2d[255]=0;
soft_core_2d[0]=0;
soft_core_2d[510]=0;
return 1;
}
int Inittrianglelutsconst(void)
{
int i;
//initialize a second lut which has c=50,a=0,b=40 this will be used for 8x8 block boundaries always
for (i=1; i<256; i++)
soft_core_2d88[i+255] = (int)soft_triangle_lut_2d((float)i,(float)CONST_C,(float)CONST_A,(float)CONST_B);
soft_core_2d88[255+(int)(CONST_C/2)] =-CONST_A;
soft_core_2d88[511-int((255-CONST_C)/2)]=40;
for (i=0; i<255; i++)
soft_core_2d88[i] = -soft_core_2d88[510-i];
soft_core_2d88[255]=0;
soft_core_2d88[0]=0;
soft_core_2d88[510]=0;
return 1;
}
int soft_triangle_lut_2d(float input, float c, float a, float b)
{
float y;
/*assumes the ranges of input,a,b,c are already clipped*/
if(input>=0 && input<(c/2))
y=-(input*a)/(c/2);
else if(input>=c/2 && input<c)
y=-((c-input)*a)/(c/2);
else if(input>=c && input<((255+c)/2))
y=((input-c)*b)/((255-c)/2);
else if(input>=((255+c)/2) && input <=255)
y=((255-input)*b)/((255-c)/2);
return((int)y);
}
void Initcliplut(void)
{
int i;
//clipping lut
//assumes a and b can have a max value 60
for (i=0; i<319; i++)
clip_softcore_post[i] = 0;
clip_softcore_post[319] = 0;
for (i=1; i<256; i++)
clip_softcore_post[i+319] = i;
for (i=256; i<511; i++)
clip_softcore_post[i+319] = 255;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -