diff options
5 files changed, 215 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index e3dafa4a4cc0..3a6e5f93861b 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -53,6 +53,7 @@ import com.android.server.display.config.DisplayBrightnessPoint; import com.android.server.display.config.DisplayConfiguration; import com.android.server.display.config.DisplayQuirks; import com.android.server.display.config.HbmTiming; +import com.android.server.display.config.HdrBrightnessData; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.IntegerArray; import com.android.server.display.config.LuxThrottling; @@ -232,7 +233,22 @@ import javax.xml.datatype.DatatypeConfigurationException; * </point> * </sdrHdrRatioMap> * </highBrightnessMode> - * + * <hdrBrightnessConfig> + * <brightnessMap> + * <point> + * <first>500</first> + * <second>0.3</second> + * </point> + * <point> + * <first>1200</first> + * <second>0.6</second> + * </point> + * </brightnessMap> + * <brightnessIncreaseDebounceMillis>1000</brightnessIncreaseDebounceMillis> + * <brightnessIncreaseDurationMillis>10000</brightnessIncreaseDurationMillis> + * <brightnessDecreaseDebounceMillis>13000</brightnessDecreaseDebounceMillis> + * <brightnessDecreaseDurationMillis>10000</brightnessDecreaseDurationMillis> + * </hdrBrightnessConfig> * <luxThrottling> * <brightnessLimitMap> * <type>default</type> @@ -769,6 +785,9 @@ public class DisplayDeviceConfig { @Nullable private HostUsiVersion mHostUsiVersion; + @Nullable + private HdrBrightnessData mHdrBrightnessData; + @VisibleForTesting DisplayDeviceConfig(Context context) { mContext = context; @@ -1544,6 +1563,14 @@ public class DisplayDeviceConfig { } /** + * @return HDR brightness related configuration + */ + @Nullable + public HdrBrightnessData getHdrBrightnessData() { + return mHdrBrightnessData; + } + + /** * @return Refresh rate range for specific profile id or null */ @Nullable @@ -1759,7 +1786,8 @@ public class DisplayDeviceConfig { + "mScreenOffBrightnessSensorValueToLux=" + Arrays.toString( mScreenOffBrightnessSensorValueToLux) + "\n" - + "mUsiVersion= " + mHostUsiVersion + + "mUsiVersion= " + mHostUsiVersion + "\n" + + "mHdrBrightnessData" + mHdrBrightnessData + "}"; } @@ -1823,6 +1851,7 @@ public class DisplayDeviceConfig { loadRefreshRateSetting(config); loadScreenOffBrightnessSensorValueToLuxFromDdc(config); loadUsiVersion(config); + mHdrBrightnessData = HdrBrightnessData.loadConfig(config); } else { Slog.w(TAG, "DisplayDeviceConfig file is null"); } diff --git a/services/core/java/com/android/server/display/config/HdrBrightnessData.java b/services/core/java/com/android/server/display/config/HdrBrightnessData.java new file mode 100644 index 000000000000..06d3c5b87520 --- /dev/null +++ b/services/core/java/com/android/server/display/config/HdrBrightnessData.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display.config; + +import android.annotation.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Brightness config for HDR content + */ +public class HdrBrightnessData { + + /** + * Lux to brightness map + */ + public final Map<Float, Float> mMaxBrightnessLimits; + + /** + * Debounce time for brightness increase + */ + public final long mBrightnessIncreaseDebounceMillis; + + /** + * Brightness increase animation duration + */ + public final long mBrightnessIncreaseDurationMillis; + + /** + * Debounce time for brightness decrease + */ + public final long mBrightnessDecreaseDebounceMillis; + + /** + * Brightness decrease animation duration + */ + public final long mBrightnessDecreaseDurationMillis; + + private HdrBrightnessData(Map<Float, Float> maxBrightnessLimits, + long brightnessIncreaseDebounceMillis, long brightnessIncreaseDurationMillis, + long brightnessDecreaseDebounceMillis, long brightnessDecreaseDurationMillis) { + mMaxBrightnessLimits = maxBrightnessLimits; + mBrightnessIncreaseDebounceMillis = brightnessIncreaseDebounceMillis; + mBrightnessIncreaseDurationMillis = brightnessIncreaseDurationMillis; + mBrightnessDecreaseDebounceMillis = brightnessDecreaseDebounceMillis; + mBrightnessDecreaseDurationMillis = brightnessDecreaseDurationMillis; + } + + @Override + public String toString() { + return "HdrBrightnessData {" + + "mMaxBrightnessLimits: " + mMaxBrightnessLimits + + ", mBrightnessIncreaseDebounceMillis: " + mBrightnessIncreaseDebounceMillis + + ", mBrightnessIncreaseDurationMillis: " + mBrightnessIncreaseDurationMillis + + ", mBrightnessDecreaseDebounceMillis: " + mBrightnessDecreaseDebounceMillis + + ", mBrightnessDecreaseDurationMillis: " + mBrightnessDecreaseDurationMillis + + "} "; + } + + /** + * Loads HdrBrightnessData from DisplayConfiguration + */ + @Nullable + public static HdrBrightnessData loadConfig(DisplayConfiguration config) { + HdrBrightnessConfig hdrConfig = config.getHdrBrightnessConfig(); + if (hdrConfig == null) { + return null; + } + + List<NonNegativeFloatToFloatPoint> points = hdrConfig.getBrightnessMap().getPoint(); + Map<Float, Float> brightnessLimits = new HashMap<>(); + for (NonNegativeFloatToFloatPoint point: points) { + brightnessLimits.put(point.getFirst().floatValue(), point.getSecond().floatValue()); + } + + return new HdrBrightnessData(brightnessLimits, + hdrConfig.getBrightnessIncreaseDebounceMillis().longValue(), + hdrConfig.getBrightnessIncreaseDurationMillis().longValue(), + hdrConfig.getBrightnessDecreaseDebounceMillis().longValue(), + hdrConfig.getBrightnessDecreaseDurationMillis().longValue()); + } +} diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd index d22e02e9dae6..4203e89ec618 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -50,6 +50,13 @@ maxOccurs="1"/> <xs:element type="highBrightnessMode" name="highBrightnessMode" minOccurs="0" maxOccurs="1"/> + + <xs:element name="hdrBrightnessConfig" type="hdrBrightnessConfig" + minOccurs="0" maxOccurs="1"> + <xs:annotation name="nullable"/> + <xs:annotation name="final"/> + </xs:element> + <xs:element type="displayQuirks" name="quirks" minOccurs="0" maxOccurs="1"/> <xs:element type="autoBrightness" name="autoBrightness" minOccurs="0" maxOccurs="1"/> @@ -238,6 +245,31 @@ </xs:all> </xs:complexType> + <!-- brightness config for HDR content --> + <xs:complexType name="hdrBrightnessConfig"> + <!-- lux level from light sensor to screen brightness recommended max value map. --> + <xs:element name="brightnessMap" type="nonNegativeFloatToFloatMap"> + <xs:annotation name="nonnull"/> + <xs:annotation name="final"/> + </xs:element> + <!-- Debounce for brightness increase in millis --> + <xs:element name="brightnessIncreaseDebounceMillis" type="xs:nonNegativeInteger"> + <xs:annotation name="final"/> + </xs:element> + <!-- Debounce for brightness decrease in millis --> + <xs:element name="brightnessDecreaseDebounceMillis" type="xs:nonNegativeInteger"> + <xs:annotation name="final"/> + </xs:element> + <!-- Animation time for brightness increase in millis --> + <xs:element name="brightnessIncreaseDurationMillis" type="xs:nonNegativeInteger"> + <xs:annotation name="final"/> + </xs:element> + <!-- Animation time for brightness decrease in millis --> + <xs:element name="brightnessDecreaseDurationMillis" type="xs:nonNegativeInteger"> + <xs:annotation name="final"/> + </xs:element> + </xs:complexType> + <!-- Maps to PowerManager.THERMAL_STATUS_* values. --> <xs:simpleType name="thermalStatus"> <xs:restriction base="xs:string"> diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index 6364c1feb659..ebd9b1c23a50 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -101,6 +101,7 @@ package com.android.server.display.config { method @Nullable public final com.android.server.display.config.DensityMapping getDensityMapping(); method @NonNull public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholds(); method public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholdsIdle(); + method @Nullable public final com.android.server.display.config.HdrBrightnessConfig getHdrBrightnessConfig(); method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode(); method public final com.android.server.display.config.SensorDetails getLightSensor(); method public com.android.server.display.config.LuxThrottling getLuxThrottling(); @@ -130,6 +131,7 @@ package com.android.server.display.config { method public final void setDensityMapping(@Nullable com.android.server.display.config.DensityMapping); method public final void setDisplayBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds); method public final void setDisplayBrightnessChangeThresholdsIdle(com.android.server.display.config.Thresholds); + method public final void setHdrBrightnessConfig(@Nullable com.android.server.display.config.HdrBrightnessConfig); method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode); method public final void setLightSensor(com.android.server.display.config.SensorDetails); method public void setLuxThrottling(com.android.server.display.config.LuxThrottling); @@ -168,6 +170,20 @@ package com.android.server.display.config { method public final void setTimeWindowSecs_all(@NonNull java.math.BigInteger); } + public class HdrBrightnessConfig { + ctor public HdrBrightnessConfig(); + method public final java.math.BigInteger getBrightnessDecreaseDebounceMillis(); + method public final java.math.BigInteger getBrightnessDecreaseDurationMillis(); + method public final java.math.BigInteger getBrightnessIncreaseDebounceMillis(); + method public final java.math.BigInteger getBrightnessIncreaseDurationMillis(); + method @NonNull public final com.android.server.display.config.NonNegativeFloatToFloatMap getBrightnessMap(); + method public final void setBrightnessDecreaseDebounceMillis(java.math.BigInteger); + method public final void setBrightnessDecreaseDurationMillis(java.math.BigInteger); + method public final void setBrightnessIncreaseDebounceMillis(java.math.BigInteger); + method public final void setBrightnessIncreaseDurationMillis(java.math.BigInteger); + method public final void setBrightnessMap(@NonNull com.android.server.display.config.NonNegativeFloatToFloatMap); + } + public class HighBrightnessMode { ctor public HighBrightnessMode(); method @NonNull public final boolean getAllowInLowPowerMode_all(); diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java index 82d00a6fcbca..7374901763db 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java @@ -44,6 +44,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.internal.R; +import com.android.server.display.config.HdrBrightnessData; import com.android.server.display.config.ThermalStatus; import org.junit.Before; @@ -477,6 +478,23 @@ public final class DisplayDeviceConfigTest { mDisplayDeviceConfig.getHighAmbientBrightnessThresholds(), ZERO_DELTA); } + @Test + public void testHdrBrightnessDataFromDisplayConfig() throws IOException { + setupDisplayDeviceConfigFromDisplayConfigFile(); + + HdrBrightnessData data = mDisplayDeviceConfig.getHdrBrightnessData(); + + assertNotNull(data); + assertEquals(2, data.mMaxBrightnessLimits.size()); + assertEquals(13000, data.mBrightnessDecreaseDebounceMillis); + assertEquals(10000, data.mBrightnessDecreaseDurationMillis); + assertEquals(1000, data.mBrightnessIncreaseDebounceMillis); + assertEquals(11000, data.mBrightnessIncreaseDurationMillis); + + assertEquals(0.3f, data.mMaxBrightnessLimits.get(500f), SMALL_DELTA); + assertEquals(0.6f, data.mMaxBrightnessLimits.get(1200f), SMALL_DELTA); + } + private void verifyConfigValuesFromConfigResource() { assertNull(mDisplayDeviceConfig.getName()); assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), new @@ -694,6 +712,25 @@ public final class DisplayDeviceConfigTest { + "</proxSensor>\n"; } + private String getHdrBrightnessConfig() { + return "<hdrBrightnessConfig>\n" + + " <brightnessMap>\n" + + " <point>\n" + + " <first>500</first>\n" + + " <second>0.3</second>\n" + + " </point>\n" + + " <point>\n" + + " <first>1200</first>\n" + + " <second>0.6</second>\n" + + " </point>\n" + + " </brightnessMap>\n" + + " <brightnessIncreaseDebounceMillis>1000</brightnessIncreaseDebounceMillis>\n" + + " <brightnessIncreaseDurationMillis>11000</brightnessIncreaseDurationMillis>\n" + + " <brightnessDecreaseDebounceMillis>13000</brightnessDecreaseDebounceMillis>\n" + + " <brightnessDecreaseDurationMillis>10000</brightnessDecreaseDurationMillis>\n" + + "</hdrBrightnessConfig>"; + } + private String getContent() { return getContent(getValidLuxThrottling(), getValidProxSensor()); } @@ -784,6 +821,7 @@ public final class DisplayDeviceConfigTest { + "</point>\n" + "</sdrHdrRatioMap>\n" + "</highBrightnessMode>\n" + + getHdrBrightnessConfig() + brightnessCapConfig + "<lightSensor>\n" + "<type>test_light_sensor</type>\n" |