From 2eb62955eb84b97695e8a7e56e14310cbb86412b Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Fri, 28 Jan 2011 12:37:51 -0800 Subject: Bug 3012968 DRM output control Modifies Stagefright to verify that there is a hardware-protected path to video sink for DRM content. Change-Id: I18b8741390e803a05a88c7f180b860a24ba88a10 --- media/libstagefright/AwesomePlayer.cpp | 14 ++++++++++++++ media/libstagefright/OMXCodec.cpp | 10 ++++++++++ 2 files changed, 24 insertions(+) (limited to 'media/libstagefright') diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 4c744bd..5734c7e 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -1189,6 +1190,19 @@ void AwesomePlayer::setVideoSource(sp source) { } status_t AwesomePlayer::initVideoDecoder(uint32_t flags) { + + // Either the application or the DRM system can independently say + // that there must be a hardware-protected path to an external video sink. + // For now we always require a hardware-protected path to external video sink + // if content is DRMed, but eventually this could be optional per DRM agent. + // When the application wants protection, then + // (USE_SURFACE_ALLOC && (mSurface != 0) && + // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) + // will be true, but that part is already handled by SurfaceFlinger. + if (mDecryptHandle != NULL) { + flags |= OMXCodec::kEnableGrallocUsageProtected; + } + LOGV("initVideoDecoder flags=0x%x", flags); mVideoSource = OMXCodec::Create( mClient.interface(), mVideoTrack->getFormat(), false, // createEncoder diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 4a94e0d..3e26a95 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -528,6 +528,12 @@ status_t OMXCodec::configureCodec(const sp &meta, uint32_t flags) { mOnlySubmitOneBufferAtOneTime = true; } + mEnableGrallocUsageProtected = false; + if (flags & kEnableGrallocUsageProtected) { + mEnableGrallocUsageProtected = true; + } + LOGV("configureCodec protected=%d", mEnableGrallocUsageProtected); + if (!(flags & kIgnoreCodecSpecificData)) { uint32_t type; const void *data; @@ -1751,7 +1757,11 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() { // XXX: Currently this error is logged, but not fatal. usage = 0; } + if (mEnableGrallocUsageProtected) { + usage |= GRALLOC_USAGE_PROTECTED; + } + LOGV("native_window_set_usage usage=0x%x", usage); err = native_window_set_usage( mNativeWindow.get(), usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); if (err != 0) { -- cgit v1.1