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

Audio

开发平台:

Visual C++

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