From eb11600a248cfe5b95ddd3e5aaae02bd2ab65276 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 26 Sep 2012 12:54:26 -0700 Subject: Make sure we only release the HDCP module once shutdown has completed. Change-Id: I4b614afe2b55ac53b4aa63311e5bea8fd6c4462e related-to-bug: 7223555 --- .../wifi-display/source/PlaybackSession.cpp | 24 ++++++++++++++- .../wifi-display/source/PlaybackSession.h | 2 ++ .../wifi-display/source/WifiDisplaySource.cpp | 34 ++++++++++++++-------- .../wifi-display/source/WifiDisplaySource.h | 3 +- 4 files changed, 49 insertions(+), 14 deletions(-) (limited to 'media') diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp index ef39713..72e6313 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp +++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp @@ -1297,6 +1297,10 @@ bool WifiDisplaySource::PlaybackSession::allTracksHavePacketizerIndex() { return true; } +static inline size_t MIN(size_t a, size_t b) { + return (a < b) ? a : b; +} + status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( size_t trackIndex, const sp &accessUnit) { const sp &track = mTracks.valueFor(trackIndex); @@ -1309,8 +1313,20 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( if (mHDCP != NULL && !track->isAudio()) { isHDCPEncrypted = true; +#if 0 + ALOGI("in:"); + hexdump(accessUnit->data(), MIN(64, accessUnit->size())); +#endif + + if (mTempAccessUnit == NULL + || mTempAccessUnit->capacity() < accessUnit->size()) { + mTempAccessUnit = new ABuffer(accessUnit->size()); + } + + memcpy(mTempAccessUnit->data(), accessUnit->data(), accessUnit->size()); + status_t err = mHDCP->encrypt( - accessUnit->data(), accessUnit->size(), + mTempAccessUnit->data(), mTempAccessUnit->size(), trackIndex /* streamCTR */, &inputCTR, accessUnit->data()); @@ -1320,6 +1336,12 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( err); return err; + } else { +#if 0 + ALOGI("out:"); + hexdump(accessUnit->data(), MIN(64, accessUnit->size())); + ALOGI("inputCTR: 0x%016llx", inputCTR); +#endif } HDCP_private_data[0] = 0x00; diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.h b/media/libstagefright/wifi-display/source/PlaybackSession.h index 6f74382..682fe2e 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.h +++ b/media/libstagefright/wifi-display/source/PlaybackSession.h @@ -164,6 +164,8 @@ private: uint64_t mTotalBytesSent; + sp mTempAccessUnit; + #if LOG_TRANSPORT_STREAM FILE *mLogFile; #endif diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp index e9811f5..daa70f6 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp @@ -230,20 +230,18 @@ void WifiDisplaySource::onMessageReceived(const sp &msg) { case kWhatStop: { - uint32_t replyID; - CHECK(msg->senderAwaitsResponse(&replyID)); + CHECK(msg->senderAwaitsResponse(&mStopReplyID)); if (mSessionID != 0 && mClientSessionID != 0) { status_t err = sendM5( mClientSessionID, true /* requestShutdown */); if (err == OK) { - mStopReplyID = replyID; break; } } - finishStop(replyID); + finishStop(); break; } @@ -339,7 +337,7 @@ void WifiDisplaySource::onMessageReceived(const sp &msg) { CHECK(msg->findInt32("ext1", &ext1)); CHECK(msg->findInt32("ext2", &ext2)); - ALOGV("Saw HDCP notification code %d, ext1 %d, ext2 %d", + ALOGI("Saw HDCP notification code %d, ext1 %d, ext2 %d", msgCode, ext1, ext2); switch (msgCode) { @@ -355,6 +353,12 @@ void WifiDisplaySource::onMessageReceived(const sp &msg) { break; } + case HDCPModule::HDCP_SHUTDOWN_COMPLETE: + { + finishStop2(); + break; + } + default: { ALOGE("HDCP failure, shutting down."); @@ -1080,8 +1084,7 @@ status_t WifiDisplaySource::onTeardownRequest( } if (mStopReplyID != 0) { - finishStop(mStopReplyID); - mStopReplyID = 0; + finishStop(); } else { disconnectClient(UNKNOWN_ERROR); } @@ -1089,21 +1092,29 @@ status_t WifiDisplaySource::onTeardownRequest( return OK; } -void WifiDisplaySource::finishStop(uint32_t replyID) { +void WifiDisplaySource::finishStop() { disconnectClient(OK); #if REQUIRE_HDCP if (mHDCP != NULL) { mHDCP->shutdownAsync(); - mHDCP.clear(); + return; } #endif + finishStop2(); +} + +void WifiDisplaySource::finishStop2() { +#if REQUIRE_HDCP + mHDCP.clear(); +#endif + status_t err = OK; sp response = new AMessage; response->setInt32("err", err); - response->postReply(replyID); + response->postReply(mStopReplyID); } status_t WifiDisplaySource::onGetParameterRequest( @@ -1195,8 +1206,7 @@ void WifiDisplaySource::sendErrorResponse( response.append("\r\n"); - status_t err = mNetSession->sendRequest(sessionID, response.c_str()); - CHECK_EQ(err, (status_t)OK); + mNetSession->sendRequest(sessionID, response.c_str()); } int32_t WifiDisplaySource::makeUniquePlaybackSessionID() const { diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.h b/media/libstagefright/wifi-display/source/WifiDisplaySource.h index 1f0e375..fb4f53d 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.h +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.h @@ -205,7 +205,8 @@ private: // A listener is notified accordingly. void disconnectClient(status_t err); - void finishStop(uint32_t replyID); + void finishStop(); + void finishStop2(); DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource); }; -- cgit v1.1