(JM)在JM8.6提取每幀的DCT係數

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章