diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2013-05-10 17:05:16 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-05-10 17:05:16 -0700 |
commit | 4a1c0a68578c069b09ff5a1b6817dd3a0fe089a2 (patch) | |
tree | e32a0f32531a5ee227cdf4ad4ab75be9be88c8de /services/camera/libcameraservice/camera2/CallbackProcessor.cpp | |
parent | 38ff2244e951a9365aa142d46b1a8c326788756a (diff) | |
parent | 9ca66450ba724aa656382adb82bd61f3c6bdbbf6 (diff) | |
download | frameworks_av-4a1c0a68578c069b09ff5a1b6817dd3a0fe089a2.zip frameworks_av-4a1c0a68578c069b09ff5a1b6817dd3a0fe089a2.tar.gz frameworks_av-4a1c0a68578c069b09ff5a1b6817dd3a0fe089a2.tar.bz2 |
am 9ca66450: am 1d74d78f: Merge "Camera2/3: Optimize a few YCbCr_420_888 copy paths" into jb-mr2-dev
* commit '9ca66450ba724aa656382adb82bd61f3c6bdbbf6':
Camera2/3: Optimize a few YCbCr_420_888 copy paths
Diffstat (limited to 'services/camera/libcameraservice/camera2/CallbackProcessor.cpp')
-rw-r--r-- | services/camera/libcameraservice/camera2/CallbackProcessor.cpp | 66 |
1 files changed, 46 insertions, 20 deletions
diff --git a/services/camera/libcameraservice/camera2/CallbackProcessor.cpp b/services/camera/libcameraservice/camera2/CallbackProcessor.cpp index 8bad5ee..6bd929e 100644 --- a/services/camera/libcameraservice/camera2/CallbackProcessor.cpp +++ b/services/camera/libcameraservice/camera2/CallbackProcessor.cpp @@ -445,35 +445,61 @@ status_t CallbackProcessor::convertFromFlexibleYuv(int32_t previewFormat, size_t dstChromaGap = dstCStride - chromaWidth; if (previewFormat == HAL_PIXEL_FORMAT_YCrCb_420_SP) { - // NV21 + // Flexible YUV chroma to NV21 chroma uint8_t *vuDst = yDst; - 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; + // Check for shortcuts + if (uSrc == vSrc + 1 && src.chromaStep == 2) { + // 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; + } + } else { + // 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; + } + vSrc += chromaGap; + uSrc += chromaGap; } - vSrc += chromaGap; - uSrc += chromaGap; } } else { - // YV12 + // 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; - 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; + if (src.chromaStep == 1) { + // 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; + } + for (size_t row = 0; row < chromaHeight; row++) { + memcpy(uDst, uSrc, chromaWidth); + uDst += dstCStride; + uSrc += src.chromaStride; + } + } else { + // 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; + } + vSrc += chromaGap; + uSrc += chromaGap; + vDst += dstChromaGap; + uDst += dstChromaGap; } - vSrc += chromaGap; - uSrc += chromaGap; - vDst += dstChromaGap; - uDst += dstChromaGap; } } |