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

Audio

开发平台:

Visual C++

  1. /*!
  2. *************************************************************************************
  3. * file img_luma.c
  4. *
  5. * brief
  6. *    Luma interpolation functions
  7. *
  8. * author
  9. *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10. *      - Alexis Michael Tourapis <alexis.tourapis@dolby.com>
  11. *      - Athanasios Leontaris    <aleon@dolby.com>
  12. *
  13. *************************************************************************************
  14. */
  15. #include "contributors.h"
  16. #include <limits.h>
  17. #include "global.h"
  18. #include "image.h"
  19. #include "img_luma.h"
  20. #include "memalloc.h"
  21. const int ONE_FOURTH_TAP[2][3] =
  22. {
  23.   {20, -5, 1},  // AVC Interpolation taps
  24.   {20,-4, 0},   // Experimental - not valid
  25. };
  26. /*!
  27.  ************************************************************************
  28.  * brief
  29.  *    Creates the 4x4 = 16 images that contain quarter-pel samples
  30.  *    sub-sampled at different spatial orientations;
  31.  *    enables more efficient implementation
  32.  *
  33.  * param s
  34.  *    pointer to StorablePicture structure
  35.  s************************************************************************
  36.  */
  37. void getSubImagesLuma( StorablePicture *s )
  38. {
  39.   imgpel  **p_curr_img = s->p_curr_img;
  40.   imgpel ****cImgSub   = s->p_curr_img_sub;
  41.   //  0  1  2  3
  42.   //  4  5  6  7
  43.   //  8  9 10 11
  44.   // 12 13 14 15
  45.   //// INTEGER PEL POSITIONS ////
  46.   // sub-image 0 [0][0]
  47.   // simply copy the integer pels
  48.   getSubImageInteger( s, cImgSub[0][0], p_curr_img);
  49.   //// HALF-PEL POSITIONS: SIX-TAP FILTER ////
  50.   // sub-image 2 [0][2]
  51.   // HOR interpolate (six-tap) sub-image [0][0]
  52.   getHorSubImageSixTap( s, cImgSub[0][2], cImgSub[0][0] );
  53.   // sub-image 8 [2][0]
  54.   // VER interpolate (six-tap) sub-image [0][0]
  55.   getVerSubImageSixTap( s, cImgSub[2][0], cImgSub[0][0]);
  56.   // sub-image 10 [2][2]
  57.   // VER interpolate (six-tap) sub-image [0][2]
  58.   getVerSubImageSixTapTmp( s, cImgSub[2][2], cImgSub[0][2]);
  59.   //// QUARTER-PEL POSITIONS: BI-LINEAR INTERPOLATION ////
  60.   // sub-image 1 [0][1]
  61.   getSubImageBiLinear    ( s, cImgSub[0][1], cImgSub[0][0], cImgSub[0][2]);
  62.   // sub-image 4 [1][0]
  63.   getSubImageBiLinear    ( s, cImgSub[1][0], cImgSub[0][0], cImgSub[2][0]);
  64.   // sub-image 5 [1][1]
  65.   getSubImageBiLinear    ( s, cImgSub[1][1], cImgSub[0][2], cImgSub[2][0]);
  66.   // sub-image 6 [1][2]
  67.   getSubImageBiLinear    ( s, cImgSub[1][2], cImgSub[0][2], cImgSub[2][2]);
  68.   // sub-image 9 [2][1]
  69.   getSubImageBiLinear    ( s, cImgSub[2][1], cImgSub[2][0], cImgSub[2][2]);
  70.   // sub-image 3  [0][3]
  71.   getHorSubImageBiLinear ( s, cImgSub[0][3], cImgSub[0][2], cImgSub[0][0]);
  72.   // sub-image 7  [1][3]
  73.   getHorSubImageBiLinear ( s, cImgSub[1][3], cImgSub[0][2], cImgSub[2][0]);
  74.   // sub-image 11 [2][3]
  75.   getHorSubImageBiLinear ( s, cImgSub[2][3], cImgSub[2][2], cImgSub[2][0]);
  76.   // sub-image 12 [3][0]
  77.   getVerSubImageBiLinear ( s, cImgSub[3][0], cImgSub[2][0], cImgSub[0][0]);
  78.   // sub-image 13 [3][1]
  79.   getVerSubImageBiLinear ( s, cImgSub[3][1], cImgSub[2][0], cImgSub[0][2]);
  80.   // sub-image 14 [3][2]
  81.   getVerSubImageBiLinear ( s, cImgSub[3][2], cImgSub[2][2], cImgSub[0][2]);
  82.   // sub-image 15 [3][3]
  83.   getDiagSubImageBiLinear( s, cImgSub[3][3], cImgSub[0][2], cImgSub[2][0]);
  84. }
  85. /*!
  86.  ************************************************************************
  87.  * brief
  88.  *    Copy Integer Samples to image [0][0]
  89.  *
  90.  * param s
  91.  *    pointer to StorablePicture structure
  92.  * param dstImg
  93.  *    destination image
  94.  * param srcImg
  95.  *    source image
  96.  ************************************************************************
  97.  */
  98. void getSubImageInteger( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
  99. {
  100.   int i, j;
  101.   int size_x_minus1 = s->size_x - 1;
  102.   static imgpel *wBufSrc, *wBufDst;
  103.   // Copy top line
  104.   wBufDst = &( dstImg[0][0] ); 
  105.   wBufSrc = srcImg[0];
  106.   // left IMG_PAD_SIZE
  107.   for (i = 0; i < IMG_PAD_SIZE; i++)
  108.     *(wBufDst++) = wBufSrc[0];
  109.   // center 0-(s->size_x)
  110.   memcpy(wBufDst, wBufSrc, s->size_x * sizeof(imgpel));
  111.   wBufDst += s->size_x;
  112.   // right IMG_PAD_SIZE
  113.   for (i = 0; i < IMG_PAD_SIZE; i++)
  114.     *(wBufDst++) = wBufSrc[size_x_minus1];
  115.   // Now copy remaining pad lines
  116.   for (j = 1; j < IMG_PAD_SIZE + 1; j++)
  117.   {
  118.     memcpy(dstImg[j], dstImg[j - 1], s->size_x_padded * sizeof(imgpel));
  119.   }
  120.   for (j = 1; j < s->size_y; j++)
  121.   {    
  122.     wBufDst = &( dstImg[j + IMG_PAD_SIZE][0] ); // 4:4:4 independent mode
  123.     wBufSrc = srcImg[j];
  124.     // left IMG_PAD_SIZE
  125.     for (i = 0; i < IMG_PAD_SIZE; i++)
  126.       *(wBufDst++) = wBufSrc[0];
  127.     // center 0-(s->size_x)
  128.     memcpy(wBufDst, wBufSrc, s->size_x * sizeof(imgpel));
  129.     wBufDst += s->size_x;
  130.     // right IMG_PAD_SIZE
  131.     for (i = 0; i < IMG_PAD_SIZE; i++)
  132.       *(wBufDst++) = wBufSrc[size_x_minus1];
  133.   }
  134.   // Replicate bottom pad lines
  135.   for (j = s->size_y + IMG_PAD_SIZE; j < s->size_y_padded; j++)
  136.   {    
  137.     memcpy(dstImg[j], dstImg[j - 1], s->size_x_padded * sizeof(imgpel));
  138.   }
  139. }
  140. /*!
  141.  ************************************************************************
  142.  * brief
  143.  *    Does _horizontal_ interpolation using the SIX TAP filters
  144.  *
  145.  * param s
  146.  *    pointer to StorablePicture structure
  147.  * param dstImg
  148.  *    destination image
  149.  * param srcImg
  150.  *    source image
  151.  ************************************************************************
  152.  */
  153. void getHorSubImageSixTap( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
  154. {
  155.   int is, jpad, ipad;
  156.   int ypadded_size = s->size_y_padded;
  157.   int xpadded_size = s->size_x_padded;
  158.   static imgpel *wBufSrc, *wBufDst;
  159.   static imgpel *srcImgA, *srcImgB, *srcImgC, *srcImgD, *srcImgE, *srcImgF;
  160.   static int *iBufDst;
  161.   const int tap0 = ONE_FOURTH_TAP[0][0];
  162.   const int tap1 = ONE_FOURTH_TAP[0][1];
  163.   const int tap2 = ONE_FOURTH_TAP[0][2];
  164.   for (jpad = 0; jpad < ypadded_size; jpad++)
  165.   {
  166.     wBufSrc = srcImg[jpad];     // 4:4:4 independent mode
  167.     wBufDst = dstImg[jpad];     // 4:4:4 independent mode
  168.     iBufDst = imgY_sub_tmp[jpad];
  169.     srcImgA = &wBufSrc[0];
  170.     srcImgB = &wBufSrc[0];      
  171.     srcImgC = &wBufSrc[0];
  172.     srcImgD = &wBufSrc[1];
  173.     srcImgE = &wBufSrc[2];
  174.     srcImgF = &wBufSrc[3];
  175.     // left padded area
  176.     is =
  177.       (tap0 * (*srcImgA++ + *srcImgD++) +
  178.       tap1 *  (*srcImgB   + *srcImgE++) +
  179.       tap2 *  (*srcImgC   + *srcImgF++));
  180.     *iBufDst++ =  is;
  181.     *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  182.     is =
  183.       (tap0 * (*srcImgA++ + *srcImgD++) +
  184.       tap1 *  (*srcImgB++ + *srcImgE++) +
  185.       tap2 *  (*srcImgC   + *srcImgF++));
  186.     *iBufDst++ =  is;
  187.     *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  188.     // center
  189.     for (ipad = 2; ipad < xpadded_size - 4; ipad++)
  190.     {
  191.       is =
  192.         (tap0 * (*srcImgA++ + *srcImgD++) +
  193.         tap1 *  (*srcImgB++ + *srcImgE++) +
  194.         tap2 *  (*srcImgC++ + *srcImgF++));
  195.       *iBufDst++ =  is;
  196.       *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  197.     }
  198.     is = (
  199.       tap0 * (*srcImgA++ + *srcImgD++) +
  200.       tap1 * (*srcImgB++ + *srcImgE++) +
  201.       tap2 * (*srcImgC++ + *srcImgF  ));
  202.     *iBufDst++ =  is;
  203.     *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  204.     // right padded area
  205.     is = (
  206.       tap0 * (*srcImgA++ + *srcImgD++) +
  207.       tap1 * (*srcImgB++ + *srcImgE) +
  208.       tap2 * (*srcImgC++ + *srcImgF));
  209.     *iBufDst++ =  is;
  210.     *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  211.     is = (
  212.       tap0 * (*srcImgA++ + *srcImgD) +
  213.       tap1 * (*srcImgB++ + *srcImgE) +
  214.       tap2 * (*srcImgC++ + *srcImgF));
  215.     *iBufDst++ =  is;
  216.     *wBufDst++ = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  217.     is = (
  218.       tap0 * (*srcImgA + *srcImgD) +
  219.       tap1 * (*srcImgB + *srcImgE) +
  220.       tap2 * (*srcImgC + *srcImgF));
  221.     *iBufDst =  is;
  222.     *wBufDst = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );      
  223.   }
  224. }
  225. /*!
  226.  ************************************************************************
  227.  * brief
  228.  *    Does _vertical_ interpolation using the SIX TAP filters
  229.  *
  230.  * param s
  231.  *    pointer to StorablePicture structure
  232.  * param dstImg
  233.  *    pointer to target image
  234.  * param srcImg
  235.  *    pointer to source image
  236.  ************************************************************************
  237.  */
  238. void getVerSubImageSixTap( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
  239. {
  240.   int is, jpad, ipad;
  241.   int ypadded_size = s->size_y_padded;
  242.   int xpadded_size = s->size_x_padded;
  243.   int maxy = ypadded_size - 1;
  244.   static imgpel *wxLineDst;
  245.   static imgpel *srcImgA, *srcImgB, *srcImgC, *srcImgD, *srcImgE, *srcImgF;
  246.   const int tap0 = ONE_FOURTH_TAP[0][0];
  247.   const int tap1 = ONE_FOURTH_TAP[0][1];
  248.   const int tap2 = ONE_FOURTH_TAP[0][2];
  249.   // branches within the j loop
  250.   // top
  251.   for (jpad = 0; jpad < 2; jpad++)
  252.   {
  253.     wxLineDst = dstImg[jpad];
  254.     srcImgA = srcImg[jpad ];
  255.     srcImgB = srcImg[0];      
  256.     srcImgC = srcImg[0];
  257.     srcImgD = srcImg[jpad + 1];
  258.     srcImgE = srcImg[jpad + 2];
  259.     srcImgF = srcImg[jpad + 3];
  260.     for (ipad = 0; ipad < xpadded_size; ipad++)
  261.     {
  262.       is =
  263.         (tap0 * (*srcImgA++ + *srcImgD++) +
  264.         tap1 *  (*srcImgB++ + *srcImgE++) +
  265.         tap2 *  (*srcImgC++ + *srcImgF++));
  266.       wxLineDst[ipad] = (imgpel) iClip1 (img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
  267.     }
  268.   }
  269.   // center
  270.   for (jpad = 2; jpad < ypadded_size - 3; jpad++)
  271.   {
  272.     wxLineDst = dstImg[jpad];
  273.     srcImgA = srcImg[jpad ];
  274.     srcImgB = srcImg[jpad - 1];      
  275.     srcImgC = srcImg[jpad - 2];
  276.     srcImgD = srcImg[jpad + 1];
  277.     srcImgE = srcImg[jpad + 2];
  278.     srcImgF = srcImg[jpad + 3];
  279.     for (ipad = 0; ipad < xpadded_size; ipad++)
  280.     {
  281.       is =
  282.         (tap0 * (*srcImgA++ + *srcImgD++) +
  283.         tap1 *  (*srcImgB++ + *srcImgE++) +
  284.         tap2 *  (*srcImgC++ + *srcImgF++));
  285.       wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
  286.     }
  287.   }
  288.   // bottom
  289.   for (jpad = ypadded_size - 3; jpad < ypadded_size; jpad++)
  290.   {
  291.     wxLineDst = dstImg[jpad];
  292.     srcImgA = srcImg[jpad ];
  293.     srcImgB = srcImg[jpad - 1];      
  294.     srcImgC = srcImg[jpad - 2];
  295.     srcImgD = srcImg[imin (maxy, jpad + 1)];
  296.     srcImgE = srcImg[maxy];
  297.     srcImgF = srcImg[maxy];
  298.     for (ipad = 0; ipad < xpadded_size; ipad++)
  299.     {
  300.       is =
  301.         (tap0 * (*srcImgA++ + *srcImgD++) +
  302.         tap1 *  (*srcImgB++ + *srcImgE++) +
  303.         tap2 *  (*srcImgC++ + *srcImgF++));
  304.       wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 5 ) );
  305.     }
  306.   }
  307. }
  308. /*!
  309.  ************************************************************************
  310.  * brief
  311.  *    Does _vertical_ interpolation using the SIX TAP filters
  312.  *
  313.  * param s
  314.  *    pointer to StorablePicture structure
  315.  * param dstImg
  316.  *    pointer to target image
  317.  * param srcImg
  318.  *    pointer to source image
  319.  ************************************************************************
  320.  */
  321. void getVerSubImageSixTapTmp( StorablePicture *s, imgpel **dstImg, imgpel **srcImg)
  322. {
  323.   int is, jpad, ipad;
  324.   int ypadded_size = s->size_y_padded;
  325.   int xpadded_size = s->size_x_padded;
  326.   int maxy = ypadded_size - 1;
  327.   static imgpel *wxLineDst;
  328.   static int *srcImgA, *srcImgB, *srcImgC, *srcImgD, *srcImgE, *srcImgF;
  329.   const int tap0 = ONE_FOURTH_TAP[0][0];
  330.   const int tap1 = ONE_FOURTH_TAP[0][1];
  331.   const int tap2 = ONE_FOURTH_TAP[0][2];
  332.   // top
  333.   for (jpad = 0; jpad < 2; jpad++)
  334.   {
  335.     wxLineDst = dstImg[jpad];
  336.     srcImgA = imgY_sub_tmp[jpad ];
  337.     srcImgB = imgY_sub_tmp[0];      
  338.     srcImgC = imgY_sub_tmp[0];
  339.     srcImgD = imgY_sub_tmp[jpad + 1];
  340.     srcImgE = imgY_sub_tmp[jpad + 2];
  341.     srcImgF = imgY_sub_tmp[jpad + 3];
  342.     for (ipad = 0; ipad < xpadded_size; ipad++)
  343.     {
  344.       is =
  345.         (tap0 * (*srcImgA++ + *srcImgD++) +
  346.         tap1 *  (*srcImgB++ + *srcImgE++) +
  347.         tap2 *  (*srcImgC++ + *srcImgF++));
  348.       wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 10 ) );
  349.     }
  350.   }
  351.   // center
  352.   for (jpad = 2; jpad < ypadded_size - 3; jpad++)
  353.   {
  354.     wxLineDst = dstImg[jpad];
  355.     srcImgA = imgY_sub_tmp[jpad ];
  356.     srcImgB = imgY_sub_tmp[jpad - 1];      
  357.     srcImgC = imgY_sub_tmp[jpad - 2];
  358.     srcImgD = imgY_sub_tmp[jpad + 1];
  359.     srcImgE = imgY_sub_tmp[jpad + 2];
  360.     srcImgF = imgY_sub_tmp[jpad + 3];
  361.     for (ipad = 0; ipad < xpadded_size; ipad++)
  362.     {
  363.       is =
  364.         (tap0 * (*srcImgA++ + *srcImgD++) +
  365.         tap1 *  (*srcImgB++ + *srcImgE++) +
  366.         tap2 *  (*srcImgC++ + *srcImgF++));
  367.       wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 10 ) );
  368.     }
  369.   }
  370.   // bottom
  371.   for (jpad = ypadded_size - 3; jpad < ypadded_size; jpad++)
  372.   {
  373.     wxLineDst = dstImg[jpad];
  374.     srcImgA = imgY_sub_tmp[jpad ];
  375.     srcImgB = imgY_sub_tmp[jpad - 1];      
  376.     srcImgC = imgY_sub_tmp[jpad - 2];
  377.     srcImgD = imgY_sub_tmp[imin (maxy, jpad + 1)];
  378.     srcImgE = imgY_sub_tmp[maxy];
  379.     srcImgF = imgY_sub_tmp[maxy];
  380.     for (ipad = 0; ipad < xpadded_size; ipad++)
  381.     {
  382.       is =
  383.         (tap0 * (*srcImgA++ + *srcImgD++) +
  384.         tap1 *  (*srcImgB++ + *srcImgE++) +
  385.         tap2 *  (*srcImgC++ + *srcImgF++));
  386.       wxLineDst[ipad] = (imgpel) iClip1 ( img->max_imgpel_value, rshift_rnd_sf( is, 10 ) );
  387.     }
  388.   }
  389. }
  390. /*!
  391.  ************************************************************************
  392.  * brief
  393.  *    Does _horizontal_ interpolation using the BiLinear filter
  394.  *
  395.  * param s
  396.  *    pointer to StorablePicture structure
  397.  * param dstImg
  398.  *    destination Image
  399.  * param srcImgL
  400.  *    source left image
  401.  * param srcImgR
  402.  *    source right image 
  403.  ************************************************************************
  404.  */
  405. void getSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgL, imgpel **srcImgR)
  406. {
  407.   int jpad, ipad;
  408.   int ypadded_size = s->size_y_padded;
  409.   int xpadded_size = s->size_x_padded;
  410.   static imgpel *wBufSrcL, *wBufSrcR, *wBufDst;
  411.   for (jpad = 0; jpad < ypadded_size; jpad++)
  412.   {
  413.     wBufSrcL = srcImgL[jpad]; // 4:4:4 independent mode
  414.     wBufSrcR = srcImgR[jpad]; // 4:4:4 independent mode
  415.     wBufDst  = dstImg[jpad];  // 4:4:4 independent mode
  416.     for (ipad = 0; ipad < xpadded_size; ipad++)
  417.     {
  418.       *wBufDst++ = (imgpel) rshift_rnd_sf( *wBufSrcL++ + *wBufSrcR++, 1 );
  419.     }
  420.   }
  421. }
  422. /*!
  423.  ************************************************************************
  424.  * brief
  425.  *    Does _horizontal_ interpolation using the BiLinear filter
  426.  *
  427.  * param s
  428.  *    pointer to StorablePicture structure
  429.  * param dstImg
  430.  *    destination Image
  431.  * param srcImgL
  432.  *    source left image
  433.  * param srcImgR
  434.  *    source right image 
  435.  ************************************************************************
  436.  */
  437. void getHorSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgL, imgpel **srcImgR)
  438. {
  439.   int jpad, ipad;
  440.   int ypadded_size = s->size_y_padded;
  441.   int xpadded_size = s->size_x_padded - 1;
  442.   static imgpel *wBufSrcL, *wBufSrcR, *wBufDst;
  443.   for (jpad = 0; jpad < ypadded_size; jpad++)
  444.   {
  445.     wBufSrcL = srcImgL[jpad]; // 4:4:4 independent mode
  446.     wBufSrcR = &srcImgR[jpad][1]; // 4:4:4 independent mode
  447.     wBufDst  = dstImg[jpad];     // 4:4:4 independent mode
  448.     // left padded area + center
  449.     for (ipad = 0; ipad < xpadded_size; ipad++)
  450.     {
  451.       *wBufDst++ = (imgpel) rshift_rnd_sf( *wBufSrcL++ + *wBufSrcR++, 1 );
  452.     }
  453.     // right padded area
  454.       *wBufDst++ = (imgpel) rshift_rnd_sf( *wBufSrcL++ + wBufSrcR[-1], 1 );
  455.   }
  456. }
  457. /*!
  458.  ************************************************************************
  459.  * brief
  460.  *    Does _vertical_ interpolation using the BiLinear filter
  461.  *
  462.  * param s
  463.  *    pointer to StorablePicture structure
  464.  * param dstImg
  465.  *    destination Image
  466.  * param srcImgT
  467.  *    source top image
  468.  * param srcImgB
  469.  *    source bottom image 
  470.  ************************************************************************
  471.  */
  472. void getVerSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgT, imgpel **srcImgB)
  473. {
  474.   int jpad, ipad;
  475.   int ypadded_size = s->size_y_padded - 1;
  476.   int xpadded_size = s->size_x_padded;  
  477.   static imgpel *wBufSrcT, *wBufSrcB, *wBufDst;
  478.   // top
  479.   for (jpad = 0; jpad < ypadded_size; jpad++)
  480.   {
  481.     wBufSrcT = srcImgT[jpad];           // 4:4:4 independent mode
  482.     wBufDst  = dstImg[jpad];            // 4:4:4 independent mode
  483.     wBufSrcB = srcImgB[jpad + 1];  // 4:4:4 independent mode
  484.     for (ipad = 0; ipad < xpadded_size; ipad++)
  485.     {
  486.       *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcT++ + *wBufSrcB++, 1);
  487.     }
  488.   }
  489.   // bottom
  490.   wBufSrcT = srcImgT[ypadded_size];           // 4:4:4 independent mode
  491.   wBufDst  = dstImg[ypadded_size];            // 4:4:4 independent mode
  492.   wBufSrcB = srcImgB[ypadded_size];           // 4:4:4 independent mode
  493.   for (ipad = 0; ipad < xpadded_size; ipad++)
  494.   {
  495.     *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcT++ + *wBufSrcB++, 1);
  496.   }
  497. }
  498. /*!
  499.  ************************************************************************
  500.  * brief
  501.  *    Does _diagonal_ interpolation using the BiLinear filter
  502.  *
  503.  * param s
  504.  *    pointer to StorablePicture structure
  505.  * param dstImg
  506.  *    destination Image
  507.  * param srcImgT
  508.  *    source top/left image
  509.  * param srcImgB
  510.  *    source bottom/right image 
  511.  ************************************************************************
  512.  */
  513. void getDiagSubImageBiLinear( StorablePicture *s, imgpel **dstImg, imgpel **srcImgT, imgpel **srcImgB )
  514. {
  515.   int jpad, ipad;
  516.   int maxx = s->size_x_padded - 1;
  517.   int maxy = s->size_y_padded - 1;
  518.   static imgpel *wBufSrcL, *wBufSrcR, *wBufDst;
  519.   for (jpad = 0; jpad < maxy; jpad++)
  520.   {
  521.     wBufSrcL = srcImgT[jpad + 1]; // 4:4:4 independent mode
  522.     wBufSrcR = &srcImgB[jpad][1]; // 4:4:4 independent mode
  523.     wBufDst  = dstImg[jpad];      // 4:4:4 independent mode
  524.     for (ipad = 0; ipad < maxx; ipad++)
  525.     {
  526.       *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + *wBufSrcR++, 1);
  527.     }
  528.     *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ +  wBufSrcR[-1], 1);
  529.   }
  530.   wBufSrcL = srcImgT[maxy];     // 4:4:4 independent mode
  531.   wBufSrcR = &srcImgB[maxy][1]; // 4:4:4 independent mode
  532.   wBufDst = dstImg[maxy];       // 4:4:4 independent mode
  533.   for (ipad = 0; ipad < maxx; ipad++)
  534.   {
  535.     *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + *wBufSrcR++, 1);
  536.   }
  537.     *wBufDst++ = (imgpel) rshift_rnd_sf(*wBufSrcL++ + wBufSrcR[-1], 1);
  538. }