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

Commit ee321a75 authored by petsjonkin's avatar petsjonkin Committed by Oleg Petšjonkin
Browse files

HdrClamper using feature flag and configuration

Bug: b/283447291
Test: atest HdrClamperTest
Change-Id: I441f2f91ee294c7bb90eca7afaccded64a9ea734
parent f079ed18
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.display;
import android.hardware.display.BrightnessInfo;
import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager;

import com.android.server.display.brightness.clamper.HdrClamper;
import com.android.server.display.feature.DisplayManagerFlags;
@@ -52,17 +53,26 @@ class BrightnessRangeController {
            HdrClamper hdrClamper, DisplayManagerFlags flags) {
        mHbmController = hbmController;
        mModeChangeCallback = modeChangeCallback;
        mUseHdrClamper = false;
        mUseNbmController = flags.isNbmControllerEnabled();
        mNormalBrightnessModeController.resetNbmData(displayDeviceConfig.getLuxThrottlingData());
        mHdrClamper = hdrClamper;
        mUseHdrClamper = flags.isHdrClamperEnabled();
        mUseNbmController = flags.isNbmControllerEnabled();
        if (mUseNbmController) {
            mNormalBrightnessModeController.resetNbmData(
                    displayDeviceConfig.getLuxThrottlingData());
        }
        if (mUseHdrClamper) {
            mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData());
        }

    }

    void dump(PrintWriter pw) {
        pw.println("BrightnessRangeController:");
        pw.println("  mUseNormalBrightnessController=" + mUseNbmController);
        pw.println("  mUseHdrClamper=" + mUseHdrClamper);
        mHbmController.dump(pw);
        mNormalBrightnessModeController.dump(pw);
        mHdrClamper.dump(pw);
    }

    void onAmbientLuxChange(float ambientLux) {
@@ -91,6 +101,9 @@ class BrightnessRangeController {
                            displayDeviceConfig::getHdrBrightnessFromSdr);
                }
        );
        if (mUseHdrClamper) {
            mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData());
        }
    }

    void stop() {
@@ -129,7 +142,9 @@ class BrightnessRangeController {

    float getHdrBrightnessValue() {
        float hdrBrightness = mHbmController.getHdrBrightnessValue();
        return Math.min(hdrBrightness, mHdrClamper.getMaxBrightness());
        float brightnessMax = mUseHdrClamper ? mHdrClamper.getMaxBrightness()
                : PowerManager.BRIGHTNESS_MAX;
        return Math.min(hdrBrightness, brightnessMax);
    }

    float getTransitionPoint() {
@@ -151,6 +166,6 @@ class BrightnessRangeController {
    }

    public float getHdrTransitionRate() {
        return mHdrClamper.getTransitionRate();
        return mUseHdrClamper ? mHdrClamper.getTransitionRate() : -1;
    }
}
+55 −41
Original line number Diff line number Diff line
@@ -16,40 +16,41 @@

package com.android.server.display.brightness.clamper;

import android.annotation.Nullable;
import android.os.Handler;
import android.os.PowerManager;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.config.HdrBrightnessData;

import java.util.HashMap;
import java.io.PrintWriter;
import java.util.Map;

public class HdrClamper {

    private final Configuration mConfiguration = new Configuration();

    private final BrightnessClamperController.ClamperChangeListener mClamperChangeListener;

    private final Handler mHandler;

    private final Runnable mDebouncer;

    private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX;
    @Nullable
    private HdrBrightnessData mHdrBrightnessData = null;

    // brightness change speed, in units per seconds,
    private float mTransitionRate = -1f;
    private float mAmbientLux = Float.MAX_VALUE;

    private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX;
    private float mDesiredMaxBrightness = PowerManager.BRIGHTNESS_MAX;

    private float mDesiredTransitionDuration = -1; // in seconds
    // brightness change speed, in units per seconds,
    private float mTransitionRate = -1f;
    private float mDesiredTransitionRate = -1f;

    public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener,
            Handler handler) {
        mClamperChangeListener = clamperChangeListener;
        mHandler = handler;
        mDebouncer = () -> {
            mTransitionRate = Math.abs((mMaxBrightness - mDesiredMaxBrightness)
                    / mDesiredTransitionDuration);
            mTransitionRate = mDesiredTransitionRate;
            mMaxBrightness = mDesiredMaxBrightness;
            mClamperChangeListener.onChanged();
        };
@@ -65,46 +66,74 @@ public class HdrClamper {
        return mTransitionRate;
    }


    /**
     * Updates brightness cap in response to ambient lux change.
     * Called by ABC in same looper: mHandler.getLooper()
     */
    public void onAmbientLuxChange(float ambientLux) {
        float expectedMaxBrightness = findBrightnessLimit(ambientLux);
        mAmbientLux = ambientLux;
        recalculateBrightnessCap(mHdrBrightnessData, ambientLux);
    }

    /**
     * Updates brightness cap config.
     * Called in same looper: mHandler.getLooper()
     */
    public void resetHdrConfig(HdrBrightnessData data) {
        mHdrBrightnessData = data;
        recalculateBrightnessCap(data, mAmbientLux);
    }

    /**
     * Dumps the state of HdrClamper.
     */
    public void dump(PrintWriter pw) {
        pw.println("HdrClamper:");
        pw.println("  mMaxBrightness=" + mMaxBrightness);
        pw.println("  mDesiredMaxBrightness=" + mDesiredMaxBrightness);
        pw.println("  mTransitionRate=" + mTransitionRate);
        pw.println("  mDesiredTransitionRate=" + mDesiredTransitionRate);
        pw.println("  mHdrBrightnessData=" + (mHdrBrightnessData == null ? "null"
                : mHdrBrightnessData.toString()));
        pw.println("  mAmbientLux=" + mAmbientLux);
    }

    private void recalculateBrightnessCap(HdrBrightnessData data, float ambientLux) {
        if (data == null) {
            mHandler.removeCallbacks(mDebouncer);
            return;
        }
        float expectedMaxBrightness = findBrightnessLimit(data, ambientLux);

        if (mMaxBrightness == expectedMaxBrightness) {
            mDesiredMaxBrightness = mMaxBrightness;
            mDesiredTransitionDuration = -1;
            mDesiredTransitionRate = -1f;
            mTransitionRate = -1f;
            mHandler.removeCallbacks(mDebouncer);
        } else if (mDesiredMaxBrightness != expectedMaxBrightness) {
            mDesiredMaxBrightness = expectedMaxBrightness;
            long debounceTime;
            long transitionDuration;
            if (mDesiredMaxBrightness > mMaxBrightness) {
                debounceTime = mConfiguration.mIncreaseConfig.mDebounceTimeMillis;
                mDesiredTransitionDuration =
                        (float) mConfiguration.mIncreaseConfig.mTransitionTimeMillis / 1000;
                debounceTime = mHdrBrightnessData.mBrightnessIncreaseDebounceMillis;
                transitionDuration = mHdrBrightnessData.mBrightnessIncreaseDurationMillis;
            } else {
                debounceTime = mConfiguration.mDecreaseConfig.mDebounceTimeMillis;
                mDesiredTransitionDuration =
                        (float) mConfiguration.mDecreaseConfig.mTransitionTimeMillis / 1000;
                debounceTime = mHdrBrightnessData.mBrightnessDecreaseDebounceMillis;
                transitionDuration = mHdrBrightnessData.mBrightnessDecreaseDurationMillis;
            }
            mDesiredTransitionRate = Math.abs(
                    (mMaxBrightness - mDesiredMaxBrightness) * 1000f / transitionDuration);

            mHandler.removeCallbacks(mDebouncer);
            mHandler.postDelayed(mDebouncer, debounceTime);
        }
    }

    @VisibleForTesting
    Configuration getConfiguration() {
        return mConfiguration;
    }

    private float findBrightnessLimit(float ambientLux) {
    private float findBrightnessLimit(HdrBrightnessData data, float ambientLux) {
        float foundAmbientBoundary = Float.MAX_VALUE;
        float foundMaxBrightness = PowerManager.BRIGHTNESS_MAX;
        for (Map.Entry<Float, Float> brightnessPoint :
                mConfiguration.mMaxBrightnessLimits.entrySet()) {
                data.mMaxBrightnessLimits.entrySet()) {
            float ambientBoundary = brightnessPoint.getKey();
            // find ambient lux upper boundary closest to current ambient lux
            if (ambientBoundary > ambientLux && ambientBoundary < foundAmbientBoundary) {
@@ -114,19 +143,4 @@ public class HdrClamper {
        }
        return foundMaxBrightness;
    }

    @VisibleForTesting
    static class Configuration {
        final Map<Float, Float> mMaxBrightnessLimits = new HashMap<>();
        final TransitionConfiguration mIncreaseConfig = new TransitionConfiguration();

        final TransitionConfiguration mDecreaseConfig = new TransitionConfiguration();
    }

    @VisibleForTesting
    static class TransitionConfiguration {
        long mDebounceTimeMillis;

        long mTransitionTimeMillis;
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.server.display.config;

import android.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -52,7 +54,8 @@ public class HdrBrightnessData {
     */
    public final long mBrightnessDecreaseDurationMillis;

    private HdrBrightnessData(Map<Float, Float> maxBrightnessLimits,
    @VisibleForTesting
    public HdrBrightnessData(Map<Float, Float> maxBrightnessLimits,
            long brightnessIncreaseDebounceMillis, long brightnessIncreaseDurationMillis,
            long brightnessDecreaseDebounceMillis, long brightnessDecreaseDurationMillis) {
        mMaxBrightnessLimits = maxBrightnessLimits;
+8 −0
Original line number Diff line number Diff line
@@ -39,6 +39,10 @@ public class DisplayManagerFlags {
            Flags.FLAG_ENABLE_NBM_CONTROLLER,
            Flags::enableNbmController);

    private final FlagState mHdrClamperFlagState = new FlagState(
            Flags.FLAG_ENABLE_HDR_CLAMPER,
            Flags::enableHdrClamper);

    /** Returns whether connected display management is enabled or not. */
    public boolean isConnectedDisplayManagementEnabled() {
        return mConnectedDisplayManagementFlagState.isEnabled();
@@ -49,6 +53,10 @@ public class DisplayManagerFlags {
        return mNbmControllerFlagState.isEnabled();
    }

    public boolean isHdrClamperEnabled() {
        return mHdrClamperFlagState.isEnabled();
    }

    private static class FlagState {

        private final String mName;
+9 −1
Original line number Diff line number Diff line
@@ -14,6 +14,14 @@ flag {
    name: "enable_nbm_controller"
    namespace: "display_manager"
    description: "Feature flag for Normal Brightness Mode Controller"
    bug: "277877297"
    bug: "299527549"
    is_fixed_read_only: true
}

flag {
    name: "enable_hdr_clamper"
    namespace: "display_manager"
    description: "Feature flag for HDR Clamper"
    bug: "295100043"
    is_fixed_read_only: true
}
Loading