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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file img_distortion.c
  4.  *
  5.  * brief
  6.  *    YUV to RGB color conversion
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *     - Woo-Shik Kim                    <wooshik.kim@usc.edu>
  11.  *************************************************************************************
  12.  */
  13. #include "contributors.h"
  14. #include "global.h"
  15. #include "memalloc.h"
  16. #include "img_distortion.h"
  17. #define YUV2RGB_YOFFSET
  18. //YUV to RGB conversion
  19. #ifdef YUV2RGB_YOFFSET
  20. #define OFFSET_Y 16
  21. static const float K0 = 1.164f;
  22. static const float K1 = 1.596f;
  23. static const float K2 = 0.391f;
  24. static const float K3 = 0.813f;
  25. static const float K4 = 2.018f;
  26. static int offset_y, offset_cr;
  27. #else
  28. static const float K0 = 1.000f;
  29. static const float K1 = 1.402f;
  30. static const float K2 = 0.34414f;
  31. static const float K3 = 0.71414f;
  32. static const float K4 = 1.772f;
  33. #endif
  34. static int wk0, wk1, wk2, wk3, wk4;
  35. ImageStructure imgRGB_src, imgRGB_ref;
  36. int create_RGB_memory(ImageParameters *img)
  37. {
  38.   int memory_size = 0;
  39.   int j;
  40.   for( j = 0; j < 3; j++ )
  41.   {
  42.     memory_size += get_mem2Dpel (&imgRGB_src.data[j], img->height, img->width);
  43.   }
  44.   for( j = 0; j < 3; j++ )
  45.   {
  46.     memory_size += get_mem2Dpel (&imgRGB_ref.data[j], img->height, img->width);
  47.   }
  48.   
  49.   return memory_size;
  50. }
  51. void delete_RGB_memory(void)
  52. {
  53.   int i;
  54.   for( i = 0; i < 3; i++ )
  55.   {
  56.     free_mem2Dpel(imgRGB_src.data[i]);
  57.   }
  58.   for( i = 0; i < 3; i++ )
  59.   {
  60.     free_mem2Dpel(imgRGB_ref.data[i]);
  61.   }
  62. }
  63. void init_YUVtoRGB(void)
  64.   float conv_scale = (float) (65536.0f);
  65.   wk0 = float2int(  conv_scale * K0);
  66.   wk1 = float2int(  conv_scale * K1);
  67.   wk2 = float2int( -conv_scale * K2);
  68.   wk3 = float2int( -conv_scale * K3);
  69.   wk4 = float2int(  conv_scale * K4);
  70. #ifdef YUV2RGB_YOFFSET
  71.   offset_y = OFFSET_Y << (params->output.bit_depth[0] - 8);
  72.   offset_cr = 1 << (params->output.bit_depth[0] - 1);
  73. #endif
  74. }
  75. /*! 
  76. *************************************************************************************
  77. * brief
  78. *    YUV to RGB conversion
  79. *    ITU 601 with and without offset consideration
  80. *    Upsampling by repetition of chroma samples in case of 4:2:0 and 4:2:2
  81. *    Method not support for 4:0:0 content
  82. *************************************************************************************
  83. */
  84. void YUVtoRGB(ImageStructure *YUV, ImageStructure *RGB)
  85. {
  86.   static int i, j, j_cr, i_cr;
  87.   static int sy, su, sv;
  88.   static int wbuv, wguv, wruv;
  89.   static imgpel *Y, *U, *V, *R, *G, *B;
  90.   FrameFormat format = YUV->format;
  91.   int width = format.width;
  92.   int height = format.height;
  93.   int max_value = format.max_value[0];
  94.   // Color conversion
  95.   for (j = 0; j < height; j++)
  96.   {
  97.     j_cr = j >> shift_cr_y;
  98.     Y = YUV->data[0][j];
  99.     U = YUV->data[1][j_cr];
  100.     V = YUV->data[2][j_cr];
  101.     R = RGB->data[0][j];
  102.     G = RGB->data[1][j];
  103.     B = RGB->data[2][j];
  104.     for (i = 0; i < width; i++)
  105.     {
  106.       i_cr = i >> shift_cr_x;
  107.       su = U[i_cr] - offset_cr;
  108.       sv = V[i_cr] - offset_cr;
  109.       wruv = wk1 * sv;
  110.       wguv = wk2 * su + wk3 * sv;
  111.       wbuv = wk4 * su;
  112. #ifdef YUV2RGB_YOFFSET // Y offset value of 16 is considered
  113.       sy = wk0 * (Y[i] - offset_y);
  114. #else
  115.       sy = wk0 * Y[i];
  116. #endif
  117.       R[i] = iClip1( max_value, rshift_rnd(sy + wruv, 16));
  118.       G[i] = iClip1( max_value, rshift_rnd(sy + wguv, 16));
  119.       B[i] = iClip1( max_value, rshift_rnd(sy + wbuv, 16));
  120.     }
  121.   }
  122.   // Setting RGB FrameFormat
  123.   RGB->format = format;  // copy format information from YUV to RGB
  124.   RGB->format.yuv_format = 3;
  125.   RGB->format.rgb_format = 1;
  126.   RGB->format.height_cr = format.height;
  127.   RGB->format.width_cr = format.width;
  128.   for (i = 1; i < 3; i++)
  129.   {
  130.     RGB->format.size_cmp[i] = format.size_cmp[0];
  131.     RGB->format.bit_depth[i] = format.bit_depth[0];
  132.     RGB->format.max_value[i] = max_value;
  133.     RGB->format.max_value_sq[i] = format.max_value_sq[0];
  134.   }
  135. }