rd_intra_jm.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:18k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file rd_intra_jm.c
  4.  *
  5.  * brief
  6.  *    Rate-Distortion optimized mode decision
  7.  *
  8.  * author
  9.  *    - Heiko Schwarz              <hschwarz@hhi.de>
  10.  *    - Valeri George              <george@hhi.de>
  11.  *    - Lowell Winger              <lwinger@lsil.com>
  12.  *    - Alexis Michael Tourapis    <alexismt@ieee.org>
  13.  * date
  14.  *    12. April 2001
  15.  **************************************************************************
  16.  */
  17. #include <limits.h>
  18. #include "global.h"
  19. #include "image.h"
  20. #include "macroblock.h"
  21. #include "mb_access.h"
  22. #include "rdopt_coding_state.h"
  23. #include "mode_decision.h"
  24. #include "rdopt.h"
  25. #include "rd_intra_jm.h"
  26. #include "q_around.h"
  27. /*!
  28.  *************************************************************************************
  29.  * brief
  30.  *    Mode Decision for an 4x4 Intra block
  31.  *************************************************************************************
  32.  */
  33. int Mode_Decision_for_4x4IntraBlocks_JM_High (Macroblock *currMB, int  b8,  int  b4,  double  lambda,  double*  min_cost, int cr_cbp[3], int is_cavlc)
  34. {
  35.   int    ipmode, best_ipmode = 0, i, j, y, dummy;
  36.   int    c_nz, nonzero = 0;
  37.   int*   ACLevel = img->cofAC[b8][b4][0];
  38.   int*   ACRun   = img->cofAC[b8][b4][1];
  39.   int    c_nzCbCr[3]= {999,999, 999};
  40.   static imgpel  rec4x4[4][4];
  41.   static imgpel  rec4x4CbCr[2][4][4];
  42.   int    uv;
  43.   double rdcost;
  44.   int    block_x     = ((b8 & 0x01) << 3) + ((b4 & 0x01) << 2);
  45.   int    block_y     = ((b8 >> 1) << 3)  + ((b4 >> 1) << 2);
  46.   int    pic_pix_x   = img->pix_x  + block_x;
  47.   int    pic_pix_y   = img->pix_y  + block_y;
  48.   int    pic_opix_x  = img->opix_x + block_x;
  49.   int    pic_opix_y  = img->opix_y + block_y;
  50.   int    pic_block_x = pic_pix_x >> 2;
  51.   int    pic_block_y = pic_pix_y >> 2;
  52.   double min_rdcost  = 1e30;
  53.   int left_available, up_available, all_available;
  54.   char   upMode;
  55.   char   leftMode;
  56.   int    mostProbableMode;
  57.   PixelPos left_block;
  58.   PixelPos top_block;
  59.   int  lrec4x4[4][4];
  60. #ifdef BEST_NZ_COEFF
  61.   int best_nz_coeff = 0;
  62.   int best_coded_block_flag = 0;
  63.   int bit_pos = 1 + ((((b8>>1)<<1)+(b4>>1))<<2) + (((b8&1)<<1)+(b4&1));
  64.   static int64 cbp_bits;
  65.   if (b8==0 && b4==0)
  66.     cbp_bits = 0;
  67. #endif
  68.   get4x4Neighbour(currMB, block_x - 1, block_y    , img->mb_size[IS_LUMA], &left_block);
  69.   get4x4Neighbour(currMB, block_x,     block_y - 1, img->mb_size[IS_LUMA], &top_block );
  70.   // constrained intra pred
  71.   if (params->UseConstrainedIntraPred)
  72.   {
  73.     left_block.available = left_block.available ? img->intra_block[left_block.mb_addr] : 0;
  74.     top_block.available  = top_block.available  ? img->intra_block[top_block.mb_addr]  : 0;
  75.   }
  76.   upMode            =  top_block.available ? img->ipredmode[top_block.pos_y ][top_block.pos_x ] : -1;
  77.   leftMode          = left_block.available ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
  78.   mostProbableMode  = (upMode < 0 || leftMode < 0) ? DC_PRED : upMode < leftMode ? upMode : leftMode;
  79.   *min_cost = INT_MAX;
  80.   ipmode_DPCM = NO_INTRA_PMODE; ////For residual DPCM
  81.   //===== INTRA PREDICTION FOR 4x4 BLOCK =====
  82.   intrapred_4x4 (currMB, PLANE_Y, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  83.   if (img->P444_joined)
  84.   {
  85.     select_plane(PLANE_U);
  86.     intrapred_4x4 (currMB, PLANE_U, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  87.     select_plane(PLANE_V);
  88.     intrapred_4x4 (currMB, PLANE_V, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  89.     select_plane(PLANE_Y);
  90.   }
  91.   //===== LOOP OVER ALL 4x4 INTRA PREDICTION MODES =====
  92.   for (ipmode = 0; ipmode < NO_INTRA_PMODE; ipmode++)
  93.   {
  94.     int available_mode =  (all_available) || (ipmode==DC_PRED) ||
  95.       (up_available && (ipmode==VERT_PRED||ipmode==VERT_LEFT_PRED||ipmode==DIAG_DOWN_LEFT_PRED)) ||
  96.       (left_available && (ipmode==HOR_PRED||ipmode==HOR_UP_PRED));
  97.     if (valid_intra_mode(ipmode) == 0)
  98.       continue;
  99.     if( available_mode)
  100.     {
  101.       // get prediction and prediction error
  102.       generate_pred_error(&pCurImg[pic_opix_y], img->mpr_4x4[0][ipmode], &img->mb_pred[0][block_y], &img->mb_ores[0][block_y], pic_opix_x, block_x);     
  103.       if (img->yuv_format == YUV444)
  104.       {
  105.         ipmode_DPCM = ipmode;
  106.         if (!IS_INDEPENDENT(params)) 
  107.         {
  108.           generate_pred_error(&pImgOrg[1][pic_opix_y], img->mpr_4x4[1][ipmode], &img->mb_pred[1][block_y], &img->mb_ores[1][block_y], pic_opix_x, block_x);
  109.           generate_pred_error(&pImgOrg[2][pic_opix_y], img->mpr_4x4[2][ipmode], &img->mb_pred[2][block_y], &img->mb_ores[2][block_y], pic_opix_x, block_x);     
  110.         }
  111.       }
  112.       //===== store the coding state =====
  113.       //store_coding_state (currMB, cs_cm);
  114.       // get and check rate-distortion cost
  115. #ifdef BEST_NZ_COEFF
  116.       currMB->cbp_bits[0] = cbp_bits;
  117. #endif      
  118.       if ((rdcost = RDCost_for_4x4IntraBlocks (currMB, &c_nz, b8, b4, ipmode, lambda, mostProbableMode, c_nzCbCr, is_cavlc)) < min_rdcost)
  119.       {
  120.         //--- set coefficients ---
  121.         memcpy(cofAC4x4[0],ACLevel, 18 * sizeof(int));
  122.         memcpy(cofAC4x4[1],ACRun,   18 * sizeof(int));
  123.         //--- set reconstruction ---
  124.         for (y=0; y<4; y++)
  125.         {
  126.           memcpy(rec4x4[y],&enc_picture->imgY[pic_pix_y+y][pic_pix_x], BLOCK_SIZE * sizeof(imgpel));
  127.         }
  128.         // SP/SI reconstruction
  129.         if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
  130.         {
  131.           for (y=0; y<4; y++)
  132.           {
  133.             memcpy(lrec4x4[y],&lrec[pic_pix_y+y][pic_pix_x], BLOCK_SIZE * sizeof(int));// stores the mode coefficients
  134.           }
  135.         }
  136.         if(img->P444_joined) 
  137.         { 
  138.           //--- set coefficients ---
  139.           for (uv=0; uv < 2; uv++)
  140.           {
  141.             memcpy(cofAC4x4CbCr[uv][0],img->cofAC[b8+4+uv*4][b4][0], 18 * sizeof(int));
  142.             memcpy(cofAC4x4CbCr[uv][1],img->cofAC[b8+4+uv*4][b4][1], 18 * sizeof(int));
  143.             cr_cbp[uv + 1] = c_nzCbCr[uv + 1];
  144.             //--- set reconstruction ---
  145.             for (y=0; y<4; y++)
  146.             {
  147.               memcpy(rec4x4CbCr[uv][y],&enc_picture->imgUV[uv][pic_pix_y+y][pic_pix_x], BLOCK_SIZE * sizeof(imgpel));
  148.             } 
  149.           }
  150.         }
  151.         //--- flag if dct-coefficients must be coded ---
  152.         nonzero = c_nz;
  153.         //--- set best mode update minimum cost ---
  154.         *min_cost     = rdcost;
  155.         min_rdcost    = rdcost;
  156.         best_ipmode   = ipmode;
  157. #ifdef BEST_NZ_COEFF
  158.         best_nz_coeff = img->nz_coeff [img->current_mb_nr][block_x4][block_y4];
  159.         best_coded_block_flag = (int)((currMB->cbp_bits[0] >> bit_pos)&(int64)(1));
  160. #endif
  161.         //store_coding_state (currMB, cs_ib4);
  162.         if (img->AdaptiveRounding)
  163.         {
  164.           store_adaptive_rounding (img, block_y, block_x);
  165.         }
  166.       }
  167. #ifndef RESET_STATE
  168.       reset_coding_state (currMB, cs_cm);
  169. #endif      
  170.     }
  171.   }
  172. #ifdef BEST_NZ_COEFF
  173.   img->nz_coeff [img->current_mb_nr][block_x4][block_y4] = best_nz_coeff;
  174.   cbp_bits &= (~(int64)(1<<bit_pos));
  175.   cbp_bits |= (int64)(best_coded_block_flag<<bit_pos);
  176. #endif
  177.   //===== set intra mode prediction =====
  178.   img->ipredmode[pic_block_y][pic_block_x] = (char) best_ipmode;
  179.   currMB->intra_pred_modes[4*b8+b4] =
  180.     (char) (mostProbableMode == best_ipmode ? -1 : (best_ipmode < mostProbableMode ? best_ipmode : best_ipmode-1));
  181.   if(img->P444_joined)
  182.   {
  183.     ColorPlane k;
  184.     for (k = PLANE_U; k <= PLANE_V; k++)
  185.     {
  186.       select_plane(k);
  187.       for (j=0; j<4; j++)
  188.       {
  189.         for (i=0; i<4; i++)
  190.         {
  191.           img->mb_pred[k][block_y+j][block_x+i]  = img->mpr_4x4[k][best_ipmode][j][i];
  192.           img->mb_ores[k][block_y+j][block_x+i]   = pImgOrg[k][img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr_4x4[k][best_ipmode][j][i];
  193.         }
  194.       }
  195.       cr_cbp[k] = pDCT_4x4(currMB, k, block_x,block_y,&dummy,1, is_cavlc);
  196.     }
  197.     select_plane(PLANE_Y);
  198.   }
  199.   //===== restore coefficients =====
  200.   memcpy (ACLevel,cofAC4x4[0], 18 * sizeof(int));
  201.   memcpy (ACRun,cofAC4x4[1], 18 * sizeof(int));
  202.   //===== restore reconstruction and prediction (needed if single coeffs are removed) =====
  203.   for (y=0; y<BLOCK_SIZE; y++)
  204.   {
  205.     memcpy (&enc_picture->imgY[pic_pix_y + y][pic_pix_x],rec4x4[y],    BLOCK_SIZE * sizeof(imgpel));
  206.     memcpy (&img->mb_pred[0][block_y + y][block_x],img->mpr_4x4[0][best_ipmode][y], BLOCK_SIZE * sizeof(imgpel));
  207.   }
  208.   // SP/SI reconstuction
  209.   if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
  210.   {
  211.     for (y=0; y<BLOCK_SIZE; y++)
  212.     {
  213.       memcpy (&lrec[pic_pix_y+y][pic_pix_x], lrec4x4[y], BLOCK_SIZE * sizeof(int));//restore coefficients when encoding primary SP frame
  214.     }
  215.   }
  216.   if (img->P444_joined) 
  217.   {
  218.     for (uv=0; uv < 2; uv++ )
  219.     {
  220.       //===== restore coefficients =====
  221.       memcpy(img->cofAC[b8+4+uv*4][b4][0], cofAC4x4CbCr[uv][0], 18 * sizeof(int));
  222.       memcpy(img->cofAC[b8+4+uv*4][b4][1], cofAC4x4CbCr[uv][1], 18 * sizeof(int));
  223.       //===== restore reconstruction and prediction (needed if single coeffs are removed) =====
  224.       for (y=0; y<BLOCK_SIZE; y++)
  225.       {
  226.         memcpy(&enc_picture->imgUV[uv][pic_pix_y+y][pic_pix_x],rec4x4CbCr[uv][y], BLOCK_SIZE * sizeof(imgpel));
  227.         memcpy(&img->mb_pred[uv + 1][block_y+y][block_x], img->mpr_4x4[uv + 1][best_ipmode][y], BLOCK_SIZE * sizeof(imgpel));
  228.       } 
  229.     }
  230.   }
  231.   if (img->AdaptiveRounding)
  232.   {
  233.     update_adaptive_rounding(img, block_y, block_x);
  234.   }
  235.   return nonzero;
  236. }
  237. /*!
  238.  *************************************************************************************
  239.  * brief
  240.  *    Mode Decision for an 4x4 Intra block
  241.  *************************************************************************************
  242.  */
  243. int Mode_Decision_for_4x4IntraBlocks_JM_Low (Macroblock *currMB, int  b8,  int  b4,  double  lambda,  double*  min_cost, int cr_cbp[3], int is_cavlc)
  244. {
  245.   int     ipmode, best_ipmode = 0, i, j, cost, dummy;
  246.   int     nonzero = 0;
  247.   int  block_x     = ((b8 & 0x01) << 3) + ((b4 & 0x01) << 2);
  248.   int  block_y     = ((b8 >> 1) << 3)  + ((b4 >> 1) << 2);
  249.   int  pic_pix_x   = img->pix_x  + block_x;
  250.   int  pic_pix_y   = img->pix_y  + block_y;
  251.   int  pic_opix_x  = img->opix_x + block_x;
  252.   int  pic_opix_y  = img->opix_y + block_y;
  253.   int  pic_block_x = pic_pix_x >> 2;
  254.   int  pic_block_y = pic_pix_y >> 2;
  255.   int left_available, up_available, all_available;
  256.   char   upMode;
  257.   char   leftMode;
  258.   int    mostProbableMode;
  259.   PixelPos left_block;
  260.   PixelPos top_block;
  261.   int  fixedcost = (int) floor(4 * lambda );
  262. #ifdef BEST_NZ_COEFF
  263.   int best_nz_coeff = 0;
  264.   int best_coded_block_flag = 0;
  265.   int bit_pos = 1 + ((((b8>>1)<<1)+(b4>>1))<<2) + (((b8&1)<<1)+(b4&1));
  266.   static int64 cbp_bits;
  267.   if (b8==0 && b4==0)
  268.     cbp_bits = 0;
  269. #endif
  270.   get4x4Neighbour(currMB, block_x - 1, block_y    , img->mb_size[IS_LUMA], &left_block);
  271.   get4x4Neighbour(currMB, block_x,     block_y - 1, img->mb_size[IS_LUMA], &top_block );
  272.   // constrained intra pred
  273.   if (params->UseConstrainedIntraPred)
  274.   {
  275.     left_block.available = left_block.available ? img->intra_block[left_block.mb_addr] : 0;
  276.     top_block.available  = top_block.available  ? img->intra_block[top_block.mb_addr]  : 0;
  277.   }
  278.   upMode            =  top_block.available ? img->ipredmode[top_block.pos_y ][top_block.pos_x ] : -1;
  279.   leftMode          = left_block.available ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
  280.   mostProbableMode  = (upMode < 0 || leftMode < 0) ? DC_PRED : upMode < leftMode ? upMode : leftMode;
  281.   *min_cost = INT_MAX;
  282.   ipmode_DPCM = NO_INTRA_PMODE; ////For residual DPCM
  283.   //===== INTRA PREDICTION FOR 4x4 BLOCK =====
  284.   intrapred_4x4 (currMB, PLANE_Y, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  285.   if (img->P444_joined)
  286.   {
  287.     select_plane(PLANE_U);
  288.     intrapred_4x4 (currMB, PLANE_U, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  289.     select_plane(PLANE_V);
  290.     intrapred_4x4 (currMB, PLANE_V, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  291.     select_plane(PLANE_Y);
  292.   }
  293.   //===== LOOP OVER ALL 4x4 INTRA PREDICTION MODES =====
  294.   for (ipmode = 0; ipmode < NO_INTRA_PMODE; ipmode++)
  295.   {
  296.     int available_mode =  (all_available) || (ipmode==DC_PRED) ||
  297.       (up_available && (ipmode==VERT_PRED||ipmode==VERT_LEFT_PRED||ipmode==DIAG_DOWN_LEFT_PRED)) ||
  298.       (left_available && (ipmode==HOR_PRED||ipmode==HOR_UP_PRED));
  299.     if (valid_intra_mode(ipmode) == 0)
  300.       continue;
  301.     if( available_mode)
  302.     {
  303.       cost  = (ipmode == mostProbableMode) ? 0 : fixedcost;
  304.       compute_comp_cost(&pCurImg[pic_opix_y], img->mpr_4x4[0][ipmode], pic_opix_x, &cost);
  305.       if (img->P444_joined)
  306.       {
  307.         compute_comp_cost(&pImgOrg[1][pic_opix_y], img->mpr_4x4[1][ipmode], pic_opix_x, &cost);
  308.         compute_comp_cost(&pImgOrg[2][pic_opix_y], img->mpr_4x4[2][ipmode], pic_opix_x, &cost);
  309.       }
  310.       
  311.       if (cost < *min_cost)
  312.       {
  313.         best_ipmode = ipmode;
  314.         *min_cost   = cost;
  315.       }
  316.     }
  317.   }
  318. #ifdef BEST_NZ_COEFF
  319.   img->nz_coeff [img->current_mb_nr][block_x4][block_y4] = best_nz_coeff;
  320.   cbp_bits &= (~(int64)(1<<bit_pos));
  321.   cbp_bits |= (int64)(best_coded_block_flag<<bit_pos);
  322. #endif
  323.   //===== set intra mode prediction =====
  324.   img->ipredmode[pic_block_y][pic_block_x] = (char) best_ipmode;
  325.   currMB->intra_pred_modes[4*b8+b4] =
  326.     (char) (mostProbableMode == best_ipmode ? -1 : (best_ipmode < mostProbableMode ? best_ipmode : best_ipmode-1));
  327.   // get prediction and prediction error
  328.   generate_pred_error(&pCurImg[pic_opix_y], img->mpr_4x4[0][best_ipmode], &img->mb_pred[0][block_y], &img->mb_ores[0][block_y], pic_opix_x, block_x);
  329.   ipmode_DPCM=best_ipmode;  
  330.   select_dct(img, currMB);
  331.   nonzero = cr_cbp[0] = pDCT_4x4 (currMB, PLANE_Y, block_x, block_y, &dummy, 1, is_cavlc);
  332.   if (img->P444_joined)
  333.   {
  334.     ColorPlane k;
  335.     for (k = PLANE_U; k <= PLANE_V; k++)
  336.     {
  337.       select_plane(k);
  338.       for (j=0; j<4; j++)
  339.       {
  340.         for (i=0; i<4; i++)
  341.         {
  342.           img->mb_pred[k][block_y+j][block_x+i] = img->mpr_4x4[k][best_ipmode][j][i];    
  343.           img->mb_ores[k][block_y+j][block_x+i] = pImgOrg[k][pic_opix_y+j][pic_opix_x+i] - img->mpr_4x4[k][best_ipmode][j][i]; 
  344.         }
  345.       }
  346.       cr_cbp[k] = pDCT_4x4(currMB, k, block_x,block_y,&dummy,1, is_cavlc);
  347.     }
  348.     select_plane(PLANE_Y);
  349.   }
  350.   return nonzero;
  351. }
  352. /*!
  353.  *************************************************************************************
  354.  * brief
  355.  *    Mode Decision for an 8x8 Intra block
  356.  *************************************************************************************
  357.  */
  358. int Mode_Decision_for_8x8IntraBlocks(Macroblock *currMB, int b8,double lambda,double *cost, int non_zero[3], int is_cavlc)
  359. {
  360.   int  b4;
  361.   double  cost4x4;
  362.   int CbCr_cbp[3]={0, 0, 0};
  363.   memset(non_zero, 0, 3 * sizeof(int));
  364.   *cost = (int)floor(6.0 * lambda + 0.4999);
  365.   if (params->rdopt == 0)
  366.     Mode_Decision_for_4x4IntraBlocks = Mode_Decision_for_4x4IntraBlocks_JM_Low;
  367.   else
  368.     Mode_Decision_for_4x4IntraBlocks = Mode_Decision_for_4x4IntraBlocks_JM_High;   
  369.   for (b4=0; b4<4; b4++)
  370.   {
  371.     non_zero[0] |= Mode_Decision_for_4x4IntraBlocks (currMB, b8, b4, lambda, &cost4x4, CbCr_cbp, is_cavlc);
  372.     non_zero[1] |= CbCr_cbp[1];
  373.     non_zero[2] |= CbCr_cbp[2];
  374.     *cost += cost4x4;
  375.   }
  376. #ifdef RESET_STATE
  377.   //reset_coding_state (currMB, cs_cm);
  378. #endif
  379.   return non_zero[0];
  380. }
  381. /*!
  382.  *************************************************************************************
  383.  * brief
  384.  *    4x4 Intra mode decision for an macroblock
  385.  *************************************************************************************
  386.  */
  387. int Mode_Decision_for_Intra4x4Macroblock (Macroblock *currMB, double lambda,  double* cost, int is_cavlc)
  388. {
  389.   int  cbp=0, b8;
  390.   double cost8x8;
  391.   int non_zero[3] = {0, 0, 0};
  392.   cmp_cbp[1] = cmp_cbp[2] = 0;
  393.   
  394.   for (*cost=0, b8=0; b8<4; b8++)
  395.   {
  396.     if (Mode_Decision_for_8x8IntraBlocks (currMB, b8, lambda, &cost8x8, non_zero, is_cavlc))
  397.     {
  398.       cbp |= (1<<b8);
  399.     }
  400.     *cost += cost8x8;
  401.     if (non_zero[1])
  402.     {
  403.       cmp_cbp[1] |= (1<<b8);
  404.       cbp |= cmp_cbp[1];
  405.       cmp_cbp[1] = cbp;
  406.       cmp_cbp[2] = cbp;
  407.     }
  408.     if (non_zero[2])
  409.     {
  410.       cmp_cbp[2] |= (1<<b8);
  411.       cbp |= cmp_cbp[2];
  412.       cmp_cbp[1] = cbp;
  413.       cmp_cbp[2] = cbp;
  414.     }
  415.   }
  416.   return cbp;
  417. }
  418. /*!
  419. *************************************************************************************
  420. * brief
  421. *    Intra 16x16 mode decision
  422. *************************************************************************************
  423. */
  424. void Intra16x16_Mode_Decision (Macroblock* currMB, int* i16mode, int is_cavlc)
  425. {
  426.   /* generate intra prediction samples for all 4 16x16 modes */
  427.   intrapred_16x16 (currMB, PLANE_Y);
  428.   
  429.   if (img->P444_joined)
  430.   {
  431.     select_plane(PLANE_U);
  432.     intrapred_16x16 (currMB, PLANE_U);
  433.     select_plane(PLANE_V);
  434.     intrapred_16x16 (currMB, PLANE_V);
  435.     select_plane(PLANE_Y);
  436.   }
  437.   find_sad_16x16 = find_sad_16x16_JM;
  438.   find_sad_16x16 (currMB, i16mode);   /* get best new intra mode */
  439.   currMB->cbp = pDCT_16x16 (currMB, PLANE_Y, *i16mode, is_cavlc);
  440.   if (img->P444_joined)
  441.   {
  442.     select_plane(PLANE_U);
  443.     cmp_cbp[1] = pDCT_16x16 (currMB, PLANE_U, *i16mode, is_cavlc);
  444.     select_plane(PLANE_V);
  445.     cmp_cbp[2] = pDCT_16x16 (currMB, PLANE_V, *i16mode, is_cavlc);
  446.     select_plane(PLANE_Y);
  447.     currMB->cbp |= cmp_cbp[1];
  448.     currMB->cbp |= cmp_cbp[2];
  449.     cmp_cbp[1] = currMB->cbp;
  450.     cmp_cbp[2] = currMB->cbp;
  451.   }
  452. }