From 1472eb39f7516faa26de200d8592464c8aaac38e Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 6 Jan 2011 11:26:54 -0800 Subject: Colorconverter may not support some src/dst bitmap configurations. Let it return an appropriate error code instead of asserting. Change-Id: I801131610ad9801b935f7b700d61f9b62733fbca related-to-bug: 3328212 --- .../colorconversion/ColorConverter.cpp | 75 ++++++++++++++-------- 1 file changed, 49 insertions(+), 26 deletions(-) (limited to 'media/libstagefright/colorconversion') 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 #include +#include namespace android { @@ -72,7 +73,7 @@ size_t ColorConverter::BitmapParams::cropHeight() const { 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 @@ void ColorConverter::convert( 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(srcBits), @@ -93,21 +96,23 @@ void ColorConverter::convert( 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 @@ void ColorConverter::convert( 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 @@ void ColorConverter::convertCbYCrY( 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 @@ void ColorConverter::convertYUV420Planar( 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 @@ void ColorConverter::convertQCOMYUV420SemiPlanar( 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 @@ void ColorConverter::convertYUV420SemiPlanar( dst_ptr += dst.mWidth / 2; } + + return OK; } uint8_t *ColorConverter::initClip() { -- cgit v1.1