From e399acc9d9f3b7af72106c4209e4bb40de37aa6a Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 27 Sep 2012 08:53:23 -0700 Subject: Prepend SPS/PPS manually before encryption in HDCP mode. This is a temporary change that will go away once the encoder can take care of this. Change-Id: Id65218f8a250d8c8fe3e8987b522065b5f5d7dca related-to-bug: 7245308 --- .../wifi-display/source/PlaybackSession.cpp | 41 ++++++++++++++++++---- .../wifi-display/source/PlaybackSession.h | 4 +-- .../wifi-display/source/TSPacketizer.cpp | 17 +++++++++ .../wifi-display/source/TSPacketizer.h | 5 +++ 4 files changed, 57 insertions(+), 10 deletions(-) (limited to 'media/libstagefright/wifi-display') diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp index 76a47ec..28fe0ec 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp +++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp @@ -24,11 +24,13 @@ #include "MediaPuller.h" #include "RepeaterSource.h" #include "TSPacketizer.h" +#include "include/avc_utils.h" #include #include #include #include +#include #include #include #include @@ -1302,7 +1304,7 @@ static inline size_t MIN(size_t a, size_t b) { } status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( - size_t trackIndex, const sp &accessUnit) { + size_t trackIndex, sp accessUnit) { const sp &track = mTracks.valueFor(trackIndex); uint32_t flags = 0; @@ -1318,15 +1320,14 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( hexdump(accessUnit->data(), MIN(64, accessUnit->size())); #endif - if (mTempAccessUnit == NULL - || mTempAccessUnit->capacity() < accessUnit->size()) { - mTempAccessUnit = new ABuffer(accessUnit->size()); + if (IsIDR(accessUnit)) { + // XXX remove this once the encoder takes care of this. + accessUnit = mPacketizer->prependCSD( + track->packetizerTrackIndex(), accessUnit); } - memcpy(mTempAccessUnit->data(), accessUnit->data(), accessUnit->size()); - status_t err = mHDCP->encrypt( - mTempAccessUnit->data(), mTempAccessUnit->size(), + accessUnit->data(), accessUnit->size(), trackIndex /* streamCTR */, &inputCTR, accessUnit->data()); @@ -1341,6 +1342,7 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( ALOGI("out:"); hexdump(accessUnit->data(), MIN(64, accessUnit->size())); ALOGI("inputCTR: 0x%016llx", inputCTR); + ALOGI("streamCTR: 0x%08x", trackIndex); #endif } @@ -1384,6 +1386,31 @@ status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit( HDCP_private_data[15] = ((inputCTR & 0x7f) << 1) | 1; +#if 0 + ALOGI("HDCP_private_data:"); + hexdump(HDCP_private_data, sizeof(HDCP_private_data)); + + ABitReader br(HDCP_private_data, sizeof(HDCP_private_data)); + CHECK_EQ(br.getBits(13), 0); + CHECK_EQ(br.getBits(2), (trackIndex >> 30) & 3); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(15), (trackIndex >> 15) & 0x7fff); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(15), trackIndex & 0x7fff); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(11), 0); + CHECK_EQ(br.getBits(4), (inputCTR >> 60) & 0xf); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(15), (inputCTR >> 45) & 0x7fff); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(15), (inputCTR >> 30) & 0x7fff); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(15), (inputCTR >> 15) & 0x7fff); + CHECK_EQ(br.getBits(1), 1u); + CHECK_EQ(br.getBits(15), inputCTR & 0x7fff); + CHECK_EQ(br.getBits(1), 1u); +#endif + flags |= TSPacketizer::IS_ENCRYPTED; } diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.h b/media/libstagefright/wifi-display/source/PlaybackSession.h index 682fe2e..b4aaa4d 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.h +++ b/media/libstagefright/wifi-display/source/PlaybackSession.h @@ -164,8 +164,6 @@ private: uint64_t mTotalBytesSent; - sp mTempAccessUnit; - #if LOG_TRANSPORT_STREAM FILE *mLogFile; #endif @@ -203,7 +201,7 @@ private: bool allTracksHavePacketizerIndex(); status_t packetizeAccessUnit( - size_t trackIndex, const sp &accessUnit); + size_t trackIndex, sp accessUnit); status_t packetizeQueuedAccessUnits(); diff --git a/media/libstagefright/wifi-display/source/TSPacketizer.cpp b/media/libstagefright/wifi-display/source/TSPacketizer.cpp index bd2f0c3..dd18998 100644 --- a/media/libstagefright/wifi-display/source/TSPacketizer.cpp +++ b/media/libstagefright/wifi-display/source/TSPacketizer.cpp @@ -702,5 +702,22 @@ uint32_t TSPacketizer::crc32(const uint8_t *start, size_t size) const { return crc; } +sp TSPacketizer::prependCSD( + size_t trackIndex, const sp &accessUnit) const { + CHECK_LT(trackIndex, mTracks.size()); + + const sp &track = mTracks.itemAt(trackIndex); + CHECK(track->isH264() && IsIDR(accessUnit)); + + int64_t timeUs; + CHECK(accessUnit->meta()->findInt64("timeUs", &timeUs)); + + sp accessUnit2 = track->prependCSD(accessUnit); + + accessUnit2->meta()->setInt64("timeUs", timeUs); + + return accessUnit2; +} + } // namespace android diff --git a/media/libstagefright/wifi-display/source/TSPacketizer.h b/media/libstagefright/wifi-display/source/TSPacketizer.h index 7020fff..01f174a 100644 --- a/media/libstagefright/wifi-display/source/TSPacketizer.h +++ b/media/libstagefright/wifi-display/source/TSPacketizer.h @@ -48,6 +48,11 @@ struct TSPacketizer : public RefBase { uint32_t flags, const uint8_t *PES_private_data, size_t PES_private_data_len); + // XXX to be removed once encoder config option takes care of this for + // encrypted mode. + sp prependCSD( + size_t trackIndex, const sp &accessUnit) const; + protected: virtual ~TSPacketizer(); -- cgit v1.1