diff options
Diffstat (limited to 'composer/hwc_layers.cpp')
-rw-r--r-- | composer/hwc_layers.cpp | 96 |
1 files changed, 95 insertions, 1 deletions
diff --git a/composer/hwc_layers.cpp b/composer/hwc_layers.cpp index 053e368b..7b74c447 100644 --- a/composer/hwc_layers.cpp +++ b/composer/hwc_layers.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. * Not a Contribution. * * Copyright 2015 The Android Open Source Project @@ -205,6 +205,99 @@ bool GetSDMColorSpace(const int32_t &dataspace, ColorMetaData *color_metadata) { return valid; } +DisplayError ColorMetadataToDataspace(ColorMetaData color_metadata, Dataspace *dataspace) { + Dataspace primaries, transfer, range = Dataspace::UNKNOWN; + + switch (color_metadata.colorPrimaries) { + case ColorPrimaries_BT709_5: + primaries = Dataspace::STANDARD_BT709; + break; + case ColorPrimaries_BT470_6M: + primaries = Dataspace::STANDARD_BT470M; + break; + case ColorPrimaries_BT601_6_625: + primaries = Dataspace::STANDARD_BT601_625; + break; + case ColorPrimaries_BT601_6_525: + primaries = Dataspace::STANDARD_BT601_525; + break; + case ColorPrimaries_GenericFilm: + primaries = Dataspace::STANDARD_FILM; + break; + case ColorPrimaries_BT2020: + primaries = Dataspace::STANDARD_BT2020; + break; + case ColorPrimaries_AdobeRGB: + primaries = Dataspace::STANDARD_ADOBE_RGB; + break; + case ColorPrimaries_DCIP3: + primaries = Dataspace::STANDARD_DCI_P3; + break; + default: + return kErrorNotSupported; + /* + ColorPrimaries_SMPTE_240M; + ColorPrimaries_SMPTE_ST428; + ColorPrimaries_EBU3213; + */ + } + + switch (color_metadata.transfer) { + case Transfer_sRGB: + transfer = Dataspace::TRANSFER_SRGB; + break; + case Transfer_Gamma2_2: + transfer = Dataspace::TRANSFER_GAMMA2_2; + break; + case Transfer_Gamma2_8: + transfer = Dataspace::TRANSFER_GAMMA2_8; + break; + case Transfer_SMPTE_170M: + transfer = Dataspace::TRANSFER_SMPTE_170M; + break; + case Transfer_Linear: + transfer = Dataspace::TRANSFER_LINEAR; + break; + case Transfer_SMPTE_ST2084: + transfer = Dataspace::TRANSFER_ST2084; + break; + case Transfer_HLG: + transfer = Dataspace::TRANSFER_HLG; + break; + default: + return kErrorNotSupported; + /* + Transfer_SMPTE_240M + Transfer_Log + Transfer_Log_Sqrt + Transfer_XvYCC + Transfer_BT1361 + Transfer_sYCC + Transfer_BT2020_2_1 + Transfer_BT2020_2_2 + Transfer_SMPTE_ST2084 + Transfer_ST_428 + */ + } + + switch (color_metadata.range) { + case Range_Full: + range = Dataspace::RANGE_FULL; + break; + case Range_Limited: + range = Dataspace::RANGE_LIMITED; + break; + case Range_Extended: + range = Dataspace::RANGE_EXTENDED; + break; + default: + return kErrorNotSupported; + } + + *dataspace = (Dataspace)((uint32_t)primaries | (uint32_t)transfer | (uint32_t)range); + return kErrorNone; +} + // Layer operations HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator) : id_(next_id_++), display_id_(display_id), buffer_allocator_(buf_allocator) { @@ -768,6 +861,7 @@ LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) format = kFormatBGR565; break; case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: + case HAL_PIXEL_FORMAT_NV12_LINEAR_FLEX: case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: format = kFormatYCbCr420SemiPlanarVenus; break; |