| Index: source/libvpx/third_party/libyuv/source/convert_from_argb.cc
 | 
| ===================================================================
 | 
| --- source/libvpx/third_party/libyuv/source/convert_from_argb.cc	(revision 291857)
 | 
| +++ source/libvpx/third_party/libyuv/source/convert_from_argb.cc	(working copy)
 | 
| @@ -60,6 +60,13 @@
 | 
|          }
 | 
|        }
 | 
|    }
 | 
| +#elif defined(HAS_ARGBTOUV444ROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
| +    ARGBToUV444Row = ARGBToUV444Row_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 8)) {
 | 
| +      ARGBToUV444Row = ARGBToUV444Row_NEON;
 | 
| +    }
 | 
| +  }
 | 
|  #endif
 | 
|  #if defined(HAS_ARGBTOYROW_SSSE3)
 | 
|    if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
 | 
| @@ -76,10 +83,8 @@
 | 
|  #elif defined(HAS_ARGBTOYROW_NEON)
 | 
|    if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
 | 
|      ARGBToYRow = ARGBToYRow_Any_NEON;
 | 
| -    ARGBToUV444Row = ARGBToUV444Row_Any_NEON;
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
| -      ARGBToUV444Row = ARGBToUV444Row_NEON;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| @@ -134,6 +139,13 @@
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| +#elif defined(HAS_ARGBTOUV422ROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 16) {
 | 
| +    ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      ARGBToUV422Row = ARGBToUV422Row_NEON;
 | 
| +    }
 | 
| +  }
 | 
|  #endif
 | 
|  
 | 
|  #if defined(HAS_ARGBTOYROW_SSSE3)
 | 
| @@ -153,12 +165,6 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
|      }
 | 
| -    if (width >= 16) {
 | 
| -      ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 16)) {
 | 
| -        ARGBToUV422Row = ARGBToUV422Row_NEON;
 | 
| -      }
 | 
| -    }
 | 
|    }
 | 
|  #endif
 | 
|  
 | 
| @@ -228,11 +234,13 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
|      }
 | 
| -    if (width >= 32) {
 | 
| -      ARGBToUV411Row = ARGBToUV411Row_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 32)) {
 | 
| -        ARGBToUV411Row = ARGBToUV411Row_NEON;
 | 
| -      }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_ARGBTOUV411ROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 32) {
 | 
| +    ARGBToUV411Row = ARGBToUV411Row_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 32)) {
 | 
| +      ARGBToUV411Row = ARGBToUV411Row_NEON;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| @@ -261,9 +269,6 @@
 | 
|        ARGBToYRow_C;
 | 
|    void (*MergeUVRow_)(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
 | 
|                        int width) = MergeUVRow_C;
 | 
| -  // Allocate a rows of uv.
 | 
| -  align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2);
 | 
| -  uint8* row_v = row_u + ((halfwidth + 15) & ~15);
 | 
|    if (!src_argb ||
 | 
|        !dst_y || !dst_uv ||
 | 
|        width <= 0 || height == 0) {
 | 
| @@ -296,11 +301,13 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
|      }
 | 
| -    if (width >= 16) {
 | 
| -      ARGBToUVRow = ARGBToUVRow_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 16)) {
 | 
| -        ARGBToUVRow = ARGBToUVRow_NEON;
 | 
| -      }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_ARGBTOUVROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 16) {
 | 
| +    ARGBToUVRow = ARGBToUVRow_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      ARGBToUVRow = ARGBToUVRow_NEON;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| @@ -331,22 +338,27 @@
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| +  {
 | 
| +    // Allocate a rows of uv.
 | 
| +    align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2);
 | 
| +    uint8* row_v = row_u + ((halfwidth + 15) & ~15);
 | 
|  
 | 
| -  for (y = 0; y < height - 1; y += 2) {
 | 
| -    ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
 | 
| -    MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
 | 
| -    ARGBToYRow(src_argb, dst_y, width);
 | 
| -    ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
 | 
| -    src_argb += src_stride_argb * 2;
 | 
| -    dst_y += dst_stride_y * 2;
 | 
| -    dst_uv += dst_stride_uv;
 | 
| +    for (y = 0; y < height - 1; y += 2) {
 | 
| +      ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
 | 
| +      MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
 | 
| +      ARGBToYRow(src_argb, dst_y, width);
 | 
| +      ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
 | 
| +      src_argb += src_stride_argb * 2;
 | 
| +      dst_y += dst_stride_y * 2;
 | 
| +      dst_uv += dst_stride_uv;
 | 
| +    }
 | 
| +    if (height & 1) {
 | 
| +      ARGBToUVRow(src_argb, 0, row_u, row_v, width);
 | 
| +      MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
 | 
| +      ARGBToYRow(src_argb, dst_y, width);
 | 
| +    }
 | 
| +    free_aligned_buffer_64(row_u);
 | 
|    }
 | 
| -  if (height & 1) {
 | 
| -    ARGBToUVRow(src_argb, 0, row_u, row_v, width);
 | 
| -    MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
 | 
| -    ARGBToYRow(src_argb, dst_y, width);
 | 
| -  }
 | 
| -  free_aligned_buffer_64(row_u);
 | 
|    return 0;
 | 
|  }
 | 
|  
 | 
| @@ -364,9 +376,6 @@
 | 
|        ARGBToYRow_C;
 | 
|    void (*MergeUVRow_)(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
 | 
|                        int width) = MergeUVRow_C;
 | 
| -  // Allocate a rows of uv.
 | 
| -  align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2);
 | 
| -  uint8* row_v = row_u + ((halfwidth + 15) & ~15);
 | 
|    if (!src_argb ||
 | 
|        !dst_y || !dst_uv ||
 | 
|        width <= 0 || height == 0) {
 | 
| @@ -399,11 +408,13 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
|      }
 | 
| -    if (width >= 16) {
 | 
| -      ARGBToUVRow = ARGBToUVRow_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 16)) {
 | 
| -        ARGBToUVRow = ARGBToUVRow_NEON;
 | 
| -      }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_ARGBTOUVROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 16) {
 | 
| +    ARGBToUVRow = ARGBToUVRow_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      ARGBToUVRow = ARGBToUVRow_NEON;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| @@ -434,22 +445,27 @@
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| +  {
 | 
| +    // Allocate a rows of uv.
 | 
| +    align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2);
 | 
| +    uint8* row_v = row_u + ((halfwidth + 15) & ~15);
 | 
|  
 | 
| -  for (y = 0; y < height - 1; y += 2) {
 | 
| -    ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
 | 
| -    MergeUVRow_(row_v, row_u, dst_uv, halfwidth);
 | 
| -    ARGBToYRow(src_argb, dst_y, width);
 | 
| -    ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
 | 
| -    src_argb += src_stride_argb * 2;
 | 
| -    dst_y += dst_stride_y * 2;
 | 
| -    dst_uv += dst_stride_uv;
 | 
| +    for (y = 0; y < height - 1; y += 2) {
 | 
| +      ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
 | 
| +      MergeUVRow_(row_v, row_u, dst_uv, halfwidth);
 | 
| +      ARGBToYRow(src_argb, dst_y, width);
 | 
| +      ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
 | 
| +      src_argb += src_stride_argb * 2;
 | 
| +      dst_y += dst_stride_y * 2;
 | 
| +      dst_uv += dst_stride_uv;
 | 
| +    }
 | 
| +    if (height & 1) {
 | 
| +      ARGBToUVRow(src_argb, 0, row_u, row_v, width);
 | 
| +      MergeUVRow_(row_v, row_u, dst_uv, halfwidth);
 | 
| +      ARGBToYRow(src_argb, dst_y, width);
 | 
| +    }
 | 
| +    free_aligned_buffer_64(row_u);
 | 
|    }
 | 
| -  if (height & 1) {
 | 
| -    ARGBToUVRow(src_argb, 0, row_u, row_v, width);
 | 
| -    MergeUVRow_(row_v, row_u, dst_uv, halfwidth);
 | 
| -    ARGBToYRow(src_argb, dst_y, width);
 | 
| -  }
 | 
| -  free_aligned_buffer_64(row_u);
 | 
|    return 0;
 | 
|  }
 | 
|  
 | 
| @@ -493,6 +509,13 @@
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| +#elif defined(HAS_ARGBTOUV422ROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 16) {
 | 
| +    ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      ARGBToUV422Row = ARGBToUV422Row_NEON;
 | 
| +    }
 | 
| +  }
 | 
|  #endif
 | 
|  #if defined(HAS_ARGBTOYROW_SSSE3)
 | 
|    if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
 | 
| @@ -510,12 +533,6 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
|      }
 | 
| -    if (width >= 16) {
 | 
| -      ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 16)) {
 | 
| -        ARGBToUV422Row = ARGBToUV422Row_NEON;
 | 
| -      }
 | 
| -    }
 | 
|    }
 | 
|  #endif
 | 
|  
 | 
| @@ -594,6 +611,13 @@
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| +#elif defined(HAS_ARGBTOUV422ROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 16) {
 | 
| +    ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      ARGBToUV422Row = ARGBToUV422Row_NEON;
 | 
| +    }
 | 
| +  }
 | 
|  #endif
 | 
|  #if defined(HAS_ARGBTOYROW_SSSE3)
 | 
|    if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
 | 
| @@ -611,12 +635,6 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYRow = ARGBToYRow_NEON;
 | 
|      }
 | 
| -    if (width >= 16) {
 | 
| -      ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 16)) {
 | 
| -        ARGBToUV422Row = ARGBToUV422Row_NEON;
 | 
| -      }
 | 
| -    }
 | 
|    }
 | 
|  #endif
 | 
|  
 | 
| @@ -1022,11 +1040,13 @@
 | 
|      if (IS_ALIGNED(width, 8)) {
 | 
|        ARGBToYJRow = ARGBToYJRow_NEON;
 | 
|      }
 | 
| -    if (width >= 16) {
 | 
| -      ARGBToUVJRow = ARGBToUVJRow_Any_NEON;
 | 
| -      if (IS_ALIGNED(width, 16)) {
 | 
| -        ARGBToUVJRow = ARGBToUVJRow_NEON;
 | 
| -      }
 | 
| +  }
 | 
| +#endif
 | 
| +#if defined(HAS_ARGBTOUVJROW_NEON)
 | 
| +  if (TestCpuFlag(kCpuHasNEON) && width >= 16) {
 | 
| +    ARGBToUVJRow = ARGBToUVJRow_Any_NEON;
 | 
| +    if (IS_ALIGNED(width, 16)) {
 | 
| +      ARGBToUVJRow = ARGBToUVJRow_NEON;
 | 
|      }
 | 
|    }
 | 
|  #endif
 | 
| 
 |