1/*
2 *
3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * @file    swconverter.h
20 * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
21 *   NV12T(tiled) layout:
22 *   Each element is not pixel. It is 64x32 pixel block.
23 *   uv pixel block is interleaved as u v u v u v ...
24 *   y1    y2    y7    y8    y9    y10   y15   y16
25 *   y3    y4    y5    y6    y11   y12   y13   y14
26 *   y17   y18   y23   y24   y25   y26   y31   y32
27 *   y19   y20   y21   y22   y27   y28   y29   y30
28 *   uv1   uv2   uv7   uv8   uv9   uv10  uv15  uv16
29 *   uv3   uv4   uv5   uv6   uv11  uv12  uv13  uv14
30 *   YUV420Planar(linear) layout:
31 *   Each element is not pixel. It is 64x32 pixel block.
32 *   y1    y2    y3    y4    y5    y6    y7    y8
33 *   y9    y10   y11   y12   y13   y14   y15   y16
34 *   y17   y18   y19   y20   y21   y22   y23   y24
35 *   y25   y26   y27   y28   y29   y30   y31   y32
36 *   u1    u2    u3    u4    u5    u6    u7    u8
37 *   v1    v2    v3    v4    v5    v6    v7    v8
38 *   YUV420Semiplanar(linear) layout:
39 *   Each element is not pixel. It is 64x32 pixel block.
40 *   uv pixel block is interleaved as u v u v u v ...
41 *   y1    y2    y3    y4    y5    y6    y7    y8
42 *   y9    y10   y11   y12   y13   y14   y15   y16
43 *   y17   y18   y19   y20   y21   y22   y23   y24
44 *   y25   y26   y27   y28   y29   y30   y31   y32
45 *   uv1   uv2   uv3   uv4   uv5   uv6   uv7   uv8
46 *   uv9   uv10  uv11  uv12  uv13  uv14  uv15  uv16
47 * @author  ShinWon Lee (shinwon.lee@samsung.com)
48 * @version 1.0
49 * @history
50 *   2012.02.01 : Create
51 */
52
53#ifndef SW_CONVERTOR_H_
54#define SW_CONVERTOR_H_
55
56/*--------------------------------------------------------------------------------*/
57/* Format Conversion API                                                          */
58/*--------------------------------------------------------------------------------*/
59/* C Code */
60/*
61 * De-interleaves src to dest1, dest2
62 *
63 * @param dest1
64 *   Address of de-interleaved data[out]
65 *
66 * @param dest2
67 *   Address of de-interleaved data[out]
68 *
69 * @param src
70 *   Address of interleaved data[in]
71 *
72 * @param src_size
73 *   Size of interleaved data[in]
74 */
75void csc_deinterleave_memcpy(
76    unsigned char *dest1,
77    unsigned char *dest2,
78    unsigned char *src,
79    unsigned int src_size);
80
81/*
82 * Interleaves src1, src2 to dest
83 *
84 * @param dest
85 *   Address of interleaved data[out]
86 *
87 * @param src1
88 *   Address of de-interleaved data[in]
89 *
90 * @param src2
91 *   Address of de-interleaved data[in]
92 *
93 * @param src_size
94 *   Size of de-interleaved data[in]
95 */
96void csc_interleave_memcpy(
97    unsigned char *dest,
98    unsigned char *src1,
99    unsigned char *src2,
100    unsigned int src_size);
101
102/*
103 * Converts tiled data to linear
104 * It supports mfc 6.x tiled
105 * 1. y of nv12t to y of yuv420p
106 * 2. y of nv12t to y of yuv420s
107 *
108 * @param dst
109 *   y address of yuv420[out]
110 *
111 * @param src
112 *   y address of nv12t[in]
113 *
114 * @param yuv420_width
115 *   real width of yuv420[in]
116 *   it should be even
117 *
118 * @param yuv420_height
119 *   real height of yuv420[in]
120 *   it should be even.
121 *
122 */
123void csc_tiled_to_linear_y(
124    unsigned char *y_dst,
125    unsigned char *y_src,
126    unsigned int width,
127    unsigned int height);
128
129/*
130 * Converts tiled data to linear
131 * It supports mfc 6.x tiled
132 * 1. uv of nv12t to y of yuv420s
133 *
134 * @param dst
135 *   uv address of yuv420s[out]
136 *
137 * @param src
138 *   uv address of nv12t[in]
139 *
140 * @param yuv420_width
141 *   real width of yuv420s[in]
142 *
143 * @param yuv420_height
144 *   real height of yuv420s[in]
145 *
146 */
147void csc_tiled_to_linear_uv(
148    unsigned char *uv_dst,
149    unsigned char *uv_src,
150    unsigned int width,
151    unsigned int height);
152
153/*
154 * Converts tiled data to linear
155 * It supports mfc 6.x tiled
156 * 1. uv of nt12t to uv of yuv420p
157 *
158 * @param u_dst
159 *   u address of yuv420p[out]
160 *
161 * @param v_dst
162 *   v address of yuv420p[out]
163 *
164 * @param uv_src
165 *   uv address of nt12t[in]
166 *
167 * @param yuv420_width
168 *   real width of yuv420p[in]
169 *
170 * @param yuv420_height
171 *   real height of yuv420p[in]
172 */
173void csc_tiled_to_linear_uv_deinterleave(
174    unsigned char *u_dst,
175    unsigned char *v_dst,
176    unsigned char *uv_src,
177    unsigned int width,
178    unsigned int height);
179
180/*
181 * Converts linear data to tiled
182 * It supports mfc 6.x tiled
183 * 1. y of yuv420 to y of nv12t
184 *
185 * @param dst
186 *   y address of nv12t[out]
187 *
188 * @param src
189 *   y address of yuv420[in]
190 *
191 * @param yuv420_width
192 *   real width of yuv420[in]
193 *   it should be even
194 *
195 * @param yuv420_height
196 *   real height of yuv420[in]
197 *   it should be even.
198 *
199 */
200void csc_linear_to_tiled_y(
201    unsigned char *y_dst,
202    unsigned char *y_src,
203    unsigned int width,
204    unsigned int height);
205
206/*
207 * Converts and interleaves linear data to tiled
208 * It supports mfc 6.x tiled
209 * 1. uv of nv12t to uv of yuv420
210 *
211 * @param dst
212 *   uv address of nv12t[out]
213 *
214 * @param src
215 *   u address of yuv420[in]
216 *
217 * @param src
218 *   v address of yuv420[in]
219 *
220 * @param yuv420_width
221 *   real width of yuv420[in]
222 *
223 * @param yuv420_height
224 *   real height of yuv420[in]
225 *
226 */
227void csc_linear_to_tiled_uv(
228    unsigned char *uv_dst,
229    unsigned char *u_src,
230    unsigned char *v_src,
231    unsigned int width,
232    unsigned int height);
233
234/*
235 * Converts RGB565 to YUV420P
236 *
237 * @param y_dst
238 *   Y plane address of YUV420P[out]
239 *
240 * @param u_dst
241 *   U plane address of YUV420P[out]
242 *
243 * @param v_dst
244 *   V plane address of YUV420P[out]
245 *
246 * @param rgb_src
247 *   Address of RGB565[in]
248 *
249 * @param width
250 *   Width of RGB565[in]
251 *
252 * @param height
253 *   Height of RGB565[in]
254 */
255void csc_RGB565_to_YUV420P(
256    unsigned char *y_dst,
257    unsigned char *u_dst,
258    unsigned char *v_dst,
259    unsigned char *rgb_src,
260    int width,
261    int height);
262
263/*
264 * Converts RGB565 to YUV420S
265 *
266 * @param y_dst
267 *   Y plane address of YUV420S[out]
268 *
269 * @param uv_dst
270 *   UV plane address of YUV420S[out]
271 *
272 * @param rgb_src
273 *   Address of RGB565[in]
274 *
275 * @param width
276 *   Width of RGB565[in]
277 *
278 * @param height
279 *   Height of RGB565[in]
280 */
281void csc_RGB565_to_YUV420SP(
282    unsigned char *y_dst,
283    unsigned char *uv_dst,
284    unsigned char *rgb_src,
285    int width,
286    int height);
287
288/*
289 * Converts ARGB8888 to YUV420P
290 *
291 * @param y_dst
292 *   Y plane address of YUV420P[out]
293 *
294 * @param u_dst
295 *   U plane address of YUV420P[out]
296 *
297 * @param v_dst
298 *   V plane address of YUV420P[out]
299 *
300 * @param rgb_src
301 *   Address of ARGB8888[in]
302 *
303 * @param width
304 *   Width of ARGB8888[in]
305 *
306 * @param height
307 *   Height of ARGB8888[in]
308 */
309void csc_ARGB8888_to_YUV420P(
310    unsigned char *y_dst,
311    unsigned char *u_dst,
312    unsigned char *v_dst,
313    unsigned char *rgb_src,
314    unsigned int width,
315    unsigned int height);
316
317/*
318 * Converts ARGB8888 to YUV420S
319 *
320 * @param y_dst
321 *   Y plane address of YUV420S[out]
322 *
323 * @param uv_dst
324 *   UV plane address of YUV420S[out]
325 *
326 * @param rgb_src
327 *   Address of ARGB8888[in]
328 *
329 * @param width
330 *   Width of ARGB8888[in]
331 *
332 * @param height
333 *   Height of ARGB8888[in]
334 */
335void csc_ARGB8888_to_YUV420SP(
336    unsigned char *y_dst,
337    unsigned char *uv_dst,
338    unsigned char *rgb_src,
339    unsigned int width,
340    unsigned int height);
341
342/*
343 * De-interleaves src to dest1, dest2
344 *
345 * @param dest1
346 *   Address of de-interleaved data[out]
347 *
348 * @param dest2
349 *   Address of de-interleaved data[out]
350 *
351 * @param src
352 *   Address of interleaved data[in]
353 *
354 * @param src_size
355 *   Size of interleaved data[in]
356 */
357void csc_deinterleave_memcpy_neon(
358    unsigned char *dest1,
359    unsigned char *dest2,
360    unsigned char *src,
361    unsigned int src_size);
362
363/*
364 * Interleaves src1, src2 to dest
365 *
366 * @param dest
367 *   Address of interleaved data[out]
368 *
369 * @param src1
370 *   Address of de-interleaved data[in]
371 *
372 * @param src2
373 *   Address of de-interleaved data[in]
374 *
375 * @param src_size
376 *   Size of de-interleaved data[in]
377 */
378void csc_interleave_memcpy_neon(
379    unsigned char *dest,
380    unsigned char *src1,
381    unsigned char *src2,
382    unsigned int src_size);
383
384/*
385 * Converts tiled data to linear for mfc 6.x
386 * 1. Y of NV12T to Y of YUV420P
387 * 2. Y of NV12T to Y of YUV420S
388 *
389 * @param dst
390 *   Y address of YUV420[out]
391 *
392 * @param src
393 *   Y address of NV12T[in]
394 *
395 * @param yuv420_width
396 *   real width of YUV420[in]
397 *
398 * @param yuv420_height
399 *   Y: real height of YUV420[in]
400 *
401 */
402void csc_tiled_to_linear_y_neon(
403    unsigned char *y_dst,
404    unsigned char *y_src,
405    unsigned int width,
406    unsigned int height);
407
408/*
409 * Converts tiled data to linear for mfc 6.x
410 * 1. UV of NV12T to Y of YUV420S
411 *
412 * @param u_dst
413 *   UV plane address of YUV420P[out]
414 *
415 * @param nv12t_src
416 *   Y or UV plane address of NV12T[in]
417 *
418 * @param yuv420_width
419 *   real width of YUV420[in]
420 *
421 * @param yuv420_height
422 *   (real height)/2 of YUV420[in]
423 */
424void csc_tiled_to_linear_uv_neon(
425    unsigned char *uv_dst,
426    unsigned char *uv_src,
427    unsigned int width,
428    unsigned int height);
429
430/*
431 * Converts tiled data to linear for mfc 6.x
432 * Deinterleave src to u_dst, v_dst
433 * 1. UV of NV12T to Y of YUV420P
434 *
435 * @param u_dst
436 *   U plane address of YUV420P[out]
437 *
438 * @param v_dst
439 *   V plane address of YUV420P[out]
440 *
441 * @param nv12t_src
442 *   Y or UV plane address of NV12T[in]
443 *
444 * @param yuv420_width
445 *   real width of YUV420[in]
446 *
447 * @param yuv420_height
448 *   (real height)/2 of YUV420[in]
449 */
450void csc_tiled_to_linear_uv_deinterleave_neon(
451    unsigned char *u_dst,
452    unsigned char *v_dst,
453    unsigned char *uv_src,
454    unsigned int width,
455    unsigned int height);
456
457/*
458 * Converts linear data to tiled
459 * It supports mfc 6.x tiled
460 * 1. y of yuv420 to y of nv12t
461 *
462 * @param dst
463 *   y address of nv12t[out]
464 *
465 * @param src
466 *   y address of yuv420[in]
467 *
468 * @param yuv420_width
469 *   real width of yuv420[in]
470 *   it should be even
471 *
472 * @param yuv420_height
473 *   real height of yuv420[in]
474 *   it should be even.
475 *
476 */
477void csc_linear_to_tiled_y_neon(
478    unsigned char *y_dst,
479    unsigned char *y_src,
480    unsigned int width,
481    unsigned int height);
482
483/*
484 * Converts and interleave linear data to tiled
485 * It supports mfc 6.x tiled
486 * 1. uv of nv12t to uv of yuv420
487 *
488 * @param dst
489 *   uv address of yuv420[out]
490 *
491 * @param src
492 *   uv address of nv12t[in]
493 *
494 * @param yuv420_width
495 *   real width of yuv420[in]
496 *
497 * @param yuv420_height
498 *   real height of yuv420[in]
499 *
500 */
501void csc_linear_to_tiled_uv_neon(
502    unsigned char *uv_dst,
503    unsigned char *uv_src,
504    unsigned int width,
505    unsigned int height);
506
507void csc_ARGB8888_to_YUV420SP_NEON(
508    unsigned char *y_dst,
509    unsigned char *uv_dst,
510    unsigned char *rgb_src,
511    unsigned int width,
512    unsigned int height);
513
514#endif /*COLOR_SPACE_CONVERTOR_H_*/
515