Apollo 11.0
自动驾驶开放平台
util.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17#pragma once
18
19#include <fcntl.h> /* low-level i/o */
20#include <malloc.h>
21#include <sys/ioctl.h>
22#include <sys/mman.h>
23#include <sys/stat.h>
24#include <sys/time.h>
25#include <sys/types.h>
26#include <unistd.h>
27#include <cassert>
28#include <cerrno>
29#include <cstdint>
30#include <cstdio>
31#include <cstdlib>
32#include <cstring>
33
34#include <immintrin.h>
35#include <x86intrin.h>
36
37namespace apollo {
38namespace drivers {
39namespace camera {
40
41void yuyv2rgb_avx(unsigned char *YUV, unsigned char *RGB, int NumPixels);
42
43#define SIMD_INLINE inline __attribute__((always_inline))
44
45void print_m256(const __m256i a);
46void print_m256_i32(const __m256i a);
47void print_m256_i16(const __m256i a);
48
49template <class T>
50SIMD_INLINE char GetChar(T value, size_t index) {
51 return (reinterpret_cast<char *>(&value))[index];
52}
53
54#define SIMD_CHAR_AS_LONGLONG(a) (((int64_t)a) & 0xFF)
55
56#define SIMD_SHORT_AS_LONGLONG(a) (((int64_t)a) & 0xFFFF)
57
58#define SIMD_INT_AS_LONGLONG(a) (((int64_t)a) & 0xFFFFFFFF)
59
60#define SIMD_LL_SET1_EPI8(a) \
61 SIMD_CHAR_AS_LONGLONG(a) | (SIMD_CHAR_AS_LONGLONG(a) << 8) | (SIMD_CHAR_AS_LONGLONG(a) << 16) \
62 | (SIMD_CHAR_AS_LONGLONG(a) << 24) | (SIMD_CHAR_AS_LONGLONG(a) << 32) | (SIMD_CHAR_AS_LONGLONG(a) << 40) \
63 | (SIMD_CHAR_AS_LONGLONG(a) << 48) | (SIMD_CHAR_AS_LONGLONG(a) << 56)
64
65#define SIMD_LL_SET2_EPI8(a, b) \
66 SIMD_CHAR_AS_LONGLONG(a) | (SIMD_CHAR_AS_LONGLONG(b) << 8) | (SIMD_CHAR_AS_LONGLONG(a) << 16) \
67 | (SIMD_CHAR_AS_LONGLONG(b) << 24) | (SIMD_CHAR_AS_LONGLONG(a) << 32) | (SIMD_CHAR_AS_LONGLONG(b) << 40) \
68 | (SIMD_CHAR_AS_LONGLONG(a) << 48) | (SIMD_CHAR_AS_LONGLONG(b) << 56)
69
70#define SIMD_LL_SETR_EPI8(a, b, c, d, e, f, g, h) \
71 SIMD_CHAR_AS_LONGLONG(a) | (SIMD_CHAR_AS_LONGLONG(b) << 8) | (SIMD_CHAR_AS_LONGLONG(c) << 16) \
72 | (SIMD_CHAR_AS_LONGLONG(d) << 24) | (SIMD_CHAR_AS_LONGLONG(e) << 32) | (SIMD_CHAR_AS_LONGLONG(f) << 40) \
73 | (SIMD_CHAR_AS_LONGLONG(g) << 48) | (SIMD_CHAR_AS_LONGLONG(h) << 56)
74
75#define SIMD_LL_SET1_EPI16(a) \
76 SIMD_SHORT_AS_LONGLONG(a) | (SIMD_SHORT_AS_LONGLONG(a) << 16) | (SIMD_SHORT_AS_LONGLONG(a) << 32) \
77 | (SIMD_SHORT_AS_LONGLONG(a) << 48)
78
79#define SIMD_LL_SET2_EPI16(a, b) \
80 SIMD_SHORT_AS_LONGLONG(a) | (SIMD_SHORT_AS_LONGLONG(b) << 16) | (SIMD_SHORT_AS_LONGLONG(a) << 32) \
81 | (SIMD_SHORT_AS_LONGLONG(b) << 48)
82
83#define SIMD_LL_SETR_EPI16(a, b, c, d) \
84 SIMD_SHORT_AS_LONGLONG(a) | (SIMD_SHORT_AS_LONGLONG(b) << 16) | (SIMD_SHORT_AS_LONGLONG(c) << 32) \
85 | (SIMD_SHORT_AS_LONGLONG(d) << 48)
86
87#define SIMD_LL_SET1_EPI32(a) SIMD_INT_AS_LONGLONG(a) | (SIMD_INT_AS_LONGLONG(a) << 32)
88
89#define SIMD_LL_SET2_EPI32(a, b) SIMD_INT_AS_LONGLONG(a) | (SIMD_INT_AS_LONGLONG(b) << 32)
90
91#define SIMD_MM256_SET1_EPI8(a) \
92 { \
93 SIMD_LL_SET1_EPI8(a) \
94 , SIMD_LL_SET1_EPI8(a), SIMD_LL_SET1_EPI8(a), SIMD_LL_SET1_EPI8(a) \
95 }
96
97#define SIMD_MM256_SET2_EPI8(a0, a1) \
98 { \
99 SIMD_LL_SET2_EPI8(a0, a1) \
100 , SIMD_LL_SET2_EPI8(a0, a1), SIMD_LL_SET2_EPI8(a0, a1), SIMD_LL_SET2_EPI8(a0, a1) \
101 }
102
103#define SIMD_MM256_SETR_EPI8( \
104 a0, \
105 a1, \
106 a2, \
107 a3, \
108 a4, \
109 a5, \
110 a6, \
111 a7, \
112 a8, \
113 a9, \
114 aa, \
115 ab, \
116 ac, \
117 ad, \
118 ae, \
119 af, \
120 b0, \
121 b1, \
122 b2, \
123 b3, \
124 b4, \
125 b5, \
126 b6, \
127 b7, \
128 b8, \
129 b9, \
130 ba, \
131 bb, \
132 bc, \
133 bd, \
134 be, \
135 bf) \
136 { \
137 SIMD_LL_SETR_EPI8(a0, a1, a2, a3, a4, a5, a6, a7) \
138 , SIMD_LL_SETR_EPI8(a8, a9, aa, ab, ac, ad, ae, af), SIMD_LL_SETR_EPI8(b0, b1, b2, b3, b4, b5, b6, b7), \
139 SIMD_LL_SETR_EPI8(b8, b9, ba, bb, bc, bd, be, bf) \
140 }
141
142#define SIMD_MM256_SET1_EPI16(a) \
143 { \
144 SIMD_LL_SET1_EPI16(a) \
145 , SIMD_LL_SET1_EPI16(a), SIMD_LL_SET1_EPI16(a), SIMD_LL_SET1_EPI16(a) \
146 }
147
148#define SIMD_MM256_SET2_EPI16(a0, a1) \
149 { \
150 SIMD_LL_SET2_EPI16(a0, a1) \
151 , SIMD_LL_SET2_EPI16(a0, a1), SIMD_LL_SET2_EPI16(a0, a1), SIMD_LL_SET2_EPI16(a0, a1) \
152 }
153
154#define SIMD_MM256_SETR_EPI16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af) \
155 { \
156 SIMD_LL_SETR_EPI16(a0, a1, a2, a3) \
157 , SIMD_LL_SETR_EPI16(a4, a5, a6, a7), SIMD_LL_SETR_EPI16(a8, a9, aa, ab), SIMD_LL_SETR_EPI16(ac, ad, ae, af) \
158 }
159
160#define SIMD_MM256_SET1_EPI32(a) \
161 { \
162 SIMD_LL_SET1_EPI32(a) \
163 , SIMD_LL_SET1_EPI32(a), SIMD_LL_SET1_EPI32(a), SIMD_LL_SET1_EPI32(a) \
164 }
165
166#define SIMD_MM256_SET2_EPI32(a0, a1) \
167 { \
168 SIMD_LL_SET2_EPI32(a0, a1) \
169 , SIMD_LL_SET2_EPI32(a0, a1), SIMD_LL_SET2_EPI32(a0, a1), SIMD_LL_SET2_EPI32(a0, a1) \
170 }
171
172#define SIMD_MM256_SETR_EPI32(a0, a1, a2, a3, a4, a5, a6, a7) \
173 { \
174 SIMD_LL_SET2_EPI32(a0, a1) \
175 , SIMD_LL_SET2_EPI32(a2, a3), SIMD_LL_SET2_EPI32(a4, a5), SIMD_LL_SET2_EPI32(a6, a7) \
176 }
177
178const size_t A = sizeof(__m256i);
179const size_t DA = 2 * A;
180const size_t QA = 4 * A;
181const size_t OA = 8 * A;
182const size_t HA = A / 2;
183
184const __m256i K_ZERO = SIMD_MM256_SET1_EPI8(0);
185const __m256i K_INV_ZERO = SIMD_MM256_SET1_EPI8(0xFF);
186
187const __m256i K8_01 = SIMD_MM256_SET1_EPI8(0x01);
188const __m256i K8_02 = SIMD_MM256_SET1_EPI8(0x02);
189const __m256i K8_04 = SIMD_MM256_SET1_EPI8(0x04);
190const __m256i K8_08 = SIMD_MM256_SET1_EPI8(0x08);
191const __m256i K8_10 = SIMD_MM256_SET1_EPI8(0x10);
192const __m256i K8_20 = SIMD_MM256_SET1_EPI8(0x20);
193const __m256i K8_40 = SIMD_MM256_SET1_EPI8(0x40);
194const __m256i K8_80 = SIMD_MM256_SET1_EPI8(0x80);
195
196const __m256i K8_01_FF = SIMD_MM256_SET2_EPI8(0x01, 0xFF);
197
198const __m256i K16_0001 = SIMD_MM256_SET1_EPI16(0x0001);
199const __m256i K16_0002 = SIMD_MM256_SET1_EPI16(0x0002);
200const __m256i K16_0003 = SIMD_MM256_SET1_EPI16(0x0003);
201const __m256i K16_0004 = SIMD_MM256_SET1_EPI16(0x0004);
202const __m256i K16_0005 = SIMD_MM256_SET1_EPI16(0x0005);
203const __m256i K16_0006 = SIMD_MM256_SET1_EPI16(0x0006);
204const __m256i K16_0008 = SIMD_MM256_SET1_EPI16(0x0008);
205const __m256i K16_0010 = SIMD_MM256_SET1_EPI16(0x0010);
206const __m256i K16_0018 = SIMD_MM256_SET1_EPI16(0x0018);
207const __m256i K16_0020 = SIMD_MM256_SET1_EPI16(0x0020);
208const __m256i K16_0080 = SIMD_MM256_SET1_EPI16(0x0080);
209const __m256i K16_00FF = SIMD_MM256_SET1_EPI16(0x00FF);
210const __m256i K16_FF00 = SIMD_MM256_SET1_EPI16(0xFF00);
211
212const __m256i K32_00000001 = SIMD_MM256_SET1_EPI32(0x00000001);
213const __m256i K32_00000002 = SIMD_MM256_SET1_EPI32(0x00000002);
214const __m256i K32_00000004 = SIMD_MM256_SET1_EPI32(0x00000004);
215const __m256i K32_00000008 = SIMD_MM256_SET1_EPI32(0x00000008);
216const __m256i K32_000000FF = SIMD_MM256_SET1_EPI32(0x000000FF);
217const __m256i K32_0000FFFF = SIMD_MM256_SET1_EPI32(0x0000FFFF);
218const __m256i K32_00010000 = SIMD_MM256_SET1_EPI32(0x00010000);
219const __m256i K32_01000000 = SIMD_MM256_SET1_EPI32(0x01000000);
220const __m256i K32_FFFFFF00 = SIMD_MM256_SET1_EPI32(0xFFFFFF00);
221
223 0x0,
224 0x3,
225 0x6,
226 0x9,
227 0xC,
228 0xF,
229 -1,
230 -1,
231 -1,
232 -1,
233 -1,
234 -1,
235 -1,
236 -1,
237 -1,
238 -1,
239 -1,
240 -1,
241 -1,
242 -1,
243 -1,
244 -1,
245 0x2,
246 0x5,
247 0x8,
248 0xB,
249 0xE,
250 -1,
251 -1,
252 -1,
253 -1,
254 -1);
256 -1,
257 -1,
258 -1,
259 -1,
260 -1,
261 -1,
262 -1,
263 -1,
264 -1,
265 -1,
266 -1,
267 0x1,
268 0x4,
269 0x7,
270 0xA,
271 0xD,
272 0x0,
273 0x3,
274 0x6,
275 0x9,
276 0xC,
277 0xF,
278 -1,
279 -1,
280 -1,
281 -1,
282 -1,
283 -1,
284 -1,
285 -1,
286 -1,
287 -1);
289 -1,
290 -1,
291 -1,
292 -1,
293 -1,
294 -1,
295 0x2,
296 0x5,
297 0x8,
298 0xB,
299 0xE,
300 -1,
301 -1,
302 -1,
303 -1,
304 -1,
305 -1,
306 -1,
307 -1,
308 -1,
309 -1,
310 -1,
311 -1,
312 -1,
313 -1,
314 -1,
315 -1,
316 0x1,
317 0x4,
318 0x7,
319 0xA,
320 0xD);
321
323 0x0,
324 0x2,
325 0x4,
326 0x6,
327 0x8,
328 0xa,
329 0xc,
330 0xe,
331 -1,
332 -1,
333 -1,
334 -1,
335 -1,
336 -1,
337 -1,
338 -1,
339 0x0,
340 0x2,
341 0x4,
342 0x6,
343 0x8,
344 0xa,
345 0xc,
346 0xe,
347 -1,
348 -1,
349 -1,
350 -1,
351 -1,
352 -1,
353 -1,
354 -1);
356 -1,
357 -1,
358 -1,
359 -1,
360 -1,
361 -1,
362 -1,
363 -1,
364 0x0,
365 0x2,
366 0x4,
367 0x6,
368 0x8,
369 0xa,
370 0xc,
371 0xe,
372 -1,
373 -1,
374 -1,
375 -1,
376 -1,
377 -1,
378 -1,
379 -1,
380 0x0,
381 0x2,
382 0x4,
383 0x6,
384 0x8,
385 0xa,
386 0xc,
387 0xe);
388
390 0x1,
391 0x5,
392 0x9,
393 0xd,
394 -1,
395 -1,
396 -1,
397 -1,
398 -1,
399 -1,
400 -1,
401 -1,
402 -1,
403 -1,
404 -1,
405 -1,
406 0x1,
407 0x5,
408 0x9,
409 0xd,
410 -1,
411 -1,
412 -1,
413 -1,
414 -1,
415 -1,
416 -1,
417 -1,
418 -1,
419 -1,
420 -1,
421 -1);
423 -1,
424 -1,
425 -1,
426 -1,
427 0x1,
428 0x5,
429 0x9,
430 0xd,
431 -1,
432 -1,
433 -1,
434 -1,
435 -1,
436 -1,
437 -1,
438 -1,
439 -1,
440 -1,
441 -1,
442 -1,
443 0x1,
444 0x5,
445 0x9,
446 0xd,
447 -1,
448 -1,
449 -1,
450 -1,
451 -1,
452 -1,
453 -1,
454 -1);
456 -1,
457 -1,
458 -1,
459 -1,
460 -1,
461 -1,
462 -1,
463 -1,
464 0x1,
465 0x5,
466 0x9,
467 0xd,
468 -1,
469 -1,
470 -1,
471 -1,
472 -1,
473 -1,
474 -1,
475 -1,
476 -1,
477 -1,
478 -1,
479 -1,
480 0x1,
481 0x5,
482 0x9,
483 0xd,
484 -1,
485 -1,
486 -1,
487 -1);
488
490 -1,
491 -1,
492 -1,
493 -1,
494 -1,
495 -1,
496 -1,
497 -1,
498 -1,
499 -1,
500 -1,
501 -1,
502 0x1,
503 0x5,
504 0x9,
505 0xd,
506 -1,
507 -1,
508 -1,
509 -1,
510 -1,
511 -1,
512 -1,
513 -1,
514 -1,
515 -1,
516 -1,
517 -1,
518 0x1,
519 0x5,
520 0x9,
521 0xd);
523 0x0,
524 0x0,
525 0x0,
526 0x0,
527 0x4,
528 0x0,
529 0x0,
530 0x0,
531 0x1,
532 0x0,
533 0x0,
534 0x0,
535 0x5,
536 0x0,
537 0x0,
538 0x0,
539 0x2,
540 0x0,
541 0x0,
542 0x0,
543 0x6,
544 0x0,
545 0x0,
546 0x0,
547 0x3,
548 0x0,
549 0x0,
550 0x0,
551 0x7,
552 0x0,
553 0x0,
554 0x0);
555
557 0x3,
558 0x7,
559 0xb,
560 0xf,
561 -1,
562 -1,
563 -1,
564 -1,
565 -1,
566 -1,
567 -1,
568 -1,
569 -1,
570 -1,
571 -1,
572 -1,
573 0x3,
574 0x7,
575 0xb,
576 0xf,
577 -1,
578 -1,
579 -1,
580 -1,
581 -1,
582 -1,
583 -1,
584 -1,
585 -1,
586 -1,
587 -1,
588 -1);
590 -1,
591 -1,
592 -1,
593 -1,
594 0x3,
595 0x7,
596 0xb,
597 0xf,
598 -1,
599 -1,
600 -1,
601 -1,
602 -1,
603 -1,
604 -1,
605 -1,
606 -1,
607 -1,
608 -1,
609 -1,
610 0x3,
611 0x7,
612 0xb,
613 0xf,
614 -1,
615 -1,
616 -1,
617 -1,
618 -1,
619 -1,
620 -1,
621 -1);
623 -1,
624 -1,
625 -1,
626 -1,
627 -1,
628 -1,
629 -1,
630 -1,
631 0x3,
632 0x7,
633 0xb,
634 0xf,
635 -1,
636 -1,
637 -1,
638 -1,
639 -1,
640 -1,
641 -1,
642 -1,
643 -1,
644 -1,
645 -1,
646 -1,
647 0x3,
648 0x7,
649 0xb,
650 0xf,
651 -1,
652 -1,
653 -1,
654 -1);
655
657 -1,
658 -1,
659 -1,
660 -1,
661 -1,
662 -1,
663 -1,
664 -1,
665 -1,
666 -1,
667 -1,
668 -1,
669 0x3,
670 0x7,
671 0xb,
672 0xf,
673 -1,
674 -1,
675 -1,
676 -1,
677 -1,
678 -1,
679 -1,
680 -1,
681 -1,
682 -1,
683 -1,
684 -1,
685 0x3,
686 0x7,
687 0xb,
688 0xf);
689
691 0x0,
692 -1,
693 -1,
694 0x1,
695 -1,
696 -1,
697 0x2,
698 -1,
699 -1,
700 0x3,
701 -1,
702 -1,
703 0x4,
704 -1,
705 -1,
706 0x5,
707 -1,
708 -1,
709 0x6,
710 -1,
711 -1,
712 0x7,
713 -1,
714 -1,
715 0x8,
716 -1,
717 -1,
718 0x9,
719 -1,
720 -1,
721 0xA,
722 -1);
724 -1,
725 0x3,
726 -1,
727 -1,
728 0x4,
729 -1,
730 -1,
731 0x5,
732 -1,
733 -1,
734 0x6,
735 -1,
736 -1,
737 0x7,
738 -1,
739 -1,
740 0x8,
741 -1,
742 -1,
743 0x9,
744 -1,
745 -1,
746 0xA,
747 -1,
748 -1,
749 0xB,
750 -1,
751 -1,
752 0xC,
753 -1,
754 -1,
755 0xD);
757 -1,
758 -1,
759 0x6,
760 -1,
761 -1,
762 0x7,
763 -1,
764 -1,
765 0x8,
766 -1,
767 -1,
768 0x9,
769 -1,
770 -1,
771 0xA,
772 -1,
773 -1,
774 0xB,
775 -1,
776 -1,
777 0xC,
778 -1,
779 -1,
780 0xD,
781 -1,
782 -1,
783 0xE,
784 -1,
785 -1,
786 0xF,
787 -1,
788 -1);
789
791 -1,
792 0x0,
793 -1,
794 -1,
795 0x1,
796 -1,
797 -1,
798 0x2,
799 -1,
800 -1,
801 0x3,
802 -1,
803 -1,
804 0x4,
805 -1,
806 -1,
807 0x5,
808 -1,
809 -1,
810 0x6,
811 -1,
812 -1,
813 0x7,
814 -1,
815 -1,
816 0x8,
817 -1,
818 -1,
819 0x9,
820 -1,
821 -1,
822 0xA);
824 -1,
825 -1,
826 0x3,
827 -1,
828 -1,
829 0x4,
830 -1,
831 -1,
832 0x5,
833 -1,
834 -1,
835 0x6,
836 -1,
837 -1,
838 0x7,
839 -1,
840 -1,
841 0x8,
842 -1,
843 -1,
844 0x9,
845 -1,
846 -1,
847 0xA,
848 -1,
849 -1,
850 0xB,
851 -1,
852 -1,
853 0xC,
854 -1,
855 -1);
857 0x5,
858 -1,
859 -1,
860 0x6,
861 -1,
862 -1,
863 0x7,
864 -1,
865 -1,
866 0x8,
867 -1,
868 -1,
869 0x9,
870 -1,
871 -1,
872 0xA,
873 -1,
874 -1,
875 0xB,
876 -1,
877 -1,
878 0xC,
879 -1,
880 -1,
881 0xD,
882 -1,
883 -1,
884 0xE,
885 -1,
886 -1,
887 0xF,
888 -1);
889
891 -1,
892 -1,
893 0x0,
894 -1,
895 -1,
896 0x1,
897 -1,
898 -1,
899 0x2,
900 -1,
901 -1,
902 0x3,
903 -1,
904 -1,
905 0x4,
906 -1,
907 -1,
908 0x5,
909 -1,
910 -1,
911 0x6,
912 -1,
913 -1,
914 0x7,
915 -1,
916 -1,
917 0x8,
918 -1,
919 -1,
920 0x9,
921 -1,
922 -1);
924 0x2,
925 -1,
926 -1,
927 0x3,
928 -1,
929 -1,
930 0x4,
931 -1,
932 -1,
933 0x5,
934 -1,
935 -1,
936 0x6,
937 -1,
938 -1,
939 0x7,
940 -1,
941 -1,
942 0x8,
943 -1,
944 -1,
945 0x9,
946 -1,
947 -1,
948 0xA,
949 -1,
950 -1,
951 0xB,
952 -1,
953 -1,
954 0xC,
955 -1);
957 -1,
958 0x5,
959 -1,
960 -1,
961 0x6,
962 -1,
963 -1,
964 0x7,
965 -1,
966 -1,
967 0x8,
968 -1,
969 -1,
970 0x9,
971 -1,
972 -1,
973 0xA,
974 -1,
975 -1,
976 0xB,
977 -1,
978 -1,
979 0xC,
980 -1,
981 -1,
982 0xD,
983 -1,
984 -1,
985 0xE,
986 -1,
987 -1,
988 0xF);
989
991 0x1,
992 0x4,
993 0x7,
994 0xA,
995 0xD,
996 -1,
997 -1,
998 -1,
999 -1,
1000 -1,
1001 -1,
1002 -1,
1003 -1,
1004 -1,
1005 -1,
1006 -1,
1007 -1,
1008 -1,
1009 -1,
1010 -1,
1011 -1,
1012 0x0,
1013 0x3,
1014 0x6,
1015 0x9,
1016 0xC,
1017 0xF,
1018 -1,
1019 -1,
1020 -1,
1021 -1,
1022 -1);
1024 -1,
1025 -1,
1026 -1,
1027 -1,
1028 -1,
1029 -1,
1030 -1,
1031 -1,
1032 -1,
1033 -1,
1034 -1,
1035 0x2,
1036 0x5,
1037 0x8,
1038 0xB,
1039 0xE,
1040 0x1,
1041 0x4,
1042 0x7,
1043 0xA,
1044 0xD,
1045 -1,
1046 -1,
1047 -1,
1048 -1,
1049 -1,
1050 -1,
1051 -1,
1052 -1,
1053 -1,
1054 -1,
1055 -1);
1057 -1,
1058 -1,
1059 -1,
1060 -1,
1061 -1,
1062 0x0,
1063 0x3,
1064 0x6,
1065 0x9,
1066 0xC,
1067 0xF,
1068 -1,
1069 -1,
1070 -1,
1071 -1,
1072 -1,
1073 -1,
1074 -1,
1075 -1,
1076 -1,
1077 -1,
1078 -1,
1079 -1,
1080 -1,
1081 -1,
1082 -1,
1083 -1,
1084 0x2,
1085 0x5,
1086 0x8,
1087 0xB,
1088 0xE);
1089
1091 0x2,
1092 0x5,
1093 0x8,
1094 0xB,
1095 0xE,
1096 -1,
1097 -1,
1098 -1,
1099 -1,
1100 -1,
1101 -1,
1102 -1,
1103 -1,
1104 -1,
1105 -1,
1106 -1,
1107 -1,
1108 -1,
1109 -1,
1110 -1,
1111 -1,
1112 0x1,
1113 0x4,
1114 0x7,
1115 0xA,
1116 0xD,
1117 -1,
1118 -1,
1119 -1,
1120 -1,
1121 -1,
1122 -1);
1124 -1,
1125 -1,
1126 -1,
1127 -1,
1128 -1,
1129 -1,
1130 -1,
1131 -1,
1132 -1,
1133 -1,
1134 0x0,
1135 0x3,
1136 0x6,
1137 0x9,
1138 0xC,
1139 0xF,
1140 0x2,
1141 0x5,
1142 0x8,
1143 0xB,
1144 0xE,
1145 -1,
1146 -1,
1147 -1,
1148 -1,
1149 -1,
1150 -1,
1151 -1,
1152 -1,
1153 -1,
1154 -1,
1155 -1);
1157 -1,
1158 -1,
1159 -1,
1160 -1,
1161 -1,
1162 0x1,
1163 0x4,
1164 0x7,
1165 0xA,
1166 0xD,
1167 -1,
1168 -1,
1169 -1,
1170 -1,
1171 -1,
1172 -1,
1173 -1,
1174 -1,
1175 -1,
1176 -1,
1177 -1,
1178 -1,
1179 -1,
1180 -1,
1181 -1,
1182 -1,
1183 0x0,
1184 0x3,
1185 0x6,
1186 0x9,
1187 0xC,
1188 0xF);
1189
1192const int Y_ADJUST = 0;
1193const int UV_ADJUST = 128;
1195const int YUV_TO_BGR_ROUND_TERM = 0; // 1 << (YUV_TO_BGR_AVERAGING_SHIFT);
1196const int Y_TO_RGB_WEIGHT = static_cast<int>((((1 << YUV_TO_BGR_AVERAGING_SHIFT))));
1197const int U_TO_BLUE_WEIGHT = static_cast<int>((2.041 * (1 << YUV_TO_BGR_AVERAGING_SHIFT)));
1198const int U_TO_GREEN_WEIGHT = -static_cast<int>((0.3455 * (1 << YUV_TO_BGR_AVERAGING_SHIFT)));
1199const int V_TO_GREEN_WEIGHT = -static_cast<int>((0.7169 * (1 << YUV_TO_BGR_AVERAGING_SHIFT)));
1200const int V_TO_RED_WEIGHT = static_cast<int>((1.4065 * (1 << YUV_TO_BGR_AVERAGING_SHIFT)));
1201
1206
1207template <bool align>
1208SIMD_INLINE __m256i Load(const __m256i *p);
1209
1210template <>
1211SIMD_INLINE __m256i Load<false>(const __m256i *p) {
1212 return _mm256_loadu_si256(p);
1213}
1214
1215template <>
1216SIMD_INLINE __m256i Load<true>(const __m256i *p) {
1217 return _mm256_load_si256(p);
1218}
1219
1220SIMD_INLINE void *AlignLo(const void *ptr, size_t align) {
1221 return reinterpret_cast<void *>(((size_t)ptr) & ~(align - 1));
1222}
1223
1224SIMD_INLINE bool Aligned(const void *ptr, size_t align = sizeof(__m256)) {
1225 return ptr == AlignLo(ptr, align);
1226}
1227
1228template <bool align>
1229SIMD_INLINE void Store(__m256i *p, __m256i a);
1230
1231template <>
1232SIMD_INLINE void Store<false>(__m256i *p, __m256i a) {
1233 _mm256_storeu_si256(p, a);
1234}
1235
1236template <>
1237SIMD_INLINE void Store<true>(__m256i *p, __m256i a) {
1238 _mm256_store_si256(p, a);
1239}
1240
1241SIMD_INLINE __m256i SaturateI16ToU8(__m256i value) {
1242 return _mm256_min_epi16(K16_00FF, _mm256_max_epi16(value, K_ZERO));
1243}
1244
1245SIMD_INLINE __m256i AdjustY16(__m256i y16) {
1246 return _mm256_subs_epi16(y16, K16_Y_ADJUST);
1247}
1248
1249SIMD_INLINE __m256i AdjustUV16(__m256i uv16) {
1250 return _mm256_subs_epi16(uv16, K16_UV_ADJUST);
1251}
1252
1253SIMD_INLINE __m256i AdjustedYuvToRed32(__m256i y16_1, __m256i v16_0) {
1254 // print_m256_i16(y16_1);
1255 // print_m256_i16(v16_0);
1256 // print_m256_i32(_mm256_madd_epi16(y16_1, K16_YRGB_RT));
1257 // print_m256_i32(_mm256_madd_epi16(v16_0, K16_VR_0));
1258 return _mm256_srai_epi32(
1259 _mm256_add_epi32(_mm256_madd_epi16(y16_1, K16_YRGB_RT), _mm256_madd_epi16(v16_0, K16_VR_0)),
1261}
1262
1263SIMD_INLINE __m256i AdjustedYuvToRed16(__m256i y16, __m256i v16) {
1264 // print_m256_i32(AdjustedYuvToRed32(_mm256_unpacklo_epi16(y16, K16_0001),
1265 // _mm256_unpacklo_epi16(v16, K_ZERO)));
1266 // print_m256_i16(_mm256_unpacklo_epi16(y16, K16_0001));
1267 return SaturateI16ToU8(_mm256_packs_epi32(
1268 AdjustedYuvToRed32(_mm256_unpacklo_epi16(y16, K16_0001), _mm256_unpacklo_epi16(v16, K_ZERO)),
1269 AdjustedYuvToRed32(_mm256_unpackhi_epi16(y16, K16_0001), _mm256_unpackhi_epi16(v16, K_ZERO))));
1270}
1271
1272SIMD_INLINE __m256i AdjustedYuvToGreen32(__m256i y16_1, __m256i u16_v16) {
1273 return _mm256_srai_epi32(
1274 _mm256_add_epi32(_mm256_madd_epi16(y16_1, K16_YRGB_RT), _mm256_madd_epi16(u16_v16, K16_UG_VG)),
1276}
1277
1278SIMD_INLINE __m256i AdjustedYuvToGreen16(__m256i y16, __m256i u16, __m256i v16) {
1279 return SaturateI16ToU8(_mm256_packs_epi32(
1280 AdjustedYuvToGreen32(_mm256_unpacklo_epi16(y16, K16_0001), _mm256_unpacklo_epi16(u16, v16)),
1281 AdjustedYuvToGreen32(_mm256_unpackhi_epi16(y16, K16_0001), _mm256_unpackhi_epi16(u16, v16))));
1282}
1283
1284SIMD_INLINE __m256i AdjustedYuvToBlue32(__m256i y16_1, __m256i u16_0) {
1285 return _mm256_srai_epi32(
1286 _mm256_add_epi32(_mm256_madd_epi16(y16_1, K16_YRGB_RT), _mm256_madd_epi16(u16_0, K16_UB_0)),
1288}
1289
1290SIMD_INLINE __m256i AdjustedYuvToBlue16(__m256i y16, __m256i u16) {
1291 return SaturateI16ToU8(_mm256_packs_epi32(
1292 AdjustedYuvToBlue32(_mm256_unpacklo_epi16(y16, K16_0001), _mm256_unpacklo_epi16(u16, K_ZERO)),
1293 AdjustedYuvToBlue32(_mm256_unpackhi_epi16(y16, K16_0001), _mm256_unpackhi_epi16(u16, K_ZERO))));
1294}
1295
1296SIMD_INLINE __m256i YuvToRed(__m256i y, __m256i v) {
1297 __m256i lo = AdjustedYuvToRed16(_mm256_unpacklo_epi8(y, K_ZERO), AdjustUV16(_mm256_unpacklo_epi8(v, K_ZERO)));
1298 __m256i hi = AdjustedYuvToRed16((_mm256_unpackhi_epi8(y, K_ZERO)), AdjustUV16(_mm256_unpackhi_epi8(v, K_ZERO)));
1299
1300 // print_m256_i16(lo);
1301 // print_m256_i16(hi);
1302 return _mm256_packus_epi16(lo, hi);
1303}
1304
1305SIMD_INLINE __m256i YuvToGreen(__m256i y, __m256i u, __m256i v) {
1306 __m256i lo = AdjustedYuvToGreen16(
1307 (_mm256_unpacklo_epi8(y, K_ZERO)),
1308 AdjustUV16(_mm256_unpacklo_epi8(u, K_ZERO)),
1309 AdjustUV16(_mm256_unpacklo_epi8(v, K_ZERO)));
1310 __m256i hi = AdjustedYuvToGreen16(
1311 (_mm256_unpackhi_epi8(y, K_ZERO)),
1312 AdjustUV16(_mm256_unpackhi_epi8(u, K_ZERO)),
1313 AdjustUV16(_mm256_unpackhi_epi8(v, K_ZERO)));
1314 return _mm256_packus_epi16(lo, hi);
1315}
1316
1317SIMD_INLINE __m256i YuvToBlue(__m256i y, __m256i u) {
1318 __m256i lo = AdjustedYuvToBlue16((_mm256_unpacklo_epi8(y, K_ZERO)), AdjustUV16(_mm256_unpacklo_epi8(u, K_ZERO)));
1319 __m256i hi = AdjustedYuvToBlue16((_mm256_unpackhi_epi8(y, K_ZERO)), AdjustUV16(_mm256_unpackhi_epi8(u, K_ZERO)));
1320 return _mm256_packus_epi16(lo, hi);
1321}
1322
1323template <int index>
1324__m256i InterleaveBgr(__m256i blue, __m256i green, __m256i red);
1325
1326template <>
1327SIMD_INLINE __m256i InterleaveBgr<0>(__m256i blue, __m256i green, __m256i red) {
1328 return _mm256_or_si256(
1329 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(blue, 0x44), K8_SHUFFLE_PERMUTED_BLUE_TO_BGR0),
1330 _mm256_or_si256(
1331 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(green, 0x44), K8_SHUFFLE_PERMUTED_GREEN_TO_BGR0),
1332 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(red, 0x44), K8_SHUFFLE_PERMUTED_RED_TO_BGR0)));
1333}
1334
1335template <>
1336SIMD_INLINE __m256i InterleaveBgr<1>(__m256i blue, __m256i green, __m256i red) {
1337 return _mm256_or_si256(
1338 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(blue, 0x99), K8_SHUFFLE_PERMUTED_BLUE_TO_BGR1),
1339 _mm256_or_si256(
1340 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(green, 0x99), K8_SHUFFLE_PERMUTED_GREEN_TO_BGR1),
1341 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(red, 0x99), K8_SHUFFLE_PERMUTED_RED_TO_BGR1)));
1342}
1343
1344template <>
1345SIMD_INLINE __m256i InterleaveBgr<2>(__m256i blue, __m256i green, __m256i red) {
1346 return _mm256_or_si256(
1347 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(blue, 0xEE), K8_SHUFFLE_PERMUTED_BLUE_TO_BGR2),
1348 _mm256_or_si256(
1349 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(green, 0xEE), K8_SHUFFLE_PERMUTED_GREEN_TO_BGR2),
1350 _mm256_shuffle_epi8(_mm256_permute4x64_epi64(red, 0xEE), K8_SHUFFLE_PERMUTED_RED_TO_BGR2)));
1351}
1352
1353SIMD_INLINE __m256i BgrToBlue(__m256i bgr[3]) {
1354 __m256i b0 = _mm256_shuffle_epi8(bgr[0], K8_SHUFFLE_BGR0_TO_BLUE);
1355 __m256i b2 = _mm256_shuffle_epi8(bgr[2], K8_SHUFFLE_BGR2_TO_BLUE);
1356 return _mm256_or_si256(
1357 _mm256_permute2x128_si256(b0, b2, 0x20),
1358 _mm256_or_si256(
1359 _mm256_shuffle_epi8(bgr[1], K8_SHUFFLE_BGR1_TO_BLUE), _mm256_permute2x128_si256(b0, b2, 0x31)));
1360}
1361
1362SIMD_INLINE __m256i BgrToGreen(__m256i bgr[3]) {
1363 __m256i g0 = _mm256_shuffle_epi8(bgr[0], K8_SHUFFLE_BGR0_TO_GREEN);
1364 __m256i g2 = _mm256_shuffle_epi8(bgr[2], K8_SHUFFLE_BGR2_TO_GREEN);
1365 return _mm256_or_si256(
1366 _mm256_permute2x128_si256(g0, g2, 0x20),
1367 _mm256_or_si256(
1368 _mm256_shuffle_epi8(bgr[1], K8_SHUFFLE_BGR1_TO_GREEN), _mm256_permute2x128_si256(g0, g2, 0x31)));
1369}
1370
1371SIMD_INLINE __m256i BgrToRed(__m256i bgr[3]) {
1372 __m256i r0 = _mm256_shuffle_epi8(bgr[0], K8_SHUFFLE_BGR0_TO_RED);
1373 __m256i r2 = _mm256_shuffle_epi8(bgr[2], K8_SHUFFLE_BGR2_TO_RED);
1374 return _mm256_or_si256(
1375 _mm256_permute2x128_si256(r0, r2, 0x20),
1376 _mm256_or_si256(
1377 _mm256_shuffle_epi8(bgr[1], K8_SHUFFLE_BGR1_TO_RED), _mm256_permute2x128_si256(r0, r2, 0x31)));
1378}
1379
1380template <bool align>
1381SIMD_INLINE __m256i LoadPermuted(const __m256i *p) {
1382 return _mm256_permute4x64_epi64(Load<align>(p), 0xD8);
1383}
1384
1385} // namespace camera
1386} // namespace drivers
1387} // namespace apollo
#define SIMD_MM256_SET1_EPI16(a)
Definition util.h:142
#define SIMD_MM256_SET2_EPI8(a0, a1)
Definition util.h:97
#define SIMD_MM256_SETR_EPI8( a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf)
Definition util.h:103
#define SIMD_MM256_SET1_EPI32(a)
Definition util.h:160
#define SIMD_MM256_SET1_EPI8(a)
Definition util.h:91
#define SIMD_MM256_SET2_EPI16(a0, a1)
Definition util.h:148
#define SIMD_INLINE
Definition util.h:43
const int U_TO_GREEN_WEIGHT
Definition util.h:1198
const size_t A
Definition util.h:178
const __m256i K16_FF00
Definition util.h:210
SIMD_INLINE __m256i BgrToGreen(__m256i bgr[3])
Definition util.h:1362
const __m256i K32_00000004
Definition util.h:214
const __m256i K8_SHUFFLE_PERMUTED_RED_TO_BGR2
Definition util.h:956
const __m256i K8_SHUFFLE_BGR1_TO_BLUE
Definition util.h:255
const __m256i K16_0010
Definition util.h:205
const __m256i K8_10
Definition util.h:191
const __m256i K16_0004
Definition util.h:201
const __m256i K16_0005
Definition util.h:202
const __m256i K16_YRGB_RT
Definition util.h:1202
const size_t OA
Definition util.h:181
const __m256i K8_04
Definition util.h:189
void print_m256(__m256i a)
Definition util.cc:26
const size_t QA
Definition util.h:180
const __m256i K16_0001
Definition util.h:198
const int Y_TO_RGB_WEIGHT
Definition util.h:1196
const __m256i K16_UG_VG
Definition util.h:1204
const __m256i Y_SHUFFLE0
Definition util.h:322
const __m256i V_SHUFFLE3
Definition util.h:656
const __m256i K8_SHUFFLE_BGR1_TO_RED
Definition util.h:1123
SIMD_INLINE __m256i YuvToRed(__m256i y, __m256i v)
Definition util.h:1296
const __m256i K8_01
Definition util.h:187
SIMD_INLINE __m256i InterleaveBgr< 2 >(__m256i blue, __m256i green, __m256i red)
Definition util.h:1345
const __m256i U_SHUFFLE1
Definition util.h:422
const __m256i K8_SHUFFLE_PERMUTED_BLUE_TO_BGR0
Definition util.h:690
const __m256i K8_80
Definition util.h:194
void print_m256_i16(const __m256i a)
Definition util.cc:51
const __m256i K16_0008
Definition util.h:204
SIMD_INLINE __m256i SaturateI16ToU8(__m256i value)
Definition util.h:1241
const __m256i K32_00010000
Definition util.h:218
const __m256i K16_00FF
Definition util.h:209
const int YUV_TO_BGR_AVERAGING_SHIFT
Definition util.h:1194
const __m256i K16_VR_0
Definition util.h:1203
SIMD_INLINE void Store< true >(__m256i *p, __m256i a)
Definition util.h:1237
SIMD_INLINE __m256i AdjustY16(__m256i y16)
Definition util.h:1245
const __m256i K8_SHUFFLE_PERMUTED_BLUE_TO_BGR1
Definition util.h:723
SIMD_INLINE __m256i BgrToRed(__m256i bgr[3])
Definition util.h:1371
SIMD_INLINE __m256i YuvToBlue(__m256i y, __m256i u)
Definition util.h:1317
const __m256i K8_SHUFFLE_PERMUTED_GREEN_TO_BGR2
Definition util.h:856
SIMD_INLINE __m256i Load< false >(const __m256i *p)
Definition util.h:1211
SIMD_INLINE __m256i AdjustUV16(__m256i uv16)
Definition util.h:1249
const __m256i K16_UV_ADJUST
Definition util.h:1191
const size_t DA
Definition util.h:179
const __m256i V_SHUFFLE1
Definition util.h:589
SIMD_INLINE __m256i AdjustedYuvToBlue16(__m256i y16, __m256i u16)
Definition util.h:1290
const __m256i K32_00000008
Definition util.h:215
const int UV_ADJUST
Definition util.h:1193
const __m256i U_SHUFFLE2
Definition util.h:455
const __m256i V_SHUFFLE2
Definition util.h:622
const __m256i K16_0080
Definition util.h:208
const int V_TO_RED_WEIGHT
Definition util.h:1200
SIMD_INLINE char GetChar(T value, size_t index)
Definition util.h:50
const __m256i K8_02
Definition util.h:188
const __m256i K8_40
Definition util.h:193
void print_m256_i32(const __m256i a)
Definition util.cc:39
const __m256i K8_SHUFFLE_PERMUTED_BLUE_TO_BGR2
Definition util.h:756
SIMD_INLINE __m256i AdjustedYuvToRed16(__m256i y16, __m256i v16)
Definition util.h:1263
const __m256i K32_00000002
Definition util.h:213
SIMD_INLINE void Store(__m256i *p, __m256i a)
SIMD_INLINE __m256i AdjustedYuvToBlue32(__m256i y16_1, __m256i u16_0)
Definition util.h:1284
const __m256i K16_0018
Definition util.h:206
const __m256i K8_SHUFFLE_BGR0_TO_RED
Definition util.h:1090
SIMD_INLINE __m256i InterleaveBgr< 1 >(__m256i blue, __m256i green, __m256i red)
Definition util.h:1336
const int V_TO_GREEN_WEIGHT
Definition util.h:1199
SIMD_INLINE __m256i AdjustedYuvToGreen32(__m256i y16_1, __m256i u16_v16)
Definition util.h:1272
const __m256i K8_SHUFFLE_BGR2_TO_RED
Definition util.h:1156
const __m256i Y_SHUFFLE1
Definition util.h:355
const __m256i K16_Y_ADJUST
Definition util.h:1190
SIMD_INLINE __m256i AdjustedYuvToGreen16(__m256i y16, __m256i u16, __m256i v16)
Definition util.h:1278
const __m256i K8_SHUFFLE_BGR0_TO_BLUE
Definition util.h:222
const __m256i K8_SHUFFLE_BGR2_TO_GREEN
Definition util.h:1056
SIMD_INLINE void * AlignLo(const void *ptr, size_t align)
Definition util.h:1220
SIMD_INLINE __m256i BgrToBlue(__m256i bgr[3])
Definition util.h:1353
const size_t HA
Definition util.h:182
const __m256i K16_0006
Definition util.h:203
const __m256i V_SHUFFLE0
Definition util.h:556
const int YUV_TO_BGR_ROUND_TERM
Definition util.h:1195
const __m256i K8_SHUFFLE_PERMUTED_RED_TO_BGR1
Definition util.h:923
SIMD_INLINE __m256i AdjustedYuvToRed32(__m256i y16_1, __m256i v16_0)
Definition util.h:1253
const int U_TO_BLUE_WEIGHT
Definition util.h:1197
const __m256i K8_SHUFFLE_PERMUTED_RED_TO_BGR0
Definition util.h:890
const __m256i U_SHUFFLE4
Definition util.h:522
const __m256i K_INV_ZERO
Definition util.h:185
__m256i InterleaveBgr(__m256i blue, __m256i green, __m256i red)
const __m256i K32_01000000
Definition util.h:219
SIMD_INLINE __m256i YuvToGreen(__m256i y, __m256i u, __m256i v)
Definition util.h:1305
const __m256i K8_01_FF
Definition util.h:196
const __m256i K8_SHUFFLE_BGR1_TO_GREEN
Definition util.h:1023
SIMD_INLINE __m256i InterleaveBgr< 0 >(__m256i blue, __m256i green, __m256i red)
Definition util.h:1327
const __m256i K16_0003
Definition util.h:200
const __m256i K_ZERO
Definition util.h:184
const __m256i K8_SHUFFLE_PERMUTED_GREEN_TO_BGR1
Definition util.h:823
const __m256i K32_00000001
Definition util.h:212
const __m256i U_SHUFFLE3
Definition util.h:489
SIMD_INLINE void Store< false >(__m256i *p, __m256i a)
Definition util.h:1232
const __m256i K32_0000FFFF
Definition util.h:217
const __m256i K8_08
Definition util.h:190
const __m256i K8_SHUFFLE_PERMUTED_GREEN_TO_BGR0
Definition util.h:790
SIMD_INLINE __m256i Load(const __m256i *p)
const __m256i K32_000000FF
Definition util.h:216
void yuyv2rgb_avx(unsigned char *YUV, unsigned char *RGB, int NumPixels)
Definition util.cc:127
const __m256i K8_20
Definition util.h:192
const __m256i K8_SHUFFLE_BGR0_TO_GREEN
Definition util.h:990
SIMD_INLINE __m256i LoadPermuted(const __m256i *p)
Definition util.h:1381
SIMD_INLINE __m256i Load< true >(const __m256i *p)
Definition util.h:1216
const __m256i K16_0020
Definition util.h:207
const __m256i K32_FFFFFF00
Definition util.h:220
const __m256i K16_UB_0
Definition util.h:1205
const __m256i K8_SHUFFLE_BGR2_TO_BLUE
Definition util.h:288
const __m256i U_SHUFFLE0
Definition util.h:389
SIMD_INLINE bool Aligned(const void *ptr, size_t align=sizeof(__m256))
Definition util.h:1224
const __m256i K16_0002
Definition util.h:199
class register implement
Definition arena_queue.h:37