diff options
author | 2025-03-21 12:54:17 -0700 | |
---|---|---|
committer | 2025-03-21 12:54:17 -0700 | |
commit | 94d76adfa3e6a3f5303ddfffd449b5c49bf8a8dd (patch) | |
tree | c231c096326a446f484cf173a1356f810a1c788d | |
parent | 1219d28bc38f62e76939f516463c4e47e3fbf8ae (diff) | |
parent | 9bec09c8f2edb5773062fcf06bfda53c68064b12 (diff) |
Merge "[MQ] Handle status change" into main
3 files changed, 177 insertions, 31 deletions
diff --git a/media/java/android/media/quality/PictureProfile.java b/media/java/android/media/quality/PictureProfile.java index 8a585efe032c..3bccd89c91c3 100644 --- a/media/java/android/media/quality/PictureProfile.java +++ b/media/java/android/media/quality/PictureProfile.java @@ -114,6 +114,18 @@ public final class PictureProfile implements Parcelable { */ public static final int ERROR_NOT_ALLOWLISTED = 4; + /** + * SDR status. + * @hide + */ + public static final String STATUS_SDR = "SDR"; + + /** + * HDR status. + * @hide + */ + public static final String STATUS_HDR = "HDR"; + private PictureProfile(@NonNull Parcel in) { mId = in.readString(); 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 937be14c01d4..4c61e226a574 100644 --- a/services/core/java/com/android/server/media/quality/MediaQualityService.java +++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java @@ -40,6 +40,7 @@ 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.hardware.tv.mediaquality.StreamStatus; import android.hardware.tv.mediaquality.VendorParamCapability; import android.media.quality.AmbientBacklightEvent; import android.media.quality.AmbientBacklightMetadata; @@ -129,6 +130,9 @@ public class MediaQualityService extends SystemService { // A global lock for ambient backlight objects. private final Object mAmbientBacklightLock = new Object(); + private final Map<Long, PictureProfile> mHandleToPictureProfile = new HashMap<>(); + private final BiMap<Long, Long> mCurrentPictureHandleToOriginal = new BiMap<>(); + public MediaQualityService(Context context) { super(context); mContext = context; @@ -373,13 +377,18 @@ public class MediaQualityService extends SystemService { Binder.getCallingUid(), Binder.getCallingPid()); } - PictureProfile pictureProfile = mMqDatabaseUtils.getPictureProfile( - mPictureProfileTempIdMap.getKey(profileId)); + Long longId = mPictureProfileTempIdMap.getKey(profileId); + if (longId == null) { + return false; + } + PictureProfile pictureProfile = mMqDatabaseUtils.getPictureProfile(longId); PersistableBundle params = pictureProfile.getParameters(); try { if (mMediaQuality != null) { PictureParameters pp = new PictureParameters(); + // put ID in params for profile update in HAL + params.putLong(BaseParameters.PARAMETER_ID, longId); PictureParameter[] pictureParameters = MediaQualityUtils .convertPersistableBundleToPictureParameterList(params); @@ -434,6 +443,7 @@ public class MediaQualityService extends SystemService { return toReturn; } + @GuardedBy("mSoundProfileLock") @Override public List<SoundProfileHandle> getSoundProfileHandle(String[] ids, int userId) { @@ -630,12 +640,18 @@ public class MediaQualityService extends SystemService { Binder.getCallingUid(), Binder.getCallingPid()); } - SoundProfile soundProfile = - mMqDatabaseUtils.getSoundProfile(mSoundProfileTempIdMap.getKey(profileId)); + Long longId = mSoundProfileTempIdMap.getKey(profileId); + if (longId == null) { + return false; + } + + SoundProfile soundProfile = mMqDatabaseUtils.getSoundProfile(longId); PersistableBundle params = soundProfile.getParameters(); try { if (mMediaQuality != null) { + // put ID in params for profile update in HAL + params.putLong(BaseParameters.PARAMETER_ID, longId); SoundParameter[] soundParameters = MediaQualityUtils.convertPersistableBundleToSoundParameterList(params); @@ -1150,15 +1166,17 @@ public class MediaQualityService extends SystemService { private final class MqDatabaseUtils { private PictureProfile getPictureProfile(Long dbId) { + return getPictureProfile(dbId, false); + } + + private PictureProfile getPictureProfile(Long dbId, boolean includeParams) { String selection = BaseParameters.PARAMETER_ID + " = ?"; String[] selectionArguments = {Long.toString(dbId)}; - try ( - Cursor cursor = getCursorAfterQuerying( - mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, - MediaQualityUtils.getMediaProfileColumns(false), selection, - selectionArguments) - ) { + try (Cursor cursor = getCursorAfterQuerying( + mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, + MediaQualityUtils.getMediaProfileColumns(includeParams), selection, + selectionArguments)) { int count = cursor.getCount(); if (count == 0) { return null; @@ -1177,11 +1195,9 @@ public class MediaQualityService extends SystemService { private List<PictureProfile> getPictureProfilesBasedOnConditions(String[] columns, String selection, String[] selectionArguments) { - try ( - Cursor cursor = getCursorAfterQuerying( - mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, columns, selection, - selectionArguments) - ) { + try (Cursor cursor = getCursorAfterQuerying( + mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, columns, selection, + selectionArguments)) { List<PictureProfile> pictureProfiles = new ArrayList<>(); while (cursor.moveToNext()) { pictureProfiles.add(MediaQualityUtils.convertCursorToPictureProfileWithTempId( @@ -1195,12 +1211,10 @@ public class MediaQualityService extends SystemService { String selection = BaseParameters.PARAMETER_ID + " = ?"; String[] selectionArguments = {Long.toString(dbId)}; - try ( - Cursor cursor = mMqDatabaseUtils.getCursorAfterQuerying( - mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, - MediaQualityUtils.getMediaProfileColumns(false), selection, - selectionArguments) - ) { + try (Cursor cursor = mMqDatabaseUtils.getCursorAfterQuerying( + mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, + MediaQualityUtils.getMediaProfileColumns(false), selection, + selectionArguments)) { int count = cursor.getCount(); if (count == 0) { return null; @@ -1219,11 +1233,9 @@ public class MediaQualityService extends SystemService { private List<SoundProfile> getSoundProfilesBasedOnConditions(String[] columns, String selection, String[] selectionArguments) { - try ( - Cursor cursor = mMqDatabaseUtils.getCursorAfterQuerying( - mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, columns, selection, - selectionArguments) - ) { + try (Cursor cursor = mMqDatabaseUtils.getCursorAfterQuerying( + mMediaQualityDbHelper.SOUND_QUALITY_TABLE_NAME, columns, selection, + selectionArguments)) { List<SoundProfile> soundProfiles = new ArrayList<>(); while (cursor.moveToNext()) { soundProfiles.add(MediaQualityUtils.convertCursorToSoundProfileWithTempId( @@ -1439,8 +1451,19 @@ public class MediaQualityService extends SystemService { private void notifyHalOnPictureProfileChange(Long dbId, PersistableBundle params) { // TODO: only notify HAL when the profile is active / being used if (mPpChangedListener != null) { + Long currentHandle = mCurrentPictureHandleToOriginal.getKey(dbId); + if (currentHandle != null) { + // this handle maps to another current profile, skip + return; + } try { - mPpChangedListener.onPictureProfileChanged(convertToHalPictureProfile(dbId, + Long idForHal = dbId; + Long originalHandle = mCurrentPictureHandleToOriginal.getValue(dbId); + if (originalHandle != null) { + // the original id is used in HAL because of status change + idForHal = originalHandle; + } + mPpChangedListener.onPictureProfileChanged(convertToHalPictureProfile(idForHal, params)); } catch (RemoteException e) { Slog.e(TAG, "Failed to notify HAL on picture profile change.", e); @@ -1569,9 +1592,116 @@ public class MediaQualityService extends SystemService { } @Override - public void onStreamStatusChanged(long pictureProfileId, byte status) + public void onStreamStatusChanged(long profileHandle, byte status) throws RemoteException { - // TODO + mHandler.post(() -> { + synchronized (mPictureProfileLock) { + // get from map if exists + PictureProfile previous = mHandleToPictureProfile.get(profileHandle); + if (previous == null) { + // get from DB if not exists + previous = mMqDatabaseUtils.getPictureProfile(profileHandle); + if (previous == null) { + return; + } + } + String[] arr = splitNameAndStatus(previous.getName()); + String profileName = arr[0]; + String profileStatus = arr[1]; + if (status == StreamStatus.HDR10) { + if (isHdr(profileStatus)) { + // already HDR + return; + } + if (isSdr(profileStatus)) { + // SDR to HDR + String selection = BaseParameters.PARAMETER_TYPE + " = ? AND " + + BaseParameters.PARAMETER_PACKAGE + " = ? AND " + + BaseParameters.PARAMETER_NAME + " = ?"; + String[] selectionArguments = { + Integer.toString(previous.getProfileType()), + previous.getPackageName(), + profileName + "/" + PictureProfile.STATUS_HDR + }; + List<PictureProfile> list = + mMqDatabaseUtils.getPictureProfilesBasedOnConditions( + MediaQualityUtils.getMediaProfileColumns(true), + selection, + selectionArguments); + if (list.isEmpty()) { + // HDR profile not found + return; + } + PictureProfile current = list.get(0); + mHandleToPictureProfile.put(profileHandle, current); + mCurrentPictureHandleToOriginal.put( + current.getHandle().getId(), profileHandle); + + mHalNotifier.notifyHalOnPictureProfileChange(profileHandle, + current.getParameters()); + + } + } else if (status == StreamStatus.SDR) { + if (isSdr(profileStatus)) { + // already SDR + return; + } + if (isHdr(profileStatus)) { + // HDR to SDR + String selection = BaseParameters.PARAMETER_TYPE + " = ? AND " + + BaseParameters.PARAMETER_PACKAGE + " = ? AND (" + + BaseParameters.PARAMETER_NAME + " = ? OR " + + BaseParameters.PARAMETER_NAME + " = ?)"; + String[] selectionArguments = { + Integer.toString(previous.getProfileType()), + previous.getPackageName(), + profileName, + profileName + "/" + PictureProfile.STATUS_SDR + }; + List<PictureProfile> list = + mMqDatabaseUtils.getPictureProfilesBasedOnConditions( + MediaQualityUtils.getMediaProfileColumns(true), + selection, + selectionArguments); + if (list.isEmpty()) { + // SDR profile not found + return; + } + PictureProfile current = list.get(0); + mHandleToPictureProfile.put(profileHandle, current); + mCurrentPictureHandleToOriginal.put( + current.getHandle().getId(), profileHandle); + + mHalNotifier.notifyHalOnPictureProfileChange(profileHandle, + current.getParameters()); + } + } + } + }); + + } + + @NonNull + private String[] splitNameAndStatus(@NonNull String nameAndStatus) { + int index = nameAndStatus.lastIndexOf('/'); + if (index == -1 || index == nameAndStatus.length() - 1) { + // no status in the original name + return new String[] {nameAndStatus, ""}; + } + return new String[] { + nameAndStatus.substring(0, index), + nameAndStatus.substring(index + 1) + }; + + } + + private boolean isSdr(@NonNull String profileStatus) { + return profileStatus.equals(PictureProfile.STATUS_SDR) + || profileStatus.isEmpty(); + } + + private boolean isHdr(@NonNull String profileStatus) { + return profileStatus.equals(PictureProfile.STATUS_HDR); } @Override diff --git a/services/core/java/com/android/server/media/quality/MediaQualityUtils.java b/services/core/java/com/android/server/media/quality/MediaQualityUtils.java index 05aac5587c2c..08a0b595033c 100644 --- a/services/core/java/com/android/server/media/quality/MediaQualityUtils.java +++ b/services/core/java/com/android/server/media/quality/MediaQualityUtils.java @@ -1273,14 +1273,18 @@ public final class MediaQualityUtils { */ public static PictureProfile convertCursorToPictureProfileWithTempId(Cursor cursor, BiMap<Long, String> map) { + String tmpId = getTempId(map, cursor); + Long dbId = map.getKey(tmpId); + PictureProfileHandle handle = dbId == null + ? PictureProfileHandle.NONE : new PictureProfileHandle(dbId); return new PictureProfile( - getTempId(map, cursor), + tmpId, getType(cursor), getName(cursor), getInputId(cursor), getPackageName(cursor), jsonToPersistableBundle(getSettingsString(cursor)), - PictureProfileHandle.NONE + handle ); } |