diff options
author | 2025-03-20 22:12:48 -0700 | |
---|---|---|
committer | 2025-03-21 23:34:33 -0700 | |
commit | 256ba2367aee49bc89f36d394fdd569ed4fec14a (patch) | |
tree | 18b2051330a3d75af2c0d2a0aa78fefe87e4187a | |
parent | d7c15565eff744a6658feac94f4c97d7be44439e (diff) |
[MQ] Set picture profile for TV input
Test: CTS
Bug: 405276566
Flag: android.media.tv.flags.media_quality_fw
Change-Id: Id04e419d9417ad9d794750853a81755f22f562f0
7 files changed, 114 insertions, 4 deletions
diff --git a/media/java/android/media/quality/MediaQualityManager.java b/media/java/android/media/quality/MediaQualityManager.java index bfd01380a2ee..6ad7684b8701 100644 --- a/media/java/android/media/quality/MediaQualityManager.java +++ b/media/java/android/media/quality/MediaQualityManager.java @@ -378,6 +378,18 @@ public final class MediaQualityManager { } /** + * Gets picture profile handle for TV input. + * @hide + */ + public long getPictureProfileForTvInput(String inputId) { + try { + return mService.getPictureProfileForTvInput(inputId, mUserHandle.getIdentifier()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Gets sound profile handle by profile ID. * @hide */ diff --git a/media/java/android/media/quality/PictureProfile.java b/media/java/android/media/quality/PictureProfile.java index 095dbb1ae2cf..b70db128852d 100644 --- a/media/java/android/media/quality/PictureProfile.java +++ b/media/java/android/media/quality/PictureProfile.java @@ -73,6 +73,12 @@ public final class PictureProfile implements Parcelable { */ public static final int TYPE_APPLICATION = 2; + /** + * Default profile name + * @hide + */ + public static final String NAME_DEFAULT = "default"; + /** @hide */ @Retention(RetentionPolicy.SOURCE) @StringDef(prefix = "NAME_", value = { @@ -81,9 +87,6 @@ public final class PictureProfile implements Parcelable { public @interface ProfileName {} /** @hide */ - public static final String NAME_DEFAULT = "default"; - - /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(flag = false, prefix = "ERROR_", value = { ERROR_UNKNOWN, diff --git a/media/java/android/media/quality/aidl/android/media/quality/IMediaQualityManager.aidl b/media/java/android/media/quality/aidl/android/media/quality/IMediaQualityManager.aidl index 4f24d8c5cc48..2ad5d9d3ed17 100644 --- a/media/java/android/media/quality/aidl/android/media/quality/IMediaQualityManager.aidl +++ b/media/java/android/media/quality/aidl/android/media/quality/IMediaQualityManager.aidl @@ -46,10 +46,13 @@ interface IMediaQualityManager { List<String> getPictureProfileAllowList(int userId); void setPictureProfileAllowList(in List<String> packages, int userId); List<PictureProfileHandle> getPictureProfileHandle(in String[] id, int userId); + long getPictureProfileHandleValue(in String id, int userId); long getDefaultPictureProfileHandleValue(int userId); void notifyPictureProfileHandleSelection(in long handle, int userId); + long getPictureProfileForTvInput(in String inputId, int userId); + void createSoundProfile(in SoundProfile pp, int userId); void updateSoundProfile(in String id, in SoundProfile pp, int userId); void removeSoundProfile(in String id, int userId); 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 c0bd22dd6308..4b8ba89b9336 100644 --- a/services/core/java/com/android/server/media/quality/MediaQualityService.java +++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java @@ -419,6 +419,7 @@ public class MediaQualityService extends SystemService { if (mMediaQuality != null) { PictureParameters pp = new PictureParameters(); // put ID in params for profile update in HAL + // TODO: update HAL API for this case params.putLong(BaseParameters.PARAMETER_ID, longId); PictureParameter[] pictureParameters = MediaQualityUtils .convertPersistableBundleToPictureParameterList(params); @@ -505,6 +506,41 @@ public class MediaQualityService extends SystemService { } } + public long getPictureProfileForTvInput(String inputId, int userId) { + // TODO: cache profiles + if (!hasGlobalPictureQualityServicePermission()) { + mMqManagerNotifier.notifyOnPictureProfileError(null, + PictureProfile.ERROR_NO_PERMISSION, + Binder.getCallingUid(), Binder.getCallingPid()); + } + String[] columns = {BaseParameters.PARAMETER_ID}; + String selection = BaseParameters.PARAMETER_TYPE + " = ? AND " + + BaseParameters.PARAMETER_NAME + " = ? AND " + + BaseParameters.PARAMETER_INPUT_ID + " = ?"; + String[] selectionArguments = { + Integer.toString(PictureProfile.TYPE_SYSTEM), + PictureProfile.NAME_DEFAULT, + inputId + }; + synchronized (mPictureProfileLock) { + try (Cursor cursor = mMqDatabaseUtils.getCursorAfterQuerying( + mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, + columns, selection, selectionArguments)) { + int count = cursor.getCount(); + if (count == 0) { + return -1; + } + long handle = -1; + cursor.moveToFirst(); + int colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_ID); + if (colIndex != -1) { + handle = cursor.getLong(colIndex); + } + return handle; + } + } + } + @GuardedBy("mSoundProfileLock") @Override public List<SoundProfileHandle> getSoundProfileHandle(String[] ids, int userId) { @@ -713,6 +749,7 @@ public class MediaQualityService extends SystemService { if (mMediaQuality != null) { SoundParameters sp = new SoundParameters(); // put ID in params for profile update in HAL + // TODO: update HAL API for this case params.putLong(BaseParameters.PARAMETER_ID, longId); SoundParameter[] soundParameters = MediaQualityUtils.convertPersistableBundleToSoundParameterList(params); diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index 2a744e6a64ae..8d02f2fc4f8b 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -67,6 +67,7 @@ final class TvInputHal implements Handler.Callback { private static native void nativeClose(long ptr); private static native int nativeSetTvMessageEnabled(long ptr, int deviceId, int streamId, int type, boolean enabled); + private static native int nativeSetPictureProfile( long ptr, int deviceId, int streamId, long profileHandle); @@ -124,6 +125,24 @@ final class TvInputHal implements Handler.Callback { } } + public int setPictureProfile(int deviceId, TvStreamConfig streamConfig, long profileHandle) { + synchronized (mLock) { + if (mPtr == 0) { + return ERROR_NO_INIT; + } + int generation = mStreamConfigGenerations.get(deviceId, 0); + if (generation != streamConfig.getGeneration()) { + return ERROR_STALE_CONFIG; + } + if (nativeSetPictureProfile(mPtr, deviceId, streamConfig.getStreamId(), profileHandle) + == 0) { + return SUCCESS; + } else { + return ERROR_UNKNOWN; + } + } + } + public int removeStream(int deviceId, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index 92b57645b9a3..d3e3257fe384 100644 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -596,6 +596,26 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } + public boolean setPictureProfile(String inputId, long profileHandle) { + synchronized (mLock) { + int deviceId = findDeviceIdForInputIdLocked(inputId); + if (deviceId < 0) { + Slog.e(TAG, "Invalid inputId : " + inputId); + return false; + } + + Connection connection = mConnections.get(deviceId); + boolean success = true; + for (TvStreamConfig config : connection.getConfigsLocked()) { + success = success + && mHal.setPictureProfile(deviceId, config, profileHandle) + == TvInputHal.SUCCESS; + } + + return success; + } + } + /** * Take a snapshot of the given TV input into the provided Surface. */ @@ -844,7 +864,6 @@ class TvInputHardwareManager implements TvInputHal.Callback { return mCallback; } - @GuardedBy("mLock") public TvStreamConfig[] getConfigsLocked() { return mConfigs; } diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index a013fdb8a9ef..3c3bfeb75c85 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -51,6 +51,7 @@ import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiTvClient; import android.media.AudioPresentation; import android.media.PlaybackParams; +import android.media.quality.MediaQualityManager; import android.media.tv.AdBuffer; import android.media.tv.AdRequest; import android.media.tv.AdResponse; @@ -193,6 +194,8 @@ public final class TvInputManagerService extends SystemService { private HdmiControlManager mHdmiControlManager = null; private HdmiTvClient mHdmiTvClient = null; + private MediaQualityManager mMediaQualityManager = null; + public TvInputManagerService(Context context) { super(context); @@ -3702,10 +3705,24 @@ public final class TvInputManagerService extends SystemService { TvInputInfo inputInfo, ComponentName component, int userId) { ServiceState serviceState = getServiceStateLocked(component, userId); serviceState.hardwareInputMap.put(inputInfo.getId(), inputInfo); + setPictureProfileLocked(inputInfo.getId()); buildTvInputListLocked(userId, null); } @GuardedBy("mLock") + private void setPictureProfileLocked(String inputId) { + if (mMediaQualityManager == null) { + mMediaQualityManager = (MediaQualityManager) getContext() + .getSystemService(Context.MEDIA_QUALITY_SERVICE); + if (mMediaQualityManager == null) { + return; + } + } + long profileHandle = mMediaQualityManager.getPictureProfileForTvInput(inputId); + mTvInputHardwareManager.setPictureProfile(inputId, profileHandle); + } + + @GuardedBy("mLock") private void removeHardwareInputLocked(String inputId, int userId) { if (!mTvInputHardwareManager.getInputMap().containsKey(inputId)) { return; |