/Modules/yuvconvert.c

http://unladen-swallow.googlecode.com/ · C · 118 lines · 105 code · 13 blank · 0 comment · 6 complexity · 6b03b2cd2958efb536cf0036882b9055 MD5 · raw file

  1. #include "yuv.h"
  2. void
  3. yuv_sv411_to_cl422dc(int invert, void *data, void *yuv, int width, int height)
  4. {
  5. struct yuv411 *in = data;
  6. struct yuv422 *out_even = yuv;
  7. struct yuv422 *out_odd = out_even + width / 2;
  8. int i, j; /* counters */
  9. for (i = height / 2; i--; ) {
  10. for (j = width / 4; j--; ) {
  11. YUV422_Y0(*out_even) = YUV411_Y00(*in);
  12. YUV422_U0(*out_even) = YUV411_U00(*in);
  13. YUV422_V0(*out_even) = YUV411_V00(*in);
  14. YUV422_Y1(*out_even) = YUV411_Y01(*in);
  15. out_even++;
  16. YUV422_Y0(*out_even) = YUV411_Y02(*in);
  17. YUV422_U0(*out_even) = YUV411_U02(*in);
  18. YUV422_V0(*out_even) = YUV411_V02(*in);
  19. YUV422_Y1(*out_even) = YUV411_Y03(*in);
  20. out_even++;
  21. YUV422_Y0(*out_odd) = YUV411_Y10(*in);
  22. YUV422_U0(*out_odd) = YUV411_U10(*in);
  23. YUV422_V0(*out_odd) = YUV411_V10(*in);
  24. YUV422_Y1(*out_odd) = YUV411_Y11(*in);
  25. out_odd++;
  26. YUV422_Y0(*out_odd) = YUV411_Y12(*in);
  27. YUV422_U0(*out_odd) = YUV411_U12(*in);
  28. YUV422_V0(*out_odd) = YUV411_V12(*in);
  29. YUV422_Y1(*out_odd) = YUV411_Y13(*in);
  30. out_odd++;
  31. in++;
  32. }
  33. out_even += width / 2;
  34. out_odd += width / 2;
  35. }
  36. }
  37. void
  38. yuv_sv411_to_cl422dc_quartersize(int invert, void *data, void *yuv,
  39. int width, int height)
  40. {
  41. int w4 = width / 4; /* quarter of width is used often */
  42. struct yuv411 *in_even = data;
  43. struct yuv411 *in_odd = in_even + w4;
  44. struct yuv422 *out_even = yuv;
  45. struct yuv422 *out_odd = out_even + w4;
  46. int i, j; /* counters */
  47. int u, v; /* U and V values */
  48. for (i = height / 4; i--; ) {
  49. for (j = w4; j--; ) {
  50. u = YUV411_U00(*in_even);
  51. v = YUV411_V00(*in_even);
  52. YUV422_Y0(*out_even) = YUV411_Y00(*in_even);
  53. YUV422_U0(*out_even) = u;
  54. YUV422_V0(*out_even) = v;
  55. YUV422_Y1(*out_even) = YUV411_Y02(*in_even);
  56. YUV422_Y0(*out_odd) = YUV411_Y10(*in_odd);
  57. YUV422_U0(*out_odd) = u;
  58. YUV422_V0(*out_odd) = v;
  59. YUV422_Y1(*out_odd) = YUV411_Y12(*in_odd);
  60. in_even++;
  61. in_odd++;
  62. out_even++;
  63. out_odd++;
  64. }
  65. in_even += w4;
  66. in_odd += w4;
  67. out_even += w4;
  68. out_odd += w4;
  69. }
  70. }
  71. void
  72. yuv_sv411_to_cl422dc_sixteenthsize(int invert, void *data, void *yuv,
  73. int width, int height)
  74. {
  75. int w4_3 = 3 * width / 4; /* three quarters of width is used often */
  76. int w8 = width / 8; /* and so is one eighth */
  77. struct yuv411 *in_even = data;
  78. struct yuv411 *in_odd = in_even + width / 2;
  79. struct yuv422 *out_even = yuv;
  80. struct yuv422 *out_odd = out_even + w8;
  81. int i, j; /* counters */
  82. int u, v; /* U and V values */
  83. for (i = height / 8; i--; ) {
  84. for (j = w8; j--; ) {
  85. u = YUV411_U00(in_even[0]);
  86. v = YUV411_V00(in_even[0]);
  87. YUV422_Y0(*out_even) = YUV411_Y00(in_even[0]);
  88. YUV422_U0(*out_even) = u;
  89. YUV422_V0(*out_even) = v;
  90. YUV422_Y1(*out_even) = YUV411_Y00(in_even[1]);
  91. YUV422_Y0(*out_odd) = YUV411_Y00(in_odd[0]);
  92. YUV422_U0(*out_odd) = u;
  93. YUV422_V0(*out_odd) = v;
  94. YUV422_Y1(*out_odd) = YUV411_Y00(in_even[1]);
  95. in_even += 2;
  96. in_odd += 2;
  97. out_even++;
  98. out_odd++;
  99. }
  100. in_even += w4_3;
  101. in_odd += w4_3;
  102. out_even += w8;
  103. out_odd += w8;
  104. }
  105. }