diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2013-05-14 16:05:27 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2013-05-14 17:03:33 -0700 |
commit | d5694a2e7e61cf7e19a0e135e63142d1967e178b (patch) | |
tree | cbc081163fbf4538cf451606733eec290d428747 /services | |
parent | a2d2dc67ecdbd8c6892c3cff11d076110dee75ef (diff) | |
download | frameworks_av-d5694a2e7e61cf7e19a0e135e63142d1967e178b.zip frameworks_av-d5694a2e7e61cf7e19a0e135e63142d1967e178b.tar.gz frameworks_av-d5694a2e7e61cf7e19a0e135e63142d1967e178b.tar.bz2 |
Camera3: Fix fast flexible YUV->NV21 path.
A U by any other name may smell just as sweet, but the color's pretty
awful if you call it a V.
Henceforth they never will be UV.
Bug: 8949720
Change-Id: I4897e93d5a293e576bb1d7ba44d91792b869ad42
Diffstat (limited to 'services')
-rw-r--r-- | services/camera/libcameraservice/camera2/CallbackProcessor.cpp | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/services/camera/libcameraservice/camera2/CallbackProcessor.cpp b/services/camera/libcameraservice/camera2/CallbackProcessor.cpp index 5e88102..5fa84e0 100644 --- a/services/camera/libcameraservice/camera2/CallbackProcessor.cpp +++ b/services/camera/libcameraservice/camera2/CallbackProcessor.cpp @@ -402,8 +402,8 @@ status_t CallbackProcessor::convertFromFlexibleYuv(int32_t previewFormat, } // Copy/swizzle chroma planes, 4:2:0 subsampling - const uint8_t *uSrc = src.dataCb; - const uint8_t *vSrc = src.dataCr; + const uint8_t *cbSrc = src.dataCb; + const uint8_t *crSrc = src.dataCr; size_t chromaHeight = src.height / 2; size_t chromaWidth = src.width / 2; ssize_t chromaGap = src.chromaStride - @@ -412,59 +412,63 @@ status_t CallbackProcessor::convertFromFlexibleYuv(int32_t previewFormat, if (previewFormat == HAL_PIXEL_FORMAT_YCrCb_420_SP) { // Flexible YUV chroma to NV21 chroma - uint8_t *vuDst = yDst; + uint8_t *crcbDst = yDst; // Check for shortcuts - if (uSrc == vSrc + 1 && src.chromaStep == 2) { + if (cbSrc == crSrc + 1 && src.chromaStep == 2) { + ALOGV("%s: Fast NV21->NV21", __FUNCTION__); // Source has semiplanar CrCb chroma layout, can copy by rows for (size_t row = 0; row < chromaHeight; row++) { - memcpy(vuDst, uSrc, src.width); - vuDst += src.width; - uSrc += src.chromaStride; + memcpy(crcbDst, crSrc, src.width); + crcbDst += src.width; + crSrc += src.chromaStride; } } else { + ALOGV("%s: Generic->NV21", __FUNCTION__); // Generic copy, always works but not very efficient for (size_t row = 0; row < chromaHeight; row++) { for (size_t col = 0; col < chromaWidth; col++) { - *(vuDst++) = *vSrc; - *(vuDst++) = *uSrc; - vSrc += src.chromaStep; - uSrc += src.chromaStep; + *(crcbDst++) = *crSrc; + *(crcbDst++) = *cbSrc; + crSrc += src.chromaStep; + cbSrc += src.chromaStep; } - vSrc += chromaGap; - uSrc += chromaGap; + crSrc += chromaGap; + cbSrc += chromaGap; } } } else { // flexible YUV chroma to YV12 chroma ALOG_ASSERT(previewFormat == HAL_PIXEL_FORMAT_YV12, "Unexpected preview format 0x%x", previewFormat); - uint8_t *vDst = yDst; - uint8_t *uDst = yDst + chromaHeight * dstCStride; + uint8_t *crDst = yDst; + uint8_t *cbDst = yDst + chromaHeight * dstCStride; if (src.chromaStep == 1) { + ALOGV("%s: Fast YV12->YV12", __FUNCTION__); // Source has planar chroma layout, can copy by row for (size_t row = 0; row < chromaHeight; row++) { - memcpy(vDst, vSrc, chromaWidth); - vDst += dstCStride; - vSrc += src.chromaStride; + memcpy(crDst, crSrc, chromaWidth); + crDst += dstCStride; + crSrc += src.chromaStride; } for (size_t row = 0; row < chromaHeight; row++) { - memcpy(uDst, uSrc, chromaWidth); - uDst += dstCStride; - uSrc += src.chromaStride; + memcpy(cbDst, cbSrc, chromaWidth); + cbDst += dstCStride; + cbSrc += src.chromaStride; } } else { + ALOGV("%s: Generic->YV12", __FUNCTION__); // Generic copy, always works but not very efficient for (size_t row = 0; row < chromaHeight; row++) { for (size_t col = 0; col < chromaWidth; col++) { - *(vDst++) = *vSrc; - *(uDst++) = *uSrc; - vSrc += src.chromaStep; - uSrc += src.chromaStep; + *(crDst++) = *crSrc; + *(cbDst++) = *cbSrc; + crSrc += src.chromaStep; + cbSrc += src.chromaStep; } - vSrc += chromaGap; - uSrc += chromaGap; - vDst += dstChromaGap; - uDst += dstChromaGap; + crSrc += chromaGap; + cbSrc += chromaGap; + crDst += dstChromaGap; + cbDst += dstChromaGap; } } } |