13a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar/*
23a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * Copyright (C) 2016 The Android Open Source Project
33a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *
43a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
53a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * you may not use this file except in compliance with the License.
63a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * You may obtain a copy of the License at
73a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *
83a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
93a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *
103a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * Unless required by applicable law or agreed to in writing, software
113a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
123a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * See the License for the specific language governing permissions and
143a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * limitations under the License.
153a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar */
163a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
173a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#ifndef COLOR_UTILS_H_
183a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
193a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define COLOR_UTILS_H_
203a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
213a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <stdint.h>
223a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
233a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define STRINGIFY_ENUMS
243a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
253a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/stagefright/foundation/AMessage.h>
263a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
273a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/hardware/VideoAPI.h>
283a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <system/graphics.h>
293a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
303a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarnamespace android {
313a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
323a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct ColorUtils {
333a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    /*
343a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * Media-platform color constants. MediaCodec uses (an extended version of) platform-defined
353a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * constants that are derived from HAL_DATASPACE, since these are directly exposed to the user.
363a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * We extend the values to maintain the richer set of information defined inside media
373a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * containers and bitstreams that are not supported by the platform. We also expect vendors
383a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * to extend some of these values with vendor-specific values. These are separated into a
393a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * vendor-extension section so they won't collide with future platform values.
403a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     */
413a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
4204e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar    /**
4304e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar     * graphic.h constants changed in Android 8.0 after ColorStandard values were already public
4404e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar     * in Android 7.0. We will not deal with the break in graphic.h here, but list the public
4504e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar     * Android SDK MediaFormat values here.
4604e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar     */
473a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    enum ColorStandard : uint32_t {
4804e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardUnspecified =          0,
4904e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT709 =                1,
5004e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT601_625 =            2,
5104e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT601_625_Unadjusted = 3, // not in SDK
5204e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT601_525 =            4,
5304e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT601_525_Unadjusted = 5, // not in SDK
5404e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT2020 =               6,
5504e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT2020Constant =       7, // not in SDK
5604e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardBT470M =               8, // not in SDK
5704e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardFilm =                 9, // not in SDK
5804e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardDCI_P3 =               10, // not in SDK, new in Android 8.0
5904e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar
603a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-standard values that are not supported by graphics HAL,
613a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           but track defined color primaries-matrix coefficient combinations in media.
623a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           These are stable for a given release. */
6304e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorStandardExtendedStart = 64,
643a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
653a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-standard values that are not supported by graphics HAL
663a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           nor using media defined color primaries or matrix coefficients. These may differ per
673a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           device. */
683a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardVendorStart = 0x10000,
693a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    };
703a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
713a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    enum ColorTransfer : uint32_t  {
7204e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorTransferUnspecified = 0,
7304e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorTransferLinear =      1,
7404e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorTransferSRGB =        2,
7536aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferSMPTE_170M =  3, // not in SDK
7636aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferGamma22 =     4, // not in SDK
7736aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferGamma28 =     5, // not in SDK
7836aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferST2084 =      6,
7936aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferHLG =         7,
8036aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferGamma26 =     8, // not in SDK, new in Android 8.0
813a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
823a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL,
833a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           but track media-defined color-transfer. These are stable for a given release. */
8436aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        kColorTransferExtendedStart = 32,
853a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
863a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL
873a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           nor defined by media. These may differ per device. */
883a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferVendorStart = 0x10000,
893a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    };
903a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
913a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    enum ColorRange : uint32_t  {
9204e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorRangeUnspecified = 0,
9304e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorRangeFull =        1,
9404e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorRangeLimited =     2,
9504e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar
963a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL,
973a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           but track media-defined color-transfer. These are stable for a given release. */
9804e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        kColorRangeExtendedStart = 8,
993a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1003a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL
1013a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           nor defined by media. These may differ per device. */
1023a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeVendorStart = 0x10000,
1033a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    };
1043a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1053a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    /*
1063a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * Static utilities for codec support
1073a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     */
1083a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1093a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // using int32_t for media range/standard/transfers to denote extended ranges
1103a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // wrap methods change invalid aspects to the Unspecified value
1113a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static int32_t wrapColorAspectsIntoColorStandard(
1123a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            ColorAspects::Primaries primaries, ColorAspects::MatrixCoeffs coeffs);
1133a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static int32_t wrapColorAspectsIntoColorRange(ColorAspects::Range range);
1143a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static int32_t wrapColorAspectsIntoColorTransfer(ColorAspects::Transfer transfer);
1153a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1163a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // unwrap methods change invalid aspects to the Other value
1173a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t unwrapColorAspectsFromColorRange(
1183a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t range, ColorAspects::Range *aspect);
1193a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t unwrapColorAspectsFromColorTransfer(
1203a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t transfer, ColorAspects::Transfer *aspect);
1213a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t unwrapColorAspectsFromColorStandard(
1223a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t standard,
1233a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            ColorAspects::Primaries *primaries, ColorAspects::MatrixCoeffs *coeffs);
1243a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1253a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t convertPlatformColorAspectsToCodecAspects(
1263a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t range, int32_t standard, int32_t transfer, ColorAspects &aspects);
1273a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t convertCodecColorAspectsToPlatformAspects(
1283a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            const ColorAspects &aspects, int32_t *range, int32_t *standard, int32_t *transfer);
1293a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
13058fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    // converts Other values to Unspecified
13158fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    static void convertCodecColorAspectsToIsoAspects(
13258fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar            const ColorAspects &aspects,
13358fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar            int32_t *primaries, int32_t *transfer, int32_t *coeffs, bool *fullRange);
13458fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    // converts unsupported values to Other
13558fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    static void convertIsoColorAspectsToCodecAspects(
13658fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar            int32_t primaries, int32_t transfer, int32_t coeffs, bool fullRange,
13758fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar            ColorAspects &aspects);
13858fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar
1396cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // unpack a uint32_t to a full ColorAspects struct
1406cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    static ColorAspects unpackToColorAspects(uint32_t packed);
1416cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
1426cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    // pack a full ColorAspects struct into a uint32_t
1436cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    static uint32_t packToU32(const ColorAspects &aspects);
1446cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
145b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // updates Unspecified color aspects to their defaults based on the video size
1463a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static void setDefaultCodecColorAspectsIfNeeded(
1473a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            ColorAspects &aspects, int32_t width, int32_t height);
148b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
149b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // it returns the closest dataSpace for given color |aspects|. if |mayExpand| is true, it allows
150b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // returning a larger dataSpace that contains the color space given by |aspects|, and is better
151b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // suited to blending. This requires implicit color space conversion on part of the device.
152b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static android_dataspace getDataSpaceForColorAspects(ColorAspects &aspects, bool mayExpand);
153b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
154b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // converts |dataSpace| to a V0 enum, and returns true if dataSpace is an aspect-only value
155b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static bool convertDataSpaceToV0(android_dataspace &dataSpace);
156b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
157b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // compares |aspect| to |orig|. Returns |true| if any aspects have changed, except if they
158b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // changed to Unspecified value. It also sets the changed values to Unspecified in |aspect|.
159b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static bool checkIfAspectsChangedAndUnspecifyThem(
160b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar            ColorAspects &aspects, const ColorAspects &orig, bool usePlatformAspects = false);
161b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
162b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // finds color config in format, defaulting them to 0.
163b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static void getColorConfigFromFormat(
164b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar            const sp<AMessage> &format, int *range, int *standard, int *transfer);
165b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
166b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // copies existing color config from |source| to |target|.
167b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static void copyColorConfig(const sp<AMessage> &source, sp<AMessage> &target);
168b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
169b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // finds color config in format as ColorAspects, defaulting them to 0.
170b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static void getColorAspectsFromFormat(const sp<AMessage> &format, ColorAspects &aspects);
171b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar
172b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // writes |aspects| into format. iff |force| is false, Unspecified values are not
173b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    // written.
174b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar    static void setColorAspectsIntoFormat(
175b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar            const ColorAspects &aspects, sp<AMessage> &format, bool force = false);
176db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang
177db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang    // finds HDR metadata in format as HDRStaticInfo, defaulting them to 0.
178db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang    // Return |true| if could find HDR metadata in format. Otherwise, return |false|.
179db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang    static bool getHDRStaticInfoFromFormat(const sp<AMessage> &format, HDRStaticInfo *info);
180db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang
181db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang    // writes |info| into format.
182db318d40b90a456311b3920c605e33b763ca79f9Hangyu Kuang    static void setHDRStaticInfoIntoFormat(const HDRStaticInfo &info, sp<AMessage> &format);
1833a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar};
1843a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1853a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarinline static const char *asString(android::ColorUtils::ColorStandard i, const char *def = "??") {
1863a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    using namespace android;
1873a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    switch (i) {
1883a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardUnspecified:          return "Unspecified";
1893a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT709:                return "BT709";
1903a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_625:            return "BT601_625";
1913a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_625_Unadjusted: return "BT601_625_Unadjusted";
1923a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_525:            return "BT601_525";
1933a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_525_Unadjusted: return "BT601_525_Unadjusted";
1943a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT2020:               return "BT2020";
1953a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT2020Constant:       return "BT2020Constant";
1963a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT470M:               return "BT470M";
1973a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardFilm:                 return "Film";
19804e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        case ColorUtils::kColorStandardDCI_P3:               return "DCI_P3";
19904e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        default:                                             return def;
2003a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    }
2013a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}
2023a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
2033a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarinline static const char *asString(android::ColorUtils::ColorTransfer i, const char *def = "??") {
2043a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    using namespace android;
2053a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    switch (i) {
2063a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferUnspecified: return "Unspecified";
2073a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferLinear:      return "Linear";
2083a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferSRGB:        return "SRGB";
2093a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferSMPTE_170M:  return "SMPTE_170M";
2103a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferGamma22:     return "Gamma22";
2113a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferGamma28:     return "Gamma28";
2123a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferST2084:      return "ST2084";
2133a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferHLG:         return "HLG";
21436aa5a11bdad24f5ca23df8ea8e02f58df476af1Lajos Molnar        case ColorUtils::kColorTransferGamma26:     return "Gamma26";
21504e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        default:                                    return def;
21604e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar    }
21704e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar}
21804e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar
2193a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarinline static const char *asString(android::ColorUtils::ColorRange i, const char *def = "??") {
2203a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    using namespace android;
2213a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    switch (i) {
2223a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorRangeUnspecified: return "Unspecified";
2233a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorRangeFull:        return "Full";
2243a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorRangeLimited:     return "Limited";
22504e0a45ef725ec2e34a7f579fba19d43941b924eLajos Molnar        default:                                 return def;
2263a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    }
2273a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}
2283a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
2293a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}  // namespace android
2303a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
2313a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#endif  // COLOR_UTILS_H_
2323a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
233