SurfaceUtils: query CONSUMER_IS_PROTECTED
Using NATIVE_WINDOW_CONSUMER_IS_PROTECTED to check whether a native
window can handle protected buffers instead of expecting
GRALLOC_USAGE_PROTECTED as a consumer usage flag.
Bug: 35726763
Test: videoplayer-nodrm-protected.apk and videoplayer-drm-protected.apk
both works.
Change-Id: I67a324161dff22e6efd949f2ab988c2349cd6bcc
diff --git a/media/libstagefright/SurfaceUtils.cpp b/media/libstagefright/SurfaceUtils.cpp
index b6b315d..b7c1598 100644
--- a/media/libstagefright/SurfaceUtils.cpp
+++ b/media/libstagefright/SurfaceUtils.cpp
@@ -91,9 +91,19 @@
return err;
}
- // Check if the ANativeWindow uses hardware protected buffers.
- if (queuesToNativeWindow != 1 && !(consumerUsage & GRALLOC_USAGE_PROTECTED)) {
- ALOGE("native window could not be authenticated");
+ // Check if the consumer end of the ANativeWindow can handle protected content.
+ int isConsumerProtected = 0;
+ err = nativeWindow->query(
+ nativeWindow, NATIVE_WINDOW_CONSUMER_IS_PROTECTED, &isConsumerProtected);
+ if (err != NO_ERROR) {
+ ALOGE("error query native window: %s (%d)", strerror(-err), -err);
+ return err;
+ }
+
+ // Deny queuing into native window if neither condition is satisfied.
+ if (queuesToNativeWindow != 1 && isConsumerProtected != 1) {
+ ALOGE("native window cannot handle protected buffers: the consumer should either be "
+ "a hardware composer or support hardware protection");
return PERMISSION_DENIED;
}
}