diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-10-01 21:07:03 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2012-10-02 16:25:10 -0700 |
commit | 77aebfdbae489c3712ae3f9bca29d01fb1f09dc2 (patch) | |
tree | 5f3cf170ce629f5b2f74374ea4b21197ed7a841d /services | |
parent | 4253abbcfa3165ad7d06c4de97cd780c4e96f94a (diff) | |
download | frameworks_base-77aebfdbae489c3712ae3f9bca29d01fb1f09dc2.zip frameworks_base-77aebfdbae489c3712ae3f9bca29d01fb1f09dc2.tar.gz frameworks_base-77aebfdbae489c3712ae3f9bca29d01fb1f09dc2.tar.bz2 |
Add new Display API for secure video capabilities.
Added a new API to determine whether the display supports
protected buffers so that an application can choose a different
content stream or change how it decodes the content so
that it will be viewable on the display.
At present, wifi display does not fully support protected
buffers although this may be enhanced in the future.
Bug: 6986623
Change-Id: If53a53d72b0ec92753cc4b29f99fcb131e00449b
Diffstat (limited to 'services')
6 files changed, 34 insertions, 17 deletions
diff --git a/services/java/com/android/server/display/DisplayDeviceInfo.java b/services/java/com/android/server/display/DisplayDeviceInfo.java index f0cd0f5..b4dab86 100644 --- a/services/java/com/android/server/display/DisplayDeviceInfo.java +++ b/services/java/com/android/server/display/DisplayDeviceInfo.java @@ -38,9 +38,15 @@ final class DisplayDeviceInfo { public static final int FLAG_SUPPORTS_ROTATION = 1 << 1; /** - * Flag: Indicates that this display device can show secure surfaces. + * Flag: Indicates that this display device has secure video output, such as HDCP. */ - public static final int FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT = 1 << 2; + public static final int FLAG_SECURE = 1 << 2; + + /** + * Flag: Indicates that this display device supports compositing + * from gralloc protected buffers. + */ + public static final int FLAG_SUPPORTS_PROTECTED_BUFFERS = 1 << 3; /** * Touch attachment: Display does not receive touch. @@ -182,8 +188,11 @@ final class DisplayDeviceInfo { if ((flags & FLAG_SUPPORTS_ROTATION) != 0) { msg.append(", FLAG_SUPPORTS_ROTATION"); } - if ((flags & FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT) != 0) { - msg.append(", FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT"); + if ((flags & FLAG_SECURE) != 0) { + msg.append(", FLAG_SECURE"); + } + if ((flags & FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) { + msg.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS"); } return msg.toString(); } diff --git a/services/java/com/android/server/display/HeadlessDisplayAdapter.java b/services/java/com/android/server/display/HeadlessDisplayAdapter.java index f3bec1d..7ec537f 100644 --- a/services/java/com/android/server/display/HeadlessDisplayAdapter.java +++ b/services/java/com/android/server/display/HeadlessDisplayAdapter.java @@ -60,7 +60,8 @@ final class HeadlessDisplayAdapter extends DisplayAdapter { mInfo.xDpi = 160; mInfo.yDpi = 160; mInfo.flags = DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY - | DisplayDeviceInfo.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT; + | DisplayDeviceInfo.FLAG_SECURE + | DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS; mInfo.touch = DisplayDeviceInfo.TOUCH_NONE; } return mInfo; diff --git a/services/java/com/android/server/display/LocalDisplayAdapter.java b/services/java/com/android/server/display/LocalDisplayAdapter.java index 9c51463..679a67e 100644 --- a/services/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/java/com/android/server/display/LocalDisplayAdapter.java @@ -124,11 +124,16 @@ final class LocalDisplayAdapter extends DisplayAdapter { mInfo.width = mPhys.width; mInfo.height = mPhys.height; mInfo.refreshRate = mPhys.refreshRate; + + // Assume that all built-in displays have secure output (eg. HDCP) and + // support compositing from gralloc protected buffers. + mInfo.flags = DisplayDeviceInfo.FLAG_SECURE + | DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS; + if (mBuiltInDisplayId == Surface.BUILT_IN_DISPLAY_ID_MAIN) { mInfo.name = getContext().getResources().getString( com.android.internal.R.string.display_manager_built_in_display_name); - mInfo.flags = DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY - | DisplayDeviceInfo.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT + mInfo.flags |= DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY | DisplayDeviceInfo.FLAG_SUPPORTS_ROTATION; mInfo.densityDpi = (int)(mPhys.density * 160 + 0.5f); mInfo.xDpi = mPhys.xDpi; @@ -137,7 +142,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { } else { mInfo.name = getContext().getResources().getString( com.android.internal.R.string.display_manager_hdmi_display_name); - mInfo.flags = DisplayDeviceInfo.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT; mInfo.touch = DisplayDeviceInfo.TOUCH_EXTERNAL; mInfo.setAssumedDensityForExternalDisplay(mPhys.width, mPhys.height); } diff --git a/services/java/com/android/server/display/LogicalDisplay.java b/services/java/com/android/server/display/LogicalDisplay.java index 3607de1..f4cb84d 100644 --- a/services/java/com/android/server/display/LogicalDisplay.java +++ b/services/java/com/android/server/display/LogicalDisplay.java @@ -179,8 +179,8 @@ final class LogicalDisplay { if (!Objects.equal(mPrimaryDisplayDeviceInfo, deviceInfo)) { mBaseDisplayInfo.layerStack = mLayerStack; mBaseDisplayInfo.flags = 0; - if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT) != 0) { - mBaseDisplayInfo.flags |= Display.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT; + if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) { + mBaseDisplayInfo.flags |= Display.FLAG_SUPPORTS_PROTECTED_BUFFERS; } mBaseDisplayInfo.name = deviceInfo.name; mBaseDisplayInfo.appWidth = deviceInfo.width; diff --git a/services/java/com/android/server/display/OverlayDisplayAdapter.java b/services/java/com/android/server/display/OverlayDisplayAdapter.java index 0767fc0..6ffb629 100644 --- a/services/java/com/android/server/display/OverlayDisplayAdapter.java +++ b/services/java/com/android/server/display/OverlayDisplayAdapter.java @@ -19,14 +19,10 @@ package com.android.server.display; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.database.ContentObserver; import android.os.Handler; import android.os.IBinder; -import android.os.UserHandle; import android.provider.Settings; import android.util.DisplayMetrics; import android.util.Slog; @@ -227,7 +223,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter { mInfo.densityDpi = mDensityDpi; mInfo.xDpi = mDensityDpi; mInfo.yDpi = mDensityDpi; - mInfo.flags = DisplayDeviceInfo.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT; + mInfo.flags = 0; mInfo.touch = DisplayDeviceInfo.TOUCH_NONE; } return mInfo; diff --git a/services/java/com/android/server/display/WifiDisplayAdapter.java b/services/java/com/android/server/display/WifiDisplayAdapter.java index 4a89be7..b2beb5e 100644 --- a/services/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/java/com/android/server/display/WifiDisplayAdapter.java @@ -50,7 +50,8 @@ import java.util.Arrays; final class WifiDisplayAdapter extends DisplayAdapter { private static final String TAG = "WifiDisplayAdapter"; - private PersistentDataStore mPersistentDataStore; + private final PersistentDataStore mPersistentDataStore; + private final boolean mSupportsProtectedBuffers; private WifiDisplayController mDisplayController; private WifiDisplayDevice mDisplayDevice; @@ -70,6 +71,8 @@ final class WifiDisplayAdapter extends DisplayAdapter { PersistentDataStore persistentDataStore) { super(syncRoot, context, handler, listener, TAG); mPersistentDataStore = persistentDataStore; + mSupportsProtectedBuffers = context.getResources().getBoolean( + com.android.internal.R.bool.config_wifiDisplaySupportsProtectedBuffers); } @Override @@ -84,6 +87,7 @@ final class WifiDisplayAdapter extends DisplayAdapter { pw.println("mAvailableDisplays=" + Arrays.toString(mAvailableDisplays)); pw.println("mRememberedDisplays=" + Arrays.toString(mRememberedDisplays)); pw.println("mPendingStatusChangeBroadcast=" + mPendingStatusChangeBroadcast); + pw.println("mSupportsProtectedBuffers=" + mSupportsProtectedBuffers); // Try to dump the controller state. if (mDisplayController == null) { @@ -217,7 +221,10 @@ final class WifiDisplayAdapter extends DisplayAdapter { int deviceFlags = 0; if ((flags & RemoteDisplay.DISPLAY_FLAG_SECURE) != 0) { - deviceFlags |= DisplayDeviceInfo.FLAG_SUPPORTS_SECURE_VIDEO_OUTPUT; + deviceFlags |= DisplayDeviceInfo.FLAG_SECURE; + } + if (mSupportsProtectedBuffers) { + deviceFlags |= DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS; } float refreshRate = 60.0f; // TODO: get this for real |