提取端在 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);
}