Merge "CpuConsumer: lock buffers that could be YUV as ycbcr" into lmp-mr1-dev

This commit is contained in:
Lajos Molnar 2015-01-29 07:53:57 +00:00 committed by Android (Google) Code Review
commit 94ee9b5916
2 changed files with 65 additions and 40 deletions

View File

@ -54,8 +54,12 @@ class CpuConsumer : public ConsumerBase
uint32_t scalingMode; uint32_t scalingMode;
int64_t timestamp; int64_t timestamp;
uint64_t frameNumber; uint64_t frameNumber;
// Values below are only valid when using // this is the same as format, except for formats that are compatible with
// HAL_PIXEL_FORMAT_YCbCr_420_888, in which case LockedBuffer::data // a flexible format (e.g. HAL_PIXEL_FORMAT_YCbCr_420_888). In the latter
// case this contains that flexible format
PixelFormat flexFormat;
// Values below are only valid when using HAL_PIXEL_FORMAT_YCbCr_420_888
// or compatible format, in which case LockedBuffer::data
// contains the Y channel, and stride is the Y channel stride. For other // contains the Y channel, and stride is the Y channel stride. For other
// formats, these will all be 0. // formats, these will all be 0.
uint8_t *dataCb; uint8_t *dataCb;

View File

@ -67,6 +67,34 @@ status_t CpuConsumer::setDefaultBufferFormat(uint32_t defaultFormat)
return mConsumer->setDefaultBufferFormat(defaultFormat); return mConsumer->setDefaultBufferFormat(defaultFormat);
} }
static bool isPossiblyYUV(PixelFormat format) {
switch ((int)format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGB_888:
case HAL_PIXEL_FORMAT_RGB_565:
case HAL_PIXEL_FORMAT_BGRA_8888:
case HAL_PIXEL_FORMAT_sRGB_A_8888:
case HAL_PIXEL_FORMAT_sRGB_X_8888:
case HAL_PIXEL_FORMAT_Y8:
case HAL_PIXEL_FORMAT_Y16:
case HAL_PIXEL_FORMAT_RAW16: // same as HAL_PIXEL_FORMAT_RAW_SENSOR
case HAL_PIXEL_FORMAT_RAW10:
case HAL_PIXEL_FORMAT_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_BLOB:
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
return false;
case HAL_PIXEL_FORMAT_YV12:
case HAL_PIXEL_FORMAT_YCbCr_420_888:
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
case HAL_PIXEL_FORMAT_YCbCr_422_I:
default:
return true;
}
}
status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) { status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
status_t err; status_t err;
@ -96,61 +124,53 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
void *bufferPointer = NULL; void *bufferPointer = NULL;
android_ycbcr ycbcr = android_ycbcr(); android_ycbcr ycbcr = android_ycbcr();
PixelFormat format = mSlots[buf].mGraphicBuffer->getPixelFormat();
PixelFormat flexFormat = format;
if (isPossiblyYUV(format)) {
if (b.mFence.get()) { if (b.mFence.get()) {
if (mSlots[buf].mGraphicBuffer->getPixelFormat() ==
HAL_PIXEL_FORMAT_YCbCr_420_888) {
err = mSlots[buf].mGraphicBuffer->lockAsyncYCbCr( err = mSlots[buf].mGraphicBuffer->lockAsyncYCbCr(
GraphicBuffer::USAGE_SW_READ_OFTEN, GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop, b.mCrop,
&ycbcr, &ycbcr,
b.mFence->dup()); b.mFence->dup());
} else {
if (err != OK) { err = mSlots[buf].mGraphicBuffer->lockYCbCr(
GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop,
&ycbcr);
}
if (err == OK) {
bufferPointer = ycbcr.y;
flexFormat = HAL_PIXEL_FORMAT_YCbCr_420_888;
if (format != HAL_PIXEL_FORMAT_YCbCr_420_888) {
CC_LOGV("locking buffer of format %#x as flex YUV", format);
}
} else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)", CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)",
strerror(-err), err); strerror(-err), err);
return err; return err;
} }
bufferPointer = ycbcr.y; }
} else {
if (bufferPointer == NULL) { // not flexible YUV
if (b.mFence.get()) {
err = mSlots[buf].mGraphicBuffer->lockAsync( err = mSlots[buf].mGraphicBuffer->lockAsync(
GraphicBuffer::USAGE_SW_READ_OFTEN, GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop, b.mCrop,
&bufferPointer, &bufferPointer,
b.mFence->dup()); b.mFence->dup());
if (err != OK) {
CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)",
strerror(-err), err);
return err;
}
}
} else {
if (mSlots[buf].mGraphicBuffer->getPixelFormat() ==
HAL_PIXEL_FORMAT_YCbCr_420_888) {
err = mSlots[buf].mGraphicBuffer->lockYCbCr(
GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop,
&ycbcr);
if (err != OK) {
CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)",
strerror(-err), err);
return err;
}
bufferPointer = ycbcr.y;
} else { } else {
err = mSlots[buf].mGraphicBuffer->lock( err = mSlots[buf].mGraphicBuffer->lock(
GraphicBuffer::USAGE_SW_READ_OFTEN, GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop, b.mCrop,
&bufferPointer); &bufferPointer);
}
if (err != OK) { if (err != OK) {
CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)", CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)",
strerror(-err), err); strerror(-err), err);
return err; return err;
} }
} }
}
size_t lockedIdx = 0; size_t lockedIdx = 0;
for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) { for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) {
@ -170,7 +190,8 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
reinterpret_cast<uint8_t*>(bufferPointer); reinterpret_cast<uint8_t*>(bufferPointer);
nativeBuffer->width = mSlots[buf].mGraphicBuffer->getWidth(); nativeBuffer->width = mSlots[buf].mGraphicBuffer->getWidth();
nativeBuffer->height = mSlots[buf].mGraphicBuffer->getHeight(); nativeBuffer->height = mSlots[buf].mGraphicBuffer->getHeight();
nativeBuffer->format = mSlots[buf].mGraphicBuffer->getPixelFormat(); nativeBuffer->format = format;
nativeBuffer->flexFormat = flexFormat;
nativeBuffer->stride = (ycbcr.y != NULL) ? nativeBuffer->stride = (ycbcr.y != NULL) ?
ycbcr.ystride : ycbcr.ystride :
mSlots[buf].mGraphicBuffer->getStride(); mSlots[buf].mGraphicBuffer->getStride();