色度分量帧内预测的代码

JM模型中8x8块的色度分量帧内预测的代码 先保存下来 一边读一边注释
  1. void IntraChromaPrediction8x8 (int *mb_up, int *mb_left, int*mb_up_left)
  2. {

  3.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  4.   int     s, s0, s1, s2, s3, i, j, k;
  5.   pel_t** image;
  6.   int     block_x, block_y;
  7.   int     mb_nr             = img->current_mb_nr;
  8.   int     mb_available_up;
  9.   int     mb_available_left[2];
  10.   int     mb_available_up_left;
  11.   int     ih,iv;
  12.   int     ib,ic,iaa;
  13.   int     uv;
  14.   int     hline[8], vline[9];
  15.   int     mode;
  16.   int     best_mode = DC_PRED_8;         //just an initilaization here, should always be overwritten
  17.   int     cost;
  18.   int     min_cost;
  19.   int     diff[16];
  20.   PixelPos up;       //!< pixel position p(0,-1)
  21.   PixelPos left[9];  //!< pixel positions p(-1, -1..8)


  22.   for (i=0;i<9;i++)
  23.   {
  24.     getNeighbour(mb_nr, -1 ,  i-1 , 0, &left[i]);
  25.   }
  26.   
  27.   getNeighbour(mb_nr, 0     ,  -1 , 0, &up);


  28.   mb_available_up                             = up.available;
  29.   mb_available_up_left                        = left[0].available;
  30.   mb_available_left[0] = mb_available_left[1] = left[1].available;

  31.   if(input->UseConstrainedIntraPred)
  32.   {
  33.     mb_available_up      = up.available ? img->intra_block[up.mb_addr] : 0;
  34.     for (i=1, mb_available_left[0]=1; i<5;i++)
  35.       mb_available_left[0]  &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  36.     for (i=5, mb_available_left[1]=1; i<9;i++)
  37.       mb_available_left[1]  &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  38.     mb_available_up_left = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
  39.   }

  40.   if (mb_up)
  41.     *mb_up = mb_available_up;
  42.   if (mb_left)
  43.     *mb_left = mb_available_left[0] && mb_available_left[1];
  44.   if( mb_up_left )
  45.     *mb_up_left = mb_available_up_left;

  46.   // compute all chroma intra prediction modes for both U and V
  47.   for (uv=0; uv<2; uv++)
  48.   {
  49.     image = enc_picture->imgUV[uv];

  50.     // DC prediction
  51.     for (block_y=0; block_y<8; block_y+=4)
  52.     for (block_x=0; block_x<8; block_x+=4)
  53.     {
  54.       s=128;
  55.       s0=s1=s2=s3=0;
  56.       //===== get prediction value =====
  57.       switch ((block_y>>1) + (block_x>>2))
  58.       {
  59.       case 0:  //===== TOP LEFT =====
  60.         if      (mb_available_up)       for (i=0;i<4;i++)  s0 += image[up.pos_y][up.pos_x + i];
  61.         if      (mb_available_left[0])  for (i=1;i<5;i++)  s2 += image[left[i].pos_y][left[i].pos_x];
  62.         if      (mb_available_up && mb_available_left[0])  s  = (s0+s2+4) >> 3;
  63.         else if (mb_available_up)                          s  = (s0   +2) >> 2;
  64.         else if (mb_available_left[0])                     s  = (s2   +2) >> 2;
  65.         break;
  66.       case 1: //===== TOP RIGHT =====
  67.         if      (mb_available_up)       for (i=4;i<8;i++)  s1 += image[up.pos_y][up.pos_x + i];
  68.         else if (mb_available_left[0])  for (i=1;i<5;i++)  s2 += image[left[i].pos_y][left[i].pos_x];
  69.         if      (mb_available_up)                          s  = (s1   +2) >> 2;
  70.         else if (mb_available_left[0])                     s  = (s2   +2) >> 2;
  71.         break;
  72.       case 2: //===== BOTTOM LEFT =====
  73.         if      (mb_available_left[1])  for (i=5;i<9;i++)  s3 += image[left[i].pos_y][left[i].pos_x];
  74.         else if (mb_available_up)       for (i=0;i<4;i++)  s0 += image[up.pos_y][up.pos_x + i];
  75.         if      (mb_available_left[1])                     s  = (s3   +2) >> 2;
  76.         else if (mb_available_up)                          s  = (s0   +2) >> 2;
  77.         break;
  78.       case 3: //===== BOTTOM RIGHT =====
  79.         if      (mb_available_up)       for (i=4;i<8;i++)  s1 += image[up.pos_y][up.pos_x + i];
  80.         if      (mb_available_left[1])  for (i=5;i<9;i++)  s3 += image[left[i].pos_y][left[i].pos_x];
  81.         if      (mb_available_up && mb_available_left[1])  s  = (s1+s3+4) >> 3;
  82.         else if (mb_available_up)                          s  = (s1   +2) >> 2;
  83.         else if (mb_available_left[1])                     s  = (s3   +2) >> 2;
  84.         break;
  85.       }


  86.       //===== prediction =====
  87.       for (j=block_y; j<block_y+4; j++)
  88.       for (i=block_x; i<block_x+4; i++)
  89.       {
  90.         img->mprr_c[uv][DC_PRED_8][i][j] = s;
  91.       }
  92.     }

  93.     // vertical prediction
  94.     if (mb_available_up)
  95.     {
  96.       for (i=0; i<8; i++)
  97.         hline[i] = image[up.pos_y][up.pos_x + i];
  98.       for (i=0; i<8; i++)
  99.       for (j=0; j<8; j++)
  100.         img->mprr_c[uv][VERT_PRED_8][i][j] = hline[i];
  101.     }

  102.     // horizontal prediction 
  103.     if (mb_available_left[0] && mb_available_left[1])
  104.     {
  105.       for (i=1; i<9; i++)
  106.         vline[i] = image[left[i].pos_y][left[i].pos_x];
  107.       for (i=0; i<8; i++)
  108.       for (j=0; j<8; j++)
  109.         img->mprr_c[uv][HOR_PRED_8][i][j] = vline[j+1]; 
  110.     }

  111.     // plane prediction 
  112.     if (mb_available_left[0] && mb_available_left[1] && mb_available_up && mb_available_up_left)
  113.     {
  114.       ih = 4*(hline[7] - image[left[0].pos_y][left[0].pos_x]);
  115.       iv = 4*(vline[7+1] - image[left[0].pos_y][left[0].pos_x]);
  116.       for (i=1;i<4;i++)
  117.       {
  118.         ih += i*(hline[3+i] - hline[3-i]);
  119.         iv += i*(vline[3+i+1] - vline[3-i+1]);
  120.       }
  121.       ib=(17*ih+16)>>5;
  122.       ic=(17*iv+16)>>5;

  123.       iaa=16*(hline[7]+vline[7+1]);
  124.       for (j=0; j<8; j++)
  125.       for (i=0; i<8; i++)
  126.         img->mprr_c[uv][PLANE_8][i][j]=max(0,min(255,(iaa+(i-3)*ib +(j-3)*ic + 16)/32));// store plane prediction
  127.     }
  128.   }

  129.   if (!input->rdopt) // the rd-opt part does not work correctly (see encode_one_macroblock)
  130.   {                       // since ipredmodes could be overwritten => encoder-decoder-mismatches
  131.     // pick lowest cost prediction mode
  132.     min_cost = 1<<20;
  133.     for (i=0;i<8;i++)
  134.     {
  135.       getNeighbour(mb_nr, 0 ,  i , 0, &left[i]);
  136.     }
  137.     for (mode=DC_PRED_8; mode<=PLANE_8; mode++)
  138.     {
  139.       if ((mode==VERT_PRED_8 && !mb_available_up) ||
  140.           (mode==HOR_PRED_8 && (!mb_available_left[0] || !mb_available_left[1])) ||
  141.           (mode==PLANE_8 && (!mb_available_left[0] || !mb_available_left[1] || !mb_available_up || !mb_available_up_left)))
  142.         continue;

  143.       cost = 0;
  144.       for (uv=0; uv<2; uv++)
  145.       {
  146.         image = imgUV_org[uv];
  147.         for (block_y=0; block_y<8; block_y+=4)
  148.         for (block_x=0; block_x<8; block_x+=4)
  149.         {
  150.           for (k=0,j=block_y; j<block_y+4; j++)
  151.           for (i=block_x; i<block_x+4; i++,k++)
  152.           {
  153.             diff[k] = image[left[j].pos_y][left[j].pos_x+i] - img->mprr_c[uv][mode][i][j];
  154.           }
  155.           cost += SATD(diff, input->hadamard);
  156.         }
  157.       }
  158.       if (cost < min_cost)
  159.       {
  160.         best_mode = mode;
  161.         min_cost = cost;
  162.       }
  163.     }

  164.     currMB->c_ipred_mode = best_mode;
  165.   }
  166.  
  167. }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值