media: Use libyuv for color conversion.
Only use libyuv for converting yuv420p to rgb565 now.
Bug:29870647
Change-Id: Ic9f51de78bb1cc9f13ae229b30af66db46ec9b42
related-to-bug:29197670
diff --git a/include/media/stagefright/ColorConverter.h b/include/media/stagefright/ColorConverter.h
index 85ba920..270c809 100644
--- a/include/media/stagefright/ColorConverter.h
+++ b/include/media/stagefright/ColorConverter.h
@@ -70,6 +70,9 @@
status_t convertYUV420Planar(
const BitmapParams &src, const BitmapParams &dst);
+ status_t convertYUV420PlanarUseLibYUV(
+ const BitmapParams &src, const BitmapParams &dst);
+
status_t convertQCOMYUV420SemiPlanar(
const BitmapParams &src, const BitmapParams &dst);
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index 2445842..3848502 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -104,6 +104,7 @@
LOCAL_STATIC_LIBRARIES := \
libstagefright_color_conversion \
+ libyuv_static \
libstagefright_aacenc \
libstagefright_matroska \
libstagefright_mediafilter \
diff --git a/media/libstagefright/colorconversion/Android.mk b/media/libstagefright/colorconversion/Android.mk
index 32e2dfd..0bf9701 100644
--- a/media/libstagefright/colorconversion/Android.mk
+++ b/media/libstagefright/colorconversion/Android.mk
@@ -7,7 +7,11 @@
LOCAL_C_INCLUDES := \
$(TOP)/frameworks/native/include/media/openmax \
- $(TOP)/hardware/msm7k
+ $(TOP)/hardware/msm7k \
+ $(TOP)/external/libyuv/files/include
+
+LOCAL_STATIC_LIBRARIES := \
+ libyuv_static \
LOCAL_CFLAGS += -Werror
LOCAL_CLANG := true
diff --git a/media/libstagefright/colorconversion/ColorConverter.cpp b/media/libstagefright/colorconversion/ColorConverter.cpp
index 597167f..3ca7cc0 100644
--- a/media/libstagefright/colorconversion/ColorConverter.cpp
+++ b/media/libstagefright/colorconversion/ColorConverter.cpp
@@ -22,6 +22,10 @@
#include <media/stagefright/ColorConverter.h>
#include <media/stagefright/MediaErrors.h>
+#include "libyuv/convert_from.h"
+
+#define USE_LIBYUV
+
namespace android {
ColorConverter::ColorConverter(
@@ -103,7 +107,11 @@
switch (mSrcFormat) {
case OMX_COLOR_FormatYUV420Planar:
+#ifdef USE_LIBYUV
+ err = convertYUV420PlanarUseLibYUV(src, dst);
+#else
err = convertYUV420Planar(src, dst);
+#endif
break;
case OMX_COLOR_FormatCbYCrY:
@@ -196,6 +204,34 @@
return OK;
}
+status_t ColorConverter::convertYUV420PlanarUseLibYUV(
+ const BitmapParams &src, const BitmapParams &dst) {
+ if (!((src.mCropLeft & 1) == 0
+ && src.cropWidth() == dst.cropWidth()
+ && src.cropHeight() == dst.cropHeight())) {
+ return ERROR_UNSUPPORTED;
+ }
+
+ uint16_t *dst_ptr = (uint16_t *)dst.mBits
+ + dst.mCropTop * dst.mWidth + dst.mCropLeft;
+
+ const uint8_t *src_y =
+ (const uint8_t *)src.mBits + src.mCropTop * src.mWidth + src.mCropLeft;
+
+ const uint8_t *src_u =
+ (const uint8_t *)src_y + src.mWidth * src.mHeight
+ + src.mCropTop * (src.mWidth / 2) + src.mCropLeft / 2;
+
+ const uint8_t *src_v =
+ src_u + (src.mWidth / 2) * (src.mHeight / 2);
+
+
+ libyuv::I420ToRGB565(src_y, src.mWidth, src_u, src.mWidth / 2, src_v, src.mWidth / 2,
+ (uint8 *)dst_ptr, dst.mWidth * 2, dst.mWidth, dst.mHeight);
+
+ return OK;
+}
+
status_t ColorConverter::convertYUV420Planar(
const BitmapParams &src, const BitmapParams &dst) {
if (!((src.mCropLeft & 1) == 0