diff options
author | Alec Mouri <alecmouri@google.com> | 2022-01-11 11:14:44 -0800 |
---|---|---|
committer | Sally Qi <sallyqi@google.com> | 2023-01-12 22:08:25 +0000 |
commit | 66d83488af88b3067bcf24f975398e04108dd8a2 (patch) | |
tree | 2ce045c12e36a411522459fbc7fc8f13d74fb7f6 | |
parent | 4cd0373251a9841920d26ccd6b0b50583b9ad026 (diff) | |
download | native-66d83488af88b3067bcf24f975398e04108dd8a2.tar.gz |
Always provide metadata blob for hdr frames
If a surface is playing HDR10+ video and switches to content with a
different HDR standard, then the HDR10+ metadata must be cleared. In
particular, HLG is a standard that does not use HDR metadata, so
unfortunately sending nothing does not imply clearing the existing
metadata. So, we can fix this by sending an empty packet for per-frame
metadata.
Bug: 212496177
Test: builds
Change-Id: Ie3476c9d9bf32f789fdaad5a4fc3cc08e9adcce9
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index c52e96d146..8364ed9d28 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -826,25 +826,24 @@ Error Layer::setPerFrameMetadata(const int32_t supportedPerFrameMetadata, mHdrMetadata.cta8613.maxFrameAverageLightLevel}}); } - Error error = static_cast<Error>( - mComposer.setLayerPerFrameMetadata(mDisplay->getId(), mId, perFrameMetadatas)); + const Error error = static_cast<Error>( + mComposer.setLayerPerFrameMetadata(mDisplay->getId(), mId, perFrameMetadatas)); + if (error != Error::NONE) { + return error; + } + std::vector<Hwc2::PerFrameMetadataBlob> perFrameMetadataBlobs; if (validTypes & HdrMetadata::HDR10PLUS) { if (CC_UNLIKELY(mHdrMetadata.hdr10plus.size() == 0)) { return Error::BAD_PARAMETER; } - std::vector<Hwc2::PerFrameMetadataBlob> perFrameMetadataBlobs; perFrameMetadataBlobs.push_back( {Hwc2::PerFrameMetadataKey::HDR10_PLUS_SEI, mHdrMetadata.hdr10plus}); - Error setMetadataBlobsError = - static_cast<Error>(mComposer.setLayerPerFrameMetadataBlobs(mDisplay->getId(), mId, - perFrameMetadataBlobs)); - if (error == Error::NONE) { - return setMetadataBlobsError; - } } - return error; + + return static_cast<Error>( + mComposer.setLayerPerFrameMetadataBlobs(mDisplay->getId(), mId, perFrameMetadataBlobs)); } Error Layer::setDisplayFrame(const Rect& frame) |