| Index: source/libvpx/third_party/libyuv/source/convert_argb.cc
 | 
| diff --git a/source/libvpx/third_party/libyuv/source/convert_argb.cc b/source/libvpx/third_party/libyuv/source/convert_argb.cc
 | 
| index ac0bc3d156fcfe205cf9be16a9b9f67cd1f7cda4..66f7660793a4b17c3773b09686103c29dcaeb640 100644
 | 
| --- a/source/libvpx/third_party/libyuv/source/convert_argb.cc
 | 
| +++ b/source/libvpx/third_party/libyuv/source/convert_argb.cc
 | 
| @@ -11,7 +11,6 @@
 | 
|  #include "libyuv/convert_argb.h"
 | 
|  
 | 
|  #include "libyuv/cpu_id.h"
 | 
| -#include "libyuv/format_conversion.h"
 | 
|  #ifdef HAVE_JPEG
 | 
|  #include "libyuv/mjpeg_decoder.h"
 | 
|  #endif
 | 
| @@ -79,17 +78,15 @@ int I444ToARGB(const uint8* src_y, int src_stride_y,
 | 
|      src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_I444TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      I444ToARGBRow = I444ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      I444ToARGBRow = I444ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        I444ToARGBRow = I444ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      I444ToARGBRow = I444ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_I444TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_I444TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      I444ToARGBRow = I444ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        I444ToARGBRow = I444ToARGBRow_NEON;
 | 
| @@ -141,18 +138,15 @@ int I422ToARGB(const uint8* src_y, int src_stride_y,
 | 
|      src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_I422TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      I422ToARGBRow = I422ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        I422ToARGBRow = I422ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      I422ToARGBRow = I422ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
|  #if defined(HAS_I422TOARGBROW_AVX2)
 | 
| -  if (TestCpuFlag(kCpuHasAVX2) && width >= 16) {
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
|      I422ToARGBRow = I422ToARGBRow_Any_AVX2;
 | 
|      if (IS_ALIGNED(width, 16)) {
 | 
|        I422ToARGBRow = I422ToARGBRow_AVX2;
 | 
| @@ -160,7 +154,7 @@ int I422ToARGB(const uint8* src_y, int src_stride_y,
 | 
|    }
 | 
|  #endif
 | 
|  #if defined(HAS_I422TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      I422ToARGBRow = I422ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        I422ToARGBRow = I422ToARGBRow_NEON;
 | 
| @@ -221,17 +215,15 @@ int I411ToARGB(const uint8* src_y, int src_stride_y,
 | 
|      src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_I411TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      I411ToARGBRow = I411ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      I411ToARGBRow = I411ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        I411ToARGBRow = I411ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      I411ToARGBRow = I411ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_I411TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_I411TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      I411ToARGBRow = I411ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        I411ToARGBRow = I411ToARGBRow_NEON;
 | 
| @@ -276,15 +268,23 @@ int I400ToARGB_Reference(const uint8* src_y, int src_stride_y,
 | 
|      src_stride_y = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_YTOARGBROW_SSE2)
 | 
| -  if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
 | 
| -      IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| +  if (TestCpuFlag(kCpuHasSSE2)) {
 | 
|      YToARGBRow = YToARGBRow_Any_SSE2;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        YToARGBRow = YToARGBRow_SSE2;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_YTOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_YTOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    YToARGBRow = YToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      YToARGBRow = YToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_YTOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      YToARGBRow = YToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        YToARGBRow = YToARGBRow_NEON;
 | 
| @@ -326,17 +326,15 @@ int I400ToARGB(const uint8* src_y, int src_stride_y,
 | 
|      src_stride_y = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_I400TOARGBROW_SSE2)
 | 
| -  if (TestCpuFlag(kCpuHasSSE2) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSE2)) {
 | 
|      I400ToARGBRow = I400ToARGBRow_Any_SSE2;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      I400ToARGBRow = I400ToARGBRow_Unaligned_SSE2;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        I400ToARGBRow = I400ToARGBRow_SSE2;
 | 
| -      }
 | 
| +      I400ToARGBRow = I400ToARGBRow_SSE2;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_I400TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_I400TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      I400ToARGBRow = I400ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        I400ToARGBRow = I400ToARGBRow_NEON;
 | 
| @@ -447,15 +445,15 @@ int RGB24ToARGB(const uint8* src_rgb24, int src_stride_rgb24,
 | 
|      src_stride_rgb24 = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_RGB24TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 16 &&
 | 
| -      IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 16)) {
 | 
|        RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_RGB24TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_RGB24TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      RGB24ToARGBRow = RGB24ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        RGB24ToARGBRow = RGB24ToARGBRow_NEON;
 | 
| @@ -497,15 +495,15 @@ int RAWToARGB(const uint8* src_raw, int src_stride_raw,
 | 
|      src_stride_raw = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_RAWTOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 16 &&
 | 
| -      IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      RAWToARGBRow = RAWToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 16)) {
 | 
|        RAWToARGBRow = RAWToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_RAWTOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_RAWTOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      RAWToARGBRow = RAWToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        RAWToARGBRow = RAWToARGBRow_NEON;
 | 
| @@ -547,15 +545,15 @@ int RGB565ToARGB(const uint8* src_rgb565, int src_stride_rgb565,
 | 
|      src_stride_rgb565 = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_RGB565TOARGBROW_SSE2)
 | 
| -  if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
 | 
| -      IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| +  if (TestCpuFlag(kCpuHasSSE2)) {
 | 
|      RGB565ToARGBRow = RGB565ToARGBRow_Any_SSE2;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        RGB565ToARGBRow = RGB565ToARGBRow_SSE2;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_RGB565TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_RGB565TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      RGB565ToARGBRow = RGB565ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        RGB565ToARGBRow = RGB565ToARGBRow_NEON;
 | 
| @@ -597,15 +595,15 @@ int ARGB1555ToARGB(const uint8* src_argb1555, int src_stride_argb1555,
 | 
|      src_stride_argb1555 = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_ARGB1555TOARGBROW_SSE2)
 | 
| -  if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
 | 
| -      IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| +  if (TestCpuFlag(kCpuHasSSE2)) {
 | 
|      ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_SSE2;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_ARGB1555TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_ARGB1555TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGB1555ToARGBRow = ARGB1555ToARGBRow_NEON;
 | 
| @@ -647,15 +645,15 @@ int ARGB4444ToARGB(const uint8* src_argb4444, int src_stride_argb4444,
 | 
|      src_stride_argb4444 = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_ARGB4444TOARGBROW_SSE2)
 | 
| -  if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
 | 
| -      IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| +  if (TestCpuFlag(kCpuHasSSE2)) {
 | 
|      ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_SSE2;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_ARGB4444TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_ARGB4444TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGB4444ToARGBRow = ARGB4444ToARGBRow_NEON;
 | 
| @@ -693,17 +691,23 @@ int NV12ToARGB(const uint8* src_y, int src_stride_y,
 | 
|      dst_stride_argb = -dst_stride_argb;
 | 
|    }
 | 
|  #if defined(HAS_NV12TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      NV12ToARGBRow = NV12ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        NV12ToARGBRow = NV12ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      NV12ToARGBRow = NV12ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_NV12TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_NV12TOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    NV12ToARGBRow = NV12ToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      NV12ToARGBRow = NV12ToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_NV12TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      NV12ToARGBRow = NV12ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        NV12ToARGBRow = NV12ToARGBRow_NEON;
 | 
| @@ -744,18 +748,23 @@ int NV21ToARGB(const uint8* src_y, int src_stride_y,
 | 
|      dst_stride_argb = -dst_stride_argb;
 | 
|    }
 | 
|  #if defined(HAS_NV21TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      NV21ToARGBRow = NV21ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      NV21ToARGBRow = NV21ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        NV21ToARGBRow = NV21ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      NV21ToARGBRow = NV21ToARGBRow_SSSE3;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_NV21TOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    NV21ToARGBRow = NV21ToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      NV21ToARGBRow = NV21ToARGBRow_AVX2;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
|  #if defined(HAS_NV21TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      NV21ToARGBRow = NV21ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        NV21ToARGBRow = NV21ToARGBRow_NEON;
 | 
| @@ -795,17 +804,23 @@ int M420ToARGB(const uint8* src_m420, int src_stride_m420,
 | 
|      dst_stride_argb = -dst_stride_argb;
 | 
|    }
 | 
|  #if defined(HAS_NV12TOARGBROW_SSSE3)
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
| -      NV12ToARGBRow = NV12ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        NV12ToARGBRow = NV12ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      NV12ToARGBRow = NV12ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_NV12TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_NV12TOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    NV12ToARGBRow = NV12ToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      NV12ToARGBRow = NV12ToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_NV12TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      NV12ToARGBRow = NV12ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        NV12ToARGBRow = NV12ToARGBRow_NEON;
 | 
| @@ -852,19 +867,23 @@ int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
 | 
|      src_stride_yuy2 = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_YUY2TOARGBROW_SSSE3)
 | 
| -  // Posix is 16, Windows is 8.
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      YUY2ToARGBRow = YUY2ToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 16)) {
 | 
| -      YUY2ToARGBRow = YUY2ToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(src_yuy2, 16) && IS_ALIGNED(src_stride_yuy2, 16) &&
 | 
| -          IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        YUY2ToARGBRow = YUY2ToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      YUY2ToARGBRow = YUY2ToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_YUY2TOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_YUY2TOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    YUY2ToARGBRow = YUY2ToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 32)) {
 | 
| +      YUY2ToARGBRow = YUY2ToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_YUY2TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      YUY2ToARGBRow = YUY2ToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        YUY2ToARGBRow = YUY2ToARGBRow_NEON;
 | 
| @@ -905,19 +924,23 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
 | 
|      src_stride_uyvy = dst_stride_argb = 0;
 | 
|    }
 | 
|  #if defined(HAS_UYVYTOARGBROW_SSSE3)
 | 
| -  // Posix is 16, Windows is 8.
 | 
| -  if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
|      UYVYToARGBRow = UYVYToARGBRow_Any_SSSE3;
 | 
|      if (IS_ALIGNED(width, 16)) {
 | 
| -      UYVYToARGBRow = UYVYToARGBRow_Unaligned_SSSE3;
 | 
| -      if (IS_ALIGNED(src_uyvy, 16) && IS_ALIGNED(src_stride_uyvy, 16) &&
 | 
| -          IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
 | 
| -        UYVYToARGBRow = UYVYToARGBRow_SSSE3;
 | 
| -      }
 | 
| +      UYVYToARGBRow = UYVYToARGBRow_SSSE3;
 | 
|      }
 | 
|    }
 | 
| -#elif defined(HAS_UYVYTOARGBROW_NEON)
 | 
| -  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +#endif
 | 
| +#if defined(HAS_UYVYTOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    UYVYToARGBRow = UYVYToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 32)) {
 | 
| +      UYVYToARGBRow = UYVYToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_UYVYTOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
|      UYVYToARGBRow = UYVYToARGBRow_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        UYVYToARGBRow = UYVYToARGBRow_NEON;
 | 
| @@ -932,6 +955,152 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
 | 
|    return 0;
 | 
|  }
 | 
|  
 | 
| +// Convert J420 to ARGB.
 | 
| +LIBYUV_API
 | 
| +int J420ToARGB(const uint8* src_y, int src_stride_y,
 | 
| +               const uint8* src_u, int src_stride_u,
 | 
| +               const uint8* src_v, int src_stride_v,
 | 
| +               uint8* dst_argb, int dst_stride_argb,
 | 
| +               int width, int height) {
 | 
| +  int y;
 | 
| +  void (*J422ToARGBRow)(const uint8* y_buf,
 | 
| +                        const uint8* u_buf,
 | 
| +                        const uint8* v_buf,
 | 
| +                        uint8* rgb_buf,
 | 
| +                        int width) = J422ToARGBRow_C;
 | 
| +  if (!src_y || !src_u || !src_v || !dst_argb ||
 | 
| +      width <= 0 || height == 0) {
 | 
| +    return -1;
 | 
| +  }
 | 
| +  // Negative height means invert the image.
 | 
| +  if (height < 0) {
 | 
| +    height = -height;
 | 
| +    dst_argb = dst_argb + (height - 1) * dst_stride_argb;
 | 
| +    dst_stride_argb = -dst_stride_argb;
 | 
| +  }
 | 
| +#if defined(HAS_J422TOARGBROW_SSSE3)
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_Any_SSSE3;
 | 
| +    if (IS_ALIGNED(width, 8)) {
 | 
| +      J422ToARGBRow = J422ToARGBRow_SSSE3;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_J422TOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      J422ToARGBRow = J422ToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_J422TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 8)) {
 | 
| +      J422ToARGBRow = J422ToARGBRow_NEON;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_J422TOARGBROW_MIPS_DSPR2)
 | 
| +  if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) &&
 | 
| +      IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) &&
 | 
| +      IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) &&
 | 
| +      IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) &&
 | 
| +      IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_MIPS_DSPR2;
 | 
| +  }
 | 
| +#endif
 | 
| +
 | 
| +  for (y = 0; y < height; ++y) {
 | 
| +    J422ToARGBRow(src_y, src_u, src_v, dst_argb, width);
 | 
| +    dst_argb += dst_stride_argb;
 | 
| +    src_y += src_stride_y;
 | 
| +    if (y & 1) {
 | 
| +      src_u += src_stride_u;
 | 
| +      src_v += src_stride_v;
 | 
| +    }
 | 
| +  }
 | 
| +  return 0;
 | 
| +}
 | 
| +
 | 
| +// Convert J422 to ARGB.
 | 
| +LIBYUV_API
 | 
| +int J422ToARGB(const uint8* src_y, int src_stride_y,
 | 
| +               const uint8* src_u, int src_stride_u,
 | 
| +               const uint8* src_v, int src_stride_v,
 | 
| +               uint8* dst_argb, int dst_stride_argb,
 | 
| +               int width, int height) {
 | 
| +  int y;
 | 
| +  void (*J422ToARGBRow)(const uint8* y_buf,
 | 
| +                        const uint8* u_buf,
 | 
| +                        const uint8* v_buf,
 | 
| +                        uint8* rgb_buf,
 | 
| +                        int width) = J422ToARGBRow_C;
 | 
| +  if (!src_y || !src_u || !src_v ||
 | 
| +      !dst_argb ||
 | 
| +      width <= 0 || height == 0) {
 | 
| +    return -1;
 | 
| +  }
 | 
| +  // Negative height means invert the image.
 | 
| +  if (height < 0) {
 | 
| +    height = -height;
 | 
| +    dst_argb = dst_argb + (height - 1) * dst_stride_argb;
 | 
| +    dst_stride_argb = -dst_stride_argb;
 | 
| +  }
 | 
| +  // Coalesce rows.
 | 
| +  if (src_stride_y == width &&
 | 
| +      src_stride_u * 2 == width &&
 | 
| +      src_stride_v * 2 == width &&
 | 
| +      dst_stride_argb == width * 4) {
 | 
| +    width *= height;
 | 
| +    height = 1;
 | 
| +    src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
 | 
| +  }
 | 
| +#if defined(HAS_J422TOARGBROW_SSSE3)
 | 
| +  if (TestCpuFlag(kCpuHasSSSE3)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_Any_SSSE3;
 | 
| +    if (IS_ALIGNED(width, 8)) {
 | 
| +      J422ToARGBRow = J422ToARGBRow_SSSE3;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_J422TOARGBROW_AVX2)
 | 
| +  if (TestCpuFlag(kCpuHasAVX2)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_Any_AVX2;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      J422ToARGBRow = J422ToARGBRow_AVX2;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_J422TOARGBROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 8)) {
 | 
| +      J422ToARGBRow = J422ToARGBRow_NEON;
 | 
| +    }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_J422TOARGBROW_MIPS_DSPR2)
 | 
| +  if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) &&
 | 
| +      IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) &&
 | 
| +      IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) &&
 | 
| +      IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) &&
 | 
| +      IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) {
 | 
| +    J422ToARGBRow = J422ToARGBRow_MIPS_DSPR2;
 | 
| +  }
 | 
| +#endif
 | 
| +
 | 
| +  for (y = 0; y < height; ++y) {
 | 
| +    J422ToARGBRow(src_y, src_u, src_v, dst_argb, width);
 | 
| +    dst_argb += dst_stride_argb;
 | 
| +    src_y += src_stride_y;
 | 
| +    src_u += src_stride_u;
 | 
| +    src_v += src_stride_v;
 | 
| +  }
 | 
| +  return 0;
 | 
| +}
 | 
| +
 | 
|  #ifdef __cplusplus
 | 
|  }  // extern "C"
 | 
|  }  // namespace libyuv
 | 
| 
 |