summaryrefslogtreecommitdiffstats
path: root/services/camera/libcameraservice/camera2/CallbackProcessor.cpp
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2013-05-10 17:05:16 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-05-10 17:05:16 -0700
commit4a1c0a68578c069b09ff5a1b6817dd3a0fe089a2 (patch)
treee32a0f32531a5ee227cdf4ad4ab75be9be88c8de /services/camera/libcameraservice/camera2/CallbackProcessor.cpp
parent38ff2244e951a9365aa142d46b1a8c326788756a (diff)
parent9ca66450ba724aa656382adb82bd61f3c6bdbbf6 (diff)
downloadframeworks_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.cpp66
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;
}
}