⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spatial_domain_coding.c

📁 JM 11.0 KTA 2.1 Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
  Macroblock* currMB = &img->mb_data[img->current_mb_nr];
  int    l,k,m,n,i,j;
  int    b8_y       = (block8x8 >>1);
  int    b8_x       = (block8x8 % 2);
  int    mb_y       = b8_y << 3;
  int    mb_x       = b8_x << 3;
  int    SSD_rd_all = 0;
  int    rate_rd_all= 0;
  double rd_lowest  = 0.0;
  double rd_cost    = 0.0;
  int    SSD_all_zero;
  int    p,c;
  int    SD_or_FD_best=0;
  int    ox,oy;
  int    tmp_x,tmp_y;
  int    tmp_ox,tmp_oy;
  int    cbp_blk_mask;
  int    coded[2][2];
  int    SSD_all           [2][2][2];
  int    ctr               [2][2];
  int    rd                [4];
  int    rd_opt            [4];
  int    blocks_non_coded;
  int    blocks_non_coded_best=0;

  currMB->SD_or_FD[b8_y][b8_x]=0;


  for (k=0;k<2;k++)
  {
    for (l=0;l<2;l++)
    {
      tmp_x = mb_x + (k << 2);
      tmp_y = mb_y + (l << 2);

      cbp_blk_mask = ((mb_x+(k<<2))>>2) + (mb_y+(l<<2));
      coded[l][k]  = ((*cbp_blk & ((int64)1 << cbp_blk_mask))==0 ? 0:1);

//calculate SSD for frequency domain coding for 4x4-Block l,k
      SSD_all[l][k][0]=0;
      tmp_x = img->pix_x+mb_x+(k<<2);
      tmp_y = img->pix_y+mb_y+(l<<2);
      tmp_ox = img->opix_x+mb_x+(k<<2);
      tmp_oy = img->opix_y+mb_y+(l<<2);
      for (n=0;n<4;n++)
        for (m=0;m<4;m++)
#ifdef  INTERNAL_BIT_DEPTH_INCREASE
          SSD_all[l][k][0]+=SQR_DEPTH(imgY_org[tmp_oy+n][tmp_ox+m], enc_picture->imgY[tmp_y+n][tmp_x+m], input->BitDepthLuma, img->BitDepthIncrease);
#else
          SSD_all[l][k][0]+=img->quad[imgY_org[tmp_oy+n][tmp_ox+m]-enc_picture->imgY[tmp_y+n][tmp_x+m]];
#endif

//calculate SSD for spatial domain coding for 4x4-Block l,k
      tmp_x = mb_x+(k<<2);
      tmp_y = mb_y+(l<<2);
      ctr[l][k]=0;
      SSD_all[l][k][1]=0;
      for (n=0;n<4;n++)
      {
        for (m=0;m<4;m++)
        {
          currMB->quantizer_indices  [tmp_y+n][tmp_x+m]=quantizer_index(currMB->prederror        [tmp_y+n][tmp_x+m], (adaptive_f_spatial_domain_4x4[img->type==B_SLICE]+img->adjust_adaptive_f_spatial_domain_4x4));
          currMB->quantized_prederror[tmp_y+n][tmp_x+m]=de_quantizer   (currMB->quantizer_indices[tmp_y+n][tmp_x+m]);

          if (img->AdaptiveRounding)
          {
            if (currMB->quantizer_indices[tmp_y+n][tmp_x+m]!=0)
#ifdef  INTERNAL_BIT_DEPTH_INCREASE
              img->adjust_adaptive_f_spatial_domain_4x4 += (float) (ROUNDING_WEIGHT_SD * (abs(currMB->prederror[tmp_y+n][tmp_x+m])- abs(currMB->quantized_prederror[tmp_y+n][tmp_x+m]))/(SD_RD_quant_s_for_all_qps_rec_int[Clip3(0,51,currMB->qp+img->bitdepth_luma_qp_scale)]/256.0));
#else
              img->adjust_adaptive_f_spatial_domain_4x4 += (float) (ROUNDING_WEIGHT_SD * (abs(currMB->prederror[tmp_y+n][tmp_x+m])- abs(currMB->quantized_prederror[tmp_y+n][tmp_x+m]))/(SD_RD_quant_s_for_all_qps_rec_int[currMB->qp]/256.0));
#endif
          }

          SSD_all[l][k][1]+=img->quad[currMB->prederror[tmp_y+n][tmp_x+m]-currMB->quantized_prederror[tmp_y+n][tmp_x+m]];
          if (currMB->quantizer_indices  [tmp_y+n][tmp_x+m]!=0)
            ctr[l][k]++;
        }
      }
#ifdef  INTERNAL_BIT_DEPTH_INCREASE
      if (img->BitDepthIncrease)
      {
        SSD_all[l][k][1] = (SSD_all[l][k][1]+((1<<(img->BitDepthIncrease*2-1))))>>(img->BitDepthIncrease*2);
      }
#endif
      if (input->SD_Quantizer==1)
      {
        eliminate_expensive_samples(tmp_x, tmp_y,&(SSD_all[l][k][1]),&(ctr[l][k]));
      }

    }//k, 4x4 in x
  }//l, 4x4 in y


  store_coding_state (cs_spatial_domain_coding);
  c=0;
  for (rd[0]=0;rd[0]<2;rd[0]++)
  {
    for (rd[1]=0;rd[1]<2;rd[1]++)
    {
      for (rd[2]=0;rd[2]<2;rd[2]++)
      {
        for (rd[3]=0;rd[3]<2;rd[3]++)
        {
          SSD_rd_all   =  SSD_all[0][0][rd[0]]
                       +  SSD_all[0][1][rd[1]]
                       +  SSD_all[1][0][rd[2]]
                       +  SSD_all[1][1][rd[3]];

          p =  rd[0] + (rd[1]<<1)+ (rd[2]<<2)+ (rd[3]<<3);

          blocks_non_coded=0;

          if      (rd[0]==1 && ctr  [0][0]==0)          blocks_non_coded++;
          else if (rd[0]==0 && coded[0][0]==0)          blocks_non_coded++;
          if      (rd[1]==1 && ctr  [0][1]==0)          blocks_non_coded++;
          else if (rd[1]==0 && coded[0][1]==0)          blocks_non_coded++;
          if      (rd[2]==1 && ctr  [1][0]==0)          blocks_non_coded++;
          else if (rd[2]==0 && coded[1][0]==0)          blocks_non_coded++;
          if      (rd[3]==1 && ctr  [1][1]==0)          blocks_non_coded++;
          else if (rd[3]==0 && coded[1][1]==0)          blocks_non_coded++;

          currMB->SD_or_FD[b8_y][b8_x]=p;
          if (blocks_non_coded==4)
          {
            rate_rd_all=0;
          }
          else if (((float)SSD_rd_all<rd_lowest) || c==0)
          {
            rate_rd_all=writeLumaCoeff8x8 (block8x8, P8x8, 0);
          }


          if (c!=15)
            reset_coding_state_spatial_domain (cs_spatial_domain_coding);
          else
            reset_coding_state (cs_spatial_domain_coding);

          rd_cost=rd_cost(SSD_rd_all,rate_rd_all);

          if (c==0 || (rd_cost < rd_lowest) )
          {
            rd_lowest=rd_cost;
            memcpy(rd_opt,rd, 4 * sizeof(int));
            SD_or_FD_best=p;
            blocks_non_coded_best=blocks_non_coded;
          }
          c++;
        }
      }
    }
  }
  SSD_all_zero =0;
  for (k=0;k<8;k++)
  {
    for (l=0;l<8;l++)
    {
      SSD_all_zero+=img->quad[currMB->prederror[mb_y+l][mb_x+k]];
    }
  }
#ifdef  INTERNAL_BIT_DEPTH_INCREASE
  if (img->BitDepthIncrease)
  {
    SSD_all_zero = (SSD_all_zero+((1<<(img->BitDepthIncrease*2-1))))>>(img->BitDepthIncrease*2);
  }
#endif
  if ((float)SSD_all_zero<rd_lowest)
  {
    SD_or_FD_best=15;
    blocks_non_coded_best=4;
    memset(ctr,0,4*sizeof(int));
    for (i=0;i<4;i++)
      rd_opt[i]=1;
    for (l=0;l<8;l++)
    {
      memset(&currMB->quantizer_indices  [mb_y+l][mb_x],0,8*sizeof(int));
      memset(&currMB->quantized_prederror[mb_y+l][mb_x],0,8*sizeof(int));
    }
  }

  currMB->SD_or_FD[b8_y][b8_x]=SD_or_FD_best;

  if (blocks_non_coded_best==4)
  {
    *coeff_cost = 0;
  }
  else if ((blocks_non_coded_best<4) && (((*cbp)&(1<<block8x8))==0))
  {
    *coeff_cost=_LUMA_COEFF_COST_+1;
    (*cbp)|=(1<<block8x8);
    for (m=0;m<4;m++)
    {
      i =(m % 2);
      j =(m >>1);
      if (rd_opt[m]!=0 && ctr[j][i]!=0 && coded[j][i]==0)
      {
        cbp_blk_mask = 1<<(((mb_x+(i<<2))>>2) + (mb_y+(j<<2)));
        *cbp_blk     = (*cbp_blk)|cbp_blk_mask;
      }
    }
  }
  else
  {
    for (m=0;m<4;m++)
    {
      i =(m % 2);
      j =(m >>1);
      if (rd_opt[m]!=0 && ctr[j][i]==0 && coded[j][i]!=0)
      {
        cbp_blk_mask = 1<<(((mb_x+(i<<2))>>2) + (mb_y+(j<<2)));
        cbp_blk_mask = ~cbp_blk_mask;
        *cbp_blk     = (*cbp_blk)&cbp_blk_mask;
      }
      else if (rd_opt[m]!=0 && ctr[j][i]!=0 && coded[j][i]==0)
      {
        cbp_blk_mask = 1<<(((mb_x+(i<<2))>>2) + (mb_y+(j<<2)));
        *cbp_blk     = (*cbp_blk)|cbp_blk_mask;
      }
    }
  }
  if (blocks_non_coded_best!=4)
  {
    for (m=0;m<4;m++)
    {
      i =(m % 2);
      j =(m >>1);
      if (rd_opt[m]!=0)
      {
        memset(img->cofAC[block8x8][m][0],0,65 * sizeof(int));
        memset(img->cofAC[block8x8][m][1],0,65 * sizeof(int));

        ox=(img->mb_x<<4)+mb_x+(i<<2);
        oy=(img->mb_y<<4)+mb_y+(j<<2);
        for (k=0;k<4;k++)
        {
          for (l=0;l<4;l++)
          {
#ifdef  INTERNAL_BIT_DEPTH_INCREASE
            enc_picture->imgY[oy + l][ox + k] = min(((1<<img->bitdepth_luma)-1),max(0,currMB->quantized_prederror[mb_y + (j<<2) + l][mb_x + (i<<2) + k] + currMB->prediction[mb_y + (j<<2) + l][mb_x + (i<<2) + k]));
#else
            enc_picture->imgY[oy + l][ox + k] = min(255,max(0,currMB->quantized_prederror[mb_y + (j<<2) + l][mb_x + (i<<2) + k] + currMB->prediction[mb_y + (j<<2) + l][mb_x + (i<<2) + k]));
#endif
          }
        }
      }
    }
  }
}


void eliminate_expensive_samples_8x8(int bx, int by, int *SSD_best, int *ctr)
{
  Macroblock* currMB = &img->mb_data[img->current_mb_nr];
  int   n,m;
  float f_test;
  int   SSD=0;
  double costs;
  double costs_min=(float)MAX_VALUE;
  int   rate;
  int   store_SD_or_FD=currMB->SD_or_FD_t8x8;
  int   block8x8=by/8*2+bx/8;
  float f_best=0.0;
  int   p;

  currMB->SD_or_FD_t8x8=7;
  store_coding_state (cs_spatial_domain_coding_rd_opt);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -