diff options
author | Andreas Huber <andih@google.com> | 2012-04-19 12:52:20 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-04-19 12:53:59 -0700 |
commit | 5b8987e7de9d04b09153f329c680d2316cdb44ec (patch) | |
tree | 2b08e1f8abd0d4b869ce8923b1462530b916a7eb /media | |
parent | fd9e14bc28f377065e43ec6833d754ca151b3941 (diff) | |
download | frameworks_av-5b8987e7de9d04b09153f329c680d2316cdb44ec.zip frameworks_av-5b8987e7de9d04b09153f329c680d2316cdb44ec.tar.gz frameworks_av-5b8987e7de9d04b09153f329c680d2316cdb44ec.tar.bz2 |
Allow propagation of error information and description from the CryptoPlugin to
the higher layers.
Change-Id: I9f434ad55cdf575803c208bedf47b607baff2330
related-to-bug: 6365261
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/ICrypto.cpp | 19 | ||||
-rw-r--r-- | media/libmediaplayerservice/Crypto.cpp | 7 | ||||
-rw-r--r-- | media/libmediaplayerservice/Crypto.h | 3 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 33 |
4 files changed, 50 insertions, 12 deletions
diff --git a/media/libmedia/ICrypto.cpp b/media/libmedia/ICrypto.cpp index d51fe01..3452e5c 100644 --- a/media/libmedia/ICrypto.cpp +++ b/media/libmedia/ICrypto.cpp @@ -20,7 +20,9 @@ #include <binder/Parcel.h> #include <media/ICrypto.h> +#include <media/stagefright/MediaErrors.h> #include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/foundation/AString.h> namespace android { @@ -96,7 +98,8 @@ struct BpCrypto : public BpInterface<ICrypto> { CryptoPlugin::Mode mode, const void *srcPtr, const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, - void *dstPtr) { + void *dstPtr, + AString *errorDetailMsg) { Parcel data, reply; data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); data.writeInt32(secure); @@ -135,6 +138,10 @@ struct BpCrypto : public BpInterface<ICrypto> { status_t result = reply.readInt32(); + if (result >= ERROR_DRM_VENDOR_MIN && result <= ERROR_DRM_VENDOR_MAX) { + errorDetailMsg->setTo(reply.readCString()); + } + if (result != OK) { return result; } @@ -251,6 +258,8 @@ status_t BnCrypto::onTransact( dstPtr = malloc(totalSize); } + AString errorDetailMsg; + status_t err = decrypt( secure, key, @@ -258,10 +267,16 @@ status_t BnCrypto::onTransact( mode, srcData, subSamples, numSubSamples, - dstPtr); + dstPtr, + &errorDetailMsg); reply->writeInt32(err); + if (err >= ERROR_DRM_VENDOR_MIN + && err <= ERROR_DRM_VENDOR_MAX) { + reply->writeCString(errorDetailMsg.c_str()); + } + if (!secure) { if (err == OK) { reply->write(dstPtr, totalSize); diff --git a/media/libmediaplayerservice/Crypto.cpp b/media/libmediaplayerservice/Crypto.cpp index 574ae71..d35d5b1 100644 --- a/media/libmediaplayerservice/Crypto.cpp +++ b/media/libmediaplayerservice/Crypto.cpp @@ -22,6 +22,7 @@ #include <media/hardware/CryptoAPI.h> #include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/foundation/AString.h> #include <media/stagefright/foundation/hexdump.h> #include <media/stagefright/MediaErrors.h> @@ -147,7 +148,8 @@ status_t Crypto::decrypt( CryptoPlugin::Mode mode, const void *srcPtr, const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, - void *dstPtr) { + void *dstPtr, + AString *errorDetailMsg) { Mutex::Autolock autoLock(mLock); if (mInitCheck != OK) { @@ -159,7 +161,8 @@ status_t Crypto::decrypt( } return mPlugin->decrypt( - secure, key, iv, mode, srcPtr, subSamples, numSubSamples, dstPtr); + secure, key, iv, mode, srcPtr, subSamples, numSubSamples, dstPtr, + errorDetailMsg); } } // namespace android diff --git a/media/libmediaplayerservice/Crypto.h b/media/libmediaplayerservice/Crypto.h index 74de2b5..c5aa3c6 100644 --- a/media/libmediaplayerservice/Crypto.h +++ b/media/libmediaplayerservice/Crypto.h @@ -49,7 +49,8 @@ struct Crypto : public BnCrypto { CryptoPlugin::Mode mode, const void *srcPtr, const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, - void *dstPtr); + void *dstPtr, + AString *errorDetailMsg); private: mutable Mutex mLock; diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index a382f1c..2df0dd2 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -27,6 +27,7 @@ #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> +#include <media/stagefright/foundation/AString.h> #include <media/stagefright/foundation/hexdump.h> #include <media/stagefright/ACodec.h> #include <media/stagefright/MediaErrors.h> @@ -179,13 +180,19 @@ status_t MediaCodec::queueInputBuffer( size_t offset, size_t size, int64_t presentationTimeUs, - uint32_t flags) { + uint32_t flags, + AString *errorDetailMsg) { + if (errorDetailMsg != NULL) { + errorDetailMsg->clear(); + } + sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); msg->setSize("index", index); msg->setSize("offset", offset); msg->setSize("size", size); msg->setInt64("timeUs", presentationTimeUs); msg->setInt32("flags", flags); + msg->setPointer("errorDetailMsg", errorDetailMsg); sp<AMessage> response; return PostAndAwaitResponse(msg, &response); @@ -200,7 +207,12 @@ status_t MediaCodec::queueSecureInputBuffer( const uint8_t iv[16], CryptoPlugin::Mode mode, int64_t presentationTimeUs, - uint32_t flags) { + uint32_t flags, + AString *errorDetailMsg) { + if (errorDetailMsg != NULL) { + errorDetailMsg->clear(); + } + sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); msg->setSize("index", index); msg->setSize("offset", offset); @@ -211,9 +223,12 @@ status_t MediaCodec::queueSecureInputBuffer( msg->setInt32("mode", mode); msg->setInt64("timeUs", presentationTimeUs); msg->setInt32("flags", flags); + msg->setPointer("errorDetailMsg", errorDetailMsg); sp<AMessage> response; - return PostAndAwaitResponse(msg, &response); + status_t err = PostAndAwaitResponse(msg, &response); + + return err; } status_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { @@ -1234,9 +1249,6 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { } sp<AMessage> reply = info->mNotify; - info->mNotify = NULL; - info->mOwnedByClient = false; - info->mData->setRange(offset, size); info->mData->meta()->setInt64("timeUs", timeUs); @@ -1253,6 +1265,9 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { return -ERANGE; } + AString *errorDetailMsg; + CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); + status_t err = mCrypto->decrypt( (mFlags & kFlagIsSecure) != 0, key, @@ -1261,7 +1276,8 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { info->mEncryptedData->base() + offset, subSamples, numSubSamples, - info->mData->base()); + info->mData->base(), + errorDetailMsg); if (err != OK) { return err; @@ -1273,6 +1289,9 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { reply->setBuffer("buffer", info->mData); reply->post(); + info->mNotify = NULL; + info->mOwnedByClient = false; + return OK; } |