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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file errdo_mc_prediction.c
  4.  *
  5.  * brief
  6.  *    Functions for motion compensated prediction
  7.  *
  8.  * author
  9.  *      Main contributors (see contributors.h for copyright, 
  10.  *                         address and affiliation details)
  11.  *      - Alexis Michael Tourapis  <alexismt@ieee.org>
  12.  *      - Modified for encoder from ldecod/src/mc_prediction.c 
  13.  *          by Peshala V. Pahalawatta <pesh@ieee.org>
  14.  *************************************************************************************
  15.  */
  16. #include "global.h"
  17. #include "mbuffer.h"
  18. #include "mb_access.h"
  19. #include "macroblock.h"
  20. #include "errdo_mc_prediction.h"
  21. //extern StorablePicture *no_reference_picture;
  22. #if defined(USEMMX) 
  23. #if defined(_MSC_VER) || defined(__INTEL_COMPILER) // ICC  
  24. __declspec(align(16)) imgpel tmp_block_l0[MB_BLOCK_SIZE][MB_BLOCK_SIZE];
  25. __declspec(align(16)) imgpel tmp_block_l1[MB_BLOCK_SIZE][MB_BLOCK_SIZE];
  26. # else  
  27. imgpel tmp_block_l0[MB_BLOCK_SIZE][MB_BLOCK_SIZE]      __attribute__ ((aligned (16)));
  28. imgpel tmp_block_l1[MB_BLOCK_SIZE][MB_BLOCK_SIZE]      __attribute__ ((aligned (16)));
  29. # endif
  30. #else
  31. imgpel tmp_block_l0[MB_BLOCK_SIZE][MB_BLOCK_SIZE];     //!< l0 prediction
  32. imgpel tmp_block_l1[MB_BLOCK_SIZE][MB_BLOCK_SIZE];     //!< l1 prediction
  33. #endif
  34. static const int COEF[6] = { 1, -5, 20, 20, -5, 1 };
  35. /*!
  36.  ************************************************************************
  37.  * brief
  38.  *    block single list prediction
  39.  ************************************************************************
  40.  */
  41. static inline void mc_prediction(imgpel mb_pred[MB_BLOCK_SIZE][MB_BLOCK_SIZE],
  42.                     int ver_block_size, 
  43.                     int hor_block_size,
  44.                     int ioff,
  45.                     imgpel block[MB_BLOCK_SIZE][MB_BLOCK_SIZE])
  46. {
  47.   static int jj;
  48.   if (hor_block_size == MB_BLOCK_SIZE)
  49.   {
  50.     memcpy(&(mb_pred[0][ioff]), &(block[0][0]), hor_block_size * ver_block_size * sizeof(imgpel));
  51.   }
  52.   else
  53.   {
  54.     for(jj = 0; jj < ver_block_size; jj++)
  55.     {
  56.       memcpy(&(mb_pred[jj][ioff]), &(block[jj][0]), hor_block_size * sizeof(imgpel));
  57.     }
  58.   }
  59. }
  60. /*!
  61.  ************************************************************************
  62.  * brief
  63.  *    block single list weighted prediction
  64.  ************************************************************************
  65.  */
  66. static inline void weighted_mc_prediction(imgpel mb_pred[MB_BLOCK_SIZE][MB_BLOCK_SIZE],
  67.                             int ver_block_size, 
  68.                             int hor_block_size,
  69.                             int ioff,
  70.                             imgpel block[MB_BLOCK_SIZE][MB_BLOCK_SIZE], 
  71.                             int wp_scale,
  72.                             int wp_offset,
  73.                             int weight_denom,
  74.                             int color_clip)
  75. {
  76.   static int ii, jj;
  77.   static imgpel *mpr, *b0;
  78.   
  79.   for(jj=0;jj<ver_block_size;jj++)
  80.   {
  81.     mpr = &mb_pred[jj][ioff];
  82.     b0 = block[jj];
  83.     for(ii=0;ii<hor_block_size;ii++)
  84.       *(mpr++) = (imgpel) iClip1(color_clip, (rshift_rnd((wp_scale * *(b0++)), weight_denom)  + wp_offset ));
  85.   }
  86. }
  87. /*!
  88.  ************************************************************************
  89.  * brief
  90.  *    block biprediction
  91.  ************************************************************************
  92.  */
  93. static inline void bi_prediction(imgpel mb_pred[MB_BLOCK_SIZE][MB_BLOCK_SIZE],  
  94.                                  imgpel block_l0[MB_BLOCK_SIZE][MB_BLOCK_SIZE], 
  95.                                  imgpel block_l1[MB_BLOCK_SIZE][MB_BLOCK_SIZE],
  96.                                  int ver_block_size, 
  97.                                  int hor_block_size,
  98.                                  int ioff)
  99. {
  100.   static int ii, jj;
  101.   static imgpel *mpr, *b0, *b1;
  102.   for(jj = 0;jj < ver_block_size;jj++)
  103.   {
  104.     mpr = &mb_pred[jj][ioff];
  105.     b0 = block_l0[jj];
  106.     b1 = block_l1[jj];
  107.     for(ii = 0; ii < hor_block_size;ii++)
  108.       *(mpr++) = (imgpel) rshift_rnd_sf((*(b0++) + *(b1++)), 1);
  109.   }
  110. }
  111. /*!
  112.  ************************************************************************
  113.  * brief
  114.  *    block weighted biprediction
  115.  ************************************************************************
  116.  */
  117. static inline void weighted_bi_prediction(imgpel mb_pred[MB_BLOCK_SIZE][MB_BLOCK_SIZE], 
  118.                                           imgpel block_l0[MB_BLOCK_SIZE][MB_BLOCK_SIZE], 
  119.                                           imgpel block_l1[MB_BLOCK_SIZE][MB_BLOCK_SIZE],
  120.                                           int ver_block_size, 
  121.                                           int hor_block_size,
  122.                                           int ioff,
  123.                                           int wp_scale_l0,
  124.                                           int wp_scale_l1,
  125.                                           int wp_offset,
  126.                                           int weight_denom,
  127.                                           int color_clip)
  128. {
  129.   static int ii, jj;
  130.   static imgpel *mpr, *b0, *b1;
  131.   
  132.   for(jj = 0; jj < ver_block_size; jj++)
  133.   {
  134.     mpr = &mb_pred[jj][ioff];    
  135.     b0  = block_l0[jj];
  136.     b1  = block_l1[jj];
  137.     for(ii=0;ii<hor_block_size;ii++)
  138.       *(mpr++) = (imgpel) iClip1(color_clip, (rshift_rnd((wp_scale_l0 * *(b0++) + wp_scale_l1 * *(b1++)), weight_denom) + wp_offset));
  139.   }
  140. }
  141. void get_block_luma(int decoder, ColorPlane pl, StorablePicture* dec_picture, StorablePicture *curr_ref, int x_pos, int y_pos, int hor_block_size, int ver_block_size, ImageParameters *img, imgpel block[MB_BLOCK_SIZE][MB_BLOCK_SIZE])
  142. {
  143.   static int tmp_res[21][21];
  144.   static int *tmp_line;
  145.   static imgpel *p0, *p1, *p2, *p3, *p4, *p5;
  146.   static int    *x0, *x1, *x2, *x3, *x4, *x5;  
  147.   
  148.   static imgpel **cur_imgY, *cur_lineY;
  149.   static int ipos_m2, ipos_m1, ipos, ipos_p1, ipos_p2, ipos_p3;
  150.   static imgpel *orig_line;
  151.   int tmp_pos;
  152.   int dx = (x_pos & 3), dy = (y_pos & 3);
  153.   int i, j, jj;
  154.   int shift_x  = dec_picture->size_x;
  155.   int maxold_x = dec_picture->size_x - 1;
  156.   int maxold_y = (dec_picture->motion.mb_field[img->current_mb_nr]) ? (dec_picture->size_y >> 1) - 1 : dec_picture->size_y - 1;
  157.   int result;
  158.   int pres_x;
  159.   int max_imgpel_value = img->max_imgpel_value_comp[pl];
  160.   if( IS_INDEPENDENT(params) )
  161.   {
  162.     cur_imgY = curr_ref->p_dec_img[img->colour_plane_id][decoder];
  163.   }
  164.   else
  165.   {
  166.     cur_imgY = curr_ref->p_dec_img[pl][decoder];
  167.   }
  168.   x_pos = x_pos >> 2;
  169.   y_pos = y_pos >> 2;
  170.   if ( (y_pos > 1) && (y_pos < maxold_y - 2 - ver_block_size) && (x_pos > 1) && (x_pos < maxold_x - 2 - hor_block_size))
  171.   {
  172.     cur_imgY = &cur_imgY[ y_pos];
  173.     if (dx == 0 && dy == 0)
  174.     {  /* fullpel position */
  175.       for (j = 0; j < ver_block_size; j++)
  176.       {        
  177.         memcpy(&(block[j][0]), &(cur_imgY[j][x_pos]), hor_block_size * sizeof(imgpel));
  178.       }
  179.     }
  180.     else
  181.     { /* other positions */
  182.       if (dy == 0)
  183.       { /* No vertical interpolation */
  184.         for (j = 0; j < ver_block_size; j++)
  185.         {
  186.           p0 = &cur_imgY[j][x_pos - 2];
  187.           p1 = p0 + 1;
  188.           p2 = p1 + 1;
  189.           p3 = p2 + 1;
  190.           p4 = p3 + 1;
  191.           p5 = p4 + 1;
  192.           orig_line = block[j];
  193.           for (i = 0; i < hor_block_size; i++)
  194.           {        
  195.             result  = (*(p0++) + *(p5++)) * COEF[0]
  196.                     + (*(p1++) + *(p4++)) * COEF[1]
  197.                     + (*(p2++) + *(p3++)) * COEF[2];
  198.             *orig_line++ = (imgpel) iClip1(max_imgpel_value, ((result + 16)>>5));
  199.           }
  200.         }
  201.         if ((dx&1) == 1)
  202.         {          
  203.           for (j = 0; j < ver_block_size; j++)
  204.           {
  205.             cur_lineY = &(cur_imgY[j][x_pos + (dx >> 1)]);
  206.             orig_line = block[j];
  207.             for (i = 0; i < hor_block_size; i++)
  208.             {
  209.               *orig_line = (imgpel) ((*orig_line + *(cur_lineY++) + 1 ) >> 1);
  210.               orig_line++;
  211.             }
  212.           }
  213.         }
  214.       }
  215.       else if (dx == 0)
  216.       {  /* No horizontal interpolation */        
  217.         p0 = &(cur_imgY[ - 2][x_pos]);
  218.         for (j = 0; j < ver_block_size; j++)
  219.         {                  
  220.           p1 = p0 + shift_x;          
  221.           p2 = p1 + shift_x;
  222.           p3 = p2 + shift_x;
  223.           p4 = p3 + shift_x;
  224.           p5 = p4 + shift_x;
  225.           orig_line = block[j];
  226.           for (i = 0; i < hor_block_size; i++)
  227.           {
  228.             result  = (*(p0++) + *(p5++)) * COEF[0]
  229.                     + (*(p1++) + *(p4++)) * COEF[1]
  230.                     + (*(p2++) + *(p3++)) * COEF[2];
  231.             *orig_line++ = (imgpel) iClip1(max_imgpel_value, ((result + 16)>>5));
  232.           }
  233.           p0 = p1 - hor_block_size;
  234.         }
  235.         if ((dy&1) == 1)
  236.         {
  237.           jj = (dy >> 1);
  238.           for (j = 0; j < ver_block_size; j++)
  239.           {
  240.             cur_lineY = &(cur_imgY[jj++][x_pos]);
  241.             orig_line = block[j];
  242.             for (i = 0; i < hor_block_size; i++)
  243.             {
  244.               *orig_line = (imgpel) ((*orig_line + *(cur_lineY++) + 1 ) >> 1);
  245.               orig_line++;
  246.             }
  247.           }
  248.         }
  249.       }
  250.       else if (dx == 2)
  251.       {  /* Vertical & horizontal interpolation */
  252.         jj = - 2;
  253.         for (j = 0; j < ver_block_size + 5; j++)
  254.         {
  255.           p0 = &cur_imgY[jj++][x_pos - 2];
  256.           p1 = p0 + 1;
  257.           p2 = p1 + 1;
  258.           p3 = p2 + 1;
  259.           p4 = p3 + 1;
  260.           p5 = p4 + 1;
  261.           orig_line = block[j];
  262.           tmp_line  = tmp_res[j];
  263.           for (i = 0; i < hor_block_size; i++)
  264.           {        
  265.             *(tmp_line++) = (*(p0++) + *(p5++)) * COEF[0]
  266.                           + (*(p1++) + *(p4++)) * COEF[1]
  267.                           + (*(p2++) + *(p3++)) * COEF[2];
  268.           }
  269.         }
  270.         for (j = 0; j < ver_block_size; j++)
  271.         {
  272.           x0 = tmp_res[j    ];
  273.           x1 = tmp_res[j + 1];
  274.           x2 = tmp_res[j + 2];
  275.           x3 = tmp_res[j + 3];
  276.           x4 = tmp_res[j + 4];
  277.           x5 = tmp_res[j + 5];
  278.           orig_line = block[j];
  279.           for (i = 0; i < hor_block_size; i++)
  280.           {
  281.             result  = (*x0++ + *x5++) * COEF[0]
  282.                     + (*x1++ + *x4++) * COEF[1]
  283.                     + (*x2++ + *x3++) * COEF[2];
  284.             *(orig_line++) = (imgpel) iClip1(max_imgpel_value, ((result+512)>>10));
  285.           }
  286.         }
  287.         if ((dy&1) == 1)
  288.         {
  289.           jj = 2 + (dy>>1);
  290.           for (j = 0; j < ver_block_size; j++)
  291.           {            
  292.             tmp_line  = tmp_res[jj++];
  293.             orig_line = block[j];
  294.             for (i = 0; i < hor_block_size; i++)
  295.             {
  296.               *orig_line = (imgpel) ((*orig_line + iClip1(max_imgpel_value, ((*(tmp_line++) + 16) >> 5)) + 1 )>> 1);
  297.               orig_line++;
  298.             }
  299.           }
  300.         }
  301.       }
  302.       else if (dy == 2)
  303.       {  /* Horizontal & vertical interpolation */
  304.         p0 = &(cur_imgY[ -2][x_pos - 2]);
  305.         for (j = 0; j < ver_block_size; j++)
  306.         {                    
  307.           p1 = p0 + shift_x;
  308.           p2 = p1 + shift_x;
  309.           p3 = p2 + shift_x;
  310.           p4 = p3 + shift_x;
  311.           p5 = p4 + shift_x;
  312.           tmp_line  = tmp_res[j];
  313.           for (i = 0; i < hor_block_size + 5; i++)
  314.           {
  315.             *(tmp_line++)  = (*(p0++) + *(p5++)) * COEF[0]
  316.                            + (*(p1++) + *(p4++)) * COEF[1]
  317.                            + (*(p2++) + *(p3++)) * COEF[2];
  318.           }
  319.           p0 = p1 - (hor_block_size + 5);
  320.         }
  321.         for (j = 0; j < ver_block_size; j++)
  322.         {
  323.           orig_line = block[j];
  324.           x0 = tmp_res[j];
  325.           x1 = x0 + 1;
  326.           x2 = x1 + 1;
  327.           x3 = x2 + 1;
  328.           x4 = x3 + 1;
  329.           x5 = x4 + 1;
  330.           for (i = 0; i < hor_block_size; i++)
  331.           {
  332.             result  = (*(x0++) + *(x5++)) * COEF[0]
  333.                     + (*(x1++) + *(x4++)) * COEF[1]
  334.                     + (*(x2++) + *(x3++)) * COEF[2];
  335.             *(orig_line++) = (imgpel) iClip1(max_imgpel_value, ((result + 512)>>10));
  336.           }
  337.         }
  338.         if ((dx&1) == 1)
  339.         {
  340.           for (j = 0; j < ver_block_size; j++)
  341.           {
  342.             tmp_line  = &tmp_res[j][2 + (dx>>1)];
  343.             orig_line = block[j];
  344.             for (i = 0; i < hor_block_size; i++)
  345.             {
  346.               *orig_line = (imgpel) ((*orig_line + iClip1(max_imgpel_value, ((*(tmp_line++) + 16)>>5))+1)>>1);
  347.               orig_line ++;
  348.             }
  349.           }
  350.         }
  351.       }
  352.       else
  353.       {  /* Diagonal interpolation */
  354.         jj = (dy == 1 ? 0 : 1);
  355.         for (j = 0; j < ver_block_size; j++)
  356.         {
  357.           p0 = &cur_imgY[jj++][x_pos - 2];
  358.           p1 = p0 + 1;
  359.           p2 = p1 + 1;
  360.           p3 = p2 + 1;
  361.           p4 = p3 + 1;
  362.           p5 = p4 + 1;
  363.           orig_line = block[j];
  364.           for (i = 0; i < hor_block_size; i++)
  365.           {        
  366.             result  = (*(p0++) + *(p5++)) * COEF[0]
  367.                     + (*(p1++) + *(p4++)) * COEF[1]
  368.                     + (*(p2++) + *(p3++)) * COEF[2];
  369.             *(orig_line++) = (imgpel) iClip1(max_imgpel_value, ((result + 16)>>5));
  370.           }
  371.         }
  372.         p0 = &(cur_imgY[-2][(dx == 1 ? x_pos : x_pos + 1)]);
  373.         for (j = 0; j < ver_block_size; j++)
  374.         {        
  375.           p1 = p0 + shift_x;
  376.           p2 = p1 + shift_x;
  377.           p3 = p2 + shift_x;
  378.           p4 = p3 + shift_x;
  379.           p5 = p4 + shift_x;
  380.           orig_line = block[j];
  381.           for (i = 0; i < hor_block_size; i++)
  382.           {
  383.             result  = (*(p0++) + *(p5++)) * COEF[0]
  384.                     + (*(p1++) + *(p4++)) * COEF[1]
  385.                     + (*(p2++) + *(p3++)) * COEF[2];
  386.             *orig_line = (imgpel) ((*orig_line + iClip1(max_imgpel_value, ((result + 16) >> 5)) + 1) >> 1);
  387.             orig_line++;
  388.           }
  389.           p0 = p1 - hor_block_size ;
  390.         }      
  391.       }
  392.     }
  393.   }
  394.   else // unsafe positions
  395.   {
  396.     if (dx == 0 && dy == 0)
  397.     {  /* fullpel position */
  398.       for (j = 0; j < ver_block_size; j++)
  399.       {
  400.         cur_lineY = cur_imgY[iClip3(0, maxold_y, y_pos + j)];
  401.         orig_line = block[j];
  402.         for (i = 0; i < hor_block_size; i++)
  403.         {
  404.           *(orig_line++) = cur_lineY[iClip3(0, maxold_x, x_pos + i )];
  405.         }
  406.       }
  407.     }
  408.     else
  409.     { /* other positions */
  410.       if (dy == 0)
  411.       { /* No vertical interpolation */
  412.         tmp_pos = x_pos - 2;
  413.         for (i = 0; i < hor_block_size; i++)
  414.         {        
  415.           ipos_m2 = iClip3(0, maxold_x, tmp_pos++);
  416.           ipos_m1 = iClip3(0, maxold_x, tmp_pos++);
  417.           ipos    = iClip3(0, maxold_x, tmp_pos++);
  418.           ipos_p1 = iClip3(0, maxold_x, tmp_pos++);
  419.           ipos_p2 = iClip3(0, maxold_x, tmp_pos++);
  420.           ipos_p3 = iClip3(0, maxold_x, tmp_pos  );
  421.           tmp_pos -= 4;          
  422.           for (j = 0; j < ver_block_size; j++)
  423.           {
  424.             cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j)];
  425.             result  = (cur_lineY[ipos_m2] + cur_lineY[ipos_p3]) * COEF[0];
  426.             result += (cur_lineY[ipos_m1] + cur_lineY[ipos_p2]) * COEF[1];
  427.             result += (cur_lineY[ipos   ] + cur_lineY[ipos_p1]) * COEF[2];
  428.             block[j][i] = (imgpel) iClip1(max_imgpel_value, ((result + 16)>>5));
  429.           }
  430.         }
  431.         if ((dx&1) == 1)
  432.         {
  433.           for (j = 0; j < ver_block_size; j++)
  434.           {
  435.             cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j)];
  436.             orig_line = block[j];
  437.             for (i = 0; i < hor_block_size; i++)
  438.             {
  439.               *orig_line = (imgpel) ((*orig_line + cur_lineY[iClip3(0, maxold_x, x_pos + i + (dx >> 1))] + 1 ) >> 1);
  440.               orig_line++;
  441.             }
  442.           }
  443.         }
  444.       }
  445.       else if (dx == 0)
  446.       {  /* No horizontal interpolation */
  447.         tmp_pos = y_pos - 2;
  448.         for (j = 0; j < ver_block_size; j++)
  449.         { 
  450.           p0 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  451.           p1 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  452.           p2 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  453.           p3 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  454.           p4 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  455.           p5 = cur_imgY[iClip3(0, maxold_y, tmp_pos  )];
  456.           
  457.           tmp_pos -= 4;
  458.           orig_line = block[j];
  459.           for (i = 0; i < hor_block_size; i++)
  460.           {
  461.             pres_x = iClip3(0,maxold_x,x_pos+i);
  462.             result  = (p0[pres_x] + p5[pres_x]) * COEF[0];
  463.             result += (p1[pres_x] + p4[pres_x]) * COEF[1];
  464.             result += (p2[pres_x] + p3[pres_x]) * COEF[2];
  465.             *(orig_line++) = (imgpel) iClip1(max_imgpel_value, ((result+16)>>5));
  466.           }
  467.         }
  468.         if ((dy&1) == 1)
  469.         {
  470.           for (j = 0; j < ver_block_size; j++)
  471.           {
  472.             cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j+(dy>>1))];
  473.             orig_line = block[j];
  474.             for (i = 0; i < hor_block_size; i++)
  475.             {
  476.               *orig_line = (imgpel) ((*orig_line + cur_lineY[iClip3(0, maxold_x, x_pos + i)] + 1 ) >> 1);
  477.               orig_line++;
  478.             }
  479.           }
  480.         }
  481.       }
  482.       else if (dx == 2)
  483.       {  /* Vertical & horizontal interpolation */
  484.         tmp_pos = x_pos - 2;
  485.         for (i = 0; i < hor_block_size; i++)
  486.         {        
  487.           ipos_m2 = iClip3(0, maxold_x, tmp_pos++);
  488.           ipos_m1 = iClip3(0, maxold_x, tmp_pos++);
  489.           ipos    = iClip3(0, maxold_x, tmp_pos++);
  490.           ipos_p1 = iClip3(0, maxold_x, tmp_pos++);
  491.           ipos_p2 = iClip3(0, maxold_x, tmp_pos++);
  492.           ipos_p3 = iClip3(0, maxold_x, tmp_pos  );
  493.           tmp_pos -= 4;
  494.           for (j = 0; j < ver_block_size + 5; j++)
  495.           {
  496.             cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos + j - 2)];
  497.             tmp_res[j][i]  = (cur_lineY[ipos_m2] + cur_lineY[ipos_p3]) * COEF[0];
  498.             tmp_res[j][i] += (cur_lineY[ipos_m1] + cur_lineY[ipos_p2]) * COEF[1];
  499.             tmp_res[j][i] += (cur_lineY[ipos   ] + cur_lineY[ipos_p1]) * COEF[2];
  500.           }
  501.         }
  502.         for (j = 0; j < ver_block_size; j++)
  503.         {
  504.           x0 = tmp_res[j    ];
  505.           x1 = tmp_res[j + 1];
  506.           x2 = tmp_res[j + 2];
  507.           x3 = tmp_res[j + 3];
  508.           x4 = tmp_res[j + 4];
  509.           x5 = tmp_res[j + 5];
  510.           orig_line = block[j];
  511.           for (i = 0; i < hor_block_size; i++)
  512.           {
  513.             result  = (*x0++ + *x5++) * COEF[0]
  514.                     + (*x1++ + *x4++) * COEF[1]
  515.                     + (*x2++ + *x3++) * COEF[2];
  516.             *(orig_line++) = (imgpel) iClip1(max_imgpel_value, ((result+512)>>10));
  517.           }
  518.         }
  519.         if ((dy&1) == 1)
  520.         {
  521.           for (j = 0; j < ver_block_size; j++)
  522.           {
  523.             tmp_line  = tmp_res[j + 2 + (dy>>1)];            
  524.             orig_line = block[j];
  525.             for (i = 0; i < hor_block_size; i++)
  526.             {
  527.               *orig_line = (imgpel) ((*orig_line + iClip1(max_imgpel_value, ((*(tmp_line++) + 16) >> 5)) + 1 )>>1);
  528.               orig_line++;
  529.             }
  530.           }
  531.         }
  532.       }
  533.       else if (dy == 2)
  534.       {  /* Horizontal & vertical interpolation */
  535.         tmp_pos = y_pos - 2;
  536.         for (j = 0; j < ver_block_size; j++)
  537.         {
  538.           p0 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  539.           p1 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  540.           p2 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  541.           p3 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  542.           p4 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  543.           p5 = cur_imgY[iClip3(0, maxold_y, tmp_pos  )];
  544.           tmp_pos -= 4;
  545.           for (i = 0; i < hor_block_size + 5; i++)
  546.           {
  547.             pres_x = iClip3(0,maxold_x, x_pos + i - 2);
  548.             result  = (p0[pres_x] + p5[pres_x])*COEF[0]
  549.                     + (p1[pres_x] + p4[pres_x])*COEF[1]
  550.                     + (p2[pres_x] + p3[pres_x])*COEF[2];
  551.             tmp_res[j][i] = result;
  552.           }
  553.         }
  554.         for (j = 0; j < ver_block_size; j++)
  555.         {
  556.           orig_line = block[j];
  557.           tmp_line  = tmp_res[j];
  558.           x0 = tmp_res[j];
  559.           x1 = x0 + 1;
  560.           x2 = x1 + 1;
  561.           x3 = x2 + 1;
  562.           x4 = x3 + 1;
  563.           x5 = x4 + 1;
  564.           for (i = 0; i < hor_block_size; i++)
  565.           {
  566.             result  = (*(x0++) + *(x5++)) * COEF[0]
  567.                     + (*(x1++) + *(x4++)) * COEF[1]
  568.                     + (*(x2++) + *(x3++)) * COEF[2];
  569.             *(orig_line++) = (imgpel) iClip1(max_imgpel_value, ((result + 512)>>10));
  570.           }
  571.         }
  572.         if ((dx&1) == 1)
  573.         {
  574.           for (j = 0; j < ver_block_size; j++)
  575.           {
  576.             tmp_line  = &tmp_res[j][2 + (dx>>1)];
  577.             orig_line = block[j];            
  578.             for (i = 0; i < hor_block_size; i++)
  579.             {
  580.               *orig_line = (imgpel) ((*orig_line + iClip1(max_imgpel_value, ((*(tmp_line++) + 16)>>5)) + 1)>> 1);
  581.               orig_line++;
  582.             }
  583.           }
  584.         }
  585.       }
  586.       else
  587.       {  /* Diagonal interpolation */
  588.         tmp_pos = x_pos - 2;
  589.         for (i = 0; i < hor_block_size; i++)
  590.         {
  591.           ipos_m2 = iClip3(0, maxold_x, tmp_pos++);
  592.           ipos_m1 = iClip3(0, maxold_x, tmp_pos++);
  593.           ipos    = iClip3(0, maxold_x, tmp_pos++);
  594.           ipos_p1 = iClip3(0, maxold_x, tmp_pos++);
  595.           ipos_p2 = iClip3(0, maxold_x, tmp_pos++);
  596.           ipos_p3 = iClip3(0, maxold_x, tmp_pos  );
  597.           tmp_pos -= 4;
  598.           for (j = 0; j < ver_block_size; j++)
  599.           {
  600.             cur_lineY = cur_imgY[iClip3(0,maxold_y,(dy == 1 ? y_pos+j : y_pos+j+1))];
  601.             result  = (cur_lineY[ipos_m2] + cur_lineY[ipos_p3]) * COEF[0];
  602.             result += (cur_lineY[ipos_m1] + cur_lineY[ipos_p2]) * COEF[1];
  603.             result += (cur_lineY[ipos   ] + cur_lineY[ipos_p1]) * COEF[2];
  604.             block[j][i] = (imgpel) iClip1(max_imgpel_value, ((result+16)>>5));
  605.           }
  606.         }
  607.         tmp_pos = y_pos - 2;
  608.         for (j = 0; j < ver_block_size; j++)
  609.         {      
  610.           p0 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  611.           p1 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  612.           p2 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  613.           p3 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  614.           p4 = cur_imgY[iClip3(0, maxold_y, tmp_pos++)];
  615.           p5 = cur_imgY[iClip3(0, maxold_y, tmp_pos  )];
  616.           tmp_pos -= 4;
  617.           orig_line = block[j];
  618.           for (i = 0; i < hor_block_size; i++)
  619.           {
  620.             pres_x = dx == 1 ? x_pos+i : x_pos+i+1;
  621.             pres_x = iClip3(0, maxold_x, pres_x);
  622.             result  = (p0[pres_x] + p5[pres_x]) * COEF[0];
  623.             result += (p1[pres_x] + p4[pres_x]) * COEF[1];
  624.             result += (p2[pres_x] + p3[pres_x]) * COEF[2];
  625.             *orig_line = (imgpel) ((*orig_line + iClip1(max_imgpel_value, ((result+16)>>5)) + 1 ) >> 1);
  626.             orig_line++;
  627.           }
  628.         }      
  629.       }
  630.     }
  631.   }
  632. }
  633. void get_block_chroma(int decoder, int uv, StorablePicture* dec_picture, StorablePicture *curr_ref, int x_pos, int y_pos, int hor_block_size, int ver_block_size, ImageParameters *img, imgpel block[MB_BLOCK_SIZE][MB_BLOCK_SIZE])
  634. {
  635.   int subpel_x    = img->mb_cr_size_x == 8 ? 7 : 3;
  636.   int subpel_y    = img->mb_cr_size_y == 8 ? 7 : 3;
  637.   int shiftpel_x  = img->mb_cr_size_x == 8 ? 3 : 2;
  638.   int shiftpel_y  = img->mb_cr_size_y == 8 ? 3 : 2;
  639.   int total_scale = shiftpel_x + shiftpel_y;
  640.   int dx = (x_pos & subpel_x);
  641.   int dy = (y_pos & subpel_y);
  642.   int dxcur = (subpel_x + 1 - dx);
  643.   int dycur = (subpel_y + 1 - dy);
  644.   int w00 = dxcur * dycur;
  645.   int w01 = dxcur * dy;
  646.   int w10 = dx * dycur;
  647.   int w11 = dx * dy;
  648.   int i, j;
  649.   int maxold_x = dec_picture->size_x_cr - 1;
  650.   int maxold_y = (dec_picture->motion.mb_field[img->current_mb_nr]) ? (dec_picture->size_y_cr >> 1) - 1 : dec_picture->size_y_cr - 1;
  651.   int result;
  652.   
  653.   static imgpel **cur_img, *blk_line;
  654.   static imgpel *cur_line, *cur_line_p1;
  655.   int tmp_pos;
  656.   static int ipos, ipos_p1;
  657.   int    max_imgpel_value = img->max_imgpel_value_comp[uv + 1];
  658. #if 0
  659.   if (curr_ref == no_reference_picture && img->framepoc < img->recovery_poc)
  660.   {
  661.     printf("list[ref_frame] is equal to 'no reference picture' before RAPn");
  662.     /* fill the block with sample value 128 */
  663.     for (j = 0; j < ver_block_size; j++)
  664.       for (i = 0; i < hor_block_size; i++)
  665.         block[j][i] = 128;
  666.     return;
  667.   }
  668. #endif
  669.   cur_img = curr_ref->p_dec_img[uv+1][decoder];
  670.   x_pos = x_pos >> shiftpel_x;
  671.   y_pos = y_pos >> shiftpel_y;
  672.   if ((y_pos >= 0) && (y_pos < maxold_y - ver_block_size) && (x_pos >= 0) && (x_pos < maxold_x - hor_block_size))
  673.   {
  674.     if (dx == 0 && dy == 0)
  675.     {  /* fullpel position */
  676.       for (j = 0; j < ver_block_size; j++)
  677.       {        
  678.         memcpy(&(block[j][0]), &(cur_img[ y_pos + j ][x_pos]), hor_block_size * sizeof(imgpel));
  679.       }
  680.     }
  681.     else if (dx == 0)
  682.     { 
  683.       for (j = 0; j < ver_block_size; j++)
  684.       {
  685.         cur_line    = &cur_img[y_pos + j    ][x_pos];
  686.         cur_line_p1 = &cur_img[y_pos + j + 1][x_pos];
  687.         blk_line = block[j];
  688.         for (i = 0; i < hor_block_size; i++)
  689.         {
  690.           result = (w00 * *cur_line++ + w01 * *cur_line_p1++);
  691.           *(blk_line++) = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf(result, total_scale));
  692.         }
  693.       }
  694.     }
  695.     else if (dy == 0)
  696.     { 
  697.       for (j = 0; j < ver_block_size; j++)
  698.       {
  699.         cur_line    = &cur_img[y_pos + j][x_pos];
  700.         cur_line_p1 = cur_line + 1;
  701.         blk_line = block[j];
  702.         for (i = 0; i < hor_block_size; i++)
  703.         {
  704.           result = (w00 * *cur_line++ + w10 * *cur_line_p1++);
  705.           *(blk_line++) = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf(result, total_scale));
  706.         }
  707.       }
  708.     }
  709.     else
  710.     { /* other positions */
  711.       for (j = 0; j < ver_block_size; j++)
  712.       {
  713.         cur_line    = &cur_img[y_pos + j    ][x_pos];
  714.         cur_line_p1 = &cur_img[y_pos + j + 1][x_pos];
  715.         blk_line = block[j];
  716.         for (i = 0; i < hor_block_size; i++)
  717.         {
  718.           result  = (w00 * *(cur_line++) + w01 * *(cur_line_p1++));
  719.           result += (w10 * *(cur_line  ) + w11 * *(cur_line_p1  ));
  720.           *(blk_line++) = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf(result, total_scale));
  721.         }
  722.       }
  723.     }
  724.   }
  725.   else // unsafe positions
  726.   {
  727.     if (dx == 0 && dy == 0)
  728.     {  /* fullpel position */
  729.       for (j = 0; j < ver_block_size; j++)
  730.       {
  731.         cur_line = cur_img[iClip3(0, maxold_y, y_pos + j)];
  732.         blk_line = block[j];
  733.         for (i = 0; i < hor_block_size; i++)
  734.         {
  735.           *(blk_line++) = cur_line[iClip3(0, maxold_x, x_pos + i )];
  736.         }
  737.       }
  738.     }
  739.     else if (dx == 0)
  740.     { 
  741.       for (j = 0; j < ver_block_size; j++)
  742.       {
  743.         cur_line    = cur_img[iClip3(0, maxold_y, y_pos + j)];
  744.         cur_line_p1 = cur_img[iClip3(0, maxold_y, y_pos + j + 1)];
  745.         tmp_pos = x_pos;
  746.         blk_line = block[j];
  747.         for (i = 0; i < hor_block_size; i++)
  748.         {
  749.           ipos    = iClip3(0, maxold_x, tmp_pos++);
  750.           result = (w00 * cur_line[ipos] + w01 * cur_line_p1[ipos]);
  751.           *(blk_line++) = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf(result, total_scale));
  752.         }
  753.       }      
  754.     }
  755.     else if (dy == 0)
  756.     { 
  757.       for (j = 0; j < ver_block_size; j++)
  758.       {
  759.         cur_line    = cur_img[iClip3(0, maxold_y, y_pos + j)];
  760.         tmp_pos = x_pos;
  761.         blk_line = block[j];
  762.         for (i = 0; i < hor_block_size; i++)
  763.         {
  764.           ipos    = iClip3(0, maxold_x, tmp_pos++);
  765.           ipos_p1 = iClip3(0, maxold_x, tmp_pos  );
  766.           result = (w00 * cur_line[ipos   ] + w10 * cur_line[ipos_p1]);
  767.           *(blk_line++) = (imgpel)iClip1(max_imgpel_value, rshift_rnd_sf(result, total_scale));
  768.         }
  769.       }      
  770.     }
  771.     else
  772.     { /* other positions */ 
  773.       for (j = 0; j < ver_block_size; j++)
  774.       {
  775.         cur_line    = cur_img[iClip3(0, maxold_y, y_pos + j)];
  776.         cur_line_p1 = cur_img[iClip3(0, maxold_y, y_pos + j + 1)];
  777.         tmp_pos = x_pos;
  778.         blk_line = block[j];
  779.         for (i = 0; i < hor_block_size; i++)
  780.         {
  781.           ipos    = iClip3(0, maxold_x, tmp_pos++);
  782.           ipos_p1 = iClip3(0, maxold_x, tmp_pos  );
  783.           result = (
  784.             w00 * cur_line   [ipos   ] + 
  785.             w10 * cur_line   [ipos_p1] +
  786.             w01 * cur_line_p1[ipos   ] +
  787.             w11 * cur_line_p1[ipos_p1]);
  788.           *(blk_line++) = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf(result, total_scale));
  789.         }
  790.       }      
  791.     }
  792.   }
  793. }
  794. #if 0
  795. void intra_cr_decoding(Macroblock *currMB, int yuv, ImageParameters *img, int smb)
  796. {
  797.   imgpel **curUV, *cur_img;
  798.   int (*m7UV)[16], *m7;
  799.   int uv;
  800.   int b8,b4;
  801.   int ioff, joff, ii, jj;
  802.   for(uv = 0; uv < 2; uv++)
  803.   {
  804.     Boolean lossless_qpprime = (Boolean) ((img->lossless_qpprime_flag == 1) &&((img->qp + dec_picture->chroma_qp_offset[uv] + img->bitdepth_chroma_qp_scale) == 0));
  805.     itrans_4x4 = (!lossless_qpprime) ? itrans4x4 : itrans4x4_ls;
  806.     curUV = dec_picture->imgUV[uv];
  807.     m7UV  = img->mb_rres[uv+1];
  808.     intrapred_chroma(img, currMB, uv);
  809.     if (!smb && (currMB->cbp >> 4))
  810.     {
  811.       for (b8 = 0; b8 < (img->num_uv_blocks); b8++)
  812.       {
  813.         for(b4 = 0; b4 < 4; b4++)
  814.         {
  815.           joff = subblk_offset_y[yuv][b8][b4];          
  816.           ioff = subblk_offset_x[yuv][b8][b4];          
  817.           itrans_4x4(img, (ColorPlane) (uv + 1), ioff, joff);
  818.           for(jj=joff; jj<joff + 4;jj++)
  819.           {
  820.             cur_img = &curUV[img->pix_c_y+jj][img->pix_c_x + ioff];
  821.             m7 = &m7UV[jj][ioff];
  822.             for(ii=0; ii<4;ii++)
  823.             {
  824.               *cur_img++ = (imgpel) *m7++;
  825.             }
  826.           }
  827.         }
  828.       }
  829.     }
  830.     else if ((currMB->cbp >> 4) == 0)
  831.     {
  832.       for (b8 = 0; b8 < (img->num_uv_blocks); b8++)
  833.       {
  834.         for(b4 = 0; b4 < 4; b4++)
  835.         {
  836.           joff = subblk_offset_y[yuv][b8][b4];
  837.           ioff = subblk_offset_x[yuv][b8][b4];          
  838.           for(jj = joff; jj < 4 + joff;jj++)
  839.             memcpy(&(curUV[img->pix_c_y + jj][img->pix_c_x + ioff]), &(img->mb_pred[uv + 1][jj][ioff]), BLOCK_SIZE * sizeof(imgpel));
  840.         }
  841.       }
  842.     }
  843.     else
  844.     {
  845.       itrans_sp_cr(img, uv);
  846.       for (joff  = 0; joff < 8; joff += 4)
  847.       {
  848.         for(ioff = 0; ioff < 8;ioff+=4)
  849.         {          
  850.           itrans_4x4(img, (ColorPlane) (uv + 1), ioff, joff);
  851.           for(jj = joff; jj < joff + 4; jj++)
  852.             for(ii = ioff; ii < ioff + 4; ii++)
  853.             {
  854.               curUV[img->pix_c_y+jj][ii + img->pix_c_x] = (imgpel) img->mb_rres[uv+1][jj][ii];
  855.             }
  856.         }
  857.       }
  858.     }
  859.   }
  860. }
  861. void prepare_direct_params(Macroblock *currMB, StorablePicture *dec_picture, ImageParameters *img, short pmvl0[2], short pmvl1[2],char *l0_rFrame, char *l1_rFrame)
  862. {
  863.   char l0_rFrameL, l0_rFrameU, l0_rFrameUL, l0_rFrameUR;
  864.   char l1_rFrameL, l1_rFrameU, l1_rFrameUL, l1_rFrameUR;
  865.   
  866.   PixelPos mb_left, mb_up, mb_upleft, mb_upright;
  867.   get4x4Neighbour(currMB, -1,  0, img->mb_size[IS_LUMA], &mb_left);
  868.   get4x4Neighbour(currMB,  0, -1, img->mb_size[IS_LUMA], &mb_up);
  869.   get4x4Neighbour(currMB, 16, -1, img->mb_size[IS_LUMA], &mb_upright);
  870.   get4x4Neighbour(currMB, -1, -1, img->mb_size[IS_LUMA], &mb_upleft);
  871.   if (!img->MbaffFrameFlag)
  872.   {
  873.     l0_rFrameL  = (char) (mb_left.available    ? dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x]       : -1);
  874.     l0_rFrameU  = (char) (mb_up.available      ? dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x]           : -1);
  875.     l0_rFrameUL = (char) (mb_upleft.available  ? dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x]   : -1);
  876.     l0_rFrameUR = (char) (mb_upright.available ? dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] : l0_rFrameUL);
  877.     l1_rFrameL  = (char) (mb_left.available     ? dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x]      : -1);
  878.     l1_rFrameU  = (char) (mb_up.available       ? dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x]          : -1);
  879.     l1_rFrameUL = (char) (mb_upleft.available  ? dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x]   : -1);
  880.     l1_rFrameUR = (char) (mb_upright.available ? dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] : l1_rFrameUL);
  881.   }
  882.   else
  883.   {
  884.     if (currMB->mb_field)
  885.     {
  886.       l0_rFrameL = (char) (mb_left.available 
  887.         ? img->mb_data[mb_left.mb_addr].mb_field  || dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x] < 0
  888.         ? dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x] 
  889.         : dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x] * 2: -1);
  890.       l0_rFrameU = (char) (mb_up.available 
  891.         ? img->mb_data[mb_up.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x] < 0
  892.         ? dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x] 
  893.         : dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x] * 2: -1);
  894.        l0_rFrameUL = (char) (mb_upleft.available 
  895.          ? img->mb_data[mb_upleft.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x] < 0
  896.          ? dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x] 
  897.          : dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x] *2: -1);
  898.        l0_rFrameUR = (char) (mb_upright.available 
  899.          ? img->mb_data[mb_upright.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] < 0 
  900.          ? dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] 
  901.          : dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] * 2: l0_rFrameUL);
  902.        l1_rFrameL = (char) (mb_left.available 
  903.          ? img->mb_data[mb_left.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x]  < 0 
  904.          ? dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x] 
  905.          : dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x] * 2: -1);
  906.        l1_rFrameU = (char) (mb_up.available 
  907.          ? img->mb_data[mb_up.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x]  < 0 
  908.          ? dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x] 
  909.          : dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x] * 2: -1);
  910.        l1_rFrameUL = (char) (mb_upleft.available 
  911.          ? img->mb_data[mb_upleft.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x]  < 0 
  912.          ? dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x] 
  913.          : dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x] *2 : -1);
  914.        l1_rFrameUR = (char) (mb_upright.available 
  915.          ? img->mb_data[mb_upright.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] < 0
  916.          ? dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] 
  917.          : dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] * 2: l1_rFrameUL);
  918.     }
  919.     else
  920.     {
  921.       l0_rFrameL = (char) (mb_left.available 
  922.         ? img->mb_data[mb_left.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x]  < 0 
  923.         ? dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x] >> 1 
  924.         : dec_picture->motion.ref_idx[LIST_0][mb_left.pos_y][mb_left.pos_x]: -1);
  925.       l0_rFrameU = (char) (mb_up.available 
  926.         ? img->mb_data[mb_up.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x] < 0 
  927.         ? dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x] >> 1 
  928.         : dec_picture->motion.ref_idx[LIST_0][mb_up.pos_y][mb_up.pos_x] : -1);
  929.       l0_rFrameUL = (char) (mb_upleft.available 
  930.         ? img->mb_data[mb_upleft.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x] < 0 
  931.         ? dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x]>> 1 
  932.         : dec_picture->motion.ref_idx[LIST_0][mb_upleft.pos_y][mb_upleft.pos_x] : -1);
  933.       l0_rFrameUR = (char) (mb_upright.available 
  934.         ? img->mb_data[mb_upright.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] < 0 
  935.         ? dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] >> 1 
  936.         : dec_picture->motion.ref_idx[LIST_0][mb_upright.pos_y][mb_upright.pos_x] : l0_rFrameUL);
  937.       l1_rFrameL = (char) (mb_left.available 
  938.         ? img->mb_data[mb_left.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x] < 0 
  939.         ? dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x] >> 1 
  940.         : dec_picture->motion.ref_idx[LIST_1][mb_left.pos_y][mb_left.pos_x] : -1);
  941.       l1_rFrameU = (char) (mb_up.available 
  942.         ? img->mb_data[mb_up.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x] < 0 
  943.         ? dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x] >> 1 
  944.         : dec_picture->motion.ref_idx[LIST_1][mb_up.pos_y][mb_up.pos_x] : -1);
  945.       l1_rFrameUL = (char) (mb_upleft.available 
  946.         ? img->mb_data[mb_upleft.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x] < 0 
  947.         ? dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x] >> 1 
  948.         : dec_picture->motion.ref_idx[LIST_1][mb_upleft.pos_y][mb_upleft.pos_x] : -1);
  949.       l1_rFrameUR = (char) (mb_upright.available 
  950.         ? img->mb_data[mb_upright.mb_addr].mb_field || dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] < 0 
  951.         ? dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] >> 1
  952.         : dec_picture->motion.ref_idx[LIST_1][mb_upright.pos_y][mb_upright.pos_x] : l1_rFrameUL);
  953.     }
  954.   }
  955.   *l0_rFrame = (char) ((l0_rFrameL >= 0 && l0_rFrameU >= 0)  ? imin(l0_rFrameL,l0_rFrameU) : imax(l0_rFrameL,l0_rFrameU));
  956.   *l0_rFrame = (char) ((*l0_rFrame >= 0 && l0_rFrameUR >= 0) ? imin(*l0_rFrame,l0_rFrameUR): imax(*l0_rFrame,l0_rFrameUR));
  957.   *l1_rFrame = (char) ((l1_rFrameL >= 0 && l1_rFrameU >= 0)  ? imin(l1_rFrameL,l1_rFrameU) : imax(l1_rFrameL,l1_rFrameU));
  958.   *l1_rFrame = (char) ((*l1_rFrame >= 0 && l1_rFrameUR >= 0) ? imin(*l1_rFrame,l1_rFrameUR): imax(*l1_rFrame,l1_rFrameUR));
  959.   if (*l0_rFrame >=0)
  960.     SetMotionVectorPredictor (img, currMB, pmvl0, *l0_rFrame, LIST_0, dec_picture->motion.ref_idx, dec_picture->motion.mv, 0, 0, 16, 16);
  961.   if (*l1_rFrame >=0)
  962.     SetMotionVectorPredictor (img, currMB, pmvl1, *l1_rFrame, LIST_1, dec_picture->motion.ref_idx, dec_picture->motion.mv, 0, 0, 16, 16);
  963. }
  964. void check_motion_vector_range(ImageParameters *img, short mv_x, short mv_y)
  965. {
  966.   if (mv_x > 8191 || mv_x < -8192)
  967.   {
  968.     fprintf(stderr,"ERROR! Horizontal motion vector %d is out of allowed range {-8192, 8191} in picture %d, macroblock %dn", mv_x, img->number, img->current_mb_nr);
  969.     error("invalid stream: too big horizontal motion vector", 500);
  970.   }
  971.   if (mv_y > (img->max_mb_vmv_r - 1) || mv_y < (-img->max_mb_vmv_r))
  972.   {
  973.     fprintf(stderr,"ERROR! Vertical motion vector %d is out of allowed range {%d, %d} in picture %d, macroblock %dn", mv_y, (-img->max_mb_vmv_r), (img->max_mb_vmv_r - 1), img->number, img->current_mb_nr);
  974.     error("invalid stream: too big vertical motion vector", 500);
  975.   }
  976. }
  977. #endif
  978. void perform_mc(int decoder, ColorPlane pl, StorablePicture *dec_picture, ImageParameters *img, int pred_dir, int l0_mode, int l1_mode, int i, int j, int list_offset, int block_size_x, int block_size_y, int curr_mb_field)
  979. {
  980.   static int vec1_x=0, vec1_y=0;
  981. #if 0
  982.   static int vec2_x=0, vec2_y=0;
  983.   static int vec1_y_cr = 0, vec2_y_cr = 0;
  984.   static int alpha_l0, alpha_l1, wp_offset;
  985.   int        max_imgpel_value = img->max_imgpel_value_comp[pl];
  986. #endif
  987.   static const int mv_mul = 16; // 4 * 4
  988.   
  989.   int i4   = img->block_x + i;
  990.   int j4   = img->block_y + j;
  991.   int ioff = (i << 2);
  992.   int joff = (j << 2);         
  993.   
  994.   assert (pred_dir<=2);
  995.   if (pred_dir != 2)
  996.   {
  997.     //===== Single List Prediction =====
  998.     short       ref_idx = dec_picture->motion.ref_idx[pred_dir][j4][i4];
  999.     //short       ref_idx_wp = ref_idx;
  1000.     short      ***mv_array = img->all_mv[pred_dir][ref_idx][l0_mode];
  1001.     StorablePicture **list = listX[list_offset + pred_dir];
  1002.     //check_motion_vector_range(img, mv_array[j4][i4][0], mv_array[j4][i4][1]);
  1003.     vec1_x = i4 * mv_mul + mv_array[j][i][0];
  1004.     //vec1_y = (img->block_y_aff + j) * mv_mul + mv_array[j4][i4][1];
  1005.     vec1_y = j4 * mv_mul + mv_array[j][i][1];
  1006.     get_block_luma (decoder, pl, dec_picture, list[ref_idx], vec1_x, vec1_y, block_size_x, block_size_y, img, tmp_block_l0); 
  1007. #if 0 //Currently not used
  1008.     if (img->apply_weights)
  1009.     {
  1010.       if (curr_mb_field && ((active_pps->weighted_pred_flag&&(img->type==P_SLICE|| img->type == SP_SLICE))||
  1011.          (active_pps->weighted_bipred_idc==1 && (img->type==B_SLICE))))
  1012.       {
  1013.         ref_idx_wp >>=1;
  1014.       }
  1015.       alpha_l0  = img->wp_weight[pred_dir][ref_idx_wp][0];
  1016.       wp_offset = img->wp_offset[pred_dir][ref_idx_wp][0];
  1017.       weighted_mc_prediction(&img->mb_pred[pl][joff], block_size_y, block_size_x, ioff, tmp_block_l0, alpha_l0, wp_offset, img->luma_log2_weight_denom, max_imgpel_value);
  1018.     }
  1019.     else
  1020. #endif
  1021.     {
  1022.       mc_prediction(&img->mb_pred[pl][joff], block_size_y, block_size_x, ioff, tmp_block_l0); 
  1023.     }
  1024. #if 0
  1025.     if ((dec_picture->chroma_format_idc != YUV400) && (dec_picture->chroma_format_idc != YUV444) ) 
  1026.     {
  1027.       int uv;
  1028.       int ioff_cr = (img->mb_cr_size_x == MB_BLOCK_SIZE) ? ioff : ioff >> 1;
  1029.       int joff_cr = (img->mb_cr_size_y == MB_BLOCK_SIZE) ? joff : joff >> 1;
  1030.       int block_size_x_cr = img->mb_cr_size_x == MB_BLOCK_SIZE ? block_size_x : block_size_x >> 1;
  1031.       int block_size_y_cr = img->mb_cr_size_y == MB_BLOCK_SIZE ? block_size_y : block_size_y >> 1;
  1032.       vec1_y_cr = vec1_y + ((active_sps->chroma_format_idc == 1)? list[ref_idx]->chroma_vector_adjustment : 0);
  1033.       for(uv=0;uv<2;uv++)
  1034.       {
  1035.         get_block_chroma (uv, list[ref_idx], vec1_x, vec1_y_cr, block_size_x_cr, block_size_y_cr, img, tmp_block_l0);
  1036.         if (img->apply_weights)
  1037.         {
  1038.           alpha_l0  = img->wp_weight[pred_dir][ref_idx_wp][uv + 1];
  1039.           wp_offset = img->wp_offset[pred_dir][ref_idx_wp][uv + 1];
  1040.           weighted_mc_prediction(&img->mb_pred[uv + 1][joff_cr], block_size_y_cr, block_size_x_cr, ioff_cr, tmp_block_l0, alpha_l0, wp_offset, img->chroma_log2_weight_denom, img->max_imgpel_value_comp[uv + 1]);
  1041.         }
  1042.         else
  1043.         {
  1044.           mc_prediction(&img->mb_pred[uv + 1][joff_cr], block_size_y_cr, block_size_x_cr, ioff_cr, tmp_block_l0);
  1045.         }
  1046.       }
  1047.     }
  1048. #endif
  1049.   }
  1050.   else
  1051.   {
  1052. #if 0
  1053.     //===== BI-PREDICTION =====
  1054.     short ***l0_mv_array = dec_picture->motion.mv[LIST_0];
  1055.     short ***l1_mv_array = dec_picture->motion.mv[LIST_1];
  1056.     short l0_refframe = dec_picture->motion.ref_idx[LIST_0][j4][i4];
  1057.     short l1_refframe = dec_picture->motion.ref_idx[LIST_1][j4][i4];
  1058.     short l0_ref_idx  = l0_refframe;
  1059.     short l1_ref_idx  = l1_refframe;
  1060.     check_motion_vector_range(img, l0_mv_array[j4][i4][0], l0_mv_array[j4][i4][1]);
  1061.     check_motion_vector_range(img, l1_mv_array[j4][i4][0], l1_mv_array[j4][i4][1]);
  1062.     vec1_x = i4 * mv_mul + l0_mv_array[j4][i4][0];
  1063.     vec2_x = i4 * mv_mul + l1_mv_array[j4][i4][0];
  1064.     vec1_y = (img->block_y_aff + j) * mv_mul + l0_mv_array[j4][i4][1];
  1065.     vec2_y = (img->block_y_aff + j) * mv_mul + l1_mv_array[j4][i4][1];
  1066.     get_block_luma(pl, listX[LIST_0 + list_offset][l0_refframe], vec1_x, vec1_y, block_size_x, block_size_y, img, tmp_block_l0);  
  1067.     get_block_luma(pl, listX[LIST_1 + list_offset][l1_refframe], vec2_x, vec2_y, block_size_x, block_size_y, img, tmp_block_l1);  
  1068.     if(img->apply_weights)
  1069.     {
  1070.       int wt_list_offset = (active_pps->weighted_bipred_idc==2)? list_offset : 0;
  1071.       // This code existed in the original. Seems pointless but copying it here for reference and in case temporal direct breaks.
  1072.       // if (mv_mode==0 && img->direct_spatial_mv_pred_flag==0 ) l1_ref_idx=0;    
  1073.       if (((active_pps->weighted_pred_flag&&(img->type==P_SLICE|| img->type == SP_SLICE))||
  1074.         (active_pps->weighted_bipred_idc==1 && (img->type==B_SLICE))) && curr_mb_field)
  1075.       {
  1076.         l0_ref_idx >>=1;
  1077.         l1_ref_idx >>=1;
  1078.       }
  1079.       alpha_l0  =   img->wbp_weight[LIST_0 + wt_list_offset][l0_ref_idx][l1_ref_idx][0];
  1080.       alpha_l1  =   img->wbp_weight[LIST_1 + wt_list_offset][l0_ref_idx][l1_ref_idx][0];
  1081.       wp_offset = ((img->wp_offset [LIST_0 + wt_list_offset][l0_ref_idx][0] + img->wp_offset[LIST_1 + wt_list_offset][l1_ref_idx][0] + 1) >>1);
  1082.       weighted_bi_prediction(&img->mb_pred[pl][joff], tmp_block_l0, tmp_block_l1, block_size_y, block_size_x, ioff, alpha_l0, alpha_l1, wp_offset, (img->luma_log2_weight_denom + 1), max_imgpel_value);
  1083.     }
  1084.     else
  1085.     { 
  1086.       bi_prediction(&img->mb_pred[pl][joff], tmp_block_l0, tmp_block_l1, block_size_y, block_size_x, ioff); 
  1087.     }
  1088.     if ((dec_picture->chroma_format_idc != YUV400) && (dec_picture->chroma_format_idc != YUV444) ) 
  1089.     {
  1090.       int uv;
  1091.       int ioff_cr = img->mb_cr_size_x == MB_BLOCK_SIZE ? ioff : ioff >> 1;
  1092.       int joff_cr = img->mb_cr_size_y == MB_BLOCK_SIZE ? joff : joff >> 1;
  1093.       int block_size_x_cr = img->mb_cr_size_x == MB_BLOCK_SIZE ? block_size_x : block_size_x >> 1;
  1094.       int block_size_y_cr = img->mb_cr_size_y == MB_BLOCK_SIZE ? block_size_y : block_size_y >> 1;
  1095.       vec1_y_cr = vec1_y + ((active_sps->chroma_format_idc == 1)? listX[LIST_0 + list_offset][l0_refframe]->chroma_vector_adjustment : 0);
  1096.       vec2_y_cr = vec2_y + ((active_sps->chroma_format_idc == 1)? listX[LIST_1 + list_offset][l1_refframe]->chroma_vector_adjustment : 0);
  1097.       for(uv=0;uv<2;uv++)
  1098.       {
  1099.         get_block_chroma (uv, listX[LIST_0 + list_offset][l0_refframe], vec1_x, vec1_y_cr, block_size_x_cr, block_size_y_cr, img, tmp_block_l0);
  1100.         get_block_chroma (uv, listX[LIST_1 + list_offset][l1_refframe], vec2_x, vec2_y_cr, block_size_x_cr, block_size_y_cr, img, tmp_block_l1);
  1101.         if(img->apply_weights)
  1102.         {
  1103.           int wt_list_offset = (active_pps->weighted_bipred_idc==2)? list_offset : 0;
  1104.           alpha_l0  =   img->wbp_weight[LIST_0 + wt_list_offset][l0_ref_idx][l1_ref_idx][uv + 1];
  1105.           alpha_l1  =   img->wbp_weight[LIST_1 + wt_list_offset][l0_ref_idx][l1_ref_idx][uv + 1];
  1106.           wp_offset = ((img->wp_offset [LIST_0 + wt_list_offset][l0_ref_idx][uv + 1] + img->wp_offset[LIST_1 + wt_list_offset][l1_ref_idx][uv + 1] + 1) >>1);
  1107.           weighted_bi_prediction(&img->mb_pred[uv+1][joff_cr], tmp_block_l0, tmp_block_l1, block_size_y_cr, block_size_x_cr, ioff_cr, alpha_l0, alpha_l1, wp_offset, (img->chroma_log2_weight_denom + 1), img->max_imgpel_value_comp[uv + 1]);
  1108.         }
  1109.         else
  1110.         {
  1111.           bi_prediction(&img->mb_pred[uv + 1][joff_cr], tmp_block_l0, tmp_block_l1, block_size_y_cr, block_size_x_cr, ioff_cr);
  1112.         }
  1113.       }
  1114.     }
  1115. #endif
  1116.   }
  1117. }
  1118. void perform_mc_concealment(int decoder, ColorPlane pl, StorablePicture *dec_picture, ImageParameters *img, int pred_dir, int i, int j, int block_size_x, int block_size_y)
  1119. {
  1120.   static int vec1_x=0, vec1_y=0;
  1121.   static const int mv_mul = 16; // 4 * 4
  1122.   
  1123.   int i4   = img->block_x + i;
  1124.   int j4   = img->block_y + j;
  1125.   int ioff = (i << 2);
  1126.   int joff = (j << 2);         
  1127.   
  1128.   assert (pred_dir<=2);
  1129.   if (pred_dir != 2)
  1130.   {
  1131.     //===== Single List Prediction =====
  1132.     short       ref_idx = dec_picture->motion.ref_idx[pred_dir][j4][i4];
  1133.     short      ***mv_array = dec_picture->motion.mv[pred_dir];
  1134.     StorablePicture **list = listX[pred_dir];
  1135.     vec1_x = i4 * mv_mul + mv_array[j4][i4][0];
  1136.     vec1_y = j4 * mv_mul + mv_array[j4][i4][1];
  1137.     get_block_luma (decoder, pl, dec_picture, list[ref_idx], vec1_x, vec1_y, block_size_x, block_size_y, img, tmp_block_l0); 
  1138.     mc_prediction(&img->mb_pred[pl][joff], block_size_y, block_size_x, ioff, tmp_block_l0); 
  1139.   }
  1140. }