53#define __STDC_WANT_LIB_EXT1__ 1
75#define BYTE_SWAP(x) (3 - x)
87static void vc_copylinev210(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
88 int gshift,
int bshift)
100 register uint32_t tmp;
102 d = (uint32_t *)(
void *) dst;
103 s = (
const void *)src;
105 while (dst_len >= 12) {
106 tmp = (s->a >> 2) | (s->b >> 2) << 8 | (((s)->c >> 2) << 16);
108 *(d++) = tmp | ((s->a >> 2) << 24);
109 tmp = (s->b >> 2) | (((s)->c >> 2) << 8);
111 *(d++) = tmp | ((s->a >> 2) << 16) | ((s->b >> 2) << 24);
115 tmp | ((s->a >> 2) << 8) | ((s->b >> 2) << 16) |
122 tmp = (s->a >> 2) | (s->b >> 2) << 8 | (((s)->c >> 2) << 16);
124 *(d++) = tmp | ((s->a >> 2) << 24);
127 tmp = (s->b >> 2) | (((s)->c >> 2) << 8);
129 *(d++) = tmp | ((s->a >> 2) << 16) | ((s->b >> 2) << 24);
137static void vc_copylineYUYV(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
138 int gshift,
int bshift)
144 register uint32_t *d;
145 register const uint32_t *s;
146 const uint32_t *
const end = (uint32_t *)(
void *) dst + dst_len / 4;
154 d = (uint32_t *)(
void *) dst;
155 s = (
const uint32_t *)(
const void *) src;
157 assert(dst_len % 4 == 0);
159 if((dst_len % 16 == 0)) {
160 asm(
"movdqu (%0), %%xmm4\n"
161 "movdqa %%xmm4, %%xmm5\n"
162 "psrldq $1, %%xmm5\n"
165 asm volatile (
"movdqu (%0), %%xmm0\n"
166 "movdqu %%xmm0, %%xmm1\n"
167 "pand %%xmm4, %%xmm0\n"
168 "psrldq $1, %%xmm0\n"
169 "pand %%xmm5, %%xmm1\n"
170 "pslldq $1, %%xmm1\n"
171 "por %%xmm0, %%xmm1\n"
172 "movdqu %%xmm1, (%1)\n"::
"r" (s),
"r"(d));
178 register uint32_t tmp = *s;
179 *d = ((tmp & 0x00ff0000) << 8) | ((tmp & 0xff000000) >> 8) |
180 ((tmp & 0x000000ff) << 8) | ((tmp & 0x0000ff00) >> 8);
212vc_copyliner10k(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int len,
int rshift,
213 int gshift,
int bshift)
229 register uint32_t *d;
230 register uint32_t tmp;
231 uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
233 d = (uint32_t *)(
void *) dst;
234 s = (
const void *) src;
239 r << rshift) | (((s->gh << 2) | s->
240 gl) << gshift) | (((s->bh << 4) | s->
246 r << rshift) | (((s->gh << 2) | s->
247 gl) << gshift) | (((s->bh << 4) | s->
253 r << rshift) | (((s->gh << 2) | s->
254 gl) << gshift) | (((s->bh << 4) | s->
260 r << rshift) | (((s->gh << 2) | s->
261 gl) << gshift) | (((s->bh << 4) | s->
270 r << rshift) | (((s->gh << 2) | s->
271 gl) << gshift) | (((s->bh << 4) | s->
281 int gshift,
int bshift) {
285 unsigned int byte2 = *src++;
286 unsigned int byte3 = *src++;
287 unsigned int byte4 = *src++;
288 dst[0] = byte2 & 0xC0U;
289 dst[3] = byte2 << 2U | byte3 >> 6U;
290 dst[2] = (byte3 & 0x30U) << 2U;
291 dst[5] = (byte3 & 0xFU) << 4U | byte4 >> 4U;
292 dst[4] = (byte4 & 0xCU) << 4U;
298static void vc_copyliner10ktoY416(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dstlen,
int rshift,
299 int gshift,
int bshift) {
304 assert((uintptr_t) dst % 2 == 0);
306 uint16_t *d = (
void *) dst;
308 unsigned int byte1 = *src++;
309 unsigned int byte2 = *src++;
310 unsigned int byte3 = *src++;
311 unsigned int byte4 = *src++;
313 r = byte1 << 8U | (byte2 & 0xC0U);
314 g = (byte2 & 0x3FU) << 10U | (byte3 & 0xF0U) << 2U;
315 b = (byte3 & 0xFU) << 12U | (byte4 & 0xFCU) << 4U;
318 (1 << (D_DEPTH - 1));
322 (1 << (D_DEPTH - 4));
326 (1 << (D_DEPTH - 4));
332static void vc_copyliner10ktoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dstlen,
int rshift,
333 int gshift,
int bshift) {
337 *(dst++) = src[1] << 2 | src[2] >> 6;
338 *(dst++) = src[2] << 4 | src[3] >> 4;
354vc_copylineR12LtoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dstlen,
int rshift,
355 int gshift,
int bshift)
435 int gshift,
int bshift)
437 assert((uintptr_t) dst %
sizeof(uint32_t) == 0);
438 uint32_t *d = (uint32_t *)(
void *) dst;
439 uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
452 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
459 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
468 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
475 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
484 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
491 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
501 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
508 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
523vc_copylineRGBA(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int len,
int rshift,
524 int gshift,
int bshift)
526 register uint32_t *d = (uint32_t *)(
void *) dst;
527 register const uint32_t *s = (
const uint32_t *)(
const void *) src;
528 register uint32_t tmp;
530 if (rshift == 0 && gshift == 8 && bshift == 16) {
531 memcpy(dst, src,
len);
533 uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
535 register unsigned int r, g, b;
538 g = (tmp >> 8) & 0xff;
539 b = (tmp >> 16) & 0xff;
540 tmp = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
544 g = (tmp >> 8) & 0xff;
545 b = (tmp >> 16) & 0xff;
546 tmp = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
550 g = (tmp >> 8) & 0xff;
551 b = (tmp >> 16) & 0xff;
552 tmp = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
556 g = (tmp >> 8) & 0xff;
557 b = (tmp >> 16) & 0xff;
558 tmp = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
563 register unsigned int r, g, b;
566 g = (tmp >> 8) & 0xff;
567 b = (tmp >> 16) & 0xff;
568 tmp = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
579static void vc_copylineDVS10toV210(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
580 int gshift,
int bshift)
586 const unsigned int *s1;
587 register unsigned int a,b;
588 d = (
unsigned int *)(
void *) dst;
589 s1 = (
const unsigned int *)(
const void *) src;
593 b = ((b >> 24) * 0x00010101) & 0x00300c03;
597 b |= a & (0xff00<<4);
599 b |= a & (0xff0000<<6);
611 register unsigned char *_d = dst, *_s = src;
613 while (src_len > 0) {
615 asm(
"movd %0, %%xmm4\n": :
"r"(0xffffff));
617 asm volatile (
"movdqa (%0), %%xmm0\n"
618 "movdqa 16(%0), %%xmm5\n"
619 "movdqa %%xmm0, %%xmm1\n"
620 "movdqa %%xmm0, %%xmm2\n"
621 "movdqa %%xmm0, %%xmm3\n"
622 "pand %%xmm4, %%xmm0\n"
623 "movdqa %%xmm5, %%xmm6\n"
624 "movdqa %%xmm5, %%xmm7\n"
625 "movdqa %%xmm5, %%xmm8\n"
626 "pand %%xmm4, %%xmm5\n"
627 "pslldq $4, %%xmm4\n"
628 "pand %%xmm4, %%xmm1\n"
629 "pand %%xmm4, %%xmm6\n"
630 "pslldq $4, %%xmm4\n"
631 "psrldq $1, %%xmm1\n"
632 "psrldq $1, %%xmm6\n"
633 "pand %%xmm4, %%xmm2\n"
634 "pand %%xmm4, %%xmm7\n"
635 "pslldq $4, %%xmm4\n"
636 "psrldq $2, %%xmm2\n"
637 "psrldq $2, %%xmm7\n"
638 "pand %%xmm4, %%xmm3\n"
639 "pand %%xmm4, %%xmm8\n"
640 "por %%xmm1, %%xmm0\n"
641 "psrldq $3, %%xmm3\n"
642 "psrldq $3, %%xmm8\n"
643 "por %%xmm2, %%xmm0\n"
644 "por %%xmm6, %%xmm5\n"
645 "por %%xmm3, %%xmm0\n"
646 "por %%xmm7, %%xmm5\n"
647 "movdq2q %%xmm0, %%mm0\n"
648 "por %%xmm8, %%xmm5\n"
649 "movdqa %%xmm5, %%xmm1\n"
650 "pslldq $12, %%xmm5\n"
651 "psrldq $4, %%xmm1\n"
652 "por %%xmm5, %%xmm0\n"
653 "psrldq $8, %%xmm0\n"
655 "movdq2q %%xmm0, %%mm1\n"
656 "movdq2q %%xmm1, %%mm2\n"
657 "movq %%mm1, 8(%1)\n"
658 "movq %%mm2, 16(%1)\n"::
"r" (_s),
"r"(_d));
671static void vc_copylineDVS10(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
672 int gshift,
int bshift)
677 int src_len = dst_len / 1.5;
678 register const uint64_t *s;
679 register uint64_t *d;
681 register uint64_t a1, a2, a3, a4;
683 d = (uint64_t *)(
void *) dst;
684 s = (
const uint64_t *)(
const void *) src;
692 a1 = (a1 & 0xffffff) | ((a1 >> 8) & 0xffffff000000LL);
693 a2 = (a2 & 0xffffff) | ((a2 >> 8) & 0xffffff000000LL);
694 a3 = (a3 & 0xffffff) | ((a3 >> 8) & 0xffffff000000LL);
695 a4 = (a4 & 0xffffff) | ((a4 >> 8) & 0xffffff000000LL);
697 *(d++) = a1 | (a2 << 48);
698 *(d++) = (a2 >> 16) | (a3 << 32);
699 *(d++) = (a3 >> 32) | (a4 << 16);
713static void vc_copylineRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
int gshift,
int bshift)
715 register unsigned int r, g, b;
721 if (rshift == 0 && gshift == 8 && bshift == 16) {
722 memcpy(dst, src, dst_len);
728 u.out = (r << rshift) | (g << gshift) | (b << bshift);
750static void vc_copylineRGBAtoRGBwithShift(
unsigned char * __restrict dst2,
const unsigned char * __restrict src2,
int dst_len,
int rshift,
int gshift,
int bshift)
752 register const uint32_t * src = (
const uint32_t *)(
const void *) src2;
753 register uint32_t * dst = (uint32_t *)(
void *) dst2;
756 register uint32_t in1 = *src++;
757 register uint32_t in2 = *src++;
758 register uint32_t in3 = *src++;
759 register uint32_t in4 = *src++;
761 *dst++ = ((in2 >> rshift)) << 24 |
762 ((in1 >> bshift) & 0xff) << 16 |
763 ((in1 >> gshift) & 0xff) << 8 |
764 ((in1 >> rshift) & 0xff);
765 *dst++ = ((in3 >> gshift)) << 24 |
766 ((in3 >> rshift) & 0xff) << 16 |
767 ((in2 >> bshift) & 0xff) << 8 |
768 ((in2 >> gshift) & 0xff);
769 *dst++ = ((in4 >> bshift)) << 24 |
770 ((in4 >> gshift) & 0xff) << 16 |
771 ((in4 >> rshift) & 0xff) << 8 |
772 ((in3 >> bshift) & 0xff);
775 uint8_t *dst_c = (uint8_t *) dst;
776 for (; x <= dst_len - 3; x += 3) {
777 register uint32_t in = *src++;
778 *dst_c++ = (in >> rshift) & 0xff;
779 *dst_c++ = (in >> gshift) & 0xff;
780 *dst_c++ = (in >> bshift) & 0xff;
790void vc_copylineABGRtoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
int gshift,
int bshift)
801 __m128i shuf = _mm_setr_epi8(3, 2, 1, 7, 6, 5, 11, 10, 9, 15, 14, 13, 0xff, 0xff, 0xff, 0xff);
804 for (x = 0; x <= dst_len - 24; x += 12) {
805 loaded = _mm_lddqu_si128((
const __m128i_u *) src);
806 loaded = _mm_shuffle_epi8(loaded, shuf);
807 _mm_storeu_si128((__m128i_u *)dst, loaded);
813 uint8_t *dst_c = (uint8_t *) dst;
814 for (; x <= dst_len - 3; x += 3) {
815 register uint32_t in = *(
const uint32_t *) (
const void *) src;
816 *dst_c++ = (in >> SRC_RSHIFT) & 0xff;
817 *dst_c++ = (in >> SRC_GSHIFT) & 0xff;
818 *dst_c++ = (in >> SRC_BSHIFT) & 0xff;
828 const unsigned char *__restrict src2,
int dst_len,
829 int rshift,
int gshift,
int bshift)
847static void vc_copylineRGBAtoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
int gshift,
int bshift)
858 __m128i shuf = _mm_setr_epi8(0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 0xff, 0xff, 0xff, 0xff);
861 for (x = 0; x <= dst_len - 24; x += 12) {
862 loaded = _mm_lddqu_si128((
const __m128i_u *) src);
863 loaded = _mm_shuffle_epi8(loaded, shuf);
864 _mm_storeu_si128((__m128i_u *)dst, loaded);
870 uint8_t *dst_c = (uint8_t *) dst;
871 for (; x <= dst_len - 3; x += 3) {
872 register uint32_t in = *(
const uint32_t *) (
const void *) src;
873 *dst_c++ = (in >> SRC_RSHIFT) & 0xff;
874 *dst_c++ = (in >> SRC_GSHIFT) & 0xff;
875 *dst_c++ = (in >> SRC_BSHIFT) & 0xff;
889 int src_rshift,
int src_gshift,
int src_bshift)
891 register const uint32_t * in = (
const uint32_t *)(
const void *) src;
892 register uint32_t * out = (uint32_t *)(
void *) dst;
893 while (dst_len >= 4) {
894 register uint32_t in_val = *in++;
896 *out++ = ((in_val >> src_rshift) & 0xff) |
897 ((in_val >> src_gshift) & 0xff) << 8 |
898 ((in_val >> src_bshift) & 0xff) << 16;
909 int gshift,
int bshift) {
925void vc_copylineRGBtoRGBA(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
int gshift,
int bshift)
932 __m128i alpha_mask_sse = _mm_set1_epi32(0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift));
938 bool is_simd_compat =
false;
940 if (rshift == 0 && gshift == 8 && bshift == 16) {
941 is_simd_compat =
true;
942 shuf = _mm_setr_epi8(0, 1, 2, 0xff, 3, 4, 5, 0xff, 6, 7, 8, 0xff, 9, 10, 11, 0xff);
943 }
else if (rshift == 16 && gshift == 8 && bshift == 0) {
944 is_simd_compat =
true;
945 shuf = _mm_setr_epi8(2, 1, 0, 0xff, 5, 4, 3, 0xff, 8, 7, 6, 0xff, 11, 10, 9, 0xff);
948 if (is_simd_compat) {
949 for (x = 0; x <= dst_len - 32; x += 16) {
950 loaded = _mm_lddqu_si128((
const __m128i_u *) src);
951 loaded = _mm_shuffle_epi8(loaded, shuf);
952 loaded = _mm_or_si128(loaded, alpha_mask_sse);
953 _mm_storeu_si128((__m128i_u *)dst, loaded);
960 uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
961 register unsigned int r, g, b;
962 register uint32_t *d = (uint32_t *)(
void *) dst;
969 *d++ = alpha_mask | (r << rshift) | (g << gshift) | (b << bshift);
984 const unsigned char *__restrict src,
985 int dst_len,
int roff,
int goff,
int boff,
991 const unsigned char *__restrict src,
int dst_len,
int roff,
992 int goff,
int boff,
int pix_size)
999 register uint32_t *d = (uint32_t *) (
void *) dst;
1007 y1 = (RGB_TO_Y(cfs, r, g, b) >> COMP_BASE) + 16;\
1008 u = RGB_TO_CB(cfs, r, g, b);\
1009 v = RGB_TO_CR(cfs, r, g, b);\
1014 y2 = (RGB_TO_Y(cfs, r, g, b) >> COMP_BASE) + 16;\
1015 u += RGB_TO_CB(cfs, r, g, b);\
1016 v += RGB_TO_CR(cfs, r, g, b);\
1017 u = ((u / 2) >> COMP_BASE) + 128;\
1018 v = ((v / 2) >> COMP_BASE) + 128;\
1020 *d++ = ((y2 & 0xFF) << 24) | ((v & 0xFF) << 16) | \
1021 ((y1 & 0xFF) << 8) | (u & 0xFF);
1023 const int count = (dst_len + 3) / UYVY_BPP;
1025 for (; x <
count / LOOP_ITEMS; x++) {
1032 for (; x <
count; x++) {
1048#define copylineYUVtoRGB(dst, src, dst_len, y1_off, y2_off, u_off, v_off, rgb16) {\
1049 enum { DEPTH = DEPTH8 };\
1050 const struct color_coeffs *cfs = get_color_coeffs(DEPTH);\
1051 OPTIMIZED_FOR (int x = 0; x <= (dst_len) - 6 * (1 + (rgb16)); x += 6 * (1 + (rgb16))) {\
1052 register int y1 = Y_SCALE(8) * ((src)[y1_off] - 16);\
1053 register int y2 = Y_SCALE(8) * ((src)[y2_off] - 16);\
1054 register int u = (src)[u_off] - 128;\
1055 register int v = (src)[v_off] - 128;\
1058 if (rgb16) *(dst)++ = 0;\
1059 val = YCBCR_TO_R(cfs, y1, u, v) >> COMP_BASE;\
1060 *(dst)++ = CLAMP(val, 0, 255);\
1061 if (rgb16) *(dst)++ = 0;\
1062 val = YCBCR_TO_G(cfs, y1, u, v) >> COMP_BASE;\
1063 *(dst)++ = CLAMP(val, 0, 255);\
1064 if (rgb16) *(dst)++ = 0;\
1065 val = YCBCR_TO_B(cfs, y1, u, v) >> COMP_BASE;\
1066 *(dst)++ = CLAMP(val, 0, 255);\
1067 if (rgb16) *(dst)++ = 0;\
1068 val = YCBCR_TO_R(cfs, y2, u, v) >> COMP_BASE;\
1069 *(dst)++ = CLAMP(val, 0, 255);\
1070 if (rgb16) *(dst)++ = 0;\
1071 val = YCBCR_TO_G(cfs, y2, u, v) >> COMP_BASE;\
1072 *(dst)++ = CLAMP(val, 0, 255);\
1073 if (rgb16) *(dst)++ = 0;\
1074 val = YCBCR_TO_B(cfs, y2, u, v) >> COMP_BASE;\
1075 *(dst)++ = CLAMP(val, 0, 255);\
1085static void vc_copylineUYVYtoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1086 int gshift,
int bshift) {
1099static void vc_copylineYUYVtoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1100 int gshift,
int bshift) {
1107static void vc_copylineUYVYtoRG48(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1108 int gshift,
int bshift) {
1120static void vc_copylineUYVYtoRGBA(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1121 int gshift,
int bshift) {
1122 assert((uintptr_t) dst %
sizeof(uint32_t) == 0);
1123 uint32_t *dst32 = (uint32_t *)(
void *) dst;
1124 uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
1126 register int y1, y2, u ,v;
1131 int r = 1.164 * (y1 - 16) + 1.793 * (v - 128);
1132 int g = 1.164 * (y1 - 16) - 0.534 * (v - 128) - 0.213 * (u - 128);
1133 int b = 1.164 * (y1 - 16) + 2.115 * (u - 128);
1134 r =
CLAMP(r, 0, 255);
1135 g =
CLAMP(g, 0, 255);
1136 b =
CLAMP(b, 0, 255);
1137 *dst32++ = alpha_mask | r << rshift | g << gshift | b << bshift;
1138 r = 1.164 * (y2 - 16) + 1.793 * (v - 128);
1139 g = 1.164 * (y2 - 16) - 0.534 * (v - 128) - 0.213 * (u - 128);
1140 b = 1.164 * (y2 - 16) + 2.115 * (u - 128);
1141 r =
CLAMP(r, 0, 255);
1142 g =
CLAMP(g, 0, 255);
1143 b =
CLAMP(b, 0, 255);
1144 *dst32++ = alpha_mask | r << rshift | g << gshift | b << bshift;
1156 int gshift,
int bshift) {
1158 __m128i yfactor = _mm_set1_epi16(74);
1159 __m128i rvfactor = _mm_set1_epi16(115);
1160 __m128i gvfactor = _mm_set1_epi16(34);
1161 __m128i gufactor = _mm_set1_epi16(14);
1162 __m128i bufactor = _mm_set1_epi16(135);
1164 __m128i ysub = _mm_set1_epi16(16);
1165 __m128i uvsub = _mm_set1_epi16(128);
1167 __m128i zero128 = _mm_set1_epi32(0);
1168 __m128i max = _mm_set1_epi16(255);
1170 __m128i ymask = _mm_set1_epi32(0x00FF00FF);
1171 __m128i umask = _mm_set1_epi32(0x000000FF);
1173 __m128i rgbshuffle = _mm_setr_epi8(0, 2, 1, 4, 6, 5, 8, 10, 9, 12, 14, 13, 15, 11, 7, 3);
1185 while(dst_len >= 28){
1186 yuv = _mm_lddqu_si128((__m128i
const*)(
const void *) src);
1189 u = _mm_and_si128(yuv, umask);
1190 u = _mm_or_si128(u, _mm_bslli_si128(u, 2));
1192 yuv = _mm_bsrli_si128(yuv, 1);
1193 y = _mm_and_si128(yuv, ymask);
1195 yuv = _mm_bsrli_si128(yuv, 1);
1196 v = _mm_and_si128(yuv, umask);
1197 v = _mm_or_si128(v, _mm_bslli_si128(v, 2));
1199 y = _mm_subs_epi16(y, ysub);
1200 y = _mm_mullo_epi16(y, yfactor);
1202 u = _mm_subs_epi16(u, uvsub);
1203 v = _mm_subs_epi16(v, uvsub);
1205 r = _mm_adds_epi16(y, _mm_mullo_epi16(v, rvfactor));
1206 g = _mm_subs_epi16(y, _mm_mullo_epi16(v, gvfactor));
1207 g = _mm_subs_epi16(g, _mm_mullo_epi16(u, gufactor));
1208 b = _mm_adds_epi16(y, _mm_mullo_epi16(u, bufactor));
1211 r = _mm_max_epi16(zero128, r);
1212 g = _mm_max_epi16(zero128, g);
1213 b = _mm_max_epi16(zero128, b);
1215 r = _mm_srli_epi16(r, 6);
1216 g = _mm_srli_epi16(g, 6);
1217 b = _mm_srli_epi16(b, 6);
1219 r = _mm_min_epi16(max, r);
1220 g = _mm_min_epi16(max, g);
1221 b = _mm_min_epi16(max, b);
1223 rgb = _mm_or_si128(_mm_bslli_si128(g, 1), r);
1224 rgb = _mm_unpacklo_epi8(rgb, b);
1225 rgb = _mm_shuffle_epi8(rgb, rgbshuffle);
1226 _mm_storeu_si128((__m128i *)(
void *) dst, rgb);
1229 rgb = _mm_or_si128(_mm_bslli_si128(g, 1), r);
1230 rgb = _mm_unpackhi_epi8(rgb, b);
1231 rgb = _mm_shuffle_epi8(rgb, rgbshuffle);
1232 _mm_storeu_si128((__m128i *)(
void *) dst, rgb);
1243static inline void vc_copylineRGB_AtoR12L(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int pix_pad)
1246static inline void vc_copylineRGB_AtoR12L(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int pix_pad) {
1308 int rshift,
int gshift,
int bshift) {
1314 int rshift,
int gshift,
int bshift) {
1320 int rshift,
int gshift,
int bshift) {
1337 int rshift,
int gshift,
int bshift) {
1354static void vc_copylineR12LtoRG48(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1355 int gshift,
int bshift)
1360 OUT_BL_SZ = PIX_COUNT * RG48_BPP,
1366 OPTIMIZED_FOR(; x < dst_len - OUT_BL_SZ + 1; x += OUT_BL_SZ)
1456 unsigned char tmp_buf[OUT_BL_SZ];
1458 memcpy(dst, tmp_buf, dst_len - x);
1461static void vc_copylineR12LtoY416(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1462 int gshift,
int bshift)
1468 assert((uintptr_t) dst %
sizeof(uint16_t) == 0);
1470 uint16_t *d = (
void *) dst;
1473 u = (RGB_TO_CB(cfs, r, g, b) >> COMP_BASE) + \
1474 (1 << (D_DEPTH - 1)); \
1475 *d++ = CLAMP_LIMITED_CBCR(u, D_DEPTH); \
1476 y = (RGB_TO_Y(cfs, r, g, b) >> COMP_BASE) + \
1477 (1 << (D_DEPTH - 4)); \
1478 *d++ = CLAMP_LIMITED_Y(y, D_DEPTH); \
1479 v = (RGB_TO_CR(cfs, r, g, b) >> COMP_BASE) + \
1480 (1 << (D_DEPTH - 1)); \
1481 *d++ = CLAMP_LIMITED_CBCR(v, D_DEPTH); \
1528 const unsigned char *__restrict src,
int dst_len,
1529 int rshift,
int gshift,
int bshift)
1534 YOFF = 1 << (D_DPTH - 4),
1535 COFF = 1 << (D_DPTH - 1),
1538 DST_BYTE_SZ = PX_PER_BLK_IN * UYVY_BPP,
1541 uint8_t *d = (
void *) dst;
1544 comp_type_t u = ((RGB_TO_CB(cfs, r1, g1, b1) + \
1545 RGB_TO_CB(cfs, r2, g2, b2)) >> \
1546 (COMP_BASE + D_DPTH + 1)) + \
1548 *d++ = CLAMP_LIMITED_CBCR(u, D_DPTH); \
1549 comp_type_t y = (RGB_TO_Y(cfs, r1, g1, b1) >> \
1550 (COMP_BASE + D_DPTH)) + \
1552 *d++ = CLAMP_LIMITED_Y(y, D_DPTH); \
1553 comp_type_t v = ((RGB_TO_CR(cfs, r1, g1, b1) + \
1554 RGB_TO_CR(cfs, r2, g2, b2)) >> \
1555 (COMP_BASE + D_DPTH + 1)) + \
1557 *d++ = CLAMP_LIMITED_CBCR(v, D_DPTH); \
1558 y = (RGB_TO_Y(cfs, r2, g2, b2) >> \
1559 (COMP_BASE + D_DPTH)) + \
1561 *d++ = CLAMP_LIMITED_Y(y, D_DPTH); \
1578 r1 = (src[8 +
BYTE_SWAP(2)] & 0xFU) << 12U |
1582 b1 = (src[12 +
BYTE_SWAP(1)] & 0xFU) << 12U |
1586 g2 = (src[16 +
BYTE_SWAP(0)] & 0xFU) << 12U |
1591 r1 = (src[16 +
BYTE_SWAP(3)] & 0xFU) << 12U |
1595 b1 = (src[20 +
BYTE_SWAP(2)] & 0xFU) << 12U |
1599 g2 = (src[24 +
BYTE_SWAP(1)] & 0xFU) << 12U |
1604 r1 = (src[28 +
BYTE_SWAP(0)] & 0xFU) << 12U |
1608 b1 = (src[28 +
BYTE_SWAP(3)] & 0xFU) << 12U |
1612 g2 = (src[32 +
BYTE_SWAP(2)] & 0xFU) << 12U |
1623static void vc_copylineR12LtoR10k(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1624 int gshift,
int bshift)
1684static void vc_copylineRG48toR12L(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1685 int gshift,
int bshift)
1736 dst[12 +
BYTE_SWAP(1)] |= src[0] & 0xF0;
1745 dst[16 +
BYTE_SWAP(0)] |= src[0] & 0xF0;
1755 dst[16 +
BYTE_SWAP(3)] |= src[0] & 0xF0;
1765 dst[20 +
BYTE_SWAP(2)] |= src[0] & 0xF0;
1774 dst[24 +
BYTE_SWAP(1)] |= src[0] & 0xF0;
1784 dst[28 +
BYTE_SWAP(0)] |= src[0] & 0xF0;
1794 dst[28 +
BYTE_SWAP(3)] |= src[0] & 0xF0;
1803 dst[32 +
BYTE_SWAP(2)] |= src[0] & 0xF0;
1811static void vc_copylineY416toR12L(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1812 int gshift,
int bshift)
1820 u = *in++ - (1 << (S_DEPTH - 1)); \
1821 y = Y_SCALE(S_DEPTH) * (*in++ - (1 << (S_DEPTH - 4))); \
1822 v = *in++ - (1 << (S_DEPTH - 1)); \
1824 r = YCBCR_TO_R(cfs, y, u, v) >> (COMP_BASE + 4U); \
1825 g = YCBCR_TO_G(cfs, y, u, v) >> (COMP_BASE + 4U); \
1826 b = YCBCR_TO_B(cfs, y, u, v) >> (COMP_BASE + 4U); \
1827 r = CLAMP_FULL(r, D_DEPTH); \
1828 g = CLAMP_FULL(g, D_DEPTH); \
1829 b = CLAMP_FULL(b, D_DEPTH);
1832 assert((uintptr_t) src % 2 == 0);
1833 const uint16_t *in = (
const void *) src;
1840 dst[
BYTE_SWAP(1)] = (g & 0xFU) << 4U | r >> 8U;
1846 dst[4 +
BYTE_SWAP(0)] = (r & 0xFU) << 4U | tmp;
1849 dst[4 +
BYTE_SWAP(3)] = (b & 0xFU) << 4U | g >> 8U;
1854 dst[8 +
BYTE_SWAP(2)] = (g & 0xFU) << 4U | r >> 8U;
1860 dst[12 +
BYTE_SWAP(1)] = (r & 0xFU) << 4U | tmp;
1864 dst[16 +
BYTE_SWAP(0)] = (b & 0xFU) << 4U | g >> 8U;
1868 dst[16 +
BYTE_SWAP(3)] = (g & 0xFU) << 4U | r >> 8U;
1874 dst[20 +
BYTE_SWAP(2)] = (r & 0xFU) << 4U | tmp;
1878 dst[24 +
BYTE_SWAP(1)] = (b & 0xFU) << 4U | g >> 8U;
1883 dst[28 +
BYTE_SWAP(0)] = (g & 0xFU) << 4U | r >> 8U;
1888 dst[28 +
BYTE_SWAP(3)] = (r & 0xFU) << 4U | tmp;
1892 dst[32 +
BYTE_SWAP(2)] = (b & 0xFU) << 4U | g >> 8U;
1900static void vc_copylineY416toR10k(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1901 int gshift,
int bshift)
1907 assert((uintptr_t) src % 2 == 0);
1909 const uint16_t *in = (
const void *) src;
1913 u = *in++ - (1 << (S_DEPTH - 1));
1914 y =
Y_SCALE(S_DEPTH) * (*in++ - (1 << (S_DEPTH - 4)));
1915 v = *in++ - (1 << (S_DEPTH - 1));
1925 *dst++ = (r & 0x3U) << 6U | g >> 4U;
1926 *dst++ = (g & 0xFU) << 4U | b >> 6U;
1927 *dst++ = (b & 0x3FU) << 2U;
1931static void vc_copylineY416toRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1932 int gshift,
int bshift)
1938 assert((uintptr_t) src % 2 == 0);
1940 const uint16_t *in = (
const void *) src;
1944 u = *in++ - (1 << (S_DEPTH - 1));
1945 y =
Y_SCALE(S_DEPTH) * (*in++ - (1 << (S_DEPTH - 4)));
1946 v = *in++ - (1 << (S_DEPTH - 1));
1961static void vc_copylineY416toRGBA(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1962 int gshift,
int bshift)
1967 assert((uintptr_t) src % 2 == 0);
1968 assert((uintptr_t) dst % 4 == 0);
1970 const uint16_t *in = (
const void *) src;
1971 uint32_t *out = (
void *) dst;
1972 const uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
1976 u = *in++ - (1 << (S_DEPTH - 1));
1977 y =
Y_SCALE(S_DEPTH) * (*in++ - (1 << (S_DEPTH - 4)));
1978 v = *in++ - (1 << (S_DEPTH - 1));
1987 *out++ = alpha_mask | r << rshift | g << gshift | b << bshift;
1991static void vc_copylineRG48toR10k(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
1992 int gshift,
int bshift)
1997 assert((uintptr_t) src %
sizeof(uint16_t) == 0);
1998 assert((uintptr_t) dst %
sizeof(uint32_t) == 0);
1999 const uint16_t *in = (
const uint16_t *)(
const void *) src;
2000 uint32_t *out = (uint32_t *)(
void *) dst;
2002#ifdef WORDS_BIGENDIAN
2003 *out++ = r << 22U | g << 12U | b << 2U | 0x3FU;
2005 unsigned r = *in++ >> 6;
2006 unsigned g = *in++ >> 6;
2007 unsigned b = *in++ >> 6;
2009 *out++ = (b & 0x3FU) << 26U | 0x3000000U | (g & 0xFU) << 20U | (b >> 6U) << 16U | (r & 0x3U) << 14U | (g >> 4U) << 8U | r >> 2U;
2014static void vc_copylineRG48toRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2015 int gshift,
int bshift)
2028static void vc_copylineRG48toRGBA(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2029 int gshift,
int bshift)
2031 assert((uintptr_t) dst %
sizeof(uint32_t) == 0);
2032 uint32_t *dst32 = (uint32_t *)(
void *) dst;
2033 uint32_t alpha_mask = 0xFFFFFFFFU ^ (0xFFU << rshift) ^ (0xFFU << gshift) ^ (0xFFU << bshift);
2035 *dst32++ = alpha_mask | src[1] << rshift | src[3] << gshift | src[5] << bshift;
2044static void vc_copylineRGBtoUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2045 int gshift,
int bshift)
2060 int gshift,
int bshift) {
2074 __m128i shuffle = _mm_setr_epi8(0, 1, 3, 4, 6, 7, 9, 10, 2, 2, 5, 5, 8, 8, 11, 11);
2075 __m128i mask = _mm_setr_epi16(0x00FF, 0x00FF, 0x00FF, 0x00FF, 0, 0, 0, 0);
2076 __m128i lowmask = _mm_setr_epi16(0, 0, 0, 0, 0x00FF, 0x00FF, 0x00FF, 0x00FF);
2077 __m128i zero = _mm_set1_epi16(0);
2079 __m128i yrf = _mm_set1_epi16(23);
2080 __m128i ygf = _mm_set1_epi16(79);
2081 __m128i ybf = _mm_set1_epi16(8);
2083 __m128i urf = _mm_set1_epi16(13);
2084 __m128i ugf = _mm_set1_epi16(43);
2085 __m128i ubf = _mm_set1_epi16(56);
2087 __m128i vrf = _mm_set1_epi16(56);
2088 __m128i vgf = _mm_set1_epi16(51);
2089 __m128i vbf = _mm_set1_epi16(5);
2091 __m128i yadd = _mm_set1_epi16(2048);
2092 __m128i uvadd = _mm_set1_epi16(16384);
2094 while(dst_len >= 20){
2096 rgb = _mm_lddqu_si128((__m128i
const*)(
const void *) src);
2099 rgb = _mm_shuffle_epi8(rgb, shuffle);
2101 r = _mm_and_si128(rgb, mask);
2102 rgb = _mm_bsrli_si128(rgb, 1);
2104 g = _mm_and_si128(rgb, mask);
2105 rgb = _mm_bsrli_si128(rgb, 7);
2107 b = _mm_and_si128(rgb, mask);
2110 rgb = _mm_lddqu_si128((__m128i
const*)(
const void *) src);
2112 rgb = _mm_shuffle_epi8(rgb, shuffle);
2113 b = _mm_or_si128(b, _mm_and_si128(rgb, lowmask));
2114 rgb = _mm_bslli_si128(rgb, 7);
2115 g = _mm_or_si128(g, _mm_and_si128(rgb, lowmask));
2117 rgb = _mm_bslli_si128(rgb, 1);
2118 r = _mm_or_si128(r, _mm_and_si128(rgb, lowmask));
2122 y = _mm_adds_epi16(yadd, _mm_mullo_epi16(r, yrf));
2123 y = _mm_adds_epi16(y, _mm_mullo_epi16(g, ygf));
2124 y = _mm_adds_epi16(y, _mm_mullo_epi16(b, ybf));
2126 u = _mm_subs_epi16(uvadd, _mm_mullo_epi16(r, urf));
2127 u = _mm_subs_epi16(u, _mm_mullo_epi16(g, ugf));
2128 u = _mm_adds_epi16(u, _mm_mullo_epi16(b, ubf));
2130 v = _mm_adds_epi16(uvadd, _mm_mullo_epi16(r, vrf));
2131 v = _mm_subs_epi16(v, _mm_mullo_epi16(g, vgf));
2132 v = _mm_subs_epi16(v, _mm_mullo_epi16(b, vbf));
2134 y = _mm_srli_epi16(y, 7);
2135 u = _mm_srli_epi16(u, 7);
2136 v = _mm_srli_epi16(v, 7);
2138 u = _mm_hadd_epi16(u, v);
2139 u = _mm_srli_epi16(u, 1);
2141 v = _mm_unpackhi_epi16(zero, u);
2142 u = _mm_unpacklo_epi16(u, zero);
2144 y = _mm_bslli_si128(y, 1);
2145 yuv = _mm_or_si128(y, u);
2146 yuv = _mm_or_si128(yuv, v);
2148 _mm_storeu_si128((__m128i *)(
void *) dst, yuv);
2163 int gshift,
int bshift) {
2177 __m128i inshuffle = _mm_setr_epi8(0, 1, 3, 4, 6, 7, 9, 10, 2, 2, 5, 5, 8, 8, 11, 11);
2178 __m128i outshuffle = _mm_setr_epi8(0, 2, 4, 6, 8, 10, 12, 14, 1, 1, 1, 1, 1, 1, 1, 1);
2179 __m128i mask = _mm_setr_epi16(0x00FF, 0x00FF, 0x00FF, 0x00FF, 0, 0, 0, 0);
2180 __m128i lowmask = _mm_setr_epi16(0, 0, 0, 0, 0x00FF, 0x00FF, 0x00FF, 0x00FF);
2182 __m128i yrf = _mm_set1_epi16(23);
2183 __m128i ygf = _mm_set1_epi16(79);
2184 __m128i ybf = _mm_set1_epi16(8);
2186 __m128i yadd = _mm_set1_epi16(2048);
2188 while(dst_len >= 16){
2190 rgb = _mm_lddqu_si128((__m128i
const*)(
const void *) src);
2193 rgb = _mm_shuffle_epi8(rgb, inshuffle);
2196 r = _mm_and_si128(rgb, mask);
2197 rgb = _mm_bsrli_si128(rgb, 1);
2199 g = _mm_and_si128(rgb, mask);
2200 rgb = _mm_bsrli_si128(rgb, 7);
2202 b = _mm_and_si128(rgb, mask);
2205 rgb = _mm_lddqu_si128((__m128i
const*)(
const void *) src);
2207 rgb = _mm_shuffle_epi8(rgb, inshuffle);
2209 b = _mm_or_si128(b, _mm_and_si128(rgb, lowmask));
2210 rgb = _mm_bslli_si128(rgb, 7);
2212 g = _mm_or_si128(g, _mm_and_si128(rgb, lowmask));
2213 rgb = _mm_bslli_si128(rgb, 1);
2215 r = _mm_or_si128(r, _mm_and_si128(rgb, lowmask));
2218 y = _mm_adds_epi16(yadd, _mm_mullo_epi16(r, yrf));
2219 y = _mm_adds_epi16(y, _mm_mullo_epi16(g, ygf));
2220 y = _mm_adds_epi16(y, _mm_mullo_epi16(b, ybf));
2222 y = _mm_srli_epi16(y, 7);
2224 y = _mm_shuffle_epi8(y, outshuffle);
2226 _mm_storeu_si128((__m128i *)(
void *) dst, y);
2232 register int ri, gi, bi;
2233 register int y1, y2;
2234 register uint16_t *d = (uint16_t *)(
void *) dst;
2239 y1 = 11993 * ri + 40239 * gi + 4063 * bi + (1<<20);
2243 y2 = 11993 * ri + 40239 * gi + 4063 * bi + (1<<20);
2245 *d++ = (
CLAMP(y2, 0, (1<<24)-1) >> 16) << 8 |
2246 (
CLAMP(y1, 0, (1<<24)-1) >> 16);
2254static void vc_copylineBGRtoUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2255 int gshift,
int bshift)
2270static void vc_copylineRGBAtoUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2271 int gshift,
int bshift)
2279static void vc_copylineR10ktoUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2280 int gshift,
int bshift)
2285 const unsigned char *
const end = dst + dst_len;
2287 unsigned char rgb[6];
2289 rgb[1] = src[1] << 2 | src[2] >> 6;
2290 rgb[2] = src[2] << 4 | src[3] >> 4;
2293 rgb[4] = src[1] << 2 | src[2] >> 6;
2294 rgb[5] = src[2] << 4 | src[3] >> 4;
2301static void vc_copylineRG48toUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2302 int gshift,
int bshift)
2313static void vc_copylineRG48toV210(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2314 int gshift,
int bshift) {
2319#define COMP_OFF (COMP_BASE+(16-10))
2320#define FETCH_BLOCK \
2324 y1 = (RGB_TO_Y(cfs, r, g, b) >> COMP_OFF) + (1<<6); \
2325 u = RGB_TO_CB(cfs, r, g, b) >> COMP_OFF; \
2326 v = RGB_TO_CR(cfs, r, g, b) >> COMP_OFF; \
2330 y2 = (RGB_TO_Y(cfs, r, g, b) >> COMP_OFF) + (1<<6); \
2331 u += RGB_TO_CB(cfs, r, g, b) >> COMP_OFF; \
2332 v += RGB_TO_CR(cfs, r, g, b) >> COMP_OFF; \
2333 y1 = CLAMP_LIMITED_Y(y1, 10); \
2334 y2 = CLAMP_LIMITED_Y(y2, 10); \
2335 u = u / 2 + (1<<9); \
2336 v = v / 2 + (1<<9); \
2337 u = CLAMP_LIMITED_CBCR(u, 10); \
2338 v = CLAMP_LIMITED_CBCR(v, 10);
2343 assert((uintptr_t) src % 2 == 0);
2344 assert((uintptr_t) dst % 4 == 0);
2345 const uint16_t *in = (
const uint16_t *)(
const void *) src;
2346 uint32_t *d = (uint32_t *)(
void *) dst;
2352 *d++ = u | y1 << 10 | v << 20;
2356 *d |= u << 10 | y1 << 20;
2357 *++d = v | y2 << 10;
2361 *++d = y1 | v << 10 | y2 << 20;
2368static void vc_copylineRG48toY216(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2369 int gshift,
int bshift) {
2376 assert((uintptr_t) src % 2 == 0);
2377 assert((uintptr_t) dst % 2 == 0);
2379 const uint16_t *in = (
const void *) src;
2380 uint16_t *d = (
void *) dst;
2388 (1 << (D_DEPTH - 4));
2409static void vc_copylineRG48toY416(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2410 int gshift,
int bshift) {
2417 assert((uintptr_t) src % 2 == 0);
2418 assert((uintptr_t) dst % 2 == 0);
2420 const uint16_t *in = (
const void *) src;
2421 uint16_t *d = (
void *) dst;
2429 (1 << (D_DEPTH - 1));
2433 (1 << (D_DEPTH - 4));
2437 (1 << (D_DEPTH - 1));
2443static void vc_copylineY416toRG48(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2444 int gshift,
int bshift) {
2451 assert((uintptr_t) src % 2 == 0);
2452 assert((uintptr_t) dst % 2 == 0);
2454 const uint16_t *in = (
const void *) src;
2455 uint16_t *d = (
void *) dst;
2459 Y_SCALE(S_DEPTH) * (*in++ - (1 << (S_DEPTH - 4)));
2478static void vc_copylineBGRtoRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
int gshift,
int bshift)
2487void vc_memcpy(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
int gshift,
int bshift)
2493 memcpy(dst, src, dst_len);
2496static void vc_copylineRGBAtoR10k(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2497 int gshift,
int bshift)
2515 } *d = (
void *) dst;
2517 while (dst_len >= 4) {
2518 unsigned int r = *(src++);
2519 unsigned int g = *(src++);
2520 unsigned int b = *(src++);
2539static void vc_copylineUYVYtoV210(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2540 int gshift,
int bshift)
2551 while (dst_len >= 4) {
2552 unsigned int u = *(src++);
2553 unsigned int y = *(src++);
2554 unsigned int v = *(src++);
2567static void vc_copylineUYVYtoY216(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2568 int gshift,
int bshift)
2573 while (dst_len >= 8) {
2587static void vc_copylineUYVYtoY416(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2588 int gshift,
int bshift)
2593 while (dst_len >= 12) {
2625static void vc_copylineY216toUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2626 int gshift,
int bshift)
2631 while (dst_len >= 4) {
2641static void vc_copylineY416toUYVY(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2642 int gshift,
int bshift)
2647 while (dst_len >= 4) {
2648 *dst++ = (src[1] + src[9]) / 2;
2650 *dst++ = (src[5] + src[13]) / 2;
2657static void vc_copylineY216toV210(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2658 int gshift,
int bshift)
2663 assert((uintptr_t) src % 2 == 0);
2664 assert((uintptr_t) dst % 4 == 0);
2666 const uint16_t *s = (
const uint16_t *)(
const void *) (src + x * 24);
2667 uint32_t *d = (uint32_t *)(
void *) (dst + x * 16);
2668 uint16_t y1, u, y2, v;
2673 d[0] = u >> 6U | y1 >> 6U << 10U | v >> 6U << 20U;
2676 d[1] = y2 >> 6U | u >> 6U << 10U | y1 >> 6U << 20U;
2681 d[2] = v >> 6U | y2 >> 6U << 10U | u >> 6U << 20U;
2684 d[3] = y1 >> 6U | v >> 6U << 10U | y2 >> 6U << 20U;
2688static void vc_copylineV210toY216(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2689 int gshift,
int bshift)
2694 assert((uintptr_t) dst % 2 == 0);
2695 assert((uintptr_t) src % 4 == 0);
2697 const uint32_t *s = (
const void *) (src + x * 16);
2698 uint16_t *d = (
void *) (dst + x * 24);
2699 uint32_t tmp = *s++;
2700 unsigned u = (tmp & 0x3FFU) << 6U;
2701 unsigned y0 = ((tmp >> 10U) & 0x3FFU) << 6U;
2702 unsigned v = ((tmp >> 20U) & 0x3FFU) << 6U;
2704 unsigned y1 = (tmp & 0x3FFU) << 6U;
2709 u = ((tmp >> 10U) & 0x3FFU) << 6U;
2710 y0 = ((tmp >> 20U) & 0x3FFU) << 6U;
2712 v = (tmp & 0x3FFU) << 6U;
2713 y1 = ((tmp >> 10U) & 0x3FFU) << 6U;
2718 u = ((tmp >> 20U) & 0x3FFU) << 6U;
2720 y0 = (tmp & 0x3FFU) << 6U;
2721 v = ((tmp >> 10U) & 0x3FFU) << 6U;
2722 y1 = ((tmp >> 20U) & 0x3FFU) << 6U;
2730static void vc_copylineV210toY416(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2731 int gshift,
int bshift)
2736 assert((uintptr_t) dst % 2 == 0);
2737 assert((uintptr_t) src % 4 == 0);
2739 const uint32_t *s = (
const void *) (src + x * 16);
2740 uint16_t *d = (
void *) (dst + x * 48);
2744 u = (tmp & 0x3FFU) << 6U;
2746 *d++ = ((tmp >> 10U) & 0x3FFU) << 6U;
2747 v = ((tmp >> 20U) & 0x3FFU) << 6U;
2752 *d++ = (tmp & 0x3FFU) << 6U;
2755 u = ((tmp >> 10U) & 0x3FFU) << 6U;
2757 *d++ = ((tmp >> 20U) & 0x3FFU) << 6U;
2759 v = (tmp & 0x3FFU) << 6U;
2763 *d++ = ((tmp >> 10U) & 0x3FFU) << 6U;
2766 u = ((tmp >> 20U) & 0x3FFU) << 6U;
2769 *d++ = (tmp & 0x3FFU) << 6U;
2770 v = ((tmp >> 10U) & 0x3FFU) << 6U;
2774 *d++ = ((tmp >> 20U) & 0x3FFU) << 6U;
2780static void vc_copylineV210toRGB(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2781 int gshift,
int bshift)
2785 Y_SHIFT = 1 << (IDEPTH - 4),
2786 C_SHIFT = 1 << (IDEPTH - 1),
2790 OUT_BL_SZ = PIX_COUNT * RGB_BPP,
2794#define WRITE_YUV_AS_RGB(y, u, v) \
2795 (y) = Y_SCALE(IDEPTH) * ((y) - Y_SHIFT); \
2796 val = (YCBCR_TO_R(cfs, (y), (u), (v)) >> (COMP_BASE)); \
2797 *(dst++) = CLAMP_FULL(val, ODEPTH); \
2798 val = (YCBCR_TO_G(cfs, (y), (u), (v)) >> (COMP_BASE)); \
2799 *(dst++) = CLAMP_FULL(val, ODEPTH); \
2800 val = (YCBCR_TO_B(cfs, (y), (u), (v)) >> (COMP_BASE)); \
2801 *(dst++) = CLAMP_FULL(val, ODEPTH);
2804#define DECLARE_LOAD_V210_COMPONENTS(a, b, c) \
2805 comp_type_t a = (src[1] & 0x3) << 6 | src[0] >> 2;\
2806 comp_type_t b = (src[2] & 0xF) << 4 | src[1] >> 4;\
2807 comp_type_t c = (src[3] & 0x3F) << 2 | src[2] >> 6;\
2834#undef WRITE_YUV_AS_RGB
2835#undef DECLARE_LOAD_V210_COMPONENTS
2840 const unsigned char *__restrict src,
int dst_len,
2841 int rshift,
int gshift,
int bshift)
2843 uint16_t *dst = (
void *) d;
2846 Y_SHIFT = 1 << (IDEPTH - 4),
2847 C_SHIFT = 1 << (IDEPTH - 1),
2849 DIFF_BPP = ODEPTH - IDEPTH,
2852 OUT_BL_SZ = PIX_COUNT * RG48_BPP,
2856#define WRITE_YUV_AS_RGB(y, u, v) \
2857 (y) = Y_SCALE(IDEPTH) * ((y) - Y_SHIFT); \
2858 val = (YCBCR_TO_R(cfs, (y), (u), (v)) >> (COMP_BASE - DIFF_BPP)); \
2859 *(dst++) = CLAMP_FULL(val, ODEPTH); \
2860 val = (YCBCR_TO_G(cfs, (y), (u), (v)) >> (COMP_BASE - DIFF_BPP)); \
2861 *(dst++) = CLAMP_FULL(val, ODEPTH); \
2862 val = (YCBCR_TO_B(cfs, (y), (u), (v)) >> (COMP_BASE - DIFF_BPP)); \
2863 *(dst++) = CLAMP_FULL(val, ODEPTH);
2866#define DECLARE_LOAD_V210_COMPONENTS(a, b, c) \
2867 comp_type_t a = (src[1] & 0x3) << 8 | src[0];\
2868 comp_type_t b = (src[2] & 0xF) << 6 | src[1] >> 2;\
2869 comp_type_t c = (src[3] & 0x3F) << 4 | src[2] >> 4;\
2896#undef WRITE_YUV_AS_RGB
2897#undef DECLARE_LOAD_V210_COMPONENTS
2900static void vc_copylineY416toV210(
unsigned char * __restrict dst,
const unsigned char * __restrict src,
int dst_len,
int rshift,
2901 int gshift,
int bshift)
2906 assert((uintptr_t) src % 2 == 0);
2907 assert((uintptr_t) dst % 4 == 0);
2909 const uint16_t *s = (
const uint16_t *)(
const void *) (src + x * 48);
2910 uint32_t *d = (uint32_t *)(
void *) (dst + x * 16);
2911 uint16_t y1, u, y2, v;
2912 u = (s[0] + s[4]) / 2;
2914 v = (s[2] + s[6]) / 2;
2916 d[0] = u >> 6U | y1 >> 6U << 10U | v >> 6U << 20U;
2918 u = (s[8] + s[12]) / 2;
2919 d[1] = y2 >> 6U | u >> 6U << 10U | y1 >> 6U << 20U;
2921 v = (s[10] + s[14]) / 2;
2923 u = (s[16] + s[20]) / 2;
2924 d[2] = v >> 6U | y2 >> 6U << 10U | u >> 6U << 20U;
2926 v = (s[18] + s[22]) / 2;
2927 d[3] = y1 >> 6U | v >> 6U << 10U | y2 >> 6U << 20U;
3030 return (
int) codec_a - (int) codec_b;
3046 const codec_t *it = out_candidates;
3051 candidates[
count++] = *it;
3060 *out = candidates[0];
const struct color_coeffs * get_color_coeffs(int ycbcr_bit_depth)
#define RGB_TO_CB(t, r, g, b)
#define CLAMP_LIMITED_CBCR(val, depth)
#define RGB_TO_Y(t, r, g, b)
#define Y_SCALE(in_depth)
#define RGB_TO_CR(t, r, g, b)
#define CLAMP_LIMITED_Y(val, depth)
#define YCBCR_TO_B(t, y_scaled, cb, cr)
#define YCBCR_TO_G(t, y_scaled, cb, cr)
#define YCBCR_TO_R(t, y_scaled, cb, cr)
#define CLAMP_FULL(val, depth)
#define CLAMP(x, low, high)
static void vc_copylineRGBtoR12L(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Changes color order of an RGB.
static void vc_copylineRGBAtoR12L(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineY416toRGBA(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBtoUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts RGB to UYVY.
static void vc_copylineY216toV210(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineV210toY216(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static const struct decoder_item decoders[]
#define DECLARE_LOAD_V210_COMPONENTS(a, b, c)
static void vc_copyliner10k(unsigned char *__restrict dst, const unsigned char *__restrict src, int len, int rshift, int gshift, int bshift)
Converts from R10k to RGBA.
static void vc_copylineY416toRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBAtoRGBwithShift(unsigned char *__restrict dst2, const unsigned char *__restrict src2, int dst_len, int rshift, int gshift, int bshift)
Converts from RGBA to RGB. Channels in RGBA can be differently ordered.
static void vc_copylineRG48toV210(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineY216toUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineUYVYtoRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts UYVY to RGB.
static void vc_copyliner10ktoRG48(unsigned char *__restrict dst, const unsigned char *__restrict src, int dstlen, int rshift, int gshift, int bshift)
static void vc_copylineUYVYtoRG48(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineYUYVtoRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts YUYV to RGB.
static void vc_copylineRG48toY416(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineToUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int roff, int goff, int boff, int pix_size)
Converts RGB(A) into UYVY.
static void vc_copylineDVS10(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts from DVS10 to UYVY.
static void vc_copylineUYVYtoY216(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBAtoR10k(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRG48toUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineUYVYtoY416(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineR12LtoR10k(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRG48toRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineV210toRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineR12LtoUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineBGRtoUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts BGR to UYVY.
static void vc_copylineV210toY416(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBAtoUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts RGBA to UYVY.
static void vc_copylineDVS10toV210(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts from DVS10 to v210.
static void vc_copylineY416toUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
#define copylineYUVtoRGB(dst, src, dst_len, y1_off, y2_off, u_off, v_off, rgb16)
Converts 8-bit YCbCr (packed 4:2:2 in 32-bit) word to RGB.
static void vc_copylineY416toR10k(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineUYVYtoRGBA(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts UYVY to RGBA.
decoder_t get_decoder_from_to(codec_t in, codec_t out)
static void vc_copylineR12L(unsigned char *dst, const unsigned char *src, int dstlen, int rshift, int gshift, int bshift)
Converts from R12L to RGBA.
#define WRITE_YUV_AS_RGB(y, u, v)
static void vc_copylineR12LtoY416(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRG48toY216(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineY416toRG48(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBAtoRG48(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineR12LtoRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dstlen, int rshift, int gshift, int bshift)
Converts from R12L to RGB.
static void vc_copylineRG48toR12L(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts RG48 to R12L. Converts 16-bit RGB to 12-bit packed RGB in full range (compatible with SMPTE ...
static void vc_copylineYUYV(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts from YUYV to UYVY.
static void vc_copylineRGB_AtoR12L(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int pix_pad)
static void vc_copylineR12LtoRG48(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts R12L to RG48. Converts 12-bit packed RGB in full range (compatible with SMPTE 268M DPX versi...
static void vc_copylineUYVYtoV210(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRG48toRGBA(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineR10ktoUYVY(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBtoRG48(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineRGBAtoRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts from RGBA to RGB.
static void vc_copylineBGRtoRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineV210toRG48(unsigned char *__restrict d, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
decoder_t get_best_decoder_from(codec_t in, const codec_t *out_candidates, codec_t *out)
static void vc_copylineRG48toR10k(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylinev210(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
Converts v210 to UYVY.
static void vc_copyliner10ktoY416(unsigned char *__restrict dst, const unsigned char *__restrict src, int dstlen, int rshift, int gshift, int bshift)
static void vc_copyliner10ktoRGB(unsigned char *__restrict dst, const unsigned char *__restrict src, int dstlen, int rshift, int gshift, int bshift)
static void vc_copylineY416toV210(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
static void vc_copylineY416toR12L(unsigned char *__restrict dst, const unsigned char *__restrict src, int dst_len, int rshift, int gshift, int bshift)
decoder_func_t vc_copylineRGBA
decoder_func_t vc_copylineABGRtoRGB
decoder_func_t vc_copylineToRGBA_inplace
decoder_func_t vc_copylineRGBtoRGBA
decoder_func_t vc_copylineUYVYtoGrayscale
decoder_func_t vc_copylineRGBtoUYVY_SSE
decoder_func_t * decoder_t
decoder_func_t vc_memcpy
dummy conversion - ptr to it returned if no conversion needed
decoder_func_t vc_copylineBGRAtoRGB
decoder_func_t vc_copylineRGBtoGrayscale_SSE
decoder_func_t vc_copylineUYVYtoRGB_SSE
#define QSORT_S_COMP_DEFINE(name, a, b, context)
struct __attribute__((packed))
@ YUYV
YCbCr 422 8-bit - Y0 Cb Y1 Cr.
@ R10k
RGB 10-bit packed - RGBX, big-endian (2 bit padding)
@ RGB
RGB 8-bit (packed into 24-bit word)
@ UYVY
YCbCr 422 8-bit - Cb Y0 Cr Y1.
@ VIDEO_CODEC_NONE
dummy color spec
@ RG48
16-bit RGB little-endian (RlRhGl...)
@ Y416
interleaved little-endian YCbCr 4444 16-bit - UYVA
@ Y216
YCbCr 422 16-bit little-endian - Y0 Cb Y1 Cr.
@ R12L
RGB 12-bit packed, little-endian.
@ DVS10
DVS 10-bit format.
@ RGBA
RGBA 8-bit, big-endian.
@ v210
YCbCr 422 10-bit - xVY0U|xY2UY1|xUY3V|xY5VY4, little-endian (2 bit padding /'x'/),...
bool codec_is_in_set(codec_t codec, const codec_t *set)
struct pixfmt_desc get_pixfmt_desc(codec_t pixfmt)
int compare_pixdesc(const struct pixfmt_desc *desc_a, const struct pixfmt_desc *desc_b, const struct pixfmt_desc *src_desc)