summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shubang Lu <shubang@google.com> 2025-03-20 22:12:48 -0700
committer Shubang Lu <shubang@google.com> 2025-03-21 23:34:33 -0700
commit256ba2367aee49bc89f36d394fdd569ed4fec14a (patch)
tree18b2051330a3d75af2c0d2a0aa78fefe87e4187a
parentd7c15565eff744a6658feac94f4c97d7be44439e (diff)
[MQ] Set picture profile for TV input
Test: CTS Bug: 405276566 Flag: android.media.tv.flags.media_quality_fw Change-Id: Id04e419d9417ad9d794750853a81755f22f562f0
-rw-r--r--media/java/android/media/quality/MediaQualityManager.java12
-rw-r--r--media/java/android/media/quality/PictureProfile.java9
-rw-r--r--media/java/android/media/quality/aidl/android/media/quality/IMediaQualityManager.aidl3
-rw-r--r--services/core/java/com/android/server/media/quality/MediaQualityService.java37
-rw-r--r--services/core/java/com/android/server/tv/TvInputHal.java19
-rw-r--r--services/core/java/com/android/server/tv/TvInputHardwareManager.java21
-rw-r--r--services/core/java/com/android/server/tv/TvInputManagerService.java17
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;