Merge "Add support for HAL_PIXEL_FORMAT_YCbCr_420_888" into jb-mr2-dev

This commit is contained in:
Eino-Ville Talvala 2013-05-09 17:13:22 +00:00 committed by Android (Google) Code Review
commit f743e3db27
6 changed files with 83 additions and 9 deletions

View File

@ -53,6 +53,14 @@ 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
// HAL_PIXEL_FORMAT_YCbCr_420_888, in which case LockedBuffer::data
// contains the Y channel, and stride is the Y channel stride. For other
// formats, these will all be 0.
uint8_t *dataCb;
uint8_t *dataCr;
uint32_t chromaStride;
uint32_t chromaStep;
}; };
// Create a new CPU consumer. The maxLockedBuffers parameter specifies // Create a new CPU consumer. The maxLockedBuffers parameter specifies

View File

@ -92,6 +92,9 @@ public:
status_t lock(uint32_t usage, void** vaddr); status_t lock(uint32_t usage, void** vaddr);
status_t lock(uint32_t usage, const Rect& rect, void** vaddr); status_t lock(uint32_t usage, const Rect& rect, void** vaddr);
// For HAL_PIXEL_FORMAT_YCbCr_420_888
status_t lockYCbCr(uint32_t usage, android_ycbcr *ycbcr);
status_t lockYCbCr(uint32_t usage, const Rect& rect, android_ycbcr *ycbcr);
status_t unlock(); status_t unlock();
ANativeWindowBuffer* getNativeBuffer() const; ANativeWindowBuffer* getNativeBuffer() const;

View File

@ -45,6 +45,9 @@ public:
status_t lock(buffer_handle_t handle, status_t lock(buffer_handle_t handle,
int usage, const Rect& bounds, void** vaddr); int usage, const Rect& bounds, void** vaddr);
status_t lockYCbCr(buffer_handle_t handle,
int usage, const Rect& bounds, android_ycbcr *ycbcr);
status_t unlock(buffer_handle_t handle); status_t unlock(buffer_handle_t handle);
// dumps information about the mapping of this handle // dumps information about the mapping of this handle

View File

@ -89,16 +89,34 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
} }
void *bufferPointer = NULL; void *bufferPointer = NULL;
err = mSlots[buf].mGraphicBuffer->lock( android_ycbcr ycbcr = android_ycbcr();
GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop,
&bufferPointer);
if (bufferPointer != NULL && err != OK) { if (mSlots[buf].mGraphicBuffer->getPixelFormat() ==
CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)", strerror(-err), HAL_PIXEL_FORMAT_YCbCr_420_888) {
err); err = mSlots[buf].mGraphicBuffer->lockYCbCr(
return err; 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 {
err = mSlots[buf].mGraphicBuffer->lock(
GraphicBuffer::USAGE_SW_READ_OFTEN,
b.mCrop,
&bufferPointer);
if (err != OK) {
CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)",
strerror(-err), err);
return err;
}
} }
size_t lockedIdx = 0; size_t lockedIdx = 0;
for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) { for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) {
if (mAcquiredBuffers[lockedIdx].mSlot == if (mAcquiredBuffers[lockedIdx].mSlot ==
@ -118,7 +136,9 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
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 = mSlots[buf].mGraphicBuffer->getPixelFormat();
nativeBuffer->stride = mSlots[buf].mGraphicBuffer->getStride(); nativeBuffer->stride = (ycbcr.y != NULL) ?
ycbcr.ystride :
mSlots[buf].mGraphicBuffer->getStride();
nativeBuffer->crop = b.mCrop; nativeBuffer->crop = b.mCrop;
nativeBuffer->transform = b.mTransform; nativeBuffer->transform = b.mTransform;
@ -126,6 +146,11 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
nativeBuffer->timestamp = b.mTimestamp; nativeBuffer->timestamp = b.mTimestamp;
nativeBuffer->frameNumber = b.mFrameNumber; nativeBuffer->frameNumber = b.mFrameNumber;
nativeBuffer->dataCb = reinterpret_cast<uint8_t*>(ycbcr.cb);
nativeBuffer->dataCr = reinterpret_cast<uint8_t*>(ycbcr.cr);
nativeBuffer->chromaStride = ycbcr.cstride;
nativeBuffer->chromaStep = ycbcr.chroma_step;
mCurrentLockedBuffers++; mCurrentLockedBuffers++;
return OK; return OK;

View File

@ -174,6 +174,27 @@ status_t GraphicBuffer::lock(uint32_t usage, const Rect& rect, void** vaddr)
return res; return res;
} }
status_t GraphicBuffer::lockYCbCr(uint32_t usage, android_ycbcr *ycbcr)
{
const Rect lockBounds(width, height);
status_t res = lockYCbCr(usage, lockBounds, ycbcr);
return res;
}
status_t GraphicBuffer::lockYCbCr(uint32_t usage, const Rect& rect,
android_ycbcr *ycbcr)
{
if (rect.left < 0 || rect.right > this->width ||
rect.top < 0 || rect.bottom > this->height) {
ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
rect.left, rect.top, rect.right, rect.bottom,
this->width, this->height);
return BAD_VALUE;
}
status_t res = getBufferMapper().lockYCbCr(handle, usage, rect, ycbcr);
return res;
}
status_t GraphicBuffer::unlock() status_t GraphicBuffer::unlock()
{ {
status_t res = getBufferMapper().unlock(handle); status_t res = getBufferMapper().unlock(handle);

View File

@ -84,6 +84,20 @@ status_t GraphicBufferMapper::lock(buffer_handle_t handle,
return err; return err;
} }
status_t GraphicBufferMapper::lockYCbCr(buffer_handle_t handle,
int usage, const Rect& bounds, android_ycbcr *ycbcr)
{
ATRACE_CALL();
status_t err;
err = mAllocMod->lock_ycbcr(mAllocMod, handle, usage,
bounds.left, bounds.top, bounds.width(), bounds.height(),
ycbcr);
ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
return err;
}
status_t GraphicBufferMapper::unlock(buffer_handle_t handle) status_t GraphicBufferMapper::unlock(buffer_handle_t handle)
{ {
ATRACE_CALL(); ATRACE_CALL();