MediaCas: changes to address API review comments
Attach CAS system id as well as session id for scrambled tracks,
so that MediaExtractor can construct the CasInfo object.
bug: 22804304
bug: 36791613
bug: 36783335
Change-Id: I524c10a746615da5c16845658c39fd5a972182c9
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index e8c46e3..621c2ce 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -613,12 +613,21 @@
uint32_t type;
const void *data;
size_t size;
- if (meta->findData(kKeyCas, &type, &data, &size)) {
+ if (meta->findData(kKeyCASessionID, &type, &data, &size)) {
sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
- msg->setBuffer("cas", buffer);
+ if (buffer.get() == NULL || buffer->base() == NULL) {
+ return NO_MEMORY;
+ }
+
+ msg->setBuffer("ca-session-id", buffer);
memcpy(buffer->data(), data, size);
}
+ int32_t systemId;
+ if (meta->findInt32(kKeyCASystemID, &systemId)) {
+ msg->setInt32("ca-system-id", systemId);
+ }
+
if (!strncasecmp("video/scrambled", mime, 15)
|| !strncasecmp("audio/scrambled", mime, 15)) {
diff --git a/media/libstagefright/include/MetaData.h b/media/libstagefright/include/MetaData.h
index 214f4ff..7afd22d 100644
--- a/media/libstagefright/include/MetaData.h
+++ b/media/libstagefright/include/MetaData.h
@@ -176,7 +176,8 @@
kKeyCryptoDefaultIVSize = 'cryS', // int32_t
kKeyPssh = 'pssh', // raw data
- kKeyCas = ' cas',
+ kKeyCASystemID = 'caid', // int32_t
+ kKeyCASessionID = 'seid', // raw data
// Please see MediaFormat.KEY_IS_AUTOSELECT.
kKeyTrackIsAutoselect = 'auto', // bool (int32_t)
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index 47caf61..8099edb 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -140,7 +140,8 @@
unsigned pid() const { return mElementaryPID; }
void setPID(unsigned pid) { mElementaryPID = pid; }
- void setCasSession(
+ void setCasInfo(
+ int32_t systemId,
const sp<IDescrambler> &descrambler,
const std::vector<uint8_t> &sessionId);
@@ -682,9 +683,10 @@
sp<Stream> &stream = mStreams.editValueAt(i);
sp<IDescrambler> descrambler;
std::vector<uint8_t> sessionId;
- if (mParser->mCasManager->getCasSession(
- mProgramNumber, stream->pid(), &descrambler, &sessionId)) {
- stream->setCasSession(descrambler, sessionId);
+ int32_t systemId;
+ if (mParser->mCasManager->getCasInfo(mProgramNumber, stream->pid(),
+ &systemId, &descrambler, &sessionId)) {
+ stream->setCasInfo(systemId, descrambler, sessionId);
}
}
}
@@ -767,8 +769,8 @@
meta->setCString(kKeyMIMEType,
isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
: MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
- // for DrmInitData
- meta->setData(kKeyCas, 0, &CA_system_ID, sizeof(CA_system_ID));
+ // for MediaExtractor.CasInfo
+ meta->setInt32(kKeyCASystemID, CA_system_ID);
mSource = new AnotherPacketSource(meta);
}
}
@@ -1566,14 +1568,14 @@
return NULL;
}
-void ATSParser::Stream::setCasSession(
- const sp<IDescrambler> &descrambler,
+void ATSParser::Stream::setCasInfo(
+ int32_t systemId, const sp<IDescrambler> &descrambler,
const std::vector<uint8_t> &sessionId) {
if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) {
signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL);
mDescrambler = descrambler;
if (mQueue->isScrambled()) {
- mQueue->setCasSession(sessionId);
+ mQueue->setCasInfo(systemId, sessionId);
}
}
}
diff --git a/media/libstagefright/mpeg2ts/CasManager.cpp b/media/libstagefright/mpeg2ts/CasManager.cpp
index 4e34a30..d801034 100644
--- a/media/libstagefright/mpeg2ts/CasManager.cpp
+++ b/media/libstagefright/mpeg2ts/CasManager.cpp
@@ -298,13 +298,15 @@
return true;
}
-bool ATSParser::CasManager::getCasSession(
+bool ATSParser::CasManager::getCasInfo(
unsigned programNumber, unsigned elementaryPID,
- sp<IDescrambler> *descrambler, std::vector<uint8_t> *sessionId) const {
+ int32_t *systemId, sp<IDescrambler> *descrambler,
+ std::vector<uint8_t> *sessionId) const {
ssize_t index = mProgramCasMap.indexOfKey(programNumber);
if (index < 0) {
return false;
}
+ *systemId = mSystemId;
return mProgramCasMap[index]->getCasSession(
elementaryPID, descrambler, sessionId);
}
diff --git a/media/libstagefright/mpeg2ts/CasManager.h b/media/libstagefright/mpeg2ts/CasManager.h
index a7a3de9..8088dec 100644
--- a/media/libstagefright/mpeg2ts/CasManager.h
+++ b/media/libstagefright/mpeg2ts/CasManager.h
@@ -39,9 +39,9 @@
unsigned programNumber, unsigned elementaryPID,
const CADescriptor &descriptor);
- bool getCasSession(
+ bool getCasInfo(
unsigned programNumber, unsigned elementaryPID,
- sp<IDescrambler> *descrambler,
+ int32_t *systemId, sp<IDescrambler> *descrambler,
std::vector<uint8_t> *sessionId) const;
bool isCAPid(unsigned pid);
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index 6bac1db..ae7ec77 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -41,7 +41,8 @@
ElementaryStreamQueue::ElementaryStreamQueue(Mode mode, uint32_t flags)
: mMode(mode),
mFlags(flags),
- mEOSReached(false) {
+ mEOSReached(false),
+ mCASystemId(0) {
}
sp<MetaData> ElementaryStreamQueue::getFormat() {
@@ -67,6 +68,16 @@
mEOSReached = false;
}
+bool ElementaryStreamQueue::isScrambled() const {
+ return (mFlags & kFlag_ScrambledData) != 0;
+}
+
+void ElementaryStreamQueue::setCasInfo(
+ int32_t systemId, const std::vector<uint8_t> &sessionId) {
+ mCASystemId = systemId;
+ mCasSessionId = sessionId;
+}
+
// Parse AC3 header assuming the current ptr is start position of syncframe,
// update metadata only applicable, and return the payload size
static unsigned parseAC3SyncFrame(
@@ -938,8 +949,10 @@
mFormat->setInt32(kKeyWidth, 1280);
mFormat->setInt32(kKeyHeight, 720);
}
- // for DrmInitData
- mFormat->setData(kKeyCas, 0, mCasSessionId.data(), mCasSessionId.size());
+ // for MediaExtractor.CasInfo
+ mFormat->setInt32(kKeyCASystemID, mCASystemId);
+ mFormat->setData(kKeyCASessionID, 0,
+ mCasSessionId.data(), mCasSessionId.size());
}
return dequeueScrambledAccessUnit();
}
@@ -1213,8 +1226,10 @@
mFormat->setInt32(kKeyWidth, 1280);
mFormat->setInt32(kKeyHeight, 720);
- // for DrmInitData
- mFormat->setData(kKeyCas, 0, mCasSessionId.data(), mCasSessionId.size());
+ // for MediaExtractor.CasInfo
+ mFormat->setInt32(kKeyCASystemID, mCASystemId);
+ mFormat->setData(kKeyCASessionID, 0,
+ mCasSessionId.data(), mCasSessionId.size());
}
return dequeueScrambledAccessUnit();
}
diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h
index 6941e3f..11e1af7 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.h
+++ b/media/libstagefright/mpeg2ts/ESQueue.h
@@ -65,13 +65,9 @@
sp<MetaData> getFormat();
- bool isScrambled() {
- return (mFlags & kFlag_ScrambledData) != 0;
- }
+ bool isScrambled() const;
- void setCasSession(const std::vector<uint8_t> &sessionId) {
- mCasSessionId = sessionId;
- }
+ void setCasInfo(int32_t systemId, const std::vector<uint8_t> &sessionId);
private:
struct RangeInfo {
@@ -99,6 +95,7 @@
sp<ABuffer> mScrambledBuffer;
List<ScrambledRangeInfo> mScrambledRangeInfos;
+ int32_t mCASystemId;
std::vector<uint8_t> mCasSessionId;
sp<MetaData> mFormat;