avyuv2yuv.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifdef _MACINTOSH
  36. #pragma altivec_model on
  37. #define VecI8 vector signed char
  38. #define VecU8 vector unsigned char
  39. #define VecI16 vector signed short
  40. #define VecU16 vector unsigned short
  41. #define VecI32 vector signed int
  42. #define VecU32 vector unsigned int
  43. #define U32 unsigned int
  44. #define COMBINE(b0,b1,b2,b3)  
  45.     ((unsigned int)(b3) | ((unsigned int)(b2) << 8) | 
  46.     ((unsigned int)(b1) << 16) | ((unsigned int)(b0) << 24))
  47.     
  48.     
  49. #ifdef _MACINTOSH
  50. #ifdef __cplusplus
  51. extern "C"
  52. #endif
  53. void
  54. AltiVec_lineI420toYUY2 (
  55. unsigned char *sy, 
  56. unsigned char *su, 
  57. unsigned char *sv,
  58. unsigned char *d,
  59. int dest_dx);
  60. #endif
  61. void
  62. AltiVec_lineI420toYUY2 (
  63. unsigned char *sy, 
  64. unsigned char *su, 
  65. unsigned char *sv,
  66. unsigned char *d,
  67. int dest_dx)
  68. {
  69. VecU8 v0, v1;
  70. VecU8 v2, v3;
  71. VecU8 v4, v5;
  72. VecU8 v6, v7;
  73. VecU8 vPY, vPU, vPV;
  74. // convert until *d is 16-byte aligned
  75. while (((int)d & 15) != 0)
  76. {
  77. *(U32*)d = COMBINE(sy[0], su[0], sy[1], sv[0]);
  78. sy += 2;
  79. su++;
  80. sv++;
  81. d += 4;
  82. dest_dx -= 2;
  83. }
  84. // Special case for all pointers 16-byte aligned
  85. if ((((int)sy | (int)su | (int)sv) & 15) == 0)
  86. {
  87. while (dest_dx >= 32)
  88. {
  89. v0  = vec_ld(0, sy); // v0 = y0|y1|y2|y3|y4|y5|y6|y7|y8|y9|ya|yb|yc|yd|ye|yf
  90. v2  = vec_ld(0, su); // v2 = u0|u1|u2|u3|u4|u5|u6|u7|u8|u9|ua|ub|uc|ud|ue|uf
  91. v4  = vec_ld(0, sv); // v4 = v0|v1|v2|v3|v4|v5|v6|v7|v8|v9|va|vb|vc|vd|ve|vf
  92. v6  = vec_mergeh(v2, v4); // v6 = u0|v0|u1|v1|u2|v2|u3|v3|u4|v4|u5|v5|u6|v6|u7|v7
  93. v7  = vec_mergeh(v0, v6); // v7 = y0|u0|y1|v0|y2|u1|y3|v1|y4|u2|y5|v2|y6|u3|y7|v3
  94. vec_st(v7, 0, d); // store
  95. v7  = vec_mergel(v0, v6); // v7 = y8|u4|y9|v4|ya|u5|yb|v5|yc|u6|yd|v6|ye|u7|yf|v7
  96. vec_st(v7, 16, d); // store
  97. v0  = vec_ld(16, sy); // v0 = y0|y1|y2|y3|y4|y5|y6|y7|y8|y9|ya|yb|yc|yd|ye|yf
  98. v6  = vec_mergel(v2, v4); // v6 = u8|v8|u9|v9|ua|va|ub|vb|uc|vc|ud|vd|ue|ve|uf|vf
  99. v7  = vec_mergeh(v0, v6); // v7 = y0|u8|y1|v8|y2|u9|y3|v9|y4|ua|y5|va|y6|ub|y7|vb
  100. vec_st(v7, 32, d); // store
  101. v7  = vec_mergel(v0, v6); // v7 = y8|uc|y9|vc|ya|ud|yb|vd|yc|ue|yd|ve|ye|uf|yf|vf
  102. vec_st(v7, 48, d); // store
  103. sy += 32;
  104. su += 16;
  105. sv += 16;
  106. d  += 64;
  107. dest_dx -= 32;
  108. }
  109. while (dest_dx >= 16)
  110. {
  111. v0  = vec_ld(0, sy); // v0 = y0|y1|y2|y3|y4|y5|y6|y7|y8|y9|ya|yb|yc|yd|ye|yf
  112. v2  = vec_ld(0, su); // v2 = u0|u1|u2|u3|u4|u5|u6|u7|u8|u9|ua|ub|uc|ud|ue|uf
  113. v4  = vec_ld(0, sv); // v4 = v0|v1|v2|v3|v4|v5|v6|v7|v8|v9|va|vb|vc|vd|ve|vf
  114. v6  = vec_mergeh(v2, v4); // v6 = u0|v0|u1|v1|u2|v2|u3|v3|u4|v4|u5|v5|u6|v6|u7|v7
  115. v7  = vec_mergeh(v0, v6); // v7 = y0|u0|y1|v0|y2|u1|y3|v1|y4|u2|y5|v2|y6|u3|y7|v3
  116. vec_st(v7, 0, d); // store
  117. v7  = vec_mergel(v0, v6); // v7 = y8|u4|y9|v4|ya|u5|yb|v5|yc|u6|yd|v6|ye|u7|yf|v7
  118. vec_st(v7, 16, d); // store
  119. sy += 16;
  120. su += 8;
  121. sv += 8;
  122. d  += 32;
  123. dest_dx -= 16;
  124. }
  125. }
  126. else
  127. {
  128. vPY = vec_lvsl(0, sy);
  129. vPU = vec_lvsl(0, su);
  130. vPV = vec_lvsl(0, sv);
  131. v0  = vec_ld(0, sy);
  132. v2  = vec_ld(0, su);
  133. v4  = vec_ld(0, sv);
  134. while (dest_dx >= 32)
  135. {
  136. // Load Y - 16 pels
  137. v1  = vec_ld(16, sy);
  138. v0  = vec_perm(v0, v1, vPY); // v0 = y0|y1|y2|y3|y4|y5|y6|y7|y8|y9|ya|yb|yc|yd|ye|yf
  139. // Load U - 16 pels
  140. v3  = vec_ld(16, su);
  141. v2  = vec_perm(v2, v3, vPU); // v2 = u0|u1|u2|u3|u4|u5|u6|u7|u8|u9|ua|ub|uc|ud|ue|uf
  142. // Load V - 16 pels
  143. v5  = vec_ld(16, sv);
  144. v4  = vec_perm(v4, v5, vPV); // v4 = v0|v1|v2|v3|v4|v5|v6|v7|v8|v9|va|vb|vc|vd|ve|vf
  145. v6  = vec_mergeh(v2, v4); // v6 = u0|v0|u1|v1|u2|v2|u3|v3|u4|v4|u5|v5|u6|v6|u7|v7
  146. v7  = vec_mergeh(v0, v6); // v7 = y0|u0|y1|v0|y2|u1|y3|v1|y4|u2|y5|v2|y6|u3|y7|v3
  147. // Store 8 YUYV pels
  148. vec_st(v7, 0, d);
  149. v7  = vec_mergel(v0, v6); // v7 = y8|u4|y9|v4|ya|u5|yb|v5|yc|u6|yd|v6|ye|u7|yf|v7
  150. // Store 8 YUYV pels
  151. vec_st(v7, 16, d);
  152. // Load Y - 16 pels
  153. v0  = vec_ld(32, sy);
  154. v1  = vec_perm(v1, v0, vPY); // v1 = y0|y1|y2|y3|y4|y5|y6|y7|y8|y9|ya|yb|yc|yd|ye|yf
  155. v6  = vec_mergel(v2, v4); // v6 = u8|v8|u9|v9|ua|va|ub|vb|uc|vc|ud|vd|ue|ve|uf|vf
  156. v7  = vec_mergeh(v1, v6); // v7 = y0|u8|y1|v8|y2|u9|y3|v9|y4|ua|y5|va|y6|ub|y7|vb
  157. // Store 8 YUYV pels
  158. vec_st(v7, 32, d);
  159. v7  = vec_mergel(v1, v6); // v7 = y8|uc|y9|vc|ya|ud|yb|vd|yc|ue|yd|ve|ye|uf|yf|vf
  160. // Store 8 YUYV pels
  161. vec_st(v7, 48, d);
  162. v2  = v3;
  163. v4  = v5;
  164. sy += 32;
  165. su += 16;
  166. sv += 16;
  167. d  += 64;
  168. dest_dx -= 32;
  169. }
  170. while (dest_dx >= 16)
  171. {
  172. // Load Y - 16 pels
  173. v1  = vec_ld(16, sy);
  174. v0  = vec_perm(v0, v1, vPY); // v0 = y0|y1|y2|y3|y4|y5|y6|y7|y8|y9|ya|yb|yc|yd|ye|yf
  175. // Load U - 16 pels
  176. v3  = vec_ld(16, su);
  177. v2  = vec_perm(v2, v3, vPU); // v2 = u0|u1|u2|u3|u4|u5|u6|u7|u8|u9|ua|ub|uc|ud|ue|uf
  178. // Load V - 16 pels
  179. v5  = vec_ld(16, sv);
  180. v4  = vec_perm(v4, v5, vPV); // v4 = v0|v1|v2|v3|v4|v5|v6|v7|v8|v9|va|vb|vc|vd|ve|vf
  181. v6  = vec_mergeh(v2, v4); // v6 = u0|v0|u1|v1|u2|v2|u3|v3|u4|v4|u5|v5|u6|v6|u7|v7
  182. v7  = vec_mergeh(v0, v6); // v7 = y0|u0|y1|v0|y2|u1|y3|v1|y4|u2|y5|v2|y6|u3|y7|v3
  183. // Store 8 YUYV pels
  184. vec_st(v7, 0, d);
  185. v7  = vec_mergel(v0, v6); // v7 = y8|u4|y9|v4|ya|u5|yb|v5|yc|u6|yd|v6|ye|u7|yf|v7
  186. // Store 8 YUYV pels
  187. vec_st(v7, 16, d);
  188. sy += 16;
  189. su += 8;
  190. sv += 8;
  191. d  += 32;
  192. dest_dx -= 16;
  193. }
  194. }
  195. while (dest_dx)
  196. {
  197. *(U32*)d = COMBINE(sy[0], su[0], sy[1], sv[0]);
  198. sy += 2;
  199. su++;
  200. sv++;
  201. d += 4;
  202. dest_dx -= 2;
  203. }
  204. }
  205. #pragma altivec_model off
  206. #endif // _MACINTOSH