1 /*
2  *  Copyright 2012 The LibYuv Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS. All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef INCLUDE_LIBYUV_CONVERT_ARGB_H_
12 #define INCLUDE_LIBYUV_CONVERT_ARGB_H_
13 
14 #include "libyuv/basic_types.h"
15 
16 #include "libyuv/rotate.h"  // For enum RotationMode.
17 
18 // TODO(fbarchard): This set of functions should exactly match convert.h
19 // TODO(fbarchard): Add tests. Create random content of right size and convert
20 // with C vs Opt and or to I420 and compare.
21 // TODO(fbarchard): Some of these functions lack parameter setting.
22 
23 #ifdef __cplusplus
24 namespace libyuv {
25 extern "C" {
26 #endif
27 
28 // Alias.
29 #define ARGBToARGB ARGBCopy
30 
31 // Copy ARGB to ARGB.
32 LIBYUV_API
33 int ARGBCopy(const uint8_t* src_argb,
34              int src_stride_argb,
35              uint8_t* dst_argb,
36              int dst_stride_argb,
37              int width,
38              int height);
39 
40 // Convert I420 to ARGB.
41 LIBYUV_API
42 int I420ToARGB(const uint8_t* src_y,
43                int src_stride_y,
44                const uint8_t* src_u,
45                int src_stride_u,
46                const uint8_t* src_v,
47                int src_stride_v,
48                uint8_t* dst_argb,
49                int dst_stride_argb,
50                int width,
51                int height);
52 
53 // Duplicate prototype for function in convert_from.h for remoting.
54 LIBYUV_API
55 int I420ToABGR(const uint8_t* src_y,
56                int src_stride_y,
57                const uint8_t* src_u,
58                int src_stride_u,
59                const uint8_t* src_v,
60                int src_stride_v,
61                uint8_t* dst_abgr,
62                int dst_stride_abgr,
63                int width,
64                int height);
65 
66 // Convert I010 to ARGB.
67 LIBYUV_API
68 int I010ToARGB(const uint16_t* src_y,
69                int src_stride_y,
70                const uint16_t* src_u,
71                int src_stride_u,
72                const uint16_t* src_v,
73                int src_stride_v,
74                uint8_t* dst_argb,
75                int dst_stride_argb,
76                int width,
77                int height);
78 
79 // Convert I010 to ARGB.
80 LIBYUV_API
81 int I010ToARGB(const uint16_t* src_y,
82                int src_stride_y,
83                const uint16_t* src_u,
84                int src_stride_u,
85                const uint16_t* src_v,
86                int src_stride_v,
87                uint8_t* dst_argb,
88                int dst_stride_argb,
89                int width,
90                int height);
91 
92 // Convert I010 to ABGR.
93 LIBYUV_API
94 int I010ToABGR(const uint16_t* src_y,
95                int src_stride_y,
96                const uint16_t* src_u,
97                int src_stride_u,
98                const uint16_t* src_v,
99                int src_stride_v,
100                uint8_t* dst_abgr,
101                int dst_stride_abgr,
102                int width,
103                int height);
104 
105 // Convert H010 to ARGB.
106 LIBYUV_API
107 int H010ToARGB(const uint16_t* src_y,
108                int src_stride_y,
109                const uint16_t* src_u,
110                int src_stride_u,
111                const uint16_t* src_v,
112                int src_stride_v,
113                uint8_t* dst_argb,
114                int dst_stride_argb,
115                int width,
116                int height);
117 
118 // Convert H010 to ABGR.
119 LIBYUV_API
120 int H010ToABGR(const uint16_t* src_y,
121                int src_stride_y,
122                const uint16_t* src_u,
123                int src_stride_u,
124                const uint16_t* src_v,
125                int src_stride_v,
126                uint8_t* dst_abgr,
127                int dst_stride_abgr,
128                int width,
129                int height);
130 
131 // Convert I422 to ARGB.
132 LIBYUV_API
133 int I422ToARGB(const uint8_t* src_y,
134                int src_stride_y,
135                const uint8_t* src_u,
136                int src_stride_u,
137                const uint8_t* src_v,
138                int src_stride_v,
139                uint8_t* dst_argb,
140                int dst_stride_argb,
141                int width,
142                int height);
143 
144 // Convert I444 to ARGB.
145 LIBYUV_API
146 int I444ToARGB(const uint8_t* src_y,
147                int src_stride_y,
148                const uint8_t* src_u,
149                int src_stride_u,
150                const uint8_t* src_v,
151                int src_stride_v,
152                uint8_t* dst_argb,
153                int dst_stride_argb,
154                int width,
155                int height);
156 
157 // Convert J444 to ARGB.
158 LIBYUV_API
159 int J444ToARGB(const uint8_t* src_y,
160                int src_stride_y,
161                const uint8_t* src_u,
162                int src_stride_u,
163                const uint8_t* src_v,
164                int src_stride_v,
165                uint8_t* dst_argb,
166                int dst_stride_argb,
167                int width,
168                int height);
169 
170 // Convert I444 to ABGR.
171 LIBYUV_API
172 int I444ToABGR(const uint8_t* src_y,
173                int src_stride_y,
174                const uint8_t* src_u,
175                int src_stride_u,
176                const uint8_t* src_v,
177                int src_stride_v,
178                uint8_t* dst_abgr,
179                int dst_stride_abgr,
180                int width,
181                int height);
182 
183 // Convert I420 with Alpha to preattenuated ARGB.
184 LIBYUV_API
185 int I420AlphaToARGB(const uint8_t* src_y,
186                     int src_stride_y,
187                     const uint8_t* src_u,
188                     int src_stride_u,
189                     const uint8_t* src_v,
190                     int src_stride_v,
191                     const uint8_t* src_a,
192                     int src_stride_a,
193                     uint8_t* dst_argb,
194                     int dst_stride_argb,
195                     int width,
196                     int height,
197                     int attenuate);
198 
199 // Convert I420 with Alpha to preattenuated ABGR.
200 LIBYUV_API
201 int I420AlphaToABGR(const uint8_t* src_y,
202                     int src_stride_y,
203                     const uint8_t* src_u,
204                     int src_stride_u,
205                     const uint8_t* src_v,
206                     int src_stride_v,
207                     const uint8_t* src_a,
208                     int src_stride_a,
209                     uint8_t* dst_abgr,
210                     int dst_stride_abgr,
211                     int width,
212                     int height,
213                     int attenuate);
214 
215 // Convert I400 (grey) to ARGB.  Reverse of ARGBToI400.
216 LIBYUV_API
217 int I400ToARGB(const uint8_t* src_y,
218                int src_stride_y,
219                uint8_t* dst_argb,
220                int dst_stride_argb,
221                int width,
222                int height);
223 
224 // Convert J400 (jpeg grey) to ARGB.
225 LIBYUV_API
226 int J400ToARGB(const uint8_t* src_y,
227                int src_stride_y,
228                uint8_t* dst_argb,
229                int dst_stride_argb,
230                int width,
231                int height);
232 
233 // Alias.
234 #define YToARGB I400ToARGB
235 
236 // Convert NV12 to ARGB.
237 LIBYUV_API
238 int NV12ToARGB(const uint8_t* src_y,
239                int src_stride_y,
240                const uint8_t* src_uv,
241                int src_stride_uv,
242                uint8_t* dst_argb,
243                int dst_stride_argb,
244                int width,
245                int height);
246 
247 // Convert NV21 to ARGB.
248 LIBYUV_API
249 int NV21ToARGB(const uint8_t* src_y,
250                int src_stride_y,
251                const uint8_t* src_vu,
252                int src_stride_vu,
253                uint8_t* dst_argb,
254                int dst_stride_argb,
255                int width,
256                int height);
257 
258 // Convert NV12 to ABGR.
259 int NV12ToABGR(const uint8_t* src_y,
260                int src_stride_y,
261                const uint8_t* src_uv,
262                int src_stride_uv,
263                uint8_t* dst_abgr,
264                int dst_stride_abgr,
265                int width,
266                int height);
267 
268 // Convert NV21 to ABGR.
269 LIBYUV_API
270 int NV21ToABGR(const uint8_t* src_y,
271                int src_stride_y,
272                const uint8_t* src_vu,
273                int src_stride_vu,
274                uint8_t* dst_abgr,
275                int dst_stride_abgr,
276                int width,
277                int height);
278 
279 // Convert NV12 to RGB24.
280 LIBYUV_API
281 int NV12ToRGB24(const uint8_t* src_y,
282                 int src_stride_y,
283                 const uint8_t* src_uv,
284                 int src_stride_uv,
285                 uint8_t* dst_rgb24,
286                 int dst_stride_rgb24,
287                 int width,
288                 int height);
289 
290 // Convert NV21 to RGB24.
291 LIBYUV_API
292 int NV21ToRGB24(const uint8_t* src_y,
293                 int src_stride_y,
294                 const uint8_t* src_vu,
295                 int src_stride_vu,
296                 uint8_t* dst_rgb24,
297                 int dst_stride_rgb24,
298                 int width,
299                 int height);
300 
301 // Convert M420 to ARGB.
302 LIBYUV_API
303 int M420ToARGB(const uint8_t* src_m420,
304                int src_stride_m420,
305                uint8_t* dst_argb,
306                int dst_stride_argb,
307                int width,
308                int height);
309 
310 // Convert YUY2 to ARGB.
311 LIBYUV_API
312 int YUY2ToARGB(const uint8_t* src_yuy2,
313                int src_stride_yuy2,
314                uint8_t* dst_argb,
315                int dst_stride_argb,
316                int width,
317                int height);
318 
319 // Convert UYVY to ARGB.
320 LIBYUV_API
321 int UYVYToARGB(const uint8_t* src_uyvy,
322                int src_stride_uyvy,
323                uint8_t* dst_argb,
324                int dst_stride_argb,
325                int width,
326                int height);
327 
328 // Convert J420 to ARGB.
329 LIBYUV_API
330 int J420ToARGB(const uint8_t* src_y,
331                int src_stride_y,
332                const uint8_t* src_u,
333                int src_stride_u,
334                const uint8_t* src_v,
335                int src_stride_v,
336                uint8_t* dst_argb,
337                int dst_stride_argb,
338                int width,
339                int height);
340 
341 // Convert J422 to ARGB.
342 LIBYUV_API
343 int J422ToARGB(const uint8_t* src_y,
344                int src_stride_y,
345                const uint8_t* src_u,
346                int src_stride_u,
347                const uint8_t* src_v,
348                int src_stride_v,
349                uint8_t* dst_argb,
350                int dst_stride_argb,
351                int width,
352                int height);
353 
354 // Convert J420 to ABGR.
355 LIBYUV_API
356 int J420ToABGR(const uint8_t* src_y,
357                int src_stride_y,
358                const uint8_t* src_u,
359                int src_stride_u,
360                const uint8_t* src_v,
361                int src_stride_v,
362                uint8_t* dst_abgr,
363                int dst_stride_abgr,
364                int width,
365                int height);
366 
367 // Convert J422 to ABGR.
368 LIBYUV_API
369 int J422ToABGR(const uint8_t* src_y,
370                int src_stride_y,
371                const uint8_t* src_u,
372                int src_stride_u,
373                const uint8_t* src_v,
374                int src_stride_v,
375                uint8_t* dst_abgr,
376                int dst_stride_abgr,
377                int width,
378                int height);
379 
380 // Convert H420 to ARGB.
381 LIBYUV_API
382 int H420ToARGB(const uint8_t* src_y,
383                int src_stride_y,
384                const uint8_t* src_u,
385                int src_stride_u,
386                const uint8_t* src_v,
387                int src_stride_v,
388                uint8_t* dst_argb,
389                int dst_stride_argb,
390                int width,
391                int height);
392 
393 // Convert H422 to ARGB.
394 LIBYUV_API
395 int H422ToARGB(const uint8_t* src_y,
396                int src_stride_y,
397                const uint8_t* src_u,
398                int src_stride_u,
399                const uint8_t* src_v,
400                int src_stride_v,
401                uint8_t* dst_argb,
402                int dst_stride_argb,
403                int width,
404                int height);
405 
406 // Convert H420 to ABGR.
407 LIBYUV_API
408 int H420ToABGR(const uint8_t* src_y,
409                int src_stride_y,
410                const uint8_t* src_u,
411                int src_stride_u,
412                const uint8_t* src_v,
413                int src_stride_v,
414                uint8_t* dst_abgr,
415                int dst_stride_abgr,
416                int width,
417                int height);
418 
419 // Convert H422 to ABGR.
420 LIBYUV_API
421 int H422ToABGR(const uint8_t* src_y,
422                int src_stride_y,
423                const uint8_t* src_u,
424                int src_stride_u,
425                const uint8_t* src_v,
426                int src_stride_v,
427                uint8_t* dst_abgr,
428                int dst_stride_abgr,
429                int width,
430                int height);
431 
432 // Convert H010 to ARGB.
433 LIBYUV_API
434 int H010ToARGB(const uint16_t* src_y,
435                int src_stride_y,
436                const uint16_t* src_u,
437                int src_stride_u,
438                const uint16_t* src_v,
439                int src_stride_v,
440                uint8_t* dst_argb,
441                int dst_stride_argb,
442                int width,
443                int height);
444 
445 // Convert I010 to AR30.
446 LIBYUV_API
447 int I010ToAR30(const uint16_t* src_y,
448                int src_stride_y,
449                const uint16_t* src_u,
450                int src_stride_u,
451                const uint16_t* src_v,
452                int src_stride_v,
453                uint8_t* dst_ar30,
454                int dst_stride_ar30,
455                int width,
456                int height);
457 
458 // Convert H010 to AR30.
459 LIBYUV_API
460 int H010ToAR30(const uint16_t* src_y,
461                int src_stride_y,
462                const uint16_t* src_u,
463                int src_stride_u,
464                const uint16_t* src_v,
465                int src_stride_v,
466                uint8_t* dst_ar30,
467                int dst_stride_ar30,
468                int width,
469                int height);
470 
471 // Convert I010 to AB30.
472 LIBYUV_API
473 int I010ToAB30(const uint16_t* src_y,
474                int src_stride_y,
475                const uint16_t* src_u,
476                int src_stride_u,
477                const uint16_t* src_v,
478                int src_stride_v,
479                uint8_t* dst_ab30,
480                int dst_stride_ab30,
481                int width,
482                int height);
483 
484 // Convert H010 to AB30.
485 LIBYUV_API
486 int H010ToAB30(const uint16_t* src_y,
487                int src_stride_y,
488                const uint16_t* src_u,
489                int src_stride_u,
490                const uint16_t* src_v,
491                int src_stride_v,
492                uint8_t* dst_ab30,
493                int dst_stride_ab30,
494                int width,
495                int height);
496 
497 // BGRA little endian (argb in memory) to ARGB.
498 LIBYUV_API
499 int BGRAToARGB(const uint8_t* src_bgra,
500                int src_stride_bgra,
501                uint8_t* dst_argb,
502                int dst_stride_argb,
503                int width,
504                int height);
505 
506 // ABGR little endian (rgba in memory) to ARGB.
507 LIBYUV_API
508 int ABGRToARGB(const uint8_t* src_abgr,
509                int src_stride_abgr,
510                uint8_t* dst_argb,
511                int dst_stride_argb,
512                int width,
513                int height);
514 
515 // RGBA little endian (abgr in memory) to ARGB.
516 LIBYUV_API
517 int RGBAToARGB(const uint8_t* src_rgba,
518                int src_stride_rgba,
519                uint8_t* dst_argb,
520                int dst_stride_argb,
521                int width,
522                int height);
523 
524 // Deprecated function name.
525 #define BG24ToARGB RGB24ToARGB
526 
527 // RGB little endian (bgr in memory) to ARGB.
528 LIBYUV_API
529 int RGB24ToARGB(const uint8_t* src_rgb24,
530                 int src_stride_rgb24,
531                 uint8_t* dst_argb,
532                 int dst_stride_argb,
533                 int width,
534                 int height);
535 
536 // RGB big endian (rgb in memory) to ARGB.
537 LIBYUV_API
538 int RAWToARGB(const uint8_t* src_raw,
539               int src_stride_raw,
540               uint8_t* dst_argb,
541               int dst_stride_argb,
542               int width,
543               int height);
544 
545 // RGB16 (RGBP fourcc) little endian to ARGB.
546 LIBYUV_API
547 int RGB565ToARGB(const uint8_t* src_rgb565,
548                  int src_stride_rgb565,
549                  uint8_t* dst_argb,
550                  int dst_stride_argb,
551                  int width,
552                  int height);
553 
554 // RGB15 (RGBO fourcc) little endian to ARGB.
555 LIBYUV_API
556 int ARGB1555ToARGB(const uint8_t* src_argb1555,
557                    int src_stride_argb1555,
558                    uint8_t* dst_argb,
559                    int dst_stride_argb,
560                    int width,
561                    int height);
562 
563 // RGB12 (R444 fourcc) little endian to ARGB.
564 LIBYUV_API
565 int ARGB4444ToARGB(const uint8_t* src_argb4444,
566                    int src_stride_argb4444,
567                    uint8_t* dst_argb,
568                    int dst_stride_argb,
569                    int width,
570                    int height);
571 
572 // Aliases
573 #define AB30ToARGB AR30ToABGR
574 #define AB30ToABGR AR30ToARGB
575 #define AB30ToAR30 AR30ToAB30
576 
577 // Convert AR30 To ARGB.
578 LIBYUV_API
579 int AR30ToARGB(const uint8_t* src_ar30,
580                int src_stride_ar30,
581                uint8_t* dst_argb,
582                int dst_stride_argb,
583                int width,
584                int height);
585 
586 // Convert AR30 To ABGR.
587 LIBYUV_API
588 int AR30ToABGR(const uint8_t* src_ar30,
589                int src_stride_ar30,
590                uint8_t* dst_abgr,
591                int dst_stride_abgr,
592                int width,
593                int height);
594 
595 // Convert AR30 To AB30.
596 LIBYUV_API
597 int AR30ToAB30(const uint8_t* src_ar30,
598                int src_stride_ar30,
599                uint8_t* dst_ab30,
600                int dst_stride_ab30,
601                int width,
602                int height);
603 
604 #ifdef HAVE_JPEG
605 // src_width/height provided by capture
606 // dst_width/height for clipping determine final size.
607 LIBYUV_API
608 int MJPGToARGB(const uint8_t* sample,
609                size_t sample_size,
610                uint8_t* dst_argb,
611                int dst_stride_argb,
612                int src_width,
613                int src_height,
614                int dst_width,
615                int dst_height);
616 #endif
617 
618 // Convert Android420 to ARGB.
619 LIBYUV_API
620 int Android420ToARGB(const uint8_t* src_y,
621                      int src_stride_y,
622                      const uint8_t* src_u,
623                      int src_stride_u,
624                      const uint8_t* src_v,
625                      int src_stride_v,
626                      int src_pixel_stride_uv,
627                      uint8_t* dst_argb,
628                      int dst_stride_argb,
629                      int width,
630                      int height);
631 
632 // Convert Android420 to ABGR.
633 LIBYUV_API
634 int Android420ToABGR(const uint8_t* src_y,
635                      int src_stride_y,
636                      const uint8_t* src_u,
637                      int src_stride_u,
638                      const uint8_t* src_v,
639                      int src_stride_v,
640                      int src_pixel_stride_uv,
641                      uint8_t* dst_abgr,
642                      int dst_stride_abgr,
643                      int width,
644                      int height);
645 
646 // Convert camera sample to ARGB with cropping, rotation and vertical flip.
647 // "sample_size" is needed to parse MJPG.
648 // "dst_stride_argb" number of bytes in a row of the dst_argb plane.
649 //   Normally this would be the same as dst_width, with recommended alignment
650 //   to 16 bytes for better efficiency.
651 //   If rotation of 90 or 270 is used, stride is affected. The caller should
652 //   allocate the I420 buffer according to rotation.
653 // "dst_stride_u" number of bytes in a row of the dst_u plane.
654 //   Normally this would be the same as (dst_width + 1) / 2, with
655 //   recommended alignment to 16 bytes for better efficiency.
656 //   If rotation of 90 or 270 is used, stride is affected.
657 // "crop_x" and "crop_y" are starting position for cropping.
658 //   To center, crop_x = (src_width - dst_width) / 2
659 //              crop_y = (src_height - dst_height) / 2
660 // "src_width" / "src_height" is size of src_frame in pixels.
661 //   "src_height" can be negative indicating a vertically flipped image source.
662 // "crop_width" / "crop_height" is the size to crop the src to.
663 //    Must be less than or equal to src_width/src_height
664 //    Cropping parameters are pre-rotation.
665 // "rotation" can be 0, 90, 180 or 270.
666 // "fourcc" is a fourcc. ie 'I420', 'YUY2'
667 // Returns 0 for successful; -1 for invalid parameter. Non-zero for failure.
668 LIBYUV_API
669 int ConvertToARGB(const uint8_t* sample,
670                   size_t sample_size,
671                   uint8_t* dst_argb,
672                   int dst_stride_argb,
673                   int crop_x,
674                   int crop_y,
675                   int src_width,
676                   int src_height,
677                   int crop_width,
678                   int crop_height,
679                   enum RotationMode rotation,
680                   uint32_t fourcc);
681 
682 #ifdef __cplusplus
683 }  // extern "C"
684 }  // namespace libyuv
685 #endif
686 
687 #endif  // INCLUDE_LIBYUV_CONVERT_ARGB_H_
688