Example #1
0
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));
    }
  }
}