summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-09-27 08:53:23 -0700
committerAndreas Huber <andih@google.com>2012-09-27 09:46:43 -0700
commite399acc9d9f3b7af72106c4209e4bb40de37aa6a (patch)
treeed6485886ae7e2d148191546ab97b1247af321a9 /media/libstagefright/wifi-display
parent6d6a4d3f37b332284b8b976bd5bb21d29007a97e (diff)
downloadframeworks_av-e399acc9d9f3b7af72106c4209e4bb40de37aa6a.zip
frameworks_av-e399acc9d9f3b7af72106c4209e4bb40de37aa6a.tar.gz
frameworks_av-e399acc9d9f3b7af72106c4209e4bb40de37aa6a.tar.bz2
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
Diffstat (limited to 'media/libstagefright/wifi-display')
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp41
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.h4
-rw-r--r--media/libstagefright/wifi-display/source/TSPacketizer.cpp17
-rw-r--r--media/libstagefright/wifi-display/source/TSPacketizer.h5
4 files changed, 57 insertions, 10 deletions
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 @@ static inline size_t MIN(size_t a, size_t b) {
}
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 @@ 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<ABuffer> mTempAccessUnit;
-
#if LOG_TRANSPORT_STREAM
FILE *mLogFile;
#endif
@@ -203,7 +201,7 @@ private:
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 @@ uint32_t TSPacketizer::crc32(const uint8_t *start, size_t size) const {
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 @@ 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<ABuffer> prependCSD(
+ size_t trackIndex, const sp<ABuffer> &accessUnit) const;
+
protected:
virtual ~TSPacketizer();