summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author petsjonkin <petsjonkin@google.com> 2023-09-15 18:01:13 +0000
committer petsjonkin <petsjonkin@google.com> 2023-09-18 12:20:02 +0000
commit487f9dd3e7de7edfb0d01ee6a682d149eb28055b (patch)
tree513112ac65c6f7d9baac53f61934dda218adad2a
parent1f81948bebf861f0b73c2d27c9ece21ef5c1193c (diff)
Introducing HDR brightness config
Bug: b/283447291 Test: atest DisplayDeviceConfigTest Change-Id: Iec4b0831740983c4539ba6d7309c4b5ab339d588
-rw-r--r--services/core/java/com/android/server/display/DisplayDeviceConfig.java33
-rw-r--r--services/core/java/com/android/server/display/config/HdrBrightnessData.java98
-rw-r--r--services/core/xsd/display-device-config/display-device-config.xsd32
-rw-r--r--services/core/xsd/display-device-config/schema/current.txt16
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java38
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"