Merge "Make sure we only release the HDCP module once shutdown has completed." into jb-mr1-dev
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 @@
     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<ABuffer> &accessUnit) {
     const sp<Track> &track = mTracks.valueFor(trackIndex);
@@ -1309,8 +1313,20 @@
     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 @@
                   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 @@
 
     uint64_t mTotalBytesSent;
 
+    sp<ABuffer> 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 @@
 
         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 @@
             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 @@
                     break;
                 }
 
+                case HDCPModule::HDCP_SHUTDOWN_COMPLETE:
+                {
+                    finishStop2();
+                    break;
+                }
+
                 default:
                 {
                     ALOGE("HDCP failure, shutting down.");
@@ -1080,8 +1084,7 @@
     }
 
     if (mStopReplyID != 0) {
-        finishStop(mStopReplyID);
-        mStopReplyID = 0;
+        finishStop();
     } else {
         disconnectClient(UNKNOWN_ERROR);
     }
@@ -1089,21 +1092,29 @@
     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<AMessage> response = new AMessage;
     response->setInt32("err", err);
-    response->postReply(replyID);
+    response->postReply(mStopReplyID);
 }
 
 status_t WifiDisplaySource::onGetParameterRequest(
@@ -1195,8 +1206,7 @@
 
     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 @@
     // A listener is notified accordingly.
     void disconnectClient(status_t err);
 
-    void finishStop(uint32_t replyID);
+    void finishStop();
+    void finishStop2();
 
     DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource);
 };