Merge "Colorconverter may not support some src/dst bitmap configurations." into honeycomb
This commit is contained in:
committed by
Android (Google) Code Review
commit
1932fef94a
@@ -21,6 +21,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <utils/Errors.h>
|
||||||
|
|
||||||
#include <OMX_Video.h>
|
#include <OMX_Video.h>
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ struct ColorConverter {
|
|||||||
|
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
|
|
||||||
void convert(
|
status_t convert(
|
||||||
const void *srcBits,
|
const void *srcBits,
|
||||||
size_t srcWidth, size_t srcHeight,
|
size_t srcWidth, size_t srcHeight,
|
||||||
size_t srcCropLeft, size_t srcCropTop,
|
size_t srcCropLeft, size_t srcCropTop,
|
||||||
@@ -63,16 +64,16 @@ private:
|
|||||||
|
|
||||||
uint8_t *initClip();
|
uint8_t *initClip();
|
||||||
|
|
||||||
void convertCbYCrY(
|
status_t convertCbYCrY(
|
||||||
const BitmapParams &src, const BitmapParams &dst);
|
const BitmapParams &src, const BitmapParams &dst);
|
||||||
|
|
||||||
void convertYUV420Planar(
|
status_t convertYUV420Planar(
|
||||||
const BitmapParams &src, const BitmapParams &dst);
|
const BitmapParams &src, const BitmapParams &dst);
|
||||||
|
|
||||||
void convertQCOMYUV420SemiPlanar(
|
status_t convertQCOMYUV420SemiPlanar(
|
||||||
const BitmapParams &src, const BitmapParams &dst);
|
const BitmapParams &src, const BitmapParams &dst);
|
||||||
|
|
||||||
void convertYUV420SemiPlanar(
|
status_t convertYUV420SemiPlanar(
|
||||||
const BitmapParams &src, const BitmapParams &dst);
|
const BitmapParams &src, const BitmapParams &dst);
|
||||||
|
|
||||||
ColorConverter(const ColorConverter &);
|
ColorConverter(const ColorConverter &);
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
|
|||||||
(OMX_COLOR_FORMATTYPE)srcFormat, OMX_COLOR_Format16bitRGB565);
|
(OMX_COLOR_FORMATTYPE)srcFormat, OMX_COLOR_Format16bitRGB565);
|
||||||
CHECK(converter.isValid());
|
CHECK(converter.isValid());
|
||||||
|
|
||||||
converter.convert(
|
err = converter.convert(
|
||||||
(const uint8_t *)buffer->data() + buffer->range_offset(),
|
(const uint8_t *)buffer->data() + buffer->range_offset(),
|
||||||
width, height,
|
width, height,
|
||||||
crop_left, crop_top, crop_right, crop_bottom,
|
crop_left, crop_top, crop_right, crop_bottom,
|
||||||
@@ -252,6 +252,13 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
|
|||||||
|
|
||||||
decoder->stop();
|
decoder->stop();
|
||||||
|
|
||||||
|
if (err != OK) {
|
||||||
|
LOGE("Colorconverter failed to convert frame.");
|
||||||
|
|
||||||
|
delete frame;
|
||||||
|
frame = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include <media/stagefright/ColorConverter.h>
|
#include <media/stagefright/ColorConverter.h>
|
||||||
#include <media/stagefright/MediaDebug.h>
|
#include <media/stagefright/MediaDebug.h>
|
||||||
|
#include <media/stagefright/MediaErrors.h>
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
@@ -72,7 +73,7 @@ size_t ColorConverter::BitmapParams::cropHeight() const {
|
|||||||
return mCropBottom - mCropTop + 1;
|
return mCropBottom - mCropTop + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorConverter::convert(
|
status_t ColorConverter::convert(
|
||||||
const void *srcBits,
|
const void *srcBits,
|
||||||
size_t srcWidth, size_t srcHeight,
|
size_t srcWidth, size_t srcHeight,
|
||||||
size_t srcCropLeft, size_t srcCropTop,
|
size_t srcCropLeft, size_t srcCropTop,
|
||||||
@@ -81,7 +82,9 @@ void ColorConverter::convert(
|
|||||||
size_t dstWidth, size_t dstHeight,
|
size_t dstWidth, size_t dstHeight,
|
||||||
size_t dstCropLeft, size_t dstCropTop,
|
size_t dstCropLeft, size_t dstCropTop,
|
||||||
size_t dstCropRight, size_t dstCropBottom) {
|
size_t dstCropRight, size_t dstCropBottom) {
|
||||||
CHECK_EQ(mDstFormat, OMX_COLOR_Format16bitRGB565);
|
if (mDstFormat != OMX_COLOR_Format16bitRGB565) {
|
||||||
|
return ERROR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
BitmapParams src(
|
BitmapParams src(
|
||||||
const_cast<void *>(srcBits),
|
const_cast<void *>(srcBits),
|
||||||
@@ -93,21 +96,23 @@ void ColorConverter::convert(
|
|||||||
dstWidth, dstHeight,
|
dstWidth, dstHeight,
|
||||||
dstCropLeft, dstCropTop, dstCropRight, dstCropBottom);
|
dstCropLeft, dstCropTop, dstCropRight, dstCropBottom);
|
||||||
|
|
||||||
|
status_t err;
|
||||||
|
|
||||||
switch (mSrcFormat) {
|
switch (mSrcFormat) {
|
||||||
case OMX_COLOR_FormatYUV420Planar:
|
case OMX_COLOR_FormatYUV420Planar:
|
||||||
convertYUV420Planar(src, dst);
|
err = convertYUV420Planar(src, dst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMX_COLOR_FormatCbYCrY:
|
case OMX_COLOR_FormatCbYCrY:
|
||||||
convertCbYCrY(src, dst);
|
err = convertCbYCrY(src, dst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMX_QCOM_COLOR_FormatYVU420SemiPlanar:
|
case OMX_QCOM_COLOR_FormatYVU420SemiPlanar:
|
||||||
convertQCOMYUV420SemiPlanar(src, dst);
|
err = convertQCOMYUV420SemiPlanar(src, dst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMX_COLOR_FormatYUV420SemiPlanar:
|
case OMX_COLOR_FormatYUV420SemiPlanar:
|
||||||
convertYUV420SemiPlanar(src, dst);
|
err = convertYUV420SemiPlanar(src, dst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -116,17 +121,21 @@ void ColorConverter::convert(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorConverter::convertCbYCrY(
|
status_t ColorConverter::convertCbYCrY(
|
||||||
const BitmapParams &src, const BitmapParams &dst) {
|
const BitmapParams &src, const BitmapParams &dst) {
|
||||||
// XXX Untested
|
// XXX Untested
|
||||||
|
|
||||||
uint8_t *kAdjustedClip = initClip();
|
uint8_t *kAdjustedClip = initClip();
|
||||||
|
|
||||||
CHECK((src.mCropLeft & 1) == 0);
|
if (!((src.mCropLeft & 1) == 0
|
||||||
CHECK_EQ(src.cropWidth(), dst.cropWidth());
|
&& src.cropWidth() == dst.cropWidth()
|
||||||
CHECK_EQ(src.cropHeight(), dst.cropHeight());
|
&& src.cropHeight() == dst.cropHeight())) {
|
||||||
|
return ERROR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
||||||
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
||||||
@@ -172,16 +181,20 @@ void ColorConverter::convertCbYCrY(
|
|||||||
src_ptr += src.mWidth * 2;
|
src_ptr += src.mWidth * 2;
|
||||||
dst_ptr += dst.mWidth / 2;
|
dst_ptr += dst.mWidth / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorConverter::convertYUV420Planar(
|
status_t ColorConverter::convertYUV420Planar(
|
||||||
const BitmapParams &src, const BitmapParams &dst) {
|
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);
|
uint8_t *kAdjustedClip = initClip();
|
||||||
CHECK((src.mCropLeft & 1) == 0);
|
|
||||||
CHECK_EQ(src.cropWidth(), dst.cropWidth());
|
|
||||||
CHECK_EQ(src.cropHeight(), dst.cropHeight());
|
|
||||||
|
|
||||||
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
||||||
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
||||||
@@ -259,16 +272,20 @@ void ColorConverter::convertYUV420Planar(
|
|||||||
|
|
||||||
dst_ptr += dst.mWidth / 2;
|
dst_ptr += dst.mWidth / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorConverter::convertQCOMYUV420SemiPlanar(
|
status_t ColorConverter::convertQCOMYUV420SemiPlanar(
|
||||||
const BitmapParams &src, const BitmapParams &dst) {
|
const BitmapParams &src, const BitmapParams &dst) {
|
||||||
uint8_t *kAdjustedClip = initClip();
|
uint8_t *kAdjustedClip = initClip();
|
||||||
|
|
||||||
CHECK((dst.mWidth & 3) == 0);
|
if (!((dst.mWidth & 3) == 0
|
||||||
CHECK((src.mCropLeft & 1) == 0);
|
&& (src.mCropLeft & 1) == 0
|
||||||
CHECK_EQ(src.cropWidth(), dst.cropWidth());
|
&& src.cropWidth() == dst.cropWidth()
|
||||||
CHECK_EQ(src.cropHeight(), dst.cropHeight());
|
&& src.cropHeight() == dst.cropHeight())) {
|
||||||
|
return ERROR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
||||||
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
||||||
@@ -324,18 +341,22 @@ void ColorConverter::convertQCOMYUV420SemiPlanar(
|
|||||||
|
|
||||||
dst_ptr += dst.mWidth / 2;
|
dst_ptr += dst.mWidth / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorConverter::convertYUV420SemiPlanar(
|
status_t ColorConverter::convertYUV420SemiPlanar(
|
||||||
const BitmapParams &src, const BitmapParams &dst) {
|
const BitmapParams &src, const BitmapParams &dst) {
|
||||||
// XXX Untested
|
// XXX Untested
|
||||||
|
|
||||||
uint8_t *kAdjustedClip = initClip();
|
uint8_t *kAdjustedClip = initClip();
|
||||||
|
|
||||||
CHECK((dst.mWidth & 3) == 0);
|
if (!((dst.mWidth & 3) == 0
|
||||||
CHECK((src.mCropLeft & 1) == 0);
|
&& (src.mCropLeft & 1) == 0
|
||||||
CHECK_EQ(src.cropWidth(), dst.cropWidth());
|
&& src.cropWidth() == dst.cropWidth()
|
||||||
CHECK_EQ(src.cropHeight(), dst.cropHeight());
|
&& src.cropHeight() == dst.cropHeight())) {
|
||||||
|
return ERROR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
uint32_t *dst_ptr = (uint32_t *)dst.mBits
|
||||||
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
+ (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
|
||||||
@@ -391,6 +412,8 @@ void ColorConverter::convertYUV420SemiPlanar(
|
|||||||
|
|
||||||
dst_ptr += dst.mWidth / 2;
|
dst_ptr += dst.mWidth / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *ColorConverter::initClip() {
|
uint8_t *ColorConverter::initClip() {
|
||||||
|
|||||||
Reference in New Issue
Block a user