📄 block.cpp
字号:
VER_ICVT(p0,p1,p2,p3);
B0=p0;B1=p1;B2=p2;B3=p3;
p0=outD[5];p1=outD[7];p2=outD[11];p3=outD[14];
VER_ICVT(p0,p1,p2,p3);
C0=p0;C1=p1;C2=p2;C3=p3;
p0=outD[6];p1=outD[12];p2=outD[13];p3=outD[15];
VER_ICVT(p0,p1,p2,p3);
D0=p0;D1=p1;D2=p2;D3=p3;
HOR_ICVT(A0,B0,C0,D0);
M4[0][0] = p0; M4[0][1]=p1;
M4[0][2] = p2; M4[0][3]=p3;
HOR_ICVT(A1,B1,C1,D1);
M4[1][0] = p0; M4[1][1]=p1;
M4[1][2] = p2; M4[1][3]=p3;
HOR_ICVT(A2,B2,C2,D2);
M4[2][0] = p0; M4[2][1]=p1;
M4[2][2] = p2; M4[2][3]=p3;
HOR_ICVT(A3,B3,C3,D3);
M4[3][0] = p0; M4[3][1]=p1;
M4[3][2] = p2; M4[3][3]=p3;
M0[0][0][0][0] = ((M4[0][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][0][0][3] = ((M4[3][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][0][0][1] = ((M4[1][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][0][0][2] = ((M4[2][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][1][0][0] = ((M4[0][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][1][0][3] = ((M4[3][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][1][0][1] = ((M4[1][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][1][0][2] = ((M4[2][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][2][0][0] = ((M4[0][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][2][0][3] = ((M4[3][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][2][0][1] = ((M4[1][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][2][0][2] = ((M4[2][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][3][0][0] = ((M4[0][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][3][0][3] = ((M4[3][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][3][0][1] = ((M4[1][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
M0[0][3][0][2] = ((M4[2][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
// AC invers trans/quant for MB
for (jj=0;jj<4;jj++)
{
for (ii=0;ii<4;ii++)
{
run = -1;
scan_pos = 0;
for (coeff_ctr=1;coeff_ctr < 16;coeff_ctr++)
{
i=SNGL_SCAN[coeff_ctr][0];
j=SNGL_SCAN[coeff_ctr][1];
pp=M0[i][ii][j][jj];
run++;
ilev=0;
level = (abs (pp) * quant_coef1[qp_rem][coeff_ctr] + qp_const) >> q_bits;
if (level != 0)
{
ac_coef = 15;
img->cof[jj][ii][scan_pos][0]=sign(level,pp);
img->cof[jj][ii][scan_pos][1]=run;
++scan_pos;
run=-1; // reset zero level counter
ilev=level*dequant_coef1[qp_rem][coeff_ctr]<<qp_per;
}
M0[i][ii][j][jj]=sign(ilev,pp);
}
img->cof[jj][ii][scan_pos][0]=0;
// invers AC transform
// IDCT horizontal
p0=M0[0][ii][0][jj];p1=M0[1][ii][0][jj];
p2=M0[2][ii][0][jj];p3=M0[3][ii][0][jj];
VER_IDCT(p0,p1,p2,p3);
A0=p0;A1=p1;A2=p2;A3=p3;
p0=M0[0][ii][1][jj];p1=M0[1][ii][1][jj];
p2=M0[2][ii][1][jj];p3=M0[3][ii][1][jj];
VER_IDCT(p0,p1,p2,p3);
B0=p0;B1=p1;B2=p2;B3=p3;
p0=M0[0][ii][2][jj];p1=M0[1][ii][2][jj];
p2=M0[2][ii][2][jj];p3=M0[3][ii][2][jj];
VER_IDCT(p0,p1,p2,p3);
C0=p0;C1=p1;C2=p2;C3=p3;
p0=M0[0][ii][3][jj];p1=M0[1][ii][3][jj];
p2=M0[2][ii][3][jj];p3=M0[3][ii][3][jj];
VER_IDCT(p0,p1,p2,p3);
D0=p0;D1=p1;D2=p2;D3=p3;
i=ii<<2; j=jj<<2;
HOR_IDCT(A0,B0,C0,D0);
M1[0+i][0+j] = p0; M1[0+i][1+j] = p1;
M1[0+i][2+j] = p2; M1[0+i][3+j] = p3;
HOR_IDCT(A1,B1,C1,D1);
M1[1+i][0+j] = p0; M1[1+i][1+j] = p1;
M1[1+i][2+j] = p2; M1[1+i][3+j] = p3;
HOR_IDCT(A2,B2,C2,D2);
M1[2+i][0+j] = p0; M1[2+i][1+j] = p1;
M1[2+i][2+j] = p2; M1[2+i][3+j] = p3;
HOR_IDCT(A3,B3,C3,D3);
M1[3+i][0+j] = p0; M1[3+i][1+j] = p1;
M1[3+i][2+j] = p2; M1[3+i][3+j] = p3;
}
}
for (j=0;j<16;j++)
{
pp=(img->pix_y+j)*lx+img->pix_x;
for (i=0;i<16;i+=4)
{
imgY[pp+i] = (byte)IDCT_SHIFT(M1[i][j], img->mprr_2[new_intra_mode][j*16+i]);
imgY[pp+i+1] = (byte)IDCT_SHIFT(M1[i+1][j],img->mprr_2[new_intra_mode][j*16+i+1]);
imgY[pp+i+2] = (byte)IDCT_SHIFT(M1[i+2][j],img->mprr_2[new_intra_mode][j*16+i+2]);
imgY[pp+i+3] = (byte)IDCT_SHIFT(M1[i+3][j],img->mprr_2[new_intra_mode][j*16+i+3]);
}
}
return ac_coef;
}
int inter_dct_luma(int *ii, int *coeff, int block_x,int block_y,int *coeff_cost, struct img_par *img)
{
int sign(int a,int b);
int ilev,coeff_ctr;
int qp_const,level,scan_pos,run;
int nonzero;
int qp_per,qp_rem,q_bits;
int pos_x = block_x/BLOCK_SIZE;
int pos_y = block_y/BLOCK_SIZE;
int p0,p1,p2,p3;
int q0,q1,q2,q3;
int A0,A1,A2,A3;
int B0,B1,B2,B3;
int C0,C1,C2,C3;
int D0,D1,D2,D3;
//int width=img->width+IMG_PAD_SIZE;
int outD[16];
qp_per = (img->qp-MIN_QP)/6;
qp_rem = (img->qp-MIN_QP)%6;
q_bits = Q_BITS+qp_per;
if (img->type == INTRA_IMG)
qp_const=(1<<q_bits)/3; // intra
else
qp_const=(1<<q_bits)/6; // inter
p0=ii[0];
p1=ii[1];
p2=ii[2];
p3=ii[3];
HOR_DCT(p0,p1,p2,p3);
A0=p0;A1=p1;A2=p2;A3=p3;
ii+=16;
p0=ii[0];
p1=ii[1];
p2=ii[2];
p3=ii[3];
HOR_DCT(p0,p1,p2,p3);
B0=p0;B1=p1;B2=p2;B3=p3;
ii+=16;
p0=ii[0];
p1=ii[1];
p2=ii[2];
p3=ii[3];
HOR_DCT(p0,p1,p2,p3);
C0=p0;C1=p1;C2=p2;C3=p3;
ii+=16;
p0=ii[0];
p1=ii[1];
p2=ii[2];
p3=ii[3];
HOR_DCT(p0,p1,p2,p3);
D0=p0;D1=p1;D2=p2;D3=p3;
VER_DCT(A0,B0,C0,D0);
outD[0]=p0;outD[2]=p1;outD[3]=p2;outD[9]=p3;
VER_DCT(A1,B1,C1,D1);
outD[1]=p0;outD[4]=p1;outD[8]=p2;outD[10]=p3;
VER_DCT(A2,B2,C2,D2);
outD[5]=p0;outD[7]=p1;outD[11]=p2;outD[14]=p3;
VER_DCT(A3,B3,C3,D3);
outD[6]=p0;outD[12]=p1;outD[13]=p2;outD[15]=p3;
// Quant
nonzero=FALSE;
run=-1;
scan_pos=0;
for (coeff_ctr=0;coeff_ctr < 16;coeff_ctr++)
{
p0=outD[coeff_ctr];
run++;
ilev=0;
level = (abs (p0) * quant_coef1[qp_rem][coeff_ctr] + qp_const) >> q_bits;
if (level != 0)
{
nonzero=TRUE;
if (level > 1)
*coeff_cost += MAX_VALUE;
else
*coeff_cost += COEFF_COST[run];
img->cof[pos_x][pos_y][scan_pos][0]=sign(level,p0);
img->cof[pos_x][pos_y][scan_pos][1]=run;
++scan_pos;
run=-1;
ilev=level*dequant_coef1[qp_rem][coeff_ctr]<<qp_per;
}
coeff[coeff_ctr]=sign(ilev,p0);
}
img->cof[pos_x][pos_y][scan_pos][0]=0;
cbp_blk[img->block_y+pos_y][img->block_x+pos_x]=nonzero;
return nonzero;
}
void inter_idct_luma(int *outD, byte *pp, int block_x,int block_y,struct img_par *img,int width)
{
int sign(int a,int b);
int j;
//int qp_const,level,scan_pos,run;
//int qp_per,qp_rem,q_bits;
int pos_x = block_x/BLOCK_SIZE;
int pos_y = block_y/BLOCK_SIZE;
int p0,p1,p2,p3;
int q0,q1,q2,q3;
int A0,A1,A2,A3;
int B0,B1,B2,B3;
int C0,C1,C2,C3;
int D0,D1,D2,D3;
//int width=img->width;
int out[256];
p0=outD[0];p1=outD[2];p2=outD[3];p3=outD[9];
VER_IDCT(p0,p1,p2,p3);
A0=p0;A1=p1;A2=p2;A3=p3;
p0=outD[1];p1=outD[4];p2=outD[8];p3=outD[10];
VER_IDCT(p0,p1,p2,p3);
B0=p0;B1=p1;B2=p2;B3=p3;
p0=outD[5];p1=outD[7];p2=outD[11];p3=outD[14];
VER_IDCT(p0,p1,p2,p3);
C0=p0;C1=p1;C2=p2;C3=p3;
p0=outD[6];p1=outD[12];p2=outD[13];p3=outD[15];
VER_IDCT(p0,p1,p2,p3);
D0=p0;D1=p1;D2=p2;D3=p3;
HOR_IDCT(A0,B0,C0,D0);
out[0]=IDCT_SHIFT(p0,pp[0]);
out[1]=IDCT_SHIFT(p1,pp[1]);
out[2]=IDCT_SHIFT(p2,pp[2]);
out[3]=IDCT_SHIFT(p3,pp[3]);
pp+=width;
HOR_IDCT(A1,B1,C1,D1);
out[4]=IDCT_SHIFT(p0,pp[0]);
out[5]=IDCT_SHIFT(p1,pp[1]);
out[6]=IDCT_SHIFT(p2,pp[2]);
out[7]=IDCT_SHIFT(p3,pp[3]);
pp+=width;
HOR_IDCT(A2,B2,C2,D2);
out[8]=IDCT_SHIFT(p0,pp[0]);
out[9]=IDCT_SHIFT(p1,pp[1]);
out[10]=IDCT_SHIFT(p2,pp[2]);
out[11]=IDCT_SHIFT(p3,pp[3]);
pp+=width;
HOR_IDCT(A3,B3,C3,D3);
out[12]=IDCT_SHIFT(p0,pp[0]);
out[13]=IDCT_SHIFT(p1,pp[1]);
out[14]=IDCT_SHIFT(p2,pp[2]);
out[15]=IDCT_SHIFT(p3,pp[3]);
for (j=0; j < BLOCK_SIZE; j++)
{
p0=(img->pix_y+block_y+j)*(img->width+IMG_PAD_SIZE)+img->pix_x+block_x;
p1=j*4;
imgY[p0 ]=out[p1 ];
imgY[p0+1]=out[p1+1];
imgY[p0+2]=out[p1+2];
imgY[p0+3]=out[p1+3];
}
}
#define UVFILTER1(f0,f1,x0,x1) (((f0)*(x0)+(f1)*(x1)+4)>>3)
#define UVFILTER2(if0,if1,jf0,jf1,x0,y0,x1,y1)\
(((if0)*(jf0)*(x0)+(if1)*(jf0)*(x1)+(if0)*(jf1)*(y0)+(if1)*(jf1)*(y1)+32)>>6)
void Predict(struct img_par *img)
{
int m,n;
int x = img->pix_x;
int y = img->pix_y;
int mvx = curr_mvx;
int mvy = curr_mvy;
int* Cb;
int* Cr;
int offset1;
int offset2;
int cc;
byte* iCb1;
byte* iCb2;
byte* iCr1;
byte* iCr2;
//byte* cCr;
//byte* cCb;
int lx=img->width+IMG_PAD_SIZE;
byte* curr=imgY_org + x+y*lx;
byte* prev=ipol[img->comp] + img->offset;
int* error=MbLum;
int if0,if1,jf0,jf1;
int x0,x1,x2,x3,x4,x5,x6,x7,x8;
int y0,y1,y2,y3,y4,y5,y6,y7,y8;
int z0,z1,z2,z3,z4,z5,z6,z7;
for (n = 0; n < MB_BLOCK_SIZE; n++)
{
z0=curr[ 0]; y0=prev[ 0];
z1=curr[ 1]; y1=prev[ 1];
z2=curr[ 2]; y2=prev[ 2];
z3=curr[ 3]; y3=prev[ 3];
z4=curr[ 4]; y4=prev[ 4];
z5=curr[ 5]; y5=prev[ 5];
z6=curr[ 6]; y6=prev[ 6];
z7=curr[ 7]; y7=prev[ 7];
error[ 0]=z0-y0;
error[ 1]=z1-y1;
error[ 2]=z2-y2;
error[ 3]=z3-y3;
error[ 4]=z4-y4;
error[ 5]=z5-y5;
error[ 6]=z6-y6;
error[ 7]=z7-y7;
z0=curr[ 8]; y0=prev[ 8];
z1=curr[ 9]; y1=prev[ 9];
z2=curr[10]; y2=prev[10];
z3=curr[11]; y3=prev[11];
z4=curr[12]; y4=prev[12];
z5=curr[13]; y5=prev[13];
z6=curr[14]; y6=prev[14];
z7=curr[15]; y7=prev[15];
error[ 8]=z0-y0;
error[ 9]=z1-y1;
error[10]=z2-y2;
error[11]=z3-y3;
error[12]=z4-y4;
error[13]=z5-y5;
error[14]=z6-y6;
error[15]=z7-y7;
error+=16;
curr+=lx;
prev+=lx;
}
x = img->pix_c_x;
y = img->pix_c_y;
m=( (mvx&7)==0 ? 0:1);
n=( (mvy&7)==0 ? 0:1);
cc=m+(n<<1);
lx = img->width_cr+IMG_PAD_SIZE;
Cb=MbCb;
Cr=MbCr;
offset1=x + (mvx>>3) + (y + (mvy>>3))*lx;
offset2=x + y*lx;
iCb1=mcef[0]+offset1;
iCb2=iCb1+lx;
iCr1=mcef[1]+offset1;
iCr2=iCr1+lx;
switch(cc)
{
case 0:
for (n = 0; n < 8; n++)
{
x0=iCb1[0];
x1=iCb1[1];
x2=iCb1[2];
x3=iCb1[3];
x4=iCb1[4];
x5=iCb1[5];
x6=iCb1[6];
x7=iCb1[7];
Cb[0]=x0;
Cb[1]=x1;
Cb[2]=x2;
Cb[3]=x3;
Cb[4]=x4;
Cb[5]=x5;
Cb[6]=x6;
Cb[7]=x7;
x0=iCr1[0];
x1=iCr1[1];
x2=iCr1[2];
x3=iCr1[3];
x4=iCr1[4];
x5=iCr1[5];
x6=iCr1[6];
x7=iCr1[7];
Cr[0]=x0;
Cr[1]=x1;
Cr[2]=x2;
Cr[3]=x3;
Cr[4]=x4;
Cr[5]=x5;
Cr[6]=x6;
Cr[7]=x7;
Cb+=8; Cr+=8;
iCb1+=lx; iCr1+=lx;
}
break;
case 1:
if1=(mvx & 7);
if0=8-if1;
for (n = 0; n < 8; n++)
{
x0=iCb1[0];
x1=iCb1[1];
x2=iCb1[2];
x3=iCb1[3];
x4=iCb1[4];
x5=iCb1[5];
x6=iCb1[6];
x7=iCb1[7];
x8=iCb1[8];
Cb[0]=UVFILTER1(if0,if1,x0,x1);
Cb[1]=UVFILTER1(if0,if1,x1,x2);
Cb[2]=UVFILTER1(if0,if1,x2,x3);
Cb[3]=UVFILTER1(if0,if1,x3,x4);
Cb[4]=UVFILTER1(if0,if1,x4,x5);
Cb[5]=UVFILTER1(if0,if1,x5,x6);
Cb[6]=UVFILTER1(if0,if1,x6,x7);
Cb[7]=UVFILTER1(if0,if1,x7,x8);
x0=iCr1[0];
x1=iCr1[1];
x2=iCr1[2];
x3=iCr1[3];
x4=iCr1[4];
x5=iCr1[5];
x6=iCr1[6];
x7=iCr1[7];
x8=iCr1[8];
Cr[0]=UVFILTER1(if0,if1,x0,x1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -