41void yuyv2rgb_avx(
unsigned char *YUV,
unsigned char *RGB,
int NumPixels);
43#define SIMD_INLINE inline __attribute__((always_inline))
51 return (
reinterpret_cast<char *
>(&value))[index];
54#define SIMD_CHAR_AS_LONGLONG(a) (((int64_t)a) & 0xFF)
56#define SIMD_SHORT_AS_LONGLONG(a) (((int64_t)a) & 0xFFFF)
58#define SIMD_INT_AS_LONGLONG(a) (((int64_t)a) & 0xFFFFFFFF)
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)
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)
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)
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)
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)
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)
87#define SIMD_LL_SET1_EPI32(a) SIMD_INT_AS_LONGLONG(a) | (SIMD_INT_AS_LONGLONG(a) << 32)
89#define SIMD_LL_SET2_EPI32(a, b) SIMD_INT_AS_LONGLONG(a) | (SIMD_INT_AS_LONGLONG(b) << 32)
91#define SIMD_MM256_SET1_EPI8(a) \
93 SIMD_LL_SET1_EPI8(a) \
94 , SIMD_LL_SET1_EPI8(a), SIMD_LL_SET1_EPI8(a), SIMD_LL_SET1_EPI8(a) \
97#define SIMD_MM256_SET2_EPI8(a0, a1) \
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) \
103#define SIMD_MM256_SETR_EPI8( \
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) \
142#define SIMD_MM256_SET1_EPI16(a) \
144 SIMD_LL_SET1_EPI16(a) \
145 , SIMD_LL_SET1_EPI16(a), SIMD_LL_SET1_EPI16(a), SIMD_LL_SET1_EPI16(a) \
148#define SIMD_MM256_SET2_EPI16(a0, a1) \
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) \
154#define SIMD_MM256_SETR_EPI16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af) \
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) \
160#define SIMD_MM256_SET1_EPI32(a) \
162 SIMD_LL_SET1_EPI32(a) \
163 , SIMD_LL_SET1_EPI32(a), SIMD_LL_SET1_EPI32(a), SIMD_LL_SET1_EPI32(a) \
166#define SIMD_MM256_SET2_EPI32(a0, a1) \
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) \
172#define SIMD_MM256_SETR_EPI32(a0, a1, a2, a3, a4, a5, a6, a7) \
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) \
178const size_t A =
sizeof(__m256i);
1207template <
bool align>
1212 return _mm256_loadu_si256(p);
1217 return _mm256_load_si256(p);
1221 return reinterpret_cast<void *
>(((size_t)ptr) & ~(align - 1));
1225 return ptr ==
AlignLo(ptr, align);
1228template <
bool align>
1233 _mm256_storeu_si256(p, a);
1238 _mm256_store_si256(p, a);
1242 return _mm256_min_epi16(
K16_00FF, _mm256_max_epi16(value,
K_ZERO));
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)),
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)),
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)),
1302 return _mm256_packus_epi16(lo, hi);
1307 (_mm256_unpacklo_epi8(y,
K_ZERO)),
1311 (_mm256_unpackhi_epi8(y,
K_ZERO)),
1314 return _mm256_packus_epi16(lo, hi);
1320 return _mm256_packus_epi16(lo, hi);
1328 return _mm256_or_si256(
1337 return _mm256_or_si256(
1346 return _mm256_or_si256(
1356 return _mm256_or_si256(
1357 _mm256_permute2x128_si256(b0, b2, 0x20),
1365 return _mm256_or_si256(
1366 _mm256_permute2x128_si256(g0, g2, 0x20),
1374 return _mm256_or_si256(
1375 _mm256_permute2x128_si256(r0, r2, 0x20),
1380template <
bool align>
1382 return _mm256_permute4x64_epi64(Load<align>(p), 0xD8);
#define SIMD_MM256_SET1_EPI16(a)
#define SIMD_MM256_SET2_EPI8(a0, a1)
#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)
#define SIMD_MM256_SET1_EPI32(a)
#define SIMD_MM256_SET1_EPI8(a)
#define SIMD_MM256_SET2_EPI16(a0, a1)
const int U_TO_GREEN_WEIGHT
SIMD_INLINE __m256i BgrToGreen(__m256i bgr[3])
const __m256i K32_00000004
const __m256i K8_SHUFFLE_PERMUTED_RED_TO_BGR2
const __m256i K8_SHUFFLE_BGR1_TO_BLUE
const __m256i K16_YRGB_RT
void print_m256(__m256i a)
const int Y_TO_RGB_WEIGHT
const __m256i K8_SHUFFLE_BGR1_TO_RED
SIMD_INLINE __m256i YuvToRed(__m256i y, __m256i v)
SIMD_INLINE __m256i InterleaveBgr< 2 >(__m256i blue, __m256i green, __m256i red)
const __m256i K8_SHUFFLE_PERMUTED_BLUE_TO_BGR0
void print_m256_i16(const __m256i a)
SIMD_INLINE __m256i SaturateI16ToU8(__m256i value)
const __m256i K32_00010000
const int YUV_TO_BGR_AVERAGING_SHIFT
SIMD_INLINE void Store< true >(__m256i *p, __m256i a)
SIMD_INLINE __m256i AdjustY16(__m256i y16)
const __m256i K8_SHUFFLE_PERMUTED_BLUE_TO_BGR1
SIMD_INLINE __m256i BgrToRed(__m256i bgr[3])
SIMD_INLINE __m256i YuvToBlue(__m256i y, __m256i u)
const __m256i K8_SHUFFLE_PERMUTED_GREEN_TO_BGR2
SIMD_INLINE __m256i Load< false >(const __m256i *p)
SIMD_INLINE __m256i AdjustUV16(__m256i uv16)
const __m256i K16_UV_ADJUST
SIMD_INLINE __m256i AdjustedYuvToBlue16(__m256i y16, __m256i u16)
const __m256i K32_00000008
const int V_TO_RED_WEIGHT
SIMD_INLINE char GetChar(T value, size_t index)
void print_m256_i32(const __m256i a)
const __m256i K8_SHUFFLE_PERMUTED_BLUE_TO_BGR2
SIMD_INLINE __m256i AdjustedYuvToRed16(__m256i y16, __m256i v16)
const __m256i K32_00000002
SIMD_INLINE void Store(__m256i *p, __m256i a)
SIMD_INLINE __m256i AdjustedYuvToBlue32(__m256i y16_1, __m256i u16_0)
const __m256i K8_SHUFFLE_BGR0_TO_RED
SIMD_INLINE __m256i InterleaveBgr< 1 >(__m256i blue, __m256i green, __m256i red)
const int V_TO_GREEN_WEIGHT
SIMD_INLINE __m256i AdjustedYuvToGreen32(__m256i y16_1, __m256i u16_v16)
const __m256i K8_SHUFFLE_BGR2_TO_RED
const __m256i K16_Y_ADJUST
SIMD_INLINE __m256i AdjustedYuvToGreen16(__m256i y16, __m256i u16, __m256i v16)
const __m256i K8_SHUFFLE_BGR0_TO_BLUE
const __m256i K8_SHUFFLE_BGR2_TO_GREEN
SIMD_INLINE void * AlignLo(const void *ptr, size_t align)
SIMD_INLINE __m256i BgrToBlue(__m256i bgr[3])
const int YUV_TO_BGR_ROUND_TERM
const __m256i K8_SHUFFLE_PERMUTED_RED_TO_BGR1
SIMD_INLINE __m256i AdjustedYuvToRed32(__m256i y16_1, __m256i v16_0)
const int U_TO_BLUE_WEIGHT
const __m256i K8_SHUFFLE_PERMUTED_RED_TO_BGR0
__m256i InterleaveBgr(__m256i blue, __m256i green, __m256i red)
const __m256i K32_01000000
SIMD_INLINE __m256i YuvToGreen(__m256i y, __m256i u, __m256i v)
const __m256i K8_SHUFFLE_BGR1_TO_GREEN
SIMD_INLINE __m256i InterleaveBgr< 0 >(__m256i blue, __m256i green, __m256i red)
const __m256i K8_SHUFFLE_PERMUTED_GREEN_TO_BGR1
const __m256i K32_00000001
SIMD_INLINE void Store< false >(__m256i *p, __m256i a)
const __m256i K32_0000FFFF
const __m256i K8_SHUFFLE_PERMUTED_GREEN_TO_BGR0
SIMD_INLINE __m256i Load(const __m256i *p)
const __m256i K32_000000FF
void yuyv2rgb_avx(unsigned char *YUV, unsigned char *RGB, int NumPixels)
const __m256i K8_SHUFFLE_BGR0_TO_GREEN
SIMD_INLINE __m256i LoadPermuted(const __m256i *p)
SIMD_INLINE __m256i Load< true >(const __m256i *p)
const __m256i K32_FFFFFF00
const __m256i K8_SHUFFLE_BGR2_TO_BLUE
SIMD_INLINE bool Aligned(const void *ptr, size_t align=sizeof(__m256))