diff options
author | Andreas Huber <andih@google.com> | 2012-04-06 11:06:28 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-04-06 12:16:27 -0700 |
commit | 4b75a9c8b93a90749bc5d22912ad0d96c12f4ecf (patch) | |
tree | ae217f5c50a37349dce944c5d8a065a8740c88a9 /media/libstagefright/MediaCodec.cpp | |
parent | 3f502bfc6d04d08369cf147284c5c4c2ac7c9a0e (diff) | |
download | frameworks_av-4b75a9c8b93a90749bc5d22912ad0d96c12f4ecf.zip frameworks_av-4b75a9c8b93a90749bc5d22912ad0d96c12f4ecf.tar.gz frameworks_av-4b75a9c8b93a90749bc5d22912ad0d96c12f4ecf.tar.bz2 |
New API to support submitting encrypted buffers to the decoder.
Change-Id: I69dd60e43078c4211c6123cf6e0ce90e676bf873
related-to-bug: 6275919
Diffstat (limited to 'media/libstagefright/MediaCodec.cpp')
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 89 |
1 files changed, 69 insertions, 20 deletions
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index ced8368..a382f1c 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -191,6 +191,31 @@ status_t MediaCodec::queueInputBuffer( return PostAndAwaitResponse(msg, &response); } +status_t MediaCodec::queueSecureInputBuffer( + size_t index, + size_t offset, + const CryptoPlugin::SubSample *subSamples, + size_t numSubSamples, + const uint8_t key[16], + const uint8_t iv[16], + CryptoPlugin::Mode mode, + int64_t presentationTimeUs, + uint32_t flags) { + sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); + msg->setSize("index", index); + msg->setSize("offset", offset); + msg->setPointer("subSamples", (void *)subSamples); + msg->setSize("numSubSamples", numSubSamples); + msg->setPointer("key", (void *)key); + msg->setPointer("iv", (void *)iv); + msg->setInt32("mode", mode); + msg->setInt64("timeUs", presentationTimeUs); + msg->setInt32("flags", flags); + + sp<AMessage> response; + return PostAndAwaitResponse(msg, &response); +} + status_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); msg->setInt64("timeoutUs", timeoutUs); @@ -1149,10 +1174,51 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { uint32_t flags; CHECK(msg->findSize("index", &index)); CHECK(msg->findSize("offset", &offset)); - CHECK(msg->findSize("size", &size)); CHECK(msg->findInt64("timeUs", &timeUs)); CHECK(msg->findInt32("flags", (int32_t *)&flags)); + const CryptoPlugin::SubSample *subSamples; + size_t numSubSamples; + const uint8_t *key; + const uint8_t *iv; + CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; + + // We allow the simpler queueInputBuffer API to be used even in + // secure mode, by fabricating a single unencrypted subSample. + CryptoPlugin::SubSample ss; + + if (msg->findSize("size", &size)) { + if (mCrypto != NULL) { + ss.mNumBytesOfClearData = size; + ss.mNumBytesOfEncryptedData = 0; + + subSamples = &ss; + numSubSamples = 1; + key = NULL; + iv = NULL; + } + } else { + if (mCrypto == NULL) { + return -EINVAL; + } + + CHECK(msg->findPointer("subSamples", (void **)&subSamples)); + CHECK(msg->findSize("numSubSamples", &numSubSamples)); + CHECK(msg->findPointer("key", (void **)&key)); + CHECK(msg->findPointer("iv", (void **)&iv)); + + int32_t tmp; + CHECK(msg->findInt32("mode", &tmp)); + + mode = (CryptoPlugin::Mode)tmp; + + size = 0; + for (size_t i = 0; i < numSubSamples; ++i) { + size += subSamples[i].mNumBytesOfClearData; + size += subSamples[i].mNumBytesOfEncryptedData; + } + } + if (index >= mPortBuffers[kPortIndexInput].size()) { return -ERANGE; } @@ -1187,29 +1253,14 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { return -ERANGE; } - uint8_t key[16]; - uint8_t iv[16]; - - CryptoPlugin::Mode mode; - CryptoPlugin::SubSample ss; - if (flags & BUFFER_FLAG_ENCRYPTED) { - mode = CryptoPlugin::kMode_AES_WV; - ss.mNumBytesOfClearData = 0; - ss.mNumBytesOfEncryptedData = size; - } else { - mode = CryptoPlugin::kMode_Unencrypted; - ss.mNumBytesOfClearData = size; - ss.mNumBytesOfEncryptedData = 0; - } - status_t err = mCrypto->decrypt( (mFlags & kFlagIsSecure) != 0, key, iv, mode, info->mEncryptedData->base() + offset, - &ss, - 1 /* numSubSamples */, + subSamples, + numSubSamples, info->mData->base()); if (err != OK) { @@ -1217,8 +1268,6 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { } info->mData->setRange(0, size); - } else if (flags & BUFFER_FLAG_ENCRYPTED) { - return -EINVAL; } reply->setBuffer("buffer", info->mData); |