diff options
author | Andreas Huber <andih@google.com> | 2011-01-06 11:26:54 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-01-06 12:42:33 -0800 |
commit | b1787e3b95e96cc002377d41518cc183f64b58c4 (patch) | |
tree | f6c8ed1d45603def7a587c5935c92a8629800585 | |
parent | 4d785ae6b940c62610612baf9d24f1ee607a2714 (diff) | |
download | frameworks_av-b1787e3b95e96cc002377d41518cc183f64b58c4.zip frameworks_av-b1787e3b95e96cc002377d41518cc183f64b58c4.tar.gz frameworks_av-b1787e3b95e96cc002377d41518cc183f64b58c4.tar.bz2 |
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
-rw-r--r-- | include/media/stagefright/ColorConverter.h | 11 | ||||
-rw-r--r-- | media/libstagefright/StagefrightMetadataRetriever.cpp | 9 | ||||
-rw-r--r-- | media/libstagefright/colorconversion/ColorConverter.cpp | 75 |
3 files changed, 63 insertions, 32 deletions
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 @@ struct ColorConverter { 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 @@ private: 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 @@ static VideoFrame *extractVideoFrameWithCodecFlags( (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 @@ static VideoFrame *extractVideoFrameWithCodecFlags( 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 @@ 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<void *>(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() { |