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

Audio

开发平台:

Visual C++

  1. /*!
  2. *************************************************************************************
  3. * file img_chroma.c
  4. *
  5. * brief
  6. *    Chroma interpolation functions
  7. *
  8. * author
  9. *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10. *      - Athanasios Leontaris    <aleon@dolby.com>
  11. *      - Alexis Michael Tourapis <alexis.tourapis@dolby.com>
  12. *
  13. *************************************************************************************
  14. */
  15. #include "contributors.h"
  16. #include <limits.h>
  17. #include "global.h"
  18. #include "image.h"
  19. #include "img_chroma.h"
  20. /*!
  21.  ************************************************************************
  22.  * brief
  23.  *    Integer sample position image generation routine
  24.  ************************************************************************
  25.  */
  26. static void generateChroma00( int size_x_minus1, int size_y_minus1, imgpel **wImgDst, imgpel **imgUV)
  27. {
  28.   int i, j;
  29.   int jpad;
  30.   static imgpel *wBufDst;
  31.   static imgpel *wBufSrc0;
  32.   for (j = -img_pad_size_uv_y, jpad = 0; j < 0; j++, jpad++)
  33.   {
  34.     wBufDst = &( wImgDst[jpad][0]);
  35.     wBufSrc0 = imgUV[0];
  36.     for (i = -img_pad_size_uv_x; i < 0; i++)
  37.     {
  38.       *(wBufDst++) = *wBufSrc0;
  39.     }
  40.     memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
  41.     wBufDst  += size_x_minus1;
  42.     wBufSrc0 += size_x_minus1;
  43.     for (i = 0; i < img_pad_size_uv_x; i++)
  44.     {
  45.       *(wBufDst++) = *wBufSrc0;
  46.     }
  47.   }
  48.   for (j = 0; j < size_y_minus1; j++, jpad++)
  49.   {
  50.     wBufDst = &( wImgDst[jpad][0] );
  51.     wBufSrc0 = imgUV[j    ];
  52.     for (i = -img_pad_size_uv_x; i < 0; i++)
  53.     {
  54.       *(wBufDst++) = *wBufSrc0;
  55.     }
  56.     memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
  57.     wBufDst  += size_x_minus1;
  58.     wBufSrc0 += size_x_minus1;
  59.     for (i = 0; i < img_pad_size_uv_x; i++)
  60.     {
  61.       *(wBufDst++) = *wBufSrc0;
  62.     }
  63.   }
  64.   for (j = 0; j < img_pad_size_uv_y; j++, jpad++)
  65.   {
  66.     wBufDst = &( wImgDst[jpad][0] );
  67.     wBufSrc0 = imgUV[size_y_minus1];
  68.     for (i = -img_pad_size_uv_x; i < 0; i++)
  69.     {
  70.       *(wBufDst++) = *wBufSrc0;
  71.     }
  72.     memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
  73.     wBufDst  += size_x_minus1;
  74.     wBufSrc0 += size_x_minus1;
  75.     for (i = 0; i < img_pad_size_uv_x; i++)
  76.     {
  77.       *(wBufDst++) = *wBufSrc0;
  78.     }
  79.   }
  80. }
  81. /*!
  82.  ************************************************************************
  83.  * brief
  84.  *    Horizontal chroma interpolation image generation routine
  85.  ************************************************************************
  86.  */
  87. static void generateChroma01( int size_x_minus1, int size_y_minus1, int weight00, int weight01, imgpel **wImgDst, imgpel **imgUV)
  88. {
  89.   int i, j;
  90.   int jpad;
  91.   int cur_value;
  92.   static imgpel *wBufDst;
  93.   static imgpel *wBufSrc0;
  94.   for (j = -img_pad_size_uv_y, jpad = 0; j < 0; j++, jpad++)
  95.   {
  96.     wBufDst  = wImgDst[jpad];
  97.     wBufSrc0 = imgUV[0];
  98.     for (i = -img_pad_size_uv_x; i < 0; i++)
  99.     {
  100.       *(wBufDst++) = *wBufSrc0;
  101.     }
  102.     for (i = 0; i < size_x_minus1; i++)
  103.     {
  104.       cur_value  = weight00 * (*wBufSrc0++);
  105.       cur_value += weight01 * (*wBufSrc0  );
  106.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  107.     }
  108.     for (i = 0; i < img_pad_size_uv_x; i++)
  109.     {
  110.       *(wBufDst++) = *wBufSrc0;
  111.     }
  112.   }
  113.   for (j = 0; j < size_y_minus1; j++, jpad++)
  114.   {
  115.     wBufDst  = wImgDst[jpad];
  116.     wBufSrc0 = imgUV[j    ];
  117.     for (i = -img_pad_size_uv_x; i < 0; i++)
  118.     {
  119.       *(wBufDst++) = *wBufSrc0;
  120.     }
  121.     for (i = 0; i < size_x_minus1; i++)
  122.     {
  123.       cur_value  = weight00 * (*wBufSrc0++);
  124.       cur_value += weight01 * (*wBufSrc0  );
  125.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  126.     }
  127.     for (i = 0; i < img_pad_size_uv_x; i++)
  128.     {
  129.       *(wBufDst++) = *wBufSrc0;
  130.     }
  131.   }
  132.   for (j = 0; j < img_pad_size_uv_y; j++, jpad++)
  133.   {
  134.     wBufDst  = wImgDst[jpad];
  135.     wBufSrc0 = imgUV[size_y_minus1];
  136.     for (i = -img_pad_size_uv_x; i < 0; i++)
  137.     {
  138.       *(wBufDst++) = *wBufSrc0;
  139.     }
  140.     for (i = 0; i < size_x_minus1; i++)
  141.     {
  142.       cur_value  = weight00 * (*wBufSrc0++);
  143.       cur_value += weight01 * (*wBufSrc0  );
  144.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  145.     }
  146.     for (i = 0; i < img_pad_size_uv_x; i++)
  147.     {
  148.       *(wBufDst++) = *wBufSrc0;
  149.     }
  150.   }
  151. }
  152. /*!
  153.  ************************************************************************
  154.  * brief
  155.  *    Vertical chroma interpolation image generation routine
  156.  ************************************************************************
  157.  */
  158. static void generateChroma10( int size_x_minus1, int size_y_minus1, int weight00, int weight10, imgpel **wImgDst, imgpel **imgUV)
  159. {
  160.   int i, j;
  161.   int jpad;
  162.   int cur_value;
  163.   static imgpel *wBufDst;
  164.   static imgpel *wBufSrc0, *wBufSrc1;
  165.   for (j = -img_pad_size_uv_y, jpad = 0; j < 0; j++, jpad++)
  166.   {
  167.     wBufDst = &( wImgDst[jpad][0] );
  168.     wBufSrc0 = imgUV[0];
  169.     for (i = -img_pad_size_uv_x; i < 0; i++)
  170.     {
  171.       *(wBufDst++) = *wBufSrc0;
  172.     }
  173.     memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
  174.     wBufDst  += size_x_minus1;
  175.     wBufSrc0 += size_x_minus1;
  176.     for (i = 0; i < img_pad_size_uv_x; i++)
  177.     {
  178.       *(wBufDst++) = *wBufSrc0;
  179.     }
  180.   }
  181.   for (j = 0; j < size_y_minus1; j++, jpad++)
  182.   {
  183.     wBufDst = &( wImgDst[jpad][0] );
  184.     wBufSrc0 = imgUV[j    ];
  185.     wBufSrc1 = imgUV[j + 1];
  186.     cur_value = rshift_rnd_sf(weight00 * (*wBufSrc0) + weight10 * (*wBufSrc1), 6 );
  187.     for (i = -img_pad_size_uv_x; i < 0; i++)
  188.     {
  189.       *(wBufDst++) = (imgpel) cur_value;
  190.     }
  191.     for (i = 0; i < size_x_minus1; i++)
  192.     {
  193.       cur_value  = weight00 * (*wBufSrc0++) + weight10 * (*wBufSrc1++);
  194.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  195.     }
  196.     cur_value = rshift_rnd_sf(weight00 * (*wBufSrc0) + weight10 * (*wBufSrc1), 6 );
  197.     for (i = 0; i < img_pad_size_uv_x; i++)
  198.     {
  199.       *(wBufDst++) = (imgpel) cur_value;
  200.     }
  201.   }
  202.   for (j = 0; j < img_pad_size_uv_y; j++, jpad++)
  203.   {
  204.     wBufDst = &( wImgDst[jpad][0] );
  205.     wBufSrc0 = imgUV[size_y_minus1];
  206.     for (i = -img_pad_size_uv_x; i < 0; i++)
  207.     {
  208.       *(wBufDst++) = *wBufSrc0;
  209.     }
  210.     memcpy(wBufDst, wBufSrc0, size_x_minus1 * sizeof(imgpel));
  211.     wBufDst  += size_x_minus1;
  212.     wBufSrc0 += size_x_minus1;
  213.     for (i = 0; i < img_pad_size_uv_x; i++)
  214.     {
  215.       *(wBufDst++) = *wBufSrc0;
  216.     }
  217.   }
  218. }
  219. /*!
  220.  ************************************************************************
  221.  * brief
  222.  *    Generic/Diagonal chroma interpolation image generation routine
  223.  ************************************************************************
  224.  */
  225. static void generateChromaXX( int size_x_minus1, int size_y_minus1, int weight00, int weight01, int weight10, int weight11, imgpel **wImgDst, imgpel **imgUV)
  226. {
  227.   int i, j;
  228.   int jpad;
  229.   int cur_value;
  230.   static imgpel *wBufDst;
  231.   static imgpel *wBufSrc0, *wBufSrc1;
  232.   int weight0001 = weight00 + weight01;
  233.   int weight1011 = weight10 + weight11;
  234.   int weight0010 = weight00 + weight10;
  235.   int weight0111 = weight01 + weight11;
  236.   for (j = -img_pad_size_uv_y, jpad = 0; j < 0; j++, jpad++)
  237.   {
  238.     wBufDst = &( wImgDst[jpad][0] );
  239.     wBufSrc0 = imgUV[0];
  240.     for (i = -img_pad_size_uv_x; i < 0; i++)
  241.     {
  242.       *(wBufDst++) = *wBufSrc0;
  243.     }
  244.     for (i = 0; i < size_x_minus1; i++)
  245.     {
  246.       cur_value  = weight0010 * (*wBufSrc0++);
  247.       cur_value += weight0111 * (*wBufSrc0  );
  248.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  249.     }
  250.     for (i = 0; i < img_pad_size_uv_x; i++)
  251.     {
  252.       *(wBufDst++) = *wBufSrc0;
  253.     }
  254.   }
  255.   for (j = 0; j < size_y_minus1; j++, jpad++)
  256.   {
  257.     wBufDst = &( wImgDst[jpad][0] );
  258.     wBufSrc0 = imgUV[j    ];
  259.     wBufSrc1 = imgUV[j + 1];
  260.     cur_value = rshift_rnd_sf(weight0001 * (*wBufSrc0) + weight1011 * (*wBufSrc1), 6 );
  261.     for (i = -img_pad_size_uv_x; i < 0; i++)
  262.     {
  263.       *(wBufDst++) = (imgpel) cur_value;
  264.     }
  265.     for (i = 0; i < size_x_minus1; i++)
  266.     {
  267.       cur_value  = weight00 * (*wBufSrc0++) + weight10 * (*wBufSrc1++);
  268.       cur_value += weight01 * (*wBufSrc0  ) + weight11 * (*wBufSrc1  );
  269.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  270.     }
  271.     cur_value = rshift_rnd_sf(weight0001 * (*wBufSrc0) + weight1011 * (*wBufSrc1), 6 );
  272.     for (i = 0; i < img_pad_size_uv_x; i++)
  273.     {
  274.       *(wBufDst++) = (imgpel) cur_value;
  275.     }
  276.   }
  277.   for (j = 0; j < img_pad_size_uv_y; j++, jpad++)
  278.   {
  279.     wBufDst = &( wImgDst[jpad][0] );
  280.     wBufSrc0 = imgUV[size_y_minus1];
  281.     for (i = -img_pad_size_uv_x; i < 0; i++)
  282.     {
  283.       *(wBufDst++) = *wBufSrc0;
  284.     }
  285.     for (i = 0; i < size_x_minus1; i++)
  286.     {
  287.       cur_value  = weight0010 * (*wBufSrc0++);
  288.       cur_value += weight0111 * (*wBufSrc0  );
  289.       *(wBufDst++) = (imgpel) rshift_rnd_sf(cur_value, 6);
  290.     }
  291.     for (i = 0; i < img_pad_size_uv_x; i++)
  292.     {
  293.       *(wBufDst++) = *wBufSrc0;
  294.     }
  295.   }
  296. }
  297. /*!
  298.  ************************************************************************
  299.  * brief
  300.  *    Creates the 16 (YUV444), 32 (YUV422), or 64 (YUV420) sub-images that
  301.  *    contain quarter-pel samples sub-sampled at different
  302.  *    spatial orientationss;
  303.  *      enables more efficient implementation
  304.  *
  305.  * param s
  306.  *    pointer to StorablePicture structure
  307.  s************************************************************************
  308.  */
  309. void getSubImagesChroma( StorablePicture *s )
  310. {
  311.   int uv, k, l, m;
  312.   int weight00, weight01, weight10, weight11;
  313.   int subimages_y, subimages_x, subx, suby;
  314.   int size_x_minus1, size_y_minus1;
  315.   // multiplier factor for index to account for UV sampling ratios
  316.   int mul_x, mul_y;
  317.   int mm, kk;
  318.   imgpel **wImgDst;  
  319.   size_x_minus1 = s->size_x_cr - 1;
  320.   size_y_minus1 = s->size_y_cr - 1;
  321.   if ( img->yuv_format == YUV420 ) 
  322.   {
  323.     subimages_x = 8;
  324.     subimages_y = 8;
  325.     mul_x = mul_y = 1;
  326.   }
  327.   else if ( img->yuv_format == YUV422 ) 
  328.   {
  329.     subimages_x = 8;
  330.     subimages_y = 4;
  331.     mul_y = 2;
  332.     mul_x = 1;
  333.   }
  334.   else 
  335.   { // YUV444
  336.     subimages_x = 4;
  337.     subimages_y = 4;
  338.     mul_x = mul_y = 2;
  339.   }
  340.   // U or V
  341.   for ( uv = 0; uv < 2; uv++ )
  342.   {
  343.     for ( suby = 0, k = 0; suby < subimages_y; suby++, k += mul_y )
  344.     {
  345.       m = (8 - k);
  346.       mm = m << 3;
  347.       kk = k << 3;
  348.       for ( subx = 0, l = 0; subx < subimages_x; subx++, l += mul_x )
  349.       {
  350.         weight01 = m * l;
  351.         weight00 = mm - weight01;
  352.         weight11 = k * l;
  353.         weight10 = kk - weight11; 
  354.         wImgDst = s->imgUV_sub[uv][suby][subx];
  355.         // Lets break things into cases
  356.         if (weight01 == 0 && weight10 == 0 && weight11 == 0) // integer
  357.         {
  358.           generateChroma00( size_x_minus1, size_y_minus1, wImgDst, s->imgUV[uv]);
  359.         }
  360.         else if (weight10 == 0 && weight11 == 0) // horizontal
  361.         {
  362.           generateChroma01( size_x_minus1, size_y_minus1, weight00, weight01, wImgDst, s->imgUV[uv]);
  363.         }
  364.         else if (weight01 == 0 && weight11 == 0) // vertical
  365.         {
  366.           generateChroma10( size_x_minus1, size_y_minus1, weight00, weight10, wImgDst, s->imgUV[uv]);
  367.         }
  368.         else //diagonal
  369.         {
  370.           generateChromaXX( size_x_minus1, size_y_minus1, weight00, weight01, weight10, weight11, wImgDst, s->imgUV[uv]);
  371.         }          
  372.       }
  373.     }
  374.   }
  375. }