Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d74d78f authored by Eino-Ville Talvala's avatar Eino-Ville Talvala Committed by Android (Google) Code Review
Browse files

Merge "Camera2/3: Optimize a few YCbCr_420_888 copy paths" into jb-mr2-dev

parents da5405fb 7e66ebc9
Loading
Loading
Loading
Loading
+46 −20
Original line number Diff line number Diff line
@@ -411,8 +411,18 @@ 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;
        // 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;
@@ -423,12 +433,27 @@ status_t CallbackProcessor::convertFromFlexibleYuv(int32_t previewFormat,
                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;
        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;
@@ -442,6 +467,7 @@ status_t CallbackProcessor::convertFromFlexibleYuv(int32_t previewFormat,
                uDst += dstChromaGap;
            }
        }
    }

    return OK;
}