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

Commit 9971362b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "ImageReader ndk: Enable NDK support for P010 format" into tm-qpr-dev am: b9cefaf4

parents 15634e89 b9cefaf4
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
@@ -247,6 +247,13 @@ AImage::getPlanePixelStride(int planeIdx, /*out*/int32_t* pixelStride) const {
        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
            *pixelStride = (planeIdx == 0) ? 1 : 2;
            return AMEDIA_OK;
        case HAL_PIXEL_FORMAT_YCBCR_P010:
            if (mLockedBuffer->dataCb && mLockedBuffer->dataCr) {
                *pixelStride = (planeIdx == 0) ? 2 : mLockedBuffer->chromaStep;
            } else {
                *pixelStride = (planeIdx == 0) ? 2 : 4;
            }
            return AMEDIA_OK;
        case HAL_PIXEL_FORMAT_Y8:
            *pixelStride = 1;
            return AMEDIA_OK;
@@ -316,6 +323,13 @@ AImage::getPlaneRowStride(int planeIdx, /*out*/int32_t* rowStride) const {
            *rowStride = (planeIdx == 0) ? mLockedBuffer->stride
                                         : ALIGN(mLockedBuffer->stride / 2, 16);
            return AMEDIA_OK;
        case HAL_PIXEL_FORMAT_YCBCR_P010:
            if (mLockedBuffer->dataCb && mLockedBuffer->dataCr) {
                *rowStride = (planeIdx == 0) ?  mLockedBuffer->stride : mLockedBuffer->chromaStride;
            } else {
                *rowStride = mLockedBuffer->stride * 2;
            }
            return AMEDIA_OK;
        case HAL_PIXEL_FORMAT_RAW10:
        case HAL_PIXEL_FORMAT_RAW12:
            // RAW10 and RAW12 are used for 10-bit and 12-bit raw data, they are single plane
@@ -473,6 +487,47 @@ AImage::getPlaneData(int planeIdx,/*out*/uint8_t** data, /*out*/int* dataLength)
                                    : (planeIdx == 1) ? cb : cr;
            dataSize = (planeIdx == 0) ? ySize : cSize;
            break;
        case HAL_PIXEL_FORMAT_YCBCR_P010:
            if (mLockedBuffer->height % 2 != 0) {
                ALOGE("YCBCR_P010: height (%d) should be a multiple of 2", mLockedBuffer->height);
                return AMEDIA_ERROR_UNKNOWN;
            }

            if (mLockedBuffer->width <= 0) {
                ALOGE("YCBCR_P010: width (%d) should be a > 0", mLockedBuffer->width);
                return AMEDIA_ERROR_UNKNOWN;
            }

            if (mLockedBuffer->height <= 0) {
                ALOGE("YCBCR_P010: height (%d) should be a > 0", mLockedBuffer->height);
                return AMEDIA_ERROR_UNKNOWN;
            }

            if (mLockedBuffer->dataCb && mLockedBuffer->dataCr) {
                pData = (planeIdx == 0) ?  mLockedBuffer->data :
                        (planeIdx == 1) ?  mLockedBuffer->dataCb : mLockedBuffer->dataCr;
                // only map until last pixel
                if (planeIdx == 0) {
                    cStride = mLockedBuffer->stride;
                    dataSize = cStride * (mLockedBuffer->height - 1) + mLockedBuffer->width * 2;
                } else {
                    bytesPerPixel = mLockedBuffer->chromaStep;
                    cStride = mLockedBuffer->chromaStride;
                    dataSize = cStride * (mLockedBuffer->height / 2 - 1) +
                            bytesPerPixel * (mLockedBuffer->width / 2);
                }
                break;
            }

            cStride = mLockedBuffer->stride * 2;
            ySize = cStride * mLockedBuffer->height;
            cSize = ySize / 2;
            cb = mLockedBuffer->data + ySize;
            cr = cb + 2;

            pData = (planeIdx == 0) ?  mLockedBuffer->data : (planeIdx == 1) ?  cb : cr;
            dataSize = (planeIdx == 0) ? ySize : cSize;
            break;
        case HAL_PIXEL_FORMAT_Y8:
            // Single plane, 8bpp.

+2 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ AImageReader::isSupportedFormatAndUsage(int32_t format, uint64_t usage) {
        case AIMAGE_FORMAT_HEIC:
        case AIMAGE_FORMAT_DEPTH_JPEG:
        case AIMAGE_FORMAT_RAW_DEPTH10:
        case HAL_PIXEL_FORMAT_YCBCR_P010:
            return true;
        case AIMAGE_FORMAT_PRIVATE:
            // For private format, cpu usage is prohibited.
@@ -86,6 +87,7 @@ int
AImageReader::getNumPlanesForFormat(int32_t format) {
    switch (format) {
        case AIMAGE_FORMAT_YUV_420_888:
        case HAL_PIXEL_FORMAT_YCBCR_P010:
            return 3;
        case AIMAGE_FORMAT_RGBA_8888:
        case AIMAGE_FORMAT_RGBX_8888: