summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/media/quality/MediaQualityService.java319
1 files changed, 295 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/media/quality/MediaQualityService.java b/services/core/java/com/android/server/media/quality/MediaQualityService.java
index 999e0b4551fe..e47cbdc3546f 100644
--- a/services/core/java/com/android/server/media/quality/MediaQualityService.java
+++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java
@@ -29,6 +29,10 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.hardware.tv.mediaquality.AmbientBacklightColorFormat;
import android.hardware.tv.mediaquality.IMediaQuality;
+import android.hardware.tv.mediaquality.PictureParameter;
+import android.hardware.tv.mediaquality.PictureParameters;
+import android.hardware.tv.mediaquality.SoundParameter;
+import android.hardware.tv.mediaquality.SoundParameters;
import android.media.quality.AmbientBacklightEvent;
import android.media.quality.AmbientBacklightMetadata;
import android.media.quality.AmbientBacklightSettings;
@@ -37,6 +41,8 @@ import android.media.quality.IMediaQualityManager;
import android.media.quality.IPictureProfileCallback;
import android.media.quality.ISoundProfileCallback;
import android.media.quality.MediaQualityContract.BaseParameters;
+import android.media.quality.MediaQualityContract.PictureQuality;
+import android.media.quality.MediaQualityContract.SoundQuality;
import android.media.quality.MediaQualityManager;
import android.media.quality.ParameterCapability;
import android.media.quality.PictureProfile;
@@ -303,10 +309,208 @@ public class MediaQualityService extends SystemService {
notifyOnPictureProfileError(profileId, PictureProfile.ERROR_NO_PERMISSION,
Binder.getCallingUid(), Binder.getCallingPid());
}
- // TODO: pass the profile ID to MediaQuality HAL when ready.
+
+ PictureProfile pictureProfile = getPictureProfile(
+ mPictureProfileTempIdMap.getKey(profileId));
+ PersistableBundle params = pictureProfile.getParameters();
+
+ try {
+ if (mMediaQuality != null) {
+ PictureParameter[] pictureParameters =
+ convertPersistableBundleToPictureParameterList(params);
+
+ PictureParameters pp = new PictureParameters();
+ pp.pictureParameters = pictureParameters;
+
+ mMediaQuality.sendDefaultPictureParameters(pp);
+ return true;
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to set default picture profile", e);
+ }
return false;
}
+ private PictureParameter[] convertPersistableBundleToPictureParameterList(
+ PersistableBundle params) {
+ List<PictureParameter> pictureParams = new ArrayList<>();
+ if (params.containsKey(PictureQuality.PARAMETER_BRIGHTNESS)) {
+ pictureParams.add(PictureParameter.brightness(params.getLong(
+ PictureQuality.PARAMETER_BRIGHTNESS)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_CONTRAST)) {
+ pictureParams.add(PictureParameter.contrast(params.getInt(
+ PictureQuality.PARAMETER_CONTRAST)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_SHARPNESS)) {
+ pictureParams.add(PictureParameter.sharpness(params.getInt(
+ PictureQuality.PARAMETER_SHARPNESS)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_SATURATION)) {
+ pictureParams.add(PictureParameter.saturation(params.getInt(
+ PictureQuality.PARAMETER_SATURATION)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_HUE)) {
+ pictureParams.add(PictureParameter.hue(params.getInt(
+ PictureQuality.PARAMETER_HUE)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_BRIGHTNESS)) {
+ pictureParams.add(PictureParameter.colorTunerBrightness(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_BRIGHTNESS)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_SATURATION)) {
+ pictureParams.add(PictureParameter.colorTunerSaturation(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_SATURATION)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_HUE)) {
+ pictureParams.add(PictureParameter.colorTunerHue(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_HUE)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_RED_OFFSET)) {
+ pictureParams.add(PictureParameter.colorTunerRedOffset(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_RED_OFFSET)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_GREEN_OFFSET)) {
+ pictureParams.add(PictureParameter.colorTunerGreenOffset(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_GREEN_OFFSET)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_BLUE_OFFSET)) {
+ pictureParams.add(PictureParameter.colorTunerBlueOffset(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_BLUE_OFFSET)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_RED_GAIN)) {
+ pictureParams.add(PictureParameter.colorTunerRedGain(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_RED_GAIN)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_GREEN_GAIN)) {
+ pictureParams.add(PictureParameter.colorTunerGreenGain(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_GREEN_GAIN)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_BLUE_GAIN)) {
+ pictureParams.add(PictureParameter.colorTunerBlueGain(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_BLUE_GAIN)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_NOISE_REDUCTION)) {
+ pictureParams.add(PictureParameter.noiseReduction(
+ (byte) params.getInt(PictureQuality.PARAMETER_NOISE_REDUCTION)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_MPEG_NOISE_REDUCTION)) {
+ pictureParams.add(PictureParameter.mpegNoiseReduction(
+ (byte) params.getInt(PictureQuality.PARAMETER_MPEG_NOISE_REDUCTION)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_FLESH_TONE)) {
+ pictureParams.add(PictureParameter.fleshTone(
+ (byte) params.getInt(PictureQuality.PARAMETER_FLESH_TONE)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_DECONTOUR)) {
+ pictureParams.add(PictureParameter.deContour(
+ (byte) params.getInt(PictureQuality.PARAMETER_DECONTOUR)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_DYNAMIC_LUMA_CONTROL)) {
+ pictureParams.add(PictureParameter.dynamicLumaControl(
+ (byte) params.getInt(PictureQuality.PARAMETER_DYNAMIC_LUMA_CONTROL)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_FILM_MODE)) {
+ pictureParams.add(PictureParameter.filmMode(params.getBoolean(
+ PictureQuality.PARAMETER_FILM_MODE)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_BLUE_STRETCH)) {
+ pictureParams.add(PictureParameter.blueStretch(params.getBoolean(
+ PictureQuality.PARAMETER_BLUE_STRETCH)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNE)) {
+ pictureParams.add(PictureParameter.colorTune(params.getBoolean(
+ PictureQuality.PARAMETER_COLOR_TUNE)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TEMPERATURE)) {
+ pictureParams.add(PictureParameter.colorTemperature(
+ (byte) params.getInt(
+ PictureQuality.PARAMETER_COLOR_TEMPERATURE)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_GLOBAL_DIMMING)) {
+ pictureParams.add(PictureParameter.globeDimming(params.getBoolean(
+ PictureQuality.PARAMETER_GLOBAL_DIMMING)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_AUTO_PICTURE_QUALITY_ENABLED)) {
+ pictureParams.add(PictureParameter.autoPictureQualityEnabled(params.getBoolean(
+ PictureQuality.PARAMETER_AUTO_PICTURE_QUALITY_ENABLED)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_AUTO_SUPER_RESOLUTION_ENABLED)) {
+ pictureParams.add(PictureParameter.autoSuperResolutionEnabled(params.getBoolean(
+ PictureQuality.PARAMETER_AUTO_SUPER_RESOLUTION_ENABLED)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_RED_GAIN)) {
+ pictureParams.add(PictureParameter.colorTemperatureRedGain(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_RED_GAIN)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_GREEN_GAIN)) {
+ pictureParams.add(PictureParameter.colorTemperatureGreenGain(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_GREEN_GAIN)));
+ }
+ if (params.containsKey(PictureQuality.PARAMETER_COLOR_TUNER_BLUE_GAIN)) {
+ pictureParams.add(PictureParameter.colorTemperatureBlueGain(params.getInt(
+ PictureQuality.PARAMETER_COLOR_TUNER_BLUE_GAIN)));
+ }
+
+ /**
+ * TODO: add conversion for following after adding to MediaQualityContract
+ *
+ * PictureParameter.levelRange
+ * PictureParameter.gamutMapping
+ * PictureParameter.pcMode
+ * PictureParameter.lowLatency
+ * PictureParameter.vrr
+ * PictureParameter.cvrr
+ * PictureParameter.hdmiRgbRange
+ * PictureParameter.colorSpace
+ * PictureParameter.panelInitMaxLuminceNits
+ * PictureParameter.panelInitMaxLuminceValid
+ * PictureParameter.gamma
+ * PictureParameter.colorTemperatureRedOffset
+ * PictureParameter.colorTemperatureGreenOffset
+ * PictureParameter.colorTemperatureBlueOffset
+ * PictureParameter.elevenPointRed
+ * PictureParameter.elevenPointGreen
+ * PictureParameter.elevenPointBlue
+ * PictureParameter.lowBlueLight
+ * PictureParameter.LdMode
+ * PictureParameter.osdRedGain
+ * PictureParameter.osdGreenGain
+ * PictureParameter.osdBlueGain
+ * PictureParameter.osdRedOffset
+ * PictureParameter.osdGreenOffset
+ * PictureParameter.osdBlueOffset
+ * PictureParameter.osdHue
+ * PictureParameter.osdSaturation
+ * PictureParameter.osdContrast
+ * PictureParameter.colorTunerSwitch
+ * PictureParameter.colorTunerHueRed
+ * PictureParameter.colorTunerHueGreen
+ * PictureParameter.colorTunerHueBlue
+ * PictureParameter.colorTunerHueCyan
+ * PictureParameter.colorTunerHueMagenta
+ * PictureParameter.colorTunerHueYellow
+ * PictureParameter.colorTunerHueFlesh
+ * PictureParameter.colorTunerSaturationRed
+ * PictureParameter.colorTunerSaturationGreen
+ * PictureParameter.colorTunerSaturationBlue
+ * PictureParameter.colorTunerSaturationCyan
+ * PictureParameter.colorTunerSaturationMagenta
+ * PictureParameter.colorTunerSaturationYellow
+ * PictureParameter.colorTunerSaturationFlesh
+ * PictureParameter.colorTunerLuminanceRed
+ * PictureParameter.colorTunerLuminanceGreen
+ * PictureParameter.colorTunerLuminanceBlue
+ * PictureParameter.colorTunerLuminanceCyan
+ * PictureParameter.colorTunerLuminanceMagenta
+ * PictureParameter.colorTunerLuminanceYellow
+ * PictureParameter.colorTunerLuminanceFlesh
+ * PictureParameter.activeProfile
+ * PictureParameter.pictureQualityEventType
+ */
+ return (PictureParameter[]) pictureParams.toArray();
+ }
+
@Override
public List<String> getPictureProfilePackageNames(UserHandle user) {
if (!hasGlobalPictureQualityServicePermission()) {
@@ -524,10 +728,77 @@ public class MediaQualityService extends SystemService {
notifyOnSoundProfileError(profileId, SoundProfile.ERROR_NO_PERMISSION,
Binder.getCallingUid(), Binder.getCallingPid());
}
- // TODO: pass the profile ID to MediaQuality HAL when ready.
+
+ SoundProfile soundProfile = getSoundProfile(mSoundProfileTempIdMap.getKey(profileId));
+ PersistableBundle params = soundProfile.getParameters();
+
+ try {
+ if (mMediaQuality != null) {
+ SoundParameter[] soundParameters =
+ convertPersistableBundleToSoundParameterList(params);
+
+ SoundParameters sp = new SoundParameters();
+ sp.soundParameters = soundParameters;
+
+ mMediaQuality.sendDefaultSoundParameters(sp);
+ return true;
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to set default sound profile", e);
+ }
return false;
}
+ private SoundParameter[] convertPersistableBundleToSoundParameterList(
+ PersistableBundle params) {
+ List<SoundParameter> soundParams = new ArrayList<>();
+ if (params.containsKey(SoundQuality.PARAMETER_BALANCE)) {
+ soundParams.add(SoundParameter.balance(params.getInt(
+ SoundQuality.PARAMETER_BALANCE)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_BASS)) {
+ soundParams.add(SoundParameter.bass(params.getInt(SoundQuality.PARAMETER_BASS)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_TREBLE)) {
+ soundParams.add(SoundParameter.treble(params.getInt(
+ SoundQuality.PARAMETER_TREBLE)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_SURROUND_SOUND)) {
+ soundParams.add(SoundParameter.surroundSoundEnabled(params.getBoolean(
+ SoundQuality.PARAMETER_SURROUND_SOUND)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_SPEAKERS)) {
+ soundParams.add(SoundParameter.speakersEnabled(params.getBoolean(
+ SoundQuality.PARAMETER_SPEAKERS)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_SPEAKERS_DELAY_MILLIS)) {
+ soundParams.add(SoundParameter.speakersDelayMs(params.getInt(
+ SoundQuality.PARAMETER_SPEAKERS_DELAY_MILLIS)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_AUTO_VOLUME_CONTROL)) {
+ soundParams.add(SoundParameter.autoVolumeControl(params.getBoolean(
+ SoundQuality.PARAMETER_AUTO_VOLUME_CONTROL)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_DTS_DRC)) {
+ soundParams.add(SoundParameter.dtsDrc(params.getBoolean(
+ SoundQuality.PARAMETER_DTS_DRC)));
+ }
+ if (params.containsKey(SoundQuality.PARAMETER_DIGITAL_OUTPUT_DELAY_MILLIS)) {
+ soundParams.add(SoundParameter.surroundSoundEnabled(params.getBoolean(
+ SoundQuality.PARAMETER_DIGITAL_OUTPUT_DELAY_MILLIS)));
+ }
+ //TODO: equalizerDetail
+ //TODO: downmixMode
+ //TODO: enhancedAudioReturnChannelEnabled
+ //TODO: dolbyAudioProcessing
+ //TODO: dolbyDialogueEnhancer
+ //TODO: dtsVirtualX
+ //TODO: digitalOutput
+ //TODO: activeProfile
+ //TODO: soundStyle
+ return (SoundParameter[]) soundParams.toArray();
+ }
+
@Override
public List<String> getSoundProfilePackageNames(UserHandle user) {
if (!hasGlobalSoundQualityServicePermission()) {
@@ -1062,10 +1333,10 @@ public class MediaQualityService extends SystemService {
try {
if (mMediaQuality != null) {
- mMediaQuality.setAutoPqEnabled(enabled);
+ if (mMediaQuality.isAutoPqSupported()) {
+ mMediaQuality.setAutoPqEnabled(enabled);
+ }
}
- } catch (UnsupportedOperationException e) {
- Slog.e(TAG, "The current device is not supported");
} catch (RemoteException e) {
Slog.e(TAG, "Failed to set auto picture quality", e);
}
@@ -1075,10 +1346,10 @@ public class MediaQualityService extends SystemService {
public boolean isAutoPictureQualityEnabled(UserHandle user) {
try {
if (mMediaQuality != null) {
- return mMediaQuality.getAutoPqEnabled();
+ if (mMediaQuality.isAutoPqSupported()) {
+ mMediaQuality.getAutoPqEnabled();
+ }
}
- } catch (UnsupportedOperationException e) {
- Slog.e(TAG, "The current device is not supported");
} catch (RemoteException e) {
Slog.e(TAG, "Failed to get auto picture quality", e);
}
@@ -1094,12 +1365,12 @@ public class MediaQualityService extends SystemService {
try {
if (mMediaQuality != null) {
- mMediaQuality.setAutoSrEnabled(enabled);
+ if (mMediaQuality.isAutoSrSupported()) {
+ mMediaQuality.setAutoSrEnabled(enabled);
+ }
}
- } catch (UnsupportedOperationException e) {
- Slog.e(TAG, "The current device is not supported");
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to set auto super resolution", e);
+ Slog.e(TAG, "Failed to set super resolution", e);
}
}
@@ -1107,12 +1378,12 @@ public class MediaQualityService extends SystemService {
public boolean isSuperResolutionEnabled(UserHandle user) {
try {
if (mMediaQuality != null) {
- return mMediaQuality.getAutoSrEnabled();
+ if (mMediaQuality.isAutoSrSupported()) {
+ mMediaQuality.getAutoSrEnabled();
+ }
}
- } catch (UnsupportedOperationException e) {
- Slog.e(TAG, "The current device is not supported");
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to get auto super resolution", e);
+ Slog.e(TAG, "Failed to get super resolution", e);
}
return false;
}
@@ -1126,12 +1397,12 @@ public class MediaQualityService extends SystemService {
try {
if (mMediaQuality != null) {
- mMediaQuality.setAutoAqEnabled(enabled);
+ if (mMediaQuality.isAutoAqSupported()) {
+ mMediaQuality.setAutoAqEnabled(enabled);
+ }
}
- } catch (UnsupportedOperationException e) {
- Slog.e(TAG, "The current device is not supported");
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to set auto audio quality", e);
+ Slog.e(TAG, "Failed to set auto sound quality", e);
}
}
@@ -1139,12 +1410,12 @@ public class MediaQualityService extends SystemService {
public boolean isAutoSoundQualityEnabled(UserHandle user) {
try {
if (mMediaQuality != null) {
- return mMediaQuality.getAutoAqEnabled();
+ if (mMediaQuality.isAutoAqSupported()) {
+ mMediaQuality.getAutoAqEnabled();
+ }
}
- } catch (UnsupportedOperationException e) {
- Slog.e(TAG, "The current device is not supported");
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to get auto audio quality", e);
+ Slog.e(TAG, "Failed to get auto sound quality", e);
}
return false;
}