summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display/source
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-09-26 12:54:26 -0700
committerAndreas Huber <andih@google.com>2012-09-26 12:54:26 -0700
commiteb11600a248cfe5b95ddd3e5aaae02bd2ab65276 (patch)
tree9b808c55bfce6bc2bf6235065bc3748d3e2806c7 /media/libstagefright/wifi-display/source
parent44b175c31a96804d8f981c43145967473491540f (diff)
downloadframeworks_av-eb11600a248cfe5b95ddd3e5aaae02bd2ab65276.zip
frameworks_av-eb11600a248cfe5b95ddd3e5aaae02bd2ab65276.tar.gz
frameworks_av-eb11600a248cfe5b95ddd3e5aaae02bd2ab65276.tar.bz2
Make sure we only release the HDCP module once shutdown has completed.
Change-Id: I4b614afe2b55ac53b4aa63311e5bea8fd6c4462e related-to-bug: 7223555
Diffstat (limited to 'media/libstagefright/wifi-display/source')
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp24
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.h2
-rw-r--r--media/libstagefright/wifi-display/source/WifiDisplaySource.cpp34
-rw-r--r--media/libstagefright/wifi-display/source/WifiDisplaySource.h3
4 files changed, 49 insertions, 14 deletions
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<ABuffer> &accessUnit) {
const sp<Track> &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<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 @@ void WifiDisplaySource::onMessageReceived(const sp<AMessage> &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<AMessage> &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<AMessage> &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<AMessage> 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);
};