hwc2: Handle reading color metadata
- Read HDR static metadata and HDR10plus datas from color metadata, and
dataspace from SF.
- If dataspace is UNKNOWN, get dataspace from gralloc metadata.
Change-Id: Ice9200fd042264d76b99b5dd2d583a705bb20009
CRs-Fixed: 2523925
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index c43f3ac..a8c1926 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright 2015 The Android Open Source Project
@@ -957,31 +957,35 @@
}
}
- // Only Video module populates the Color Metadata in handle.
- if (layer_buffer->flags.video && IsBT2020(layer_buffer->color_metadata.colorPrimaries)) {
+ if (IsBT2020(layer_buffer->color_metadata.colorPrimaries)) {
// android_dataspace_t doesnt support mastering display and light levels
// so retrieve it from metadata for BT2020(HDR)
use_color_metadata = true;
}
- // Since client has set PerFrameMetadata, dataspace will be valid
- // so we can skip reading from ColorMetaData.
if (use_color_metadata && !per_frame_hdr_metadata_) {
- ColorMetaData old_meta_data = layer_buffer->color_metadata;
- if (sdm::SetCSC(handle, &layer_buffer->color_metadata) == kErrorNone) {
- if ((layer_buffer->color_metadata.colorPrimaries != old_meta_data.colorPrimaries) ||
- (layer_buffer->color_metadata.transfer != old_meta_data.transfer) ||
- (layer_buffer->color_metadata.range != old_meta_data.range)) {
+ ColorMetaData new_metadata = {};
+ if (sdm::SetCSC(handle, &new_metadata) == kErrorNone) {
+ // If dataspace is KNOWN, overwrite the gralloc metadata CSC using the previously derived CSC
+ // from dataspace.
+ if (dataspace_ != HAL_DATASPACE_UNKNOWN) {
+ new_metadata.colorPrimaries = layer_buffer->color_metadata.colorPrimaries;
+ new_metadata.transfer = layer_buffer->color_metadata.transfer;
+ new_metadata.range = layer_buffer->color_metadata.range;
+ }
+ if ((layer_buffer->color_metadata.colorPrimaries != new_metadata.colorPrimaries) ||
+ (layer_buffer->color_metadata.transfer != new_metadata.transfer) ||
+ (layer_buffer->color_metadata.range != new_metadata.range)) {
layer_->update_mask.set(kMetadataUpdate);
}
- DLOGV_IF(kTagClient, "Dynamic Metadata valid = %d size = %d",
- layer_buffer->color_metadata.dynamicMetaDataValid,
- layer_buffer->color_metadata.dynamicMetaDataLen);
- if (layer_buffer->color_metadata.dynamicMetaDataValid &&
+ if (new_metadata.dynamicMetaDataValid &&
!SameConfig(layer_buffer->color_metadata.dynamicMetaDataPayload,
- old_meta_data.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) {
+ new_metadata.dynamicMetaDataPayload, HDR_DYNAMIC_META_DATA_SZ)) {
layer_->update_mask.set(kMetadataUpdate);
}
+ if (layer_->update_mask.test(kMetadataUpdate)) {
+ layer_buffer->color_metadata = new_metadata;
+ }
} else {
dataspace_supported_ = false;
return;