Merge "DisplayPowerController uses max desired SDR/HDR ratio" into udc-dev
This commit is contained in:
@@ -42,10 +42,13 @@ public abstract class SurfaceControlHdrLayerInfoListener {
|
|||||||
* @param maxH The height of the HDR layer with the largest area
|
* @param maxH The height of the HDR layer with the largest area
|
||||||
* @param flags Additional metadata flags, currently always 0
|
* @param flags Additional metadata flags, currently always 0
|
||||||
* TODO(b/182312559): Add some flags
|
* TODO(b/182312559): Add some flags
|
||||||
|
* @param maxDesiredHdrSdrRatio The max desired HDR/SDR ratio. Unbounded if the ratio is
|
||||||
|
* positive infinity.
|
||||||
*
|
*
|
||||||
* @hide */
|
* @hide
|
||||||
|
*/
|
||||||
public abstract void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
public abstract void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
||||||
int maxW, int maxH, int flags);
|
int maxW, int maxH, int flags, float maxDesiredHdrSdrRatio);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers this as an HDR info listener on the provided display
|
* Registers this as an HDR info listener on the provided display
|
||||||
|
|||||||
@@ -42,12 +42,12 @@ struct SurfaceControlHdrLayerInfoListener : public gui::BnHdrLayerInfoListener {
|
|||||||
LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&mVm) != JNI_OK, "Failed to GetJavaVm");
|
LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&mVm) != JNI_OK, "Failed to GetJavaVm");
|
||||||
}
|
}
|
||||||
|
|
||||||
binder::Status onHdrLayerInfoChanged(int numberOfHdrLayers, int maxW, int maxH,
|
binder::Status onHdrLayerInfoChanged(int numberOfHdrLayers, int maxW, int maxH, int flags,
|
||||||
int flags) override {
|
float maxDesiredHdrSdrRatio) override {
|
||||||
JNIEnv* env = requireEnv();
|
JNIEnv* env = requireEnv();
|
||||||
|
|
||||||
env->CallVoidMethod(mListener, gListenerClassInfo.mOnHdrInfoChanged, mDisplayToken,
|
env->CallVoidMethod(mListener, gListenerClassInfo.mOnHdrInfoChanged, mDisplayToken,
|
||||||
numberOfHdrLayers, maxW, maxH, flags);
|
numberOfHdrLayers, maxW, maxH, flags, maxDesiredHdrSdrRatio);
|
||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
ALOGE("SurfaceControlHdrLayerInfoListener.onHdrInfoChanged() failed.");
|
ALOGE("SurfaceControlHdrLayerInfoListener.onHdrInfoChanged() failed.");
|
||||||
@@ -129,7 +129,7 @@ int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env) {
|
|||||||
jclass clazz = env->FindClass("android/view/SurfaceControlHdrLayerInfoListener");
|
jclass clazz = env->FindClass("android/view/SurfaceControlHdrLayerInfoListener");
|
||||||
gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz);
|
gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz);
|
||||||
gListenerClassInfo.mOnHdrInfoChanged =
|
gListenerClassInfo.mOnHdrInfoChanged =
|
||||||
env->GetMethodID(clazz, "onHdrInfoChanged", "(Landroid/os/IBinder;IIII)V");
|
env->GetMethodID(clazz, "onHdrInfoChanged", "(Landroid/os/IBinder;IIIIF)V");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -889,11 +889,12 @@ public class DisplayDeviceConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the HDR brightness for the specified SDR brightenss.
|
* Calculate the HDR brightness for the specified SDR brightenss, restricted by the
|
||||||
|
* maxDesiredHdrSdrRatio (the ratio between the HDR luminance and SDR luminance)
|
||||||
*
|
*
|
||||||
* @return the HDR brightness or BRIGHTNESS_INVALID when no mapping exists.
|
* @return the HDR brightness or BRIGHTNESS_INVALID when no mapping exists.
|
||||||
*/
|
*/
|
||||||
public float getHdrBrightnessFromSdr(float brightness) {
|
public float getHdrBrightnessFromSdr(float brightness, float maxDesiredHdrSdrRatio) {
|
||||||
if (mSdrToHdrRatioSpline == null) {
|
if (mSdrToHdrRatioSpline == null) {
|
||||||
return PowerManager.BRIGHTNESS_INVALID;
|
return PowerManager.BRIGHTNESS_INVALID;
|
||||||
}
|
}
|
||||||
@@ -904,7 +905,7 @@ public class DisplayDeviceConfig {
|
|||||||
return PowerManager.BRIGHTNESS_INVALID;
|
return PowerManager.BRIGHTNESS_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
float ratio = mSdrToHdrRatioSpline.interpolate(nits);
|
float ratio = Math.min(mSdrToHdrRatioSpline.interpolate(nits), maxDesiredHdrSdrRatio);
|
||||||
float hdrNits = nits * ratio;
|
float hdrNits = nits * ratio;
|
||||||
if (mNitsToBacklightSpline == null) {
|
if (mNitsToBacklightSpline == null) {
|
||||||
return PowerManager.BRIGHTNESS_INVALID;
|
return PowerManager.BRIGHTNESS_INVALID;
|
||||||
|
|||||||
@@ -975,8 +975,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
||||||
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
||||||
@Override
|
@Override
|
||||||
public float getHdrBrightnessFromSdr(float sdrBrightness) {
|
public float getHdrBrightnessFromSdr(
|
||||||
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness);
|
float sdrBrightness, float maxDesiredHdrSdrRatio) {
|
||||||
|
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
|
||||||
|
sdrBrightness, maxDesiredHdrSdrRatio);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mBrightnessThrottler.resetThrottlingData(
|
mBrightnessThrottler.resetThrottlingData(
|
||||||
@@ -2088,8 +2090,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
|
displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
|
||||||
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
||||||
@Override
|
@Override
|
||||||
public float getHdrBrightnessFromSdr(float sdrBrightness) {
|
public float getHdrBrightnessFromSdr(
|
||||||
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness);
|
float sdrBrightness, float maxDesiredHdrSdrRatio) {
|
||||||
|
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
|
||||||
|
sdrBrightness, maxDesiredHdrSdrRatio);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
() -> {
|
() -> {
|
||||||
|
|||||||
@@ -809,8 +809,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
||||||
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
||||||
@Override
|
@Override
|
||||||
public float getHdrBrightnessFromSdr(float sdrBrightness) {
|
public float getHdrBrightnessFromSdr(
|
||||||
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness);
|
float sdrBrightness, float maxDesiredHdrSdrRatio) {
|
||||||
|
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
|
||||||
|
sdrBrightness, maxDesiredHdrSdrRatio);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mBrightnessThrottler.resetThrottlingData(
|
mBrightnessThrottler.resetThrottlingData(
|
||||||
@@ -1796,8 +1798,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
|
displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
|
||||||
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
||||||
@Override
|
@Override
|
||||||
public float getHdrBrightnessFromSdr(float sdrBrightness) {
|
public float getHdrBrightnessFromSdr(
|
||||||
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness);
|
float sdrBrightness, float maxDesiredHdrSdrRatio) {
|
||||||
|
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
|
||||||
|
sdrBrightness, maxDesiredHdrSdrRatio);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
() -> {
|
() -> {
|
||||||
|
|||||||
@@ -61,8 +61,12 @@ class HighBrightnessModeController {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final float HBM_TRANSITION_POINT_INVALID = Float.POSITIVE_INFINITY;
|
static final float HBM_TRANSITION_POINT_INVALID = Float.POSITIVE_INFINITY;
|
||||||
|
|
||||||
|
private static final float DEFAULT_MAX_DESIRED_HDR_SDR_RATIO = 1.0f;
|
||||||
|
|
||||||
public interface HdrBrightnessDeviceConfig {
|
public interface HdrBrightnessDeviceConfig {
|
||||||
float getHdrBrightnessFromSdr(float sdrBrightness);
|
// maxDesiredHdrSdrRatio will restrict the HDR brightness if the ratio is less than
|
||||||
|
// Float.POSITIVE_INFINITY
|
||||||
|
float getHdrBrightnessFromSdr(float sdrBrightness, float maxDesiredHdrSdrRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final float mBrightnessMin;
|
private final float mBrightnessMin;
|
||||||
@@ -96,6 +100,9 @@ class HighBrightnessModeController {
|
|||||||
|
|
||||||
private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
|
private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
|
||||||
private boolean mIsHdrLayerPresent = false;
|
private boolean mIsHdrLayerPresent = false;
|
||||||
|
|
||||||
|
// mMaxDesiredHdrSdrRatio should only be applied when there is a valid backlight->nits mapping
|
||||||
|
private float mMaxDesiredHdrSdrRatio = DEFAULT_MAX_DESIRED_HDR_SDR_RATIO;
|
||||||
private boolean mIsThermalStatusWithinLimit = true;
|
private boolean mIsThermalStatusWithinLimit = true;
|
||||||
private boolean mIsBlockedByLowPowerMode = false;
|
private boolean mIsBlockedByLowPowerMode = false;
|
||||||
private int mWidth;
|
private int mWidth;
|
||||||
@@ -177,7 +184,8 @@ class HighBrightnessModeController {
|
|||||||
|
|
||||||
float getHdrBrightnessValue() {
|
float getHdrBrightnessValue() {
|
||||||
if (mHdrBrightnessCfg != null) {
|
if (mHdrBrightnessCfg != null) {
|
||||||
float hdrBrightness = mHdrBrightnessCfg.getHdrBrightnessFromSdr(mBrightness);
|
float hdrBrightness = mHdrBrightnessCfg.getHdrBrightnessFromSdr(
|
||||||
|
mBrightness, mMaxDesiredHdrSdrRatio);
|
||||||
if (hdrBrightness != PowerManager.BRIGHTNESS_INVALID) {
|
if (hdrBrightness != PowerManager.BRIGHTNESS_INVALID) {
|
||||||
return hdrBrightness;
|
return hdrBrightness;
|
||||||
}
|
}
|
||||||
@@ -457,6 +465,7 @@ class HighBrightnessModeController {
|
|||||||
+ ", isLuxHigh: " + mIsInAllowedAmbientRange
|
+ ", isLuxHigh: " + mIsInAllowedAmbientRange
|
||||||
+ ", isHBMCurrentlyAllowed: " + isCurrentlyAllowed()
|
+ ", isHBMCurrentlyAllowed: " + isCurrentlyAllowed()
|
||||||
+ ", isHdrLayerPresent: " + mIsHdrLayerPresent
|
+ ", isHdrLayerPresent: " + mIsHdrLayerPresent
|
||||||
|
+ ", mMaxDesiredHdrSdrRatio: " + mMaxDesiredHdrSdrRatio
|
||||||
+ ", isAutoBrightnessEnabled: " + mIsAutoBrightnessEnabled
|
+ ", isAutoBrightnessEnabled: " + mIsAutoBrightnessEnabled
|
||||||
+ ", mIsTimeAvailable: " + mIsTimeAvailable
|
+ ", mIsTimeAvailable: " + mIsTimeAvailable
|
||||||
+ ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange
|
+ ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange
|
||||||
@@ -600,11 +609,25 @@ class HighBrightnessModeController {
|
|||||||
class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
||||||
@Override
|
@Override
|
||||||
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
|
||||||
int maxW, int maxH, int flags) {
|
int maxW, int maxH, int flags, float maxDesiredHdrSdrRatio) {
|
||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
mIsHdrLayerPresent = numberOfHdrLayers > 0
|
mIsHdrLayerPresent = numberOfHdrLayers > 0
|
||||||
&& (float) (maxW * maxH) >= ((float) (mWidth * mHeight)
|
&& (float) (maxW * maxH) >= ((float) (mWidth * mHeight)
|
||||||
* mHbmData.minimumHdrPercentOfScreen);
|
* mHbmData.minimumHdrPercentOfScreen);
|
||||||
|
|
||||||
|
final float candidateDesiredHdrSdrRatio =
|
||||||
|
mIsHdrLayerPresent && mHdrBrightnessCfg != null
|
||||||
|
? maxDesiredHdrSdrRatio
|
||||||
|
: DEFAULT_MAX_DESIRED_HDR_SDR_RATIO;
|
||||||
|
|
||||||
|
if (candidateDesiredHdrSdrRatio >= 1.0f) {
|
||||||
|
mMaxDesiredHdrSdrRatio = candidateDesiredHdrSdrRatio;
|
||||||
|
} else {
|
||||||
|
Slog.w(TAG, "Ignoring invalid desired HDR/SDR Ratio: "
|
||||||
|
+ candidateDesiredHdrSdrRatio);
|
||||||
|
mMaxDesiredHdrSdrRatio = DEFAULT_MAX_DESIRED_HDR_SDR_RATIO;
|
||||||
|
}
|
||||||
|
|
||||||
// Calling the brightness update so that we can recalculate
|
// Calling the brightness update so that we can recalculate
|
||||||
// brightness with HDR in mind.
|
// brightness with HDR in mind.
|
||||||
onBrightnessChanged(mBrightness, mUnthrottledBrightness, mThrottlingReason);
|
onBrightnessChanged(mBrightness, mUnthrottledBrightness, mThrottlingReason);
|
||||||
|
|||||||
@@ -235,6 +235,18 @@ public final class DisplayDeviceConfigTest {
|
|||||||
assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMajorVersion(), 2);
|
assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMajorVersion(), 2);
|
||||||
assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMinorVersion(), 0);
|
assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMinorVersion(), 0);
|
||||||
|
|
||||||
|
// Max desired Hdr/SDR ratio upper-bounds the HDR brightness.
|
||||||
|
assertEquals(1.0f,
|
||||||
|
mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, Float.POSITIVE_INFINITY),
|
||||||
|
ZERO_DELTA);
|
||||||
|
assertEquals(0.62f,
|
||||||
|
mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, 1.0f),
|
||||||
|
ZERO_DELTA);
|
||||||
|
assertEquals(0.77787f,
|
||||||
|
mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, 1.25f),
|
||||||
|
SMALL_DELTA);
|
||||||
|
|
||||||
|
|
||||||
// Todo: Add asserts for BrightnessThrottlingData, DensityMapping,
|
// Todo: Add asserts for BrightnessThrottlingData, DensityMapping,
|
||||||
// HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor.
|
// HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor.
|
||||||
}
|
}
|
||||||
@@ -417,6 +429,16 @@ public final class DisplayDeviceConfigTest {
|
|||||||
+ "</refreshRate>\n"
|
+ "</refreshRate>\n"
|
||||||
+ "<thermalStatusLimit>light</thermalStatusLimit>\n"
|
+ "<thermalStatusLimit>light</thermalStatusLimit>\n"
|
||||||
+ "<allowInLowPowerMode>false</allowInLowPowerMode>\n"
|
+ "<allowInLowPowerMode>false</allowInLowPowerMode>\n"
|
||||||
|
+ "<sdrHdrRatioMap>\n"
|
||||||
|
+ "<point>\n"
|
||||||
|
+ "<sdrNits>2.000</sdrNits>\n"
|
||||||
|
+ "<hdrRatio>4.000</hdrRatio>\n"
|
||||||
|
+ "</point>\n"
|
||||||
|
+ "<point>\n"
|
||||||
|
+ "<sdrNits>500.0</sdrNits>\n"
|
||||||
|
+ "<hdrRatio>1.6</hdrRatio>\n"
|
||||||
|
+ "</point>\n"
|
||||||
|
+ "</sdrHdrRatioMap>\n"
|
||||||
+ "</highBrightnessMode>\n"
|
+ "</highBrightnessMode>\n"
|
||||||
+ "<screenOffBrightnessSensor>\n"
|
+ "<screenOffBrightnessSensor>\n"
|
||||||
+ "<type>sensor_12345</type>\n"
|
+ "<type>sensor_12345</type>\n"
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import static com.android.server.display.DisplayDeviceConfig.HDR_PERCENT_OF_SCRE
|
|||||||
import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID;
|
import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.Mockito.anyFloat;
|
||||||
import static org.mockito.Mockito.anyInt;
|
import static org.mockito.Mockito.anyInt;
|
||||||
import static org.mockito.Mockito.eq;
|
import static org.mockito.Mockito.eq;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
@@ -103,6 +104,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
|
|
||||||
@Mock IThermalService mThermalServiceMock;
|
@Mock IThermalService mThermalServiceMock;
|
||||||
@Mock Injector mInjectorMock;
|
@Mock Injector mInjectorMock;
|
||||||
|
@Mock HighBrightnessModeController.HdrBrightnessDeviceConfig mHdrBrightnessDeviceConfigMock;
|
||||||
|
|
||||||
@Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
|
@Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
|
||||||
|
|
||||||
@@ -376,17 +378,48 @@ public class HighBrightnessModeControllerTest {
|
|||||||
|
|
||||||
// ensure hdr doesn't turn on if layer is too small
|
// ensure hdr doesn't turn on if layer is too small
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
layerWidth, smallLayerHeight, 0 /*flags*/);
|
layerWidth, smallLayerHeight, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
|
||||||
|
|
||||||
// Now check with layer larger than 50%
|
// Now check with layer larger than 50%
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
layerWidth, largeLayerHeight, 0 /*flags*/);
|
layerWidth, largeLayerHeight, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHdrRespectsMaxDesiredHdrSdrRatio() {
|
||||||
|
final HighBrightnessModeController hbmc = new TestHbmBuilder()
|
||||||
|
.setClock(new OffsettableClock())
|
||||||
|
.setHdrBrightnessConfig(mHdrBrightnessDeviceConfigMock)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Passthrough return the max desired hdr/sdr ratio
|
||||||
|
when(mHdrBrightnessDeviceConfigMock.getHdrBrightnessFromSdr(anyFloat(), anyFloat()))
|
||||||
|
.thenAnswer(i -> i.getArgument(1));
|
||||||
|
|
||||||
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 2.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
|
advanceTime(0);
|
||||||
|
assertEquals(2.0f, hbmc.getHdrBrightnessValue(), EPSILON);
|
||||||
|
|
||||||
|
// The hdr ratio cannot be less than 1.
|
||||||
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 0.5f /*maxDesiredHdrSdrRatio*/);
|
||||||
|
advanceTime(0);
|
||||||
|
assertEquals(1.0f, hbmc.getHdrBrightnessValue(), EPSILON);
|
||||||
|
|
||||||
|
// The hdr ratio can be as much as positive infinity
|
||||||
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/,
|
||||||
|
Float.POSITIVE_INFINITY /*maxDesiredHdrSdrRatio*/);
|
||||||
|
advanceTime(0);
|
||||||
|
assertEquals(Float.POSITIVE_INFINITY, hbmc.getHdrBrightnessValue(), 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHdrTrumpsSunlight() {
|
public void testHdrTrumpsSunlight() {
|
||||||
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
||||||
@@ -400,7 +433,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
|
|
||||||
// turn on hdr
|
// turn on hdr
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||||
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||||
@@ -412,14 +445,14 @@ public class HighBrightnessModeControllerTest {
|
|||||||
|
|
||||||
// Check limit when HBM is off
|
// Check limit when HBM is off
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||||
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||||
|
|
||||||
// Check limit with HBM is set to HDR
|
// Check limit with HBM is set to HDR
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
|
||||||
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
|
||||||
@@ -430,7 +463,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
|
||||||
|
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||||
|
|
||||||
@@ -473,7 +506,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
|
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
|
||||||
hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT);
|
hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT);
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||||
|
|
||||||
@@ -483,7 +516,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN));
|
eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN));
|
||||||
|
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
|
||||||
0, 0, 0 /*flags*/);
|
0, 0, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
|
|
||||||
// Verify Stats HBM_OFF
|
// Verify Stats HBM_OFF
|
||||||
@@ -517,7 +550,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
|
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
|
||||||
hbmcOnBrightnessChanged(hbmc, DEFAULT_MIN);
|
hbmcOnBrightnessChanged(hbmc, DEFAULT_MIN);
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
|
||||||
|
|
||||||
@@ -657,7 +690,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN));
|
eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN));
|
||||||
|
|
||||||
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
|
||||||
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/);
|
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
|
||||||
advanceTime(0);
|
advanceTime(0);
|
||||||
|
|
||||||
verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId),
|
verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId),
|
||||||
@@ -696,19 +729,42 @@ public class HighBrightnessModeControllerTest {
|
|||||||
assertEquals(hbmMode, hbmc.getHighBrightnessMode());
|
assertEquals(hbmMode, hbmc.getHighBrightnessMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
private HighBrightnessModeController createDefaultHbm() {
|
private class TestHbmBuilder {
|
||||||
return createDefaultHbm(null);
|
OffsettableClock mClock;
|
||||||
|
HighBrightnessModeController.HdrBrightnessDeviceConfig mHdrBrightnessCfg;
|
||||||
|
|
||||||
|
TestHbmBuilder setClock(OffsettableClock clock) {
|
||||||
|
mClock = clock;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates instance with standard initialization values.
|
TestHbmBuilder setHdrBrightnessConfig(
|
||||||
private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
|
HighBrightnessModeController.HdrBrightnessDeviceConfig hdrBrightnessCfg
|
||||||
initHandler(clock);
|
) {
|
||||||
|
mHdrBrightnessCfg = hdrBrightnessCfg;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighBrightnessModeController build() {
|
||||||
|
initHandler(mClock);
|
||||||
if (mHighBrightnessModeMetadata == null) {
|
if (mHighBrightnessModeMetadata == null) {
|
||||||
mHighBrightnessModeMetadata = new HighBrightnessModeMetadata();
|
mHighBrightnessModeMetadata = new HighBrightnessModeMetadata();
|
||||||
}
|
}
|
||||||
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
|
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
|
||||||
DISPLAY_HEIGHT, mDisplayToken, mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX,
|
DISPLAY_HEIGHT, mDisplayToken, mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX,
|
||||||
DEFAULT_HBM_DATA, null, () -> {}, mHighBrightnessModeMetadata, mContextSpy);
|
DEFAULT_HBM_DATA, mHdrBrightnessCfg, () -> {}, mHighBrightnessModeMetadata,
|
||||||
|
mContextSpy);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private HighBrightnessModeController createDefaultHbm() {
|
||||||
|
return new TestHbmBuilder().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates instance with standard initialization values.
|
||||||
|
private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
|
||||||
|
return new TestHbmBuilder().setClock(clock).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initHandler(OffsettableClock clock) {
|
private void initHandler(OffsettableClock clock) {
|
||||||
|
|||||||
Reference in New Issue
Block a user