Index: source/planar_functions.cc |
diff --git a/source/planar_functions.cc b/source/planar_functions.cc |
index f9fa212f315da8710e72e90a6adec5e4dedcad74..d24393f684bae5a69265da607cb00ffb6c32091b 100644 |
--- a/source/planar_functions.cc |
+++ b/source/planar_functions.cc |
@@ -588,6 +588,71 @@ int UYVYToI422(const uint8* src_uyvy, int src_stride_uyvy, |
return 0; |
} |
+// Convert YUY2 to Y. |
+LIBYUV_API |
+int YUY2ToY(const uint8* src_yuy2, int src_stride_yuy2, |
+ uint8* dst_y, int dst_stride_y, |
+ int width, int height) { |
+ int y; |
+ void (*YUY2ToYRow)(const uint8* src_yuy2, uint8* dst_y, int width) = |
+ YUY2ToYRow_C; |
+ if (!src_yuy2 || !dst_y || width <= 0 || height == 0) { |
+ return -1; |
+ } |
+ // Negative height means invert the image. |
+ if (height < 0) { |
+ height = -height; |
+ src_yuy2 = src_yuy2 + (height - 1) * src_stride_yuy2; |
+ src_stride_yuy2 = -src_stride_yuy2; |
+ } |
+ // Coalesce rows. |
+ if (src_stride_yuy2 == width * 2 && |
+ dst_stride_y == width) { |
+ width *= height; |
+ height = 1; |
+ src_stride_yuy2 = dst_stride_y = 0; |
+ } |
+#if defined(HAS_YUY2TOYROW_SSE2) |
+ if (TestCpuFlag(kCpuHasSSE2)) { |
+ YUY2ToYRow = YUY2ToYRow_Any_SSE2; |
+ if (IS_ALIGNED(width, 16)) { |
+ YUY2ToYRow = YUY2ToYRow_SSE2; |
+ } |
+ } |
+#endif |
+#if defined(HAS_YUY2TOYROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ YUY2ToYRow = YUY2ToYRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 32)) { |
+ YUY2ToYRow = YUY2ToYRow_AVX2; |
+ } |
+ } |
+#endif |
+#if defined(HAS_YUY2TOYROW_NEON) |
+ if (TestCpuFlag(kCpuHasNEON)) { |
+ YUY2ToYRow = YUY2ToYRow_Any_NEON; |
+ if (IS_ALIGNED(width, 16)) { |
+ YUY2ToYRow = YUY2ToYRow_NEON; |
+ } |
+ } |
+#endif |
+#if defined(HAS_YUY2TOYROW_MSA) |
+ if (TestCpuFlag(kCpuHasMSA)) { |
+ YUY2ToYRow = YUY2ToYRow_Any_MSA; |
+ if (IS_ALIGNED(width, 32)) { |
+ YUY2ToYRow = YUY2ToYRow_MSA; |
+ } |
+ } |
+#endif |
+ |
+ for (y = 0; y < height; ++y) { |
+ YUY2ToYRow(src_yuy2, dst_y, width); |
+ src_yuy2 += src_stride_yuy2; |
+ dst_y += dst_stride_y; |
+ } |
+ return 0; |
+} |
+ |
// Mirror I400 with optional flipping |
LIBYUV_API |
int I400Mirror(const uint8* src_y, int src_stride_y, |
@@ -2699,6 +2764,7 @@ int ARGBCopyYToAlpha(const uint8* src_y, int src_stride_y, |
return 0; |
} |
+ |
// TODO(fbarchard): Consider if width is even Y channel can be split |
// directly. A SplitUVRow_Odd function could copy the remaining chroma. |