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

Commit 2e1bec39 authored by Wonsik Kim's avatar Wonsik Kim Committed by Automerger Merge Worker
Browse files

Merge "codec2: Add flexible 10-bit YUV support" am: 3ae68616 am: 8a822f34 am: 9d0b5e10

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1707888

Change-Id: I8451db95d966c4c4c7693a614e7299487a381908
parents 058458ed 9d0b5e10
Loading
Loading
Loading
Loading
+36 −17
Original line number Original line Diff line number Diff line
@@ -1018,29 +1018,31 @@ void CCodec::configure(const sp<AMessage> &msg) {
            } else {
            } else {
                pixelFormatInfo = nullptr;
                pixelFormatInfo = nullptr;
            }
            }
            std::optional<uint32_t> flexPixelFormat{};
            // bit depth -> format
            std::optional<uint32_t> flexPlanarPixelFormat{};
            std::map<uint32_t, uint32_t> flexPixelFormat;
            std::optional<uint32_t> flexSemiPlanarPixelFormat{};
            std::map<uint32_t, uint32_t> flexPlanarPixelFormat;
            std::map<uint32_t, uint32_t> flexSemiPlanarPixelFormat;
            if (pixelFormatInfo && *pixelFormatInfo) {
            if (pixelFormatInfo && *pixelFormatInfo) {
                for (size_t i = 0; i < pixelFormatInfo->flexCount(); ++i) {
                for (size_t i = 0; i < pixelFormatInfo->flexCount(); ++i) {
                    const C2FlexiblePixelFormatDescriptorStruct &desc =
                    const C2FlexiblePixelFormatDescriptorStruct &desc =
                        pixelFormatInfo->m.values[i];
                        pixelFormatInfo->m.values[i];
                    if (desc.bitDepth != 8
                    if (desc.subsampling != C2Color::YUV_420
                            || desc.subsampling != C2Color::YUV_420
                            // TODO(b/180076105): some device report wrong layout
                            // TODO(b/180076105): some device report wrong layout
                            // || desc.layout == C2Color::INTERLEAVED_PACKED
                            // || desc.layout == C2Color::INTERLEAVED_PACKED
                            // || desc.layout == C2Color::INTERLEAVED_ALIGNED
                            // || desc.layout == C2Color::INTERLEAVED_ALIGNED
                            || desc.layout == C2Color::UNKNOWN_LAYOUT) {
                            || desc.layout == C2Color::UNKNOWN_LAYOUT) {
                        continue;
                        continue;
                    }
                    }
                    if (!flexPixelFormat) {
                    if (flexPixelFormat.count(desc.bitDepth) == 0) {
                        flexPixelFormat = desc.pixelFormat;
                        flexPixelFormat.emplace(desc.bitDepth, desc.pixelFormat);
                    }
                    }
                    if (desc.layout == C2Color::PLANAR_PACKED && !flexPlanarPixelFormat) {
                    if (desc.layout == C2Color::PLANAR_PACKED
                        flexPlanarPixelFormat = desc.pixelFormat;
                            && flexPlanarPixelFormat.count(desc.bitDepth) == 0) {
                        flexPlanarPixelFormat.emplace(desc.bitDepth, desc.pixelFormat);
                    }
                    }
                    if (desc.layout == C2Color::SEMIPLANAR_PACKED && !flexSemiPlanarPixelFormat) {
                    if (desc.layout == C2Color::SEMIPLANAR_PACKED
                        flexSemiPlanarPixelFormat = desc.pixelFormat;
                            && flexSemiPlanarPixelFormat.count(desc.bitDepth) == 0) {
                        flexSemiPlanarPixelFormat.emplace(desc.bitDepth, desc.pixelFormat);
                    }
                    }
                }
                }
            }
            }
@@ -1050,7 +1052,7 @@ void CCodec::configure(const sp<AMessage> &msg) {
                if (!(config->mDomain & Config::IS_ENCODER)) {
                if (!(config->mDomain & Config::IS_ENCODER)) {
                    if (surface == nullptr) {
                    if (surface == nullptr) {
                        const char *prefix = "";
                        const char *prefix = "";
                        if (flexSemiPlanarPixelFormat) {
                        if (flexSemiPlanarPixelFormat.count(8) != 0) {
                            format = COLOR_FormatYUV420SemiPlanar;
                            format = COLOR_FormatYUV420SemiPlanar;
                            prefix = "semi-";
                            prefix = "semi-";
                        } else {
                        } else {
@@ -1067,17 +1069,34 @@ void CCodec::configure(const sp<AMessage> &msg) {
                if ((config->mDomain & Config::IS_ENCODER) || !surface) {
                if ((config->mDomain & Config::IS_ENCODER) || !surface) {
                    switch (format) {
                    switch (format) {
                        case COLOR_FormatYUV420Flexible:
                        case COLOR_FormatYUV420Flexible:
                            format = flexPixelFormat.value_or(COLOR_FormatYUV420Planar);
                            format = COLOR_FormatYUV420Planar;
                            if (flexPixelFormat.count(8) != 0) {
                                format = flexPixelFormat[8];
                            }
                            break;
                            break;
                        case COLOR_FormatYUV420Planar:
                        case COLOR_FormatYUV420Planar:
                        case COLOR_FormatYUV420PackedPlanar:
                        case COLOR_FormatYUV420PackedPlanar:
                            format = flexPlanarPixelFormat.value_or(
                            if (flexPlanarPixelFormat.count(8) != 0) {
                                    flexPixelFormat.value_or(format));
                                format = flexPlanarPixelFormat[8];
                            } else if (flexPixelFormat.count(8) != 0) {
                                format = flexPixelFormat[8];
                            }
                            break;
                            break;
                        case COLOR_FormatYUV420SemiPlanar:
                        case COLOR_FormatYUV420SemiPlanar:
                        case COLOR_FormatYUV420PackedSemiPlanar:
                        case COLOR_FormatYUV420PackedSemiPlanar:
                            format = flexSemiPlanarPixelFormat.value_or(
                            if (flexSemiPlanarPixelFormat.count(8) != 0) {
                                    flexPixelFormat.value_or(format));
                                format = flexSemiPlanarPixelFormat[8];
                            } else if (flexPixelFormat.count(8) != 0) {
                                format = flexPixelFormat[8];
                            }
                            break;
                        case COLOR_FormatYUVP010:
                            format = COLOR_FormatYUVP010;
                            if (flexSemiPlanarPixelFormat.count(10) != 0) {
                                format = flexSemiPlanarPixelFormat[10];
                            } else if (flexPixelFormat.count(10) != 0) {
                                format = flexPixelFormat[10];
                            }
                            break;
                            break;
                        default:
                        default:
                            // No-op
                            // No-op
+16 −9
Original line number Original line Diff line number Diff line
@@ -363,21 +363,22 @@ public:
                        break;
                        break;


                    case COLOR_FormatYUVP010:
                    case COLOR_FormatYUVP010:
                        // stride is in bytes
                        mediaImage->mPlane[mediaImage->Y].mOffset = 0;
                        mediaImage->mPlane[mediaImage->Y].mOffset = 0;
                        mediaImage->mPlane[mediaImage->Y].mColInc = 2;
                        mediaImage->mPlane[mediaImage->Y].mColInc = 2;
                        mediaImage->mPlane[mediaImage->Y].mRowInc = stride * 2;
                        mediaImage->mPlane[mediaImage->Y].mRowInc = stride;
                        mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1;
                        mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1;
                        mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1;
                        mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1;


                        mediaImage->mPlane[mediaImage->U].mOffset = stride * vStride * 2;
                        mediaImage->mPlane[mediaImage->U].mOffset = stride * vStride;
                        mediaImage->mPlane[mediaImage->U].mColInc = 4;
                        mediaImage->mPlane[mediaImage->U].mColInc = 4;
                        mediaImage->mPlane[mediaImage->U].mRowInc = stride * 2;
                        mediaImage->mPlane[mediaImage->U].mRowInc = stride;
                        mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2;
                        mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2;
                        mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2;
                        mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2;


                        mediaImage->mPlane[mediaImage->V].mOffset = stride * vStride * 2 + 2;
                        mediaImage->mPlane[mediaImage->V].mOffset = stride * vStride + 2;
                        mediaImage->mPlane[mediaImage->V].mColInc = 4;
                        mediaImage->mPlane[mediaImage->V].mColInc = 4;
                        mediaImage->mPlane[mediaImage->V].mRowInc = stride * 2;
                        mediaImage->mPlane[mediaImage->V].mRowInc = stride;
                        mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2;
                        mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2;
                        mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2;
                        mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2;
                        if (tryWrapping) {
                        if (tryWrapping) {
@@ -538,8 +539,8 @@ public:
                mInitCheck = BAD_VALUE;
                mInitCheck = BAD_VALUE;
                return;
                return;
            }
            }
            bufferSize += stride * vStride
            // stride is in bytes
                    / plane.rowSampling / plane.colSampling * divUp(mAllocatedDepth, 8u);
            bufferSize += stride * vStride / plane.rowSampling / plane.colSampling;
        }
        }


        mBackBufferSize = bufferSize;
        mBackBufferSize = bufferSize;
@@ -792,8 +793,14 @@ sp<ConstGraphicBlockBuffer> ConstGraphicBlockBuffer::AllocateEmpty(
        ALOGD("format had no width / height");
        ALOGD("format had no width / height");
        return nullptr;
        return nullptr;
    }
    }
    // NOTE: we currently only support YUV420 formats for byte-buffer mode.
    int32_t colorFormat = COLOR_FormatYUV420Flexible;
    sp<ABuffer> aBuffer(alloc(align(width, 16) * align(height, 16) * 3 / 2));
    int32_t bpp = 12;  // 8(Y) + 2(U) + 2(V)
    if (format->findInt32(KEY_COLOR_FORMAT, &colorFormat)) {
        if (colorFormat == COLOR_FormatYUVP010) {
            bpp = 24;  // 16(Y) + 4(U) + 4(V)
        }
    }
    sp<ABuffer> aBuffer(alloc(align(width, 16) * align(height, 16) * bpp / 8));
    return new ConstGraphicBlockBuffer(
    return new ConstGraphicBlockBuffer(
            format,
            format,
            aBuffer,
            aBuffer,