Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 487f9dd3 authored by petsjonkin's avatar petsjonkin
Browse files

Introducing HDR brightness config

Bug: b/283447291
Test: atest DisplayDeviceConfigTest
Change-Id: Iec4b0831740983c4539ba6d7309c4b5ab339d588
parent 1f81948b
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -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;
@@ -1543,6 +1562,14 @@ public class DisplayDeviceConfig {
        return mDefaultLowBlockingZoneRefreshRate;
    }

    /**
     * @return HDR brightness related configuration
     */
    @Nullable
    public HdrBrightnessData getHdrBrightnessData() {
        return mHdrBrightnessData;
    }

    /**
     * @return Refresh rate range for specific profile id or null
     */
@@ -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");
            }
+98 −0
Original line number Diff line number Diff line
/*
 * 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());
    }
}
+32 −0
Original line number Diff line number Diff line
@@ -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">
+16 −0
Original line number Diff line number Diff line
@@ -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();
+38 −0
Original line number Diff line number Diff line
@@ -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"