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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file rdoq.c
  4.  *
  5.  * brief
  6.  *    Rate Distortion Optimized Quantization based on VCEG-AH21
  7.  *************************************************************************************
  8.  */
  9. #include "contributors.h"
  10. #include <math.h>
  11. #include <float.h>
  12. #include "global.h"
  13. #include "image.h"
  14. #include "fmo.h"
  15. #include "macroblock.h"
  16. #include "mb_access.h"
  17. #include "ratectl.h"
  18. #include "rdoq.h"
  19. #include "mv-search.h"
  20. #define RDOQ_BASE 0
  21. const int estErr4x4[6][4][4] =
  22. {
  23.   {
  24.     {25600, 27040, 25600, 27040}, 
  25.     {27040, 25600, 27040, 25600}, 
  26.     {25600, 27040, 25600, 27040}, 
  27.     {27040, 25600, 27040, 25600} 
  28.   },
  29.   {
  30.     {30976, 31360, 30976, 31360}, 
  31.     {31360, 32400, 31360, 32400}, 
  32.     {30976, 31360, 30976, 31360}, 
  33.     {31360, 32400, 31360, 32400} 
  34.   },
  35.   {
  36.     {43264, 40960, 43264, 40960}, 
  37.     {40960, 40000, 40960, 40000}, 
  38.     {43264, 40960, 43264, 40960}, 
  39.     {40960, 40000, 40960, 40000} 
  40.   },
  41.   {
  42.     {50176, 51840, 50176, 51840}, 
  43.     {51840, 52900, 51840, 52900}, 
  44.     {50176, 51840, 50176, 51840}, 
  45.     {51840, 52900, 51840, 52900} 
  46.   },
  47.   {
  48.     {65536, 64000, 65536, 64000}, 
  49.     {64000, 62500, 64000, 62500}, 
  50.     {65536, 64000, 65536, 64000}, 
  51.     {64000, 62500, 64000, 62500} 
  52.   },
  53.   {
  54.     {82944, 84640, 82944, 84640}, 
  55.     {84640, 84100, 84640, 84100}, 
  56.     {82944, 84640, 82944, 84640}, 
  57.     {84640, 84100, 84640, 84100} 
  58.   }
  59. };
  60. const int estErr8x8[6][8][8]={
  61.   {
  62.     {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056}, 
  63.     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}, 
  64.     {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560}, 
  65.     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}, 
  66.     {6553600, 6677056, 6400000, 6677056, 6553600, 6677056, 6400000, 6677056}, 
  67.     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201}, 
  68.     {6400000, 6658560, 6553600, 6658560, 6400000, 6658560, 6553600, 6658560}, 
  69.     {6677056, 6765201, 6658560, 6765201, 6677056, 6765201, 6658560, 6765201} 
  70.   },
  71.   {
  72.     {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736}, 
  73.     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}, 
  74.     {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560}, 
  75.     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}, 
  76.     {7929856, 8156736, 8028160, 8156736, 7929856, 8156736, 8028160, 8156736}, 
  77.     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770}, 
  78.     {8028160, 7814560, 7840000, 7814560, 8028160, 7814560, 7840000, 7814560}, 
  79.     {8156736, 7537770, 7814560, 7537770, 8156736, 7537770, 7814560, 7537770} 
  80.   },
  81.   {
  82.     {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696}, 
  83.     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}, 
  84.     {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160}, 
  85.     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}, 
  86.     {11075584, 10653696, 11151360, 10653696, 11075584, 10653696, 11151360, 10653696}, 
  87.     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652}, 
  88.     {11151360, 11109160, 11289600, 11109160, 11151360, 11109160, 11289600, 11109160}, 
  89.     {10653696, 11045652, 11109160, 11045652, 10653696, 11045652, 11109160, 11045652} 
  90.   },
  91.   {
  92.     {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296}, 
  93.     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}, 
  94.     {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840}, 
  95.     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}, 
  96.     {12845056, 12503296, 12544000, 12503296, 12845056, 12503296, 12544000, 12503296}, 
  97.     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156}, 
  98.     {12544000, 12588840, 12960000, 12588840, 12544000, 12588840, 12960000, 12588840}, 
  99.     {12503296, 13050156, 12588840, 13050156, 12503296, 13050156, 12588840, 13050156} 
  100.   },
  101.   {
  102.     {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400}, 
  103.     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}, 
  104.     {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640}, 
  105.     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}, 
  106.     {16777216, 16646400, 16384000, 16646400, 16777216, 16646400, 16384000, 16646400}, 
  107.     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116}, 
  108.     {16384000, 16692640, 16646400, 16692640, 16384000, 16692640, 16646400, 16692640}, 
  109.     {16646400, 16370116, 16692640, 16370116, 16646400, 16370116, 16692640, 16370116} 
  110.   },
  111.   {
  112.     {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376}, 
  113.     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}, 
  114.     {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440}, 
  115.     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}, 
  116.     {21233664, 21381376, 21667840, 21381376, 21233664, 21381376, 21667840, 21381376}, 
  117.     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376}, 
  118.     {21667840, 21374440, 21529600, 21374440, 21667840, 21374440, 21529600, 21374440}, 
  119.     {21381376, 21381376, 21374440, 21381376, 21381376, 21381376, 21374440, 21381376} 
  120.   }
  121. };
  122. extern int *mvbits;
  123. double norm_factor_4x4;
  124. double norm_factor_8x8;
  125. extern void SetMotionVectorPredictor (Macroblock *currMB, short  pmv[2], char   **refPic,
  126.                                       short  ***tmp_mv, short  ref_frame,
  127.                                       int    list,      int mb_x, int mb_y, 
  128.                                       int    blockshape_x, int blockshape_y);
  129. /*!
  130. ****************************************************************************
  131. * brief
  132. *    Initialize the parameters related to RDO_Q in slice level
  133. ****************************************************************************
  134. */
  135. void init_rdoq_slice(int slice_type, int symbol_mode)
  136. {
  137.   //norm_factor_4x4 = (double) ((int64) 1 << (2 * DQ_BITS + 19)); // norm factor 4x4 is basically (1<<31)
  138.   //norm_factor_8x8 = (double) ((int64) 1 << (2 * Q_BITS_8 + 9)); // norm factor 8x8 is basically (1<<41)
  139.   norm_factor_4x4 = pow(2, (2 * DQ_BITS + 19));
  140.   norm_factor_8x8 = pow(2, (2 * Q_BITS_8 + 9));
  141. }
  142. /*!
  143. ****************************************************************************
  144. * brief
  145. *    Initialize levelData for Chroma DC
  146. ****************************************************************************
  147. */
  148. int init_trellis_data_DC_cr(int (*tblock)[4], int qp_per, int qp_rem, 
  149.                          int levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,  
  150.                          levelDataStruct *dataLevel, int* kStart, int* kStop, int type)
  151. {
  152.   int noCoeff = 0;
  153.   int i, j, coeff_ctr, end_coeff_ctr = ( (type == CHROMA_DC) ? 4 : 8 );
  154.   static int *m7;
  155.   int q_bits = Q_BITS + qp_per + 1; 
  156.   int q_offset = ( 1 << (q_bits - 1) );
  157.   double err; 
  158.   int level, lowerInt, k;
  159.   double estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4; // note that we could also use int64
  160.   for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
  161.   {
  162.     j = *p_scan++;  // horizontal position
  163.     i = *p_scan++;  // vertical position
  164.     m7 = &tblock[j][i];
  165.     if (*m7 == 0)
  166.     {
  167.       dataLevel->levelDouble = 0;
  168.       dataLevel->level[0] = 0;
  169.       dataLevel->noLevels = 1;
  170.       err = 0.0;
  171.       dataLevel->errLevel[0] = 0.0;
  172.     }
  173.     else
  174.     {
  175.       dataLevel->levelDouble = iabs(*m7 * levelscale);
  176.       level = (dataLevel->levelDouble >> q_bits);
  177.       lowerInt=( ((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
  178.       dataLevel->level[0] = 0;
  179.       if (level == 0 && lowerInt == 1)
  180.       {
  181.         dataLevel->noLevels = 1;
  182.       }
  183.       else if (level == 0 && lowerInt == 0)
  184.       {
  185.         dataLevel->level[1] = level + 1;
  186.         dataLevel->noLevels = 2;
  187.         *kStop = coeff_ctr;
  188.         noCoeff++;
  189.       }
  190.       else if (level > 0 && lowerInt == 1)
  191.       {
  192.         dataLevel->level[1] = level;
  193.         dataLevel->noLevels = 2;
  194.         *kStop = coeff_ctr;
  195.         noCoeff++;
  196.       }
  197.       else
  198.       {
  199.         dataLevel->level[1] = level;
  200.         dataLevel->level[2] = level + 1;
  201.         dataLevel->noLevels = 3;
  202.         *kStop  = coeff_ctr;
  203.         *kStart = coeff_ctr;
  204.         noCoeff++;
  205.       }
  206.       for (k = 0; k < dataLevel->noLevels; k++)
  207.       {
  208.         err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  209.         dataLevel->errLevel[k] = (err * err * estErr); 
  210.       }
  211.     }
  212.     dataLevel++;
  213.   }
  214.   return (noCoeff);
  215. }
  216. void trellis_mp(Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
  217. {
  218.   int masterQP = 0, deltaQP;
  219.   int qp_left, qp_up;
  220. #if RDOQ_BASE
  221.   const int deltaQPTabB[] = {0,  1, -1,  2, 3, -2, 4,  5, -3};
  222.   const int deltaQPTabP[] = {0, -1,  1, -2, 2, -3, 3, -4,  4};
  223. #endif
  224.   int   deltaQPCnt; 
  225.   int   qp_anchor; 
  226.   int   prev_mb = FmoGetPreviousMBNr(img->current_mb_nr);
  227.   int   qp_offset = (img->type == B_SLICE) ? (params->RDOQ_QP_Num / 3): (params->RDOQ_QP_Num >> 1);
  228.   masterQP = img->masterQP = img->qp;
  229.   Motion_Selected = 0;
  230.   rddata_trellis_best.min_rdcost = 1e30;
  231.   if (params->symbol_mode == CABAC)
  232.   {
  233.     estRunLevel_CABAC(currMB, LUMA_4x4); 
  234.     estRunLevel_CABAC(currMB, LUMA_16AC);
  235.     estRunLevel_CABAC(currMB, LUMA_16DC);
  236.     if (params->Transform8x8Mode)
  237.       estRunLevel_CABAC(currMB, LUMA_8x8);
  238.     if (params->yuv_format != YUV400)
  239.     {
  240.       estRunLevel_CABAC(currMB, CHROMA_AC);
  241.       if (params->yuv_format == YUV420)
  242.         estRunLevel_CABAC(currMB, CHROMA_DC);
  243.       else
  244.         estRunLevel_CABAC(currMB, CHROMA_DC_2x4);
  245.     }
  246.   }
  247.   qp_left   = (currMB->mb_available_left) ? currMB->mb_available_left->qp : img->masterQP;
  248.   qp_up     = (currMB->mb_available_up)   ? currMB->mb_available_up->qp   : img->masterQP;
  249.   qp_anchor = (qp_left + qp_up + 1)>>1;
  250.   for (deltaQPCnt=0; deltaQPCnt < params->RDOQ_QP_Num; deltaQPCnt++)
  251.   {
  252.     rdopt = &rddata_trellis_curr;
  253. #if RDOQ_BASE
  254.     if (img->type == B_SLICE)
  255.       deltaQP = deltaQPTabB[deltaQPCnt];      
  256.     else
  257.       deltaQP = deltaQPTabP[deltaQPCnt];
  258. #else
  259.     // It seems that pushing the masterQP as first helps things when fast me is enabled. 
  260.     // Could there be an issue with motion estimation?
  261.     if (deltaQPCnt == 0)
  262.       deltaQP = 0;
  263.     else if (deltaQPCnt <= qp_offset)
  264.       deltaQP = deltaQPCnt - 1 - qp_offset;
  265.     else
  266.       deltaQP = deltaQPCnt - qp_offset;
  267.     //printf("qp %d %d %dn", deltaQP,  deltaQPCnt, masterQP);
  268. #endif
  269.     img->qp = iClip3(-img->bitdepth_luma_qp_scale, 51, masterQP + deltaQP);
  270.     deltaQP = masterQP - img->qp;    
  271. #if 0
  272.     if(deltaQP != 0 && !(img->qp - qp_anchor >= -2 && img->qp - qp_anchor <= 1) && currMB->mb_available_left && currMB->mb_available_up && img->type == P_SLICE)
  273.       continue; 
  274.     if(deltaQP != 0 && !(img->qp - qp_anchor >= -1 && img->qp - qp_anchor <= 2) && currMB->mb_available_left && currMB->mb_available_up && img->type == B_SLICE)
  275.       continue;
  276. #endif
  277.     reset_macroblock(currMB, prev_mb);
  278.     currMB->qp       = img->qp;
  279.     currMB->delta_qp = currMB->qp - currMB->prev_qp;
  280.     update_qp (img, currMB);
  281.     encode_one_macroblock (currMB);
  282.     if ( rddata_trellis_curr.min_rdcost < rddata_trellis_best.min_rdcost)
  283.       copy_rddata_trellis(&rddata_trellis_best, rdopt);
  284.     if (params->RDOQ_CP_MV)
  285.       Motion_Selected = 1;
  286. #if (!RDOQ_BASE)
  287.     if (params->RDOQ_Fast)
  288.     {
  289.       if ((img->qp - rddata_trellis_best.qp > 1))
  290.         break;
  291.       if ((rddata_trellis_curr.cbp == 0) && (rddata_trellis_curr.mb_type != 0))
  292.         break;
  293.       if ((rddata_trellis_best.mb_type == 0) && (rddata_trellis_best.cbp == 0))
  294.         break;
  295.     }
  296. #endif
  297.   }
  298.   reset_macroblock(currMB, prev_mb);
  299.   rdopt = &rddata_trellis_best;
  300.   copy_rdopt_data (currMB, FALSE);  // copy the MB data for Top MB from the temp buffers
  301.   write_one_macroblock (currMB, 1, prev_recode_mb);
  302.   img->qp = masterQP;
  303. }
  304. void trellis_sp(Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
  305. {
  306.   img->masterQP = img->qp;
  307.   if (params->symbol_mode == CABAC)
  308.   {
  309.     estRunLevel_CABAC(currMB, LUMA_4x4); 
  310.     estRunLevel_CABAC(currMB, LUMA_16AC);
  311.     
  312.     estRunLevel_CABAC(currMB, LUMA_16DC);
  313.     if (params->Transform8x8Mode)
  314.       estRunLevel_CABAC(currMB, LUMA_8x8);
  315.     if (params->yuv_format != YUV400)
  316.     {
  317.       estRunLevel_CABAC(currMB, CHROMA_AC);
  318.       if (params->yuv_format == YUV420)
  319.         estRunLevel_CABAC(currMB, CHROMA_DC);
  320.       else
  321.         estRunLevel_CABAC(currMB, CHROMA_DC_2x4);
  322.     }
  323.   }
  324.   encode_one_macroblock (currMB);
  325.   write_one_macroblock (currMB, 1, prev_recode_mb);    
  326. }
  327. void trellis_coding(Macroblock *currMB, int CurrentMbAddr, Boolean prev_recode_mb)
  328. {
  329.   if (params->RDOQ_QP_Num > 1)
  330.   {
  331.     trellis_mp(currMB, CurrentMbAddr, prev_recode_mb);   
  332.   }
  333.   else
  334.   {
  335.     trellis_sp(currMB, CurrentMbAddr, prev_recode_mb);   
  336.   }
  337. }
  338. void RDOQ_update_mode(RD_PARAMS *enc_mb, int bslice)
  339. {
  340.   int i;
  341.   for(i=0; i<MAXMODE; i++)
  342.     enc_mb->valid[i] = 0;
  343.   enc_mb->valid[rdopt->mb_type] = 1;
  344.   if(rdopt->mb_type  == P8x8)
  345.   {            
  346.     enc_mb->valid[4] = (params->InterSearch[bslice][4]);
  347.     enc_mb->valid[5] = (params->InterSearch[bslice][5] && !(params->Transform8x8Mode==2));
  348.     enc_mb->valid[6] = (params->InterSearch[bslice][6] && !(params->Transform8x8Mode==2));
  349.     enc_mb->valid[7] = (params->InterSearch[bslice][7] && !(params->Transform8x8Mode==2));
  350.   }
  351. }
  352. void copy_rddata_trellis (RD_DATA *dest, RD_DATA *src)
  353. {
  354.   int j; 
  355.   dest->min_rdcost = src->min_rdcost;
  356.   dest->min_dcost  = src->min_dcost;
  357.   memcpy(&dest->rec_mbY[0][0],&src->rec_mbY[0][0], MB_PIXELS * sizeof(imgpel));
  358.   if (img->yuv_format != YUV400) 
  359.   {
  360.     // we could allocate these dynamically to improve performance.
  361.     memcpy(&dest->rec_mb_cr[0][0][0],&src->rec_mb_cr[0][0][0], 2 * MB_PIXELS * sizeof(imgpel));
  362.   }
  363.   memcpy(&dest->cofAC[0][0][0][0], &src->cofAC[0][0][0][0], (4 + img->num_blk8x8_uv) * 4 * 2 * 65 * sizeof(int));
  364.   memcpy(&dest->cofDC[0][0][0], &src->cofDC[0][0][0], 3 * 2 * 18 * sizeof(int));
  365.   dest->mb_type = src->mb_type;
  366.   memcpy(dest->b8mode, src->b8mode, BLOCK_MULTIPLE * sizeof(short));
  367.   memcpy(dest->b8pdir, src->b8pdir, BLOCK_MULTIPLE * sizeof(short));
  368.   dest->cbp  = src->cbp;
  369.   dest->mode = src->mode;
  370.   dest->i16offset = src->i16offset;
  371.   dest->c_ipred_mode = src->c_ipred_mode;
  372.   dest->luma_transform_size_8x8_flag = src->luma_transform_size_8x8_flag;
  373.   dest->NoMbPartLessThan8x8Flag = src->NoMbPartLessThan8x8Flag;
  374.   dest->qp = src->qp;
  375.   dest->prev_qp  = src->prev_qp;
  376.   dest->prev_dqp = src->prev_dqp;
  377.   dest->delta_qp = src->delta_qp;
  378.   dest->prev_cbp = src->prev_cbp;
  379.   dest->cbp_blk  = src->cbp_blk;
  380.  
  381.   if (img->type != I_SLICE)
  382.   {
  383.     // note that this is not copying the bipred mvs!!!
  384.     memcpy(&dest->all_mv [0][0][0][0][0][0], &src->all_mv [0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));
  385.     memcpy(&dest->pred_mv[0][0][0][0][0][0], &src->pred_mv[0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));
  386.   }
  387.   memcpy(dest->intra_pred_modes,src->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  388.   memcpy(dest->intra_pred_modes8x8,src->intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  389.   for(j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
  390.     memcpy(&dest->ipredmode[j][img->block_x],&src->ipredmode[j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  391.   memcpy(&dest->refar[LIST_0][0][0], &src->refar[LIST_0][0][0], 2 * BLOCK_MULTIPLE * BLOCK_MULTIPLE * sizeof(char));
  392. }                            
  393. void updateMV_mp(int *m_cost, short ref, int list, int h, int v, int blocktype, int *lambda_factor, int block8x8)
  394. {
  395.   int       i, j;
  396.   int       bsx       = params->blc_size[blocktype][0];
  397.   int       bsy       = params->blc_size[blocktype][1];
  398.   short     tmp_pred_mv[2];
  399.   short*    pred_mv = img->pred_mv[list][ref][blocktype][v][h];
  400.   short     all_mv[2];
  401.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  402.   if ( (params->Transform8x8Mode == 1) && (blocktype == 4) && currMB->luma_transform_size_8x8_flag)
  403.   {
  404.     all_mv[0] = tmp_mv8[list][ref][v][h][0];
  405.     all_mv[1] = tmp_mv8[list][ref][v][h][1];
  406.     tmp_pred_mv[0] = tmp_pmv8[list][ref][v][h][0];
  407.     tmp_pred_mv[1] = tmp_pmv8[list][ref][v][h][1];
  408.     *m_cost   = motion_cost8[list][ref][block8x8];
  409.   }
  410.   else
  411.   {
  412.     all_mv[0] = rddata_trellis_best.all_mv[list][ref][blocktype][v][h][0];
  413.     all_mv[1] = rddata_trellis_best.all_mv[list][ref][blocktype][v][h][1];
  414.     tmp_pred_mv[0] = rddata_trellis_best.pred_mv[list][ref][blocktype][v][h][0];
  415.     tmp_pred_mv[1] = rddata_trellis_best.pred_mv[list][ref][blocktype][v][h][1];
  416.   }
  417.   for (j = 0; j < (bsy>>2); j++)
  418.   {
  419.     for (i = 0; i < (bsx>>2); i++) 
  420.       memcpy(img->all_mv[list][ref][blocktype][v+j][h+i], all_mv, 2 * sizeof(short));
  421.   }
  422.   SetMotionVectorPredictor (currMB, pred_mv, enc_picture->motion.ref_idx[list], enc_picture->motion.mv[list], ref, list, h<<2, v<<2, bsx, bsy);
  423.   if ( (tmp_pred_mv[0] != pred_mv[0]) || (tmp_pred_mv[1] != pred_mv[1]) )
  424.   {
  425.     *m_cost -= MV_COST_SMP (lambda_factor[H_PEL], all_mv[0], all_mv[1], tmp_pred_mv[0], tmp_pred_mv[1]);
  426.     *m_cost += MV_COST_SMP (lambda_factor[H_PEL], all_mv[0], all_mv[1], pred_mv[0], pred_mv[1]);
  427.   }
  428. }