am bf5d85e6: am 5cfd237f: Merge "Prepend SPS/PPS manually before encryption in HDCP mode. This is" into jb-mr1-dev

* commit 'bf5d85e633d5818b47e5fd92d69bec7963fc3d52':
  Prepend SPS/PPS manually before encryption in HDCP mode. This is
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 <binder/IServiceManager.h>
 #include <gui/ISurfaceComposer.h>
 #include <gui/SurfaceComposerClient.h>
 #include <media/IHDCP.h>
+#include <media/stagefright/foundation/ABitReader.h>
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AMessage.h>
@@ -1302,7 +1304,7 @@
 }
 
 status_t WifiDisplaySource::PlaybackSession::packetizeAccessUnit(
-        size_t trackIndex, const sp<ABuffer> &accessUnit) {
+        size_t trackIndex, sp<ABuffer> accessUnit) {
     const sp<Track> &track = mTracks.valueFor(trackIndex);
 
     uint32_t flags = 0;
@@ -1318,15 +1320,14 @@
         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 @@
             ALOGI("out:");
             hexdump(accessUnit->data(), MIN(64, accessUnit->size()));
             ALOGI("inputCTR: 0x%016llx", inputCTR);
+            ALOGI("streamCTR: 0x%08x", trackIndex);
 #endif
         }
 
@@ -1384,6 +1386,31 @@
         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 @@
 
     uint64_t mTotalBytesSent;
 
-    sp<ABuffer> mTempAccessUnit;
-
 #if LOG_TRANSPORT_STREAM
     FILE *mLogFile;
 #endif
@@ -203,7 +201,7 @@
     bool allTracksHavePacketizerIndex();
 
     status_t packetizeAccessUnit(
-            size_t trackIndex, const sp<ABuffer> &accessUnit);
+            size_t trackIndex, sp<ABuffer> 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 @@
     return crc;
 }
 
+sp<ABuffer> TSPacketizer::prependCSD(
+        size_t trackIndex, const sp<ABuffer> &accessUnit) const {
+    CHECK_LT(trackIndex, mTracks.size());
+
+    const sp<Track> &track = mTracks.itemAt(trackIndex);
+    CHECK(track->isH264() && IsIDR(accessUnit));
+
+    int64_t timeUs;
+    CHECK(accessUnit->meta()->findInt64("timeUs", &timeUs));
+
+    sp<ABuffer> 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 @@
             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<ABuffer> prependCSD(
+            size_t trackIndex, const sp<ABuffer> &accessUnit) const;
+
 protected:
     virtual ~TSPacketizer();