Colorconverter may not support some src/dst bitmap configurations.

Let it return an appropriate error code instead of asserting.

Change-Id: I7fe0dfa169e1cbdecb04c5fcbe8501e73362d05e
related-to-bug: 3328212
diff --git a/include/media/stagefright/ColorConverter.h b/include/media/stagefright/ColorConverter.h
index 2b61f58..2ae8a5b 100644
--- a/include/media/stagefright/ColorConverter.h
+++ b/include/media/stagefright/ColorConverter.h
@@ -21,6 +21,7 @@
 #include <sys/types.h>
 
 #include <stdint.h>
+#include <utils/Errors.h>
 
 #include <OMX_Video.h>
 
@@ -32,7 +33,7 @@
 
     bool isValid() const;
 
-    void convert(
+    status_t convert(
             const void *srcBits,
             size_t srcWidth, size_t srcHeight,
             size_t srcCropLeft, size_t srcCropTop,
@@ -63,16 +64,16 @@
 
     uint8_t *initClip();
 
-    void convertCbYCrY(
+    status_t convertCbYCrY(
             const BitmapParams &src, const BitmapParams &dst);
 
-    void convertYUV420Planar(
+    status_t convertYUV420Planar(
             const BitmapParams &src, const BitmapParams &dst);
 
-    void convertQCOMYUV420SemiPlanar(
+    status_t convertQCOMYUV420SemiPlanar(
             const BitmapParams &src, const BitmapParams &dst);
 
-    void convertYUV420SemiPlanar(
+    status_t convertYUV420SemiPlanar(
             const BitmapParams &src, const BitmapParams &dst);
 
     ColorConverter(const ColorConverter &);
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index 6331a63..8cd2998 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -238,7 +238,7 @@
             (OMX_COLOR_FORMATTYPE)srcFormat, OMX_COLOR_Format16bitRGB565);
     CHECK(converter.isValid());
 
-    converter.convert(
+    err = converter.convert(
             (const uint8_t *)buffer->data() + buffer->range_offset(),
             width, height,
             crop_left, crop_top, crop_right, crop_bottom,
@@ -252,6 +252,13 @@
 
     decoder->stop();
 
+    if (err != OK) {
+        LOGE("Colorconverter failed to convert frame.");
+
+        delete frame;
+        frame = NULL;
+    }
+
     return frame;
 }
 
diff --git a/media/libstagefright/colorconversion/ColorConverter.cpp b/media/libstagefright/colorconversion/ColorConverter.cpp
index 600f040..d518c97 100644
--- a/media/libstagefright/colorconversion/ColorConverter.cpp
+++ b/media/libstagefright/colorconversion/ColorConverter.cpp
@@ -16,6 +16,7 @@
 
 #include <media/stagefright/ColorConverter.h>
 #include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaErrors.h>
 
 namespace android {
 
@@ -72,7 +73,7 @@
     return mCropBottom - mCropTop + 1;
 }
 
-void ColorConverter::convert(
+status_t ColorConverter::convert(
         const void *srcBits,
         size_t srcWidth, size_t srcHeight,
         size_t srcCropLeft, size_t srcCropTop,
@@ -81,7 +82,9 @@
         size_t dstWidth, size_t dstHeight,
         size_t dstCropLeft, size_t dstCropTop,
         size_t dstCropRight, size_t dstCropBottom) {
-    CHECK_EQ(mDstFormat, OMX_COLOR_Format16bitRGB565);
+    if (mDstFormat != OMX_COLOR_Format16bitRGB565) {
+        return ERROR_UNSUPPORTED;
+    }
 
     BitmapParams src(
             const_cast<void *>(srcBits),
@@ -93,21 +96,23 @@
             dstWidth, dstHeight,
             dstCropLeft, dstCropTop, dstCropRight, dstCropBottom);
 
+    status_t err;
+
     switch (mSrcFormat) {
         case OMX_COLOR_FormatYUV420Planar:
-            convertYUV420Planar(src, dst);
+            err = convertYUV420Planar(src, dst);
             break;
 
         case OMX_COLOR_FormatCbYCrY:
-            convertCbYCrY(src, dst);
+            err = convertCbYCrY(src, dst);
             break;
 
         case OMX_QCOM_COLOR_FormatYVU420SemiPlanar:
-            convertQCOMYUV420SemiPlanar(src, dst);
+            err = convertQCOMYUV420SemiPlanar(src, dst);
             break;
 
         case OMX_COLOR_FormatYUV420SemiPlanar:
-            convertYUV420SemiPlanar(src, dst);
+            err = convertYUV420SemiPlanar(src, dst);
             break;
 
         default:
@@ -116,17 +121,21 @@
             break;
         }
     }
+
+    return err;
 }
 
-void ColorConverter::convertCbYCrY(
+status_t ColorConverter::convertCbYCrY(
         const BitmapParams &src, const BitmapParams &dst) {
     // XXX Untested
 
     uint8_t *kAdjustedClip = initClip();
 
-    CHECK((src.mCropLeft & 1) == 0);
-    CHECK_EQ(src.cropWidth(), dst.cropWidth());
-    CHECK_EQ(src.cropHeight(), dst.cropHeight());
+    if (!((src.mCropLeft & 1) == 0
+        && src.cropWidth() == dst.cropWidth()
+        && src.cropHeight() == dst.cropHeight())) {
+        return ERROR_UNSUPPORTED;
+    }
 
     uint32_t *dst_ptr = (uint32_t *)dst.mBits
         + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -172,16 +181,20 @@
         src_ptr += src.mWidth * 2;
         dst_ptr += dst.mWidth / 2;
     }
+
+    return OK;
 }
 
-void ColorConverter::convertYUV420Planar(
+status_t ColorConverter::convertYUV420Planar(
         const BitmapParams &src, const BitmapParams &dst) {
-    uint8_t *kAdjustedClip = initClip();
+    if (!((dst.mWidth & 3) == 0
+            && (src.mCropLeft & 1) == 0
+            && src.cropWidth() == dst.cropWidth()
+            && src.cropHeight() == dst.cropHeight())) {
+        return ERROR_UNSUPPORTED;
+    }
 
-    CHECK((dst.mWidth & 3) == 0);
-    CHECK((src.mCropLeft & 1) == 0);
-    CHECK_EQ(src.cropWidth(), dst.cropWidth());
-    CHECK_EQ(src.cropHeight(), dst.cropHeight());
+    uint8_t *kAdjustedClip = initClip();
 
     uint32_t *dst_ptr = (uint32_t *)dst.mBits
         + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -259,16 +272,20 @@
 
         dst_ptr += dst.mWidth / 2;
     }
+
+    return OK;
 }
 
-void ColorConverter::convertQCOMYUV420SemiPlanar(
+status_t ColorConverter::convertQCOMYUV420SemiPlanar(
         const BitmapParams &src, const BitmapParams &dst) {
     uint8_t *kAdjustedClip = initClip();
 
-    CHECK((dst.mWidth & 3) == 0);
-    CHECK((src.mCropLeft & 1) == 0);
-    CHECK_EQ(src.cropWidth(), dst.cropWidth());
-    CHECK_EQ(src.cropHeight(), dst.cropHeight());
+    if (!((dst.mWidth & 3) == 0
+            && (src.mCropLeft & 1) == 0
+            && src.cropWidth() == dst.cropWidth()
+            && src.cropHeight() == dst.cropHeight())) {
+        return ERROR_UNSUPPORTED;
+    }
 
     uint32_t *dst_ptr = (uint32_t *)dst.mBits
         + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -324,18 +341,22 @@
 
         dst_ptr += dst.mWidth / 2;
     }
+
+    return OK;
 }
 
-void ColorConverter::convertYUV420SemiPlanar(
+status_t ColorConverter::convertYUV420SemiPlanar(
         const BitmapParams &src, const BitmapParams &dst) {
     // XXX Untested
 
     uint8_t *kAdjustedClip = initClip();
 
-    CHECK((dst.mWidth & 3) == 0);
-    CHECK((src.mCropLeft & 1) == 0);
-    CHECK_EQ(src.cropWidth(), dst.cropWidth());
-    CHECK_EQ(src.cropHeight(), dst.cropHeight());
+    if (!((dst.mWidth & 3) == 0
+            && (src.mCropLeft & 1) == 0
+            && src.cropWidth() == dst.cropWidth()
+            && src.cropHeight() == dst.cropHeight())) {
+        return ERROR_UNSUPPORTED;
+    }
 
     uint32_t *dst_ptr = (uint32_t *)dst.mBits
         + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -391,6 +412,8 @@
 
         dst_ptr += dst.mWidth / 2;
     }
+
+    return OK;
 }
 
 uint8_t *ColorConverter::initClip() {