template<bool avx> void edge2ToBGRA(const __m_auto_i* const src, const __m_auto_i* const srcEnd, __m_auto_i* const dest, const __m_auto_i* const destEnd) { static const __m_auto_i offset = _mmauto_set1_epi8(char(128)); __m_auto_i* pDest = dest; for(const __m_auto_i* pSrc = src; pSrc < srcEnd && pDest < destEnd; pSrc++) { const __m_auto_i p = _mmauto_loadt_si_all<true>(pSrc); const __m_auto_i offsetCorrected = _mmauto_abs_epi8(_mmauto_sub_epi8(p, offset)); __m_auto_i res0 = _mmauto_slli_epi16(_mmauto_sqrt_epu16<avx>(_mmauto_slli_epi16(_mmauto_maddubs_epi16(offsetCorrected, offsetCorrected), 1)), 8); __m_auto_i res1 = p; _mmauto_unpacklohi_epi8(res0, res1); _mmauto_storet_si_all<true>(pDest++, res0); _mmauto_storet_si_all<true>(pDest++, res1); } yuvToBGRA<avx>(dest, destEnd, dest); }
template<bool avx, bool aligned> void yuyvToBGRA(const __m_auto_i* const src, const __m_auto_i* const srcEnd, __m_auto_i* const dest) { static const __m_auto_i channelMask = _mmauto_set1_epi16(0x00FF); static const __m_auto_i c_128 = _mmauto_set1_epi16(128); static const __m_auto_i c_0 = _mmauto_setzero_si_all(); static const __m_auto_i alpha = _mmauto_set1_epi8(static_cast<unsigned char>(0xFF)); static const __m_auto_i scaledInvUCoeff = _mmauto_set1_epi16(static_cast<short>(static_cast<float>(1 << 14) / ColorModelConversions::uCoeff)); static const __m_auto_i scaledInvVCoeff = _mmauto_set1_epi16(static_cast<short>(static_cast<float>(1 << 14) / ColorModelConversions::vCoeff)); static const __m_auto_i scaledGCoeffU = _mmauto_set1_epi16(static_cast<short>(ColorModelConversions::yCoeffB / (ColorModelConversions::yCoeffG * ColorModelConversions::uCoeff) * static_cast<float>(1 << 15))); static const __m_auto_i scaledGCoeffV = _mmauto_set1_epi16(static_cast<short>(ColorModelConversions::yCoeffR / (ColorModelConversions::yCoeffG * ColorModelConversions::vCoeff) * static_cast<float>(1 << 15))); __m_auto_i* pDest = dest; for(const __m_auto_i* pSrc = src; pSrc < srcEnd; pSrc++) { const __m_auto_i p = _mmauto_loadt_si_all<true>(pSrc); const __m_auto_i y = _mmauto_and_si_all(p, channelMask); const __m_auto_i uv = _mmauto_sub_epi16(_mmauto_and_si_all(_mmauto_srli_si_all(p, 1), channelMask), c_128); __m_auto_i u = _mmauto_packs_epi32(_mmauto_srai_epi32(_mmauto_slli_epi32(uv, 16), 16), c_0); u = _mmauto_unpacklo_epi16(u, u); __m_auto_i v = _mmauto_packs_epi32(_mmauto_srai_epi32(uv, 16), c_0); v = _mmauto_unpacklo_epi16(v, v); const __m_auto_i b = _mmauto_correct_256op(_mmauto_packus_epi16(_mmauto_add_epi16(y, _mmauto_slli_epi16(_mmauto_mulhrs_epi16(u, scaledInvUCoeff), 1)), c_0)); const __m_auto_i g = _mmauto_correct_256op(_mmauto_packus_epi16(_mmauto_sub_epi16(y, _mmauto_add_epi16(_mmauto_mulhrs_epi16(u, scaledGCoeffU), _mmauto_mulhrs_epi16(v, scaledGCoeffV))), c_0)); const __m_auto_i r = _mmauto_correct_256op(_mmauto_packus_epi16(_mmauto_add_epi16(y, _mmauto_slli_epi32(_mmauto_mulhrs_epi16(v, scaledInvVCoeff), 1)), c_0)); if(avx) { __m_auto_i bgra0 = b; __m_auto_i tmp = g; _mmauto_unpacklohi_epi8(bgra0, tmp); __m_auto_i bgra1 = r; tmp = alpha; _mmauto_unpacklohi_epi8(bgra1, tmp); _mmauto_unpacklohi_epi16(bgra0, bgra1); _mmauto_storet_si_all<aligned>(pDest++, bgra0); _mmauto_storet_si_all<aligned>(pDest++, bgra1); } else { const __m_auto_i bg = _mmauto_unpacklo_epi8(b, g); const __m_auto_i ra = _mmauto_unpacklo_epi8(r, alpha); _mmauto_storet_si_all<aligned>(pDest++, _mmauto_unpacklo_epi16(bg, ra)); _mmauto_storet_si_all<aligned>(pDest++, _mmauto_unpackhi_epi16(bg, ra)); } } }