summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Mouri <alecmouri@google.com>2022-01-11 11:14:44 -0800
committerSally Qi <sallyqi@google.com>2023-01-12 22:08:25 +0000
commit66d83488af88b3067bcf24f975398e04108dd8a2 (patch)
tree2ce045c12e36a411522459fbc7fc8f13d74fb7f6
parent4cd0373251a9841920d26ccd6b0b50583b9ad026 (diff)
downloadnative-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.cpp19
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)