📄 user_ini_decode.h
字号:
extern unsigned char decode_bmpdata[MapHeight*WIDTHBYTES(MapWidth*24)];
extern int pYnew[MapHeight*MapWidth];
extern int pUnew[MapHeight*MapWidth/4];
extern int pVnew[MapHeight*MapWidth/4];
void read_YCbCr(short (*s1)[8],short (*s2)[8],short (*s3)[8],short (*s4)[8],short (*sCb)[8],short (*sCr)[8],short j)
{
////////////////////////////
short m,n,n1,n2,n3,n4,*py1,*py2,*py3,*py4,*pcb,*pcr;
n=j*64;
//n=j*64;
n1=n*4;
n2=n1+64;
n3=n2+64;
n4=n3+64;
pcb=(short*)sCb;
pcr=(short*)sCr;
py1=(short*)s1;
py2=(short*)s2;
py3=(short*)s3;
py4=(short*)s4;
for(m=0;m<64;m++){
*(pcr+m)=pVnew[n+m];
*(pcb+m)=pUnew[n+m];
*(py1+m)=pYnew[n1+m];
*(py2+m)=pYnew[n2+m];
*(py3+m)=pYnew[n3+m];
*(py4+m)=pYnew[n4+m];
}
}
/////离散余弦逆变换 和 逆量化
// *source)[8] 为要进行离散余弦变换的矩阵 变量
// *q 为亮度/色度 量化表
void IDCT_Q(short (*source)[8],short *q)
{
int j;
short *psource;
psource=(short*)source;
/*************开始进行逆量化****************/
for(j=0;j<64;j++){
psource[j]=(short)(psource[j]*q[j]);
psource[j+64]=(short)(psource[j+64]*q[j]);
psource[j+128]=(short)(psource[j+128]*q[j]);
psource[j+192]=(short)(psource[j+192]*q[j]);
}
IMG_idct_8x8(psource,4); //进行dct 逆变换
}
//对UV进行 dct 逆变换
//short *q 为量化表
void IDCT_Q_UV(short (*source)[8],short *q)
{
int j;
short *psource;
psource=(short*)source;
/*************开始进行逆量化****************/
for(j=0;j<64;j++){
psource[j]=(short)(psource[j]*q[j]);
psource[j+64]=(short)(psource[j+64]*q[j]);
}
IMG_idct_8x8(psource,2); //进行dct 逆变换
}
void YccToRgb(lastblk tempBGR[16][16],lastblk (*out_Image)[16])
{short i,j;
int pCb2,pCb3,pCr1,pCr2,tempBGR_Cr,tempBGR_Cb,tempBGR_Y;
long pY,pCb,pCr;
pCr1=140200;
pCb2=34414;
pCr2=71414;
pCb3=177200;
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
pY=0;
pCb=0;
pCr=0;
tempBGR_Cr =tempBGR[i][j].Cr-128;
tempBGR_Cb =tempBGR[i][j].Cb-128;
tempBGR_Y =100000*tempBGR[i][j].Y;
pY =tempBGR_Y+pCr1*tempBGR_Cr;
pCb=tempBGR_Y-pCb2*tempBGR_Cb;
pCb=pCb -pCr2*tempBGR_Cr;
pCr=tempBGR_Y+pCb3*tempBGR_Cb;
out_Image[i][j].Y =(int)(pY/100000);
out_Image[i][j].Cb=(int)(pCb/100000);
out_Image[i][j].Cr=(int)(pCr/100000);
out_Image[i][j].Y=out_Image[i][j].Y<0 ?0 : out_Image[i][j].Y>255 ? 255:out_Image[i][j].Y;
out_Image[i][j].Cb=out_Image[i][j].Cb<0 ?0 : out_Image[i][j].Cb>255 ? 255:out_Image[i][j].Cb;
out_Image[i][j].Cr=out_Image[i][j].Cr<0 ?0 : out_Image[i][j].Cr>255 ? 255:out_Image[i][j].Cr;
}
}
}
void save_decode_bmpdata(short s1[8][8],short s2[8][8],short s3[8][8],short s4[8][8],short sCb[8][8],short sCr[8][8],int m)
{
int i,i1,j,j1,k,l,x_y,x,y;
YCC yuv,out_yuv;
for(j=0;j<16;j++){
for(i=0;i<16;i++){
i1=i%8;
j1=j%8;
if(j<8){
if(i<8){
yuv[j][i].Y=s1[j][i];
}
else{
yuv[j][i].Y=s2[j][i1];
}
}
else{
if(i<8){
yuv[j][i].Y=s3[j1][i];
}
else{
yuv[j][i].Y=s4[j1][i1];
}
}
yuv[j][i].Cb=sCb[j1][i1];
yuv[j][i].Cr=sCr[j1][i1];
}
}
YccToRgb(yuv,out_yuv); ///转换Ycbcr--->Redgreenblue
k=m/8;
l=m%8;
x=k*16;
y=l*16*3;
for(j=0;j<16;j++){
for(i=0;i<16;i++){
x_y=(x+j)*WIDTHBYTES(MapWidth*24)+y+i*3;
decode_bmpdata[x_y]=(BYTE)out_yuv[j][i].Y;
decode_bmpdata[x_y+1]=(BYTE)out_yuv[j][i].Cb;
decode_bmpdata[x_y+2]=(BYTE)out_yuv[j][i].Cr;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -