提取端在 ldecod的block.c文件裏面
主要參考了這篇博文:https://blog.csdn.net/stpeace/article/details/8125377
void itrans(struct img_par * img, //!< image parameters
int ioff, //!< index to 4x4 block
int joff, //!<
int i0, //!<
int j0) //!<
{
int i,j,i1,j1;
int m5[4];
int m6[4];
/*第一步修改開始,主要生成txt文件,把DCT係數放進去*/
int framenum = img->frame_num; //得到每一幀的數據
FILE *mbmark2; //文件指針
char dir[100] = ".\\dct\\dct";//記得DCT這個文件夾要提前創建出來,否則報錯
char dirt[100] = ".txt";
char s[100]; //臨時數組
sprintf(s, "%d",framenum);
strcat(dir, s);
strcat(dir, dirt);//最後拼接成 dct1.txt 這樣子
if ((mbmark2 = fopen(dir, "a+")) == NULL) {
printf("cannot open file!\n");
}
/*第一步修改結束*/
// horizontal
for (j=0;j<BLOCK_SIZE;j++)
{
for (i=0;i<BLOCK_SIZE;i++)
{
m5[i]=img->cof[i0][j0][i][j];
}
m6[0]=(m5[0]+m5[2]);
m6[1]=(m5[0]-m5[2]);
m6[2]=(m5[1]>>1)-m5[3];
m6[3]=m5[1]+(m5[3]>>1);
for (i=0;i<2;i++)
{
i1=3-i;
img->m7[i][j]=m6[i]+m6[i1];
img->m7[i1][j]=m6[i]-m6[i1];
}
}
// vertical
for (i=0;i<BLOCK_SIZE;i++)
{
for (j=0;j<BLOCK_SIZE;j++)
m5[j]=img->m7[i][j];
m6[0]=(m5[0]+m5[2]);
m6[1]=(m5[0]-m5[2]);
m6[2]=(m5[1]>>1)-m5[3];
m6[3]=m5[1]+(m5[3]>>1);
for (j=0;j<2;j++)
{
j1=3-j;
img->m7[i][j] =max(0,min(255,(m6[j]+m6[j1]+(img->mpr[i+ioff][j+joff] <<DQ_BITS)+DQ_ROUND)>>DQ_BITS));
img->m7[i][j1]=max(0,min(255,(m6[j]-m6[j1]+(img->mpr[i+ioff][j1+joff]<<DQ_BITS)+DQ_ROUND)>>DQ_BITS));
}
}
/*
test printf dct
*/
/*第二步修改,遍歷每個座標,並保存數據*/
for (j = 0; j < BLOCK_SIZE; j++)
{
for (i = 0; i < BLOCK_SIZE; i++)
{
fprintf(mbmark2, " %d", img->cof[i0][j0][i][j]);
}
}
fclose(mbmark2);
}