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

Commit 8f0a3805 authored by yihsing.shen's avatar yihsing.shen Committed by Lili Lin
Browse files

Fix Surface HDR meta reset

Camera hal uses IMapper to set HDR metadata instead of
Surface APIs. However, Surface would overwrite it with default
value, causing HDR metadata lost. We use flags to track
whether Surface APIs have been called or not. And, we overwrite
metadata when those APIs have been called.

Bug: 255389049
Test: hdr test pass
Change-Id: I6d14d4bfc7fae18ba7b2fde9bf371a7d80255319
parent 39983c6e
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -1107,8 +1107,11 @@ void Surface::applyGrallocMetadataLocked(
    ATRACE_CALL();
    auto& mapper = GraphicBufferMapper::get();
    mapper.setDataspace(buffer->handle, static_cast<ui::Dataspace>(queueBufferInput.dataSpace));
    if (mHdrMetadataIsSet & HdrMetadata::SMPTE2086)
        mapper.setSmpte2086(buffer->handle, queueBufferInput.getHdrMetadata().getSmpte2086());
    if (mHdrMetadataIsSet & HdrMetadata::CTA861_3)
        mapper.setCta861_3(buffer->handle, queueBufferInput.getHdrMetadata().getCta8613());
    if (mHdrMetadataIsSet & HdrMetadata::HDR10PLUS)
        mapper.setSmpte2094_40(buffer->handle, queueBufferInput.getHdrMetadata().getHdr10Plus());
}

@@ -2250,6 +2253,7 @@ int Surface::setBuffersDataSpace(Dataspace dataSpace)
int Surface::setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metadata) {
    ALOGV("Surface::setBuffersSmpte2086Metadata");
    Mutex::Autolock lock(mMutex);
    mHdrMetadataIsSet |= HdrMetadata::SMPTE2086;
    if (metadata) {
        mHdrMetadata.smpte2086 = *metadata;
        mHdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
@@ -2262,6 +2266,7 @@ int Surface::setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metad
int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata) {
    ALOGV("Surface::setBuffersCta8613Metadata");
    Mutex::Autolock lock(mMutex);
    mHdrMetadataIsSet |= HdrMetadata::CTA861_3;
    if (metadata) {
        mHdrMetadata.cta8613 = *metadata;
        mHdrMetadata.validTypes |= HdrMetadata::CTA861_3;
@@ -2274,6 +2279,7 @@ int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata
int Surface::setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata) {
    ALOGV("Surface::setBuffersBlobMetadata");
    Mutex::Autolock lock(mMutex);
    mHdrMetadataIsSet |= HdrMetadata::HDR10PLUS;
    if (size > 0) {
        mHdrMetadata.hdr10plus.assign(metadata, metadata + size);
        mHdrMetadata.validTypes |= HdrMetadata::HDR10PLUS;
+5 −0
Original line number Diff line number Diff line
@@ -462,6 +462,11 @@ protected:
    // queue operation.  There is no HDR metadata by default.
    HdrMetadata mHdrMetadata;

    // mHdrMetadataIsSet is a bitfield to track which HDR metadata has been set.
    // Prevent Surface from resetting HDR metadata that was set on a bufer when
    // HDR metadata is not set on this Surface.
    uint32_t mHdrMetadataIsSet{0};

    // mCrop is the crop rectangle that will be used for the next buffer
    // that gets queued. It is set by calling setCrop.
    Rect mCrop;