Callback behaviour change for CONFIGURE_FLAG_USE_CRYPTO_ASYNC
- when using blockModel, now all the cryptoErrors are send
through onCryptoError()
Bug: 254050543
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:af8d2fb741d285c7e0aea0b679520b994ff69f44)
Merged-In: I316373c450e5badde408ffbafbdefa3fa482808f
Change-Id: I316373c450e5badde408ffbafbdefa3fa482808f
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index e800ccd..d2df4f3 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -426,7 +426,8 @@
size_t offset,
const CryptoPlugin::SubSample *subSamples,
size_t numSubSamples,
- const sp<MediaCodecBuffer> &buffer) {
+ const sp<MediaCodecBuffer> &buffer,
+ AString* errorDetailMsg) {
static const C2MemoryUsage kSecureUsage{C2MemoryUsage::READ_PROTECTED, 0};
static const C2MemoryUsage kDefaultReadWriteUsage{
C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE};
@@ -456,7 +457,6 @@
ssize_t result = -1;
ssize_t codecDataOffset = 0;
if (mCrypto) {
- AString errorDetailMsg;
int32_t heapSeqNum = getHeapSeqNum(memory);
hardware::drm::V1_0::SharedBuffer src{(uint32_t)heapSeqNum, offset, size};
hardware::drm::V1_0::DestinationBuffer dst;
@@ -470,7 +470,7 @@
}
result = mCrypto->decrypt(
key, iv, mode, pattern, src, 0, subSamples, numSubSamples,
- dst, &errorDetailMsg);
+ dst, errorDetailMsg);
if (result < 0) {
ALOGI("[%s] attachEncryptedBuffer: decrypt failed: result = %zd", mName, result);
return result;
@@ -515,7 +515,9 @@
result = (ssize_t)_bytesWritten;
detailedError = _detailedError;
});
-
+ if (errorDetailMsg) {
+ errorDetailMsg->setTo(detailedError.c_str(), detailedError.size());
+ }
if (!returnVoid.isOk() || status != CasStatus::OK || result < 0) {
ALOGI("[%s] descramble failed, trans=%s, status=%d, result=%zd",
mName, returnVoid.description().c_str(), status, result);
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.h b/media/codec2/sfplugin/CCodecBufferChannel.h
index e2e55b9..20dca2b 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.h
+++ b/media/codec2/sfplugin/CCodecBufferChannel.h
@@ -86,7 +86,8 @@
size_t offset,
const CryptoPlugin::SubSample *subSamples,
size_t numSubSamples,
- const sp<MediaCodecBuffer> &buffer) override;
+ const sp<MediaCodecBuffer> &buffer,
+ AString* errorDetailMsg) override;
virtual status_t renderOutputBuffer(
const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) override;
virtual void pollForRenderedBuffers() override;
diff --git a/media/libstagefright/ACodecBufferChannel.cpp b/media/libstagefright/ACodecBufferChannel.cpp
index 57f26d0..8f2bed2 100644
--- a/media/libstagefright/ACodecBufferChannel.cpp
+++ b/media/libstagefright/ACodecBufferChannel.cpp
@@ -347,7 +347,8 @@
size_t offset,
const CryptoPlugin::SubSample *subSamples,
size_t numSubSamples,
- const sp<MediaCodecBuffer> &buffer) {
+ const sp<MediaCodecBuffer> &buffer,
+ AString* errorDetailMsg) {
std::shared_ptr<const std::vector<const BufferInfo>> array(
std::atomic_load(&mInputBuffers));
BufferInfoIterator it = findClientBuffer(array, buffer);
@@ -371,7 +372,6 @@
ssize_t result = -1;
ssize_t codecDataOffset = 0;
if (mCrypto != NULL) {
- AString errorDetailMsg;
hardware::drm::V1_0::DestinationBuffer destination;
if (secure) {
destination.type = DrmBufferType::NATIVE_HANDLE;
@@ -387,7 +387,7 @@
result = mCrypto->decrypt(key, iv, mode, pattern,
source, it->mClientBuffer->offset(),
- subSamples, numSubSamples, destination, &errorDetailMsg);
+ subSamples, numSubSamples, destination, errorDetailMsg);
if (result < 0) {
return result;
@@ -441,7 +441,9 @@
result = (ssize_t)_bytesWritten;
detailedError = _detailedError;
});
-
+ if (errorDetailMsg) {
+ errorDetailMsg->setTo(detailedError.c_str(), detailedError.size());
+ }
if (!returnVoid.isOk() || status != Status::OK || result < 0) {
ALOGE("descramble failed, trans=%s, status=%d, result=%zd",
returnVoid.description().c_str(), status, result);
diff --git a/media/libstagefright/CryptoAsync.cpp b/media/libstagefright/CryptoAsync.cpp
index 32fd3be..8b5c8ed 100644
--- a/media/libstagefright/CryptoAsync.cpp
+++ b/media/libstagefright/CryptoAsync.cpp
@@ -153,7 +153,7 @@
// attach buffer
err = channel->attachEncryptedBuffer(
memory, secure, key, iv, mode, pattern,
- offset, subSamples, numSubSamples, buffer);
+ offset, subSamples, numSubSamples, buffer, &errorDetailMsg);
// a generic error
auto handleError = [this, &err, &msg]() {
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index e5cc991..38df5d0 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -4290,11 +4290,10 @@
mFlags |= kFlagUseBlockModel;
}
if (flags & CONFIGURE_FLAG_USE_CRYPTO_ASYNC) {
- // silently disable crytoasync with blockmodel
- if (!(mFlags & kFlagUseBlockModel)) {
- mFlags |= kFlagUseCryptoAsync;
- } else {
- ALOGW("CrytoAsync not yet enabled for block model, falling back to normal");
+ mFlags |= kFlagUseCryptoAsync;
+ if ((mFlags & kFlagUseBlockModel)) {
+ ALOGW("CrytoAsync not yet enabled for block model,\
+ falling back to normal");
}
}
}
@@ -4324,17 +4323,23 @@
mBufferChannel->setDescrambler(mDescrambler);
if ((mFlags & kFlagUseCryptoAsync) &&
mCrypto && (mDomain == DOMAIN_VIDEO)) {
- mCryptoAsync = new CryptoAsync(mBufferChannel);
- mCryptoAsync->setCallback(
- std::make_unique<CryptoAsyncCallback>(new AMessage(kWhatCodecNotify, this)));
- mCryptoLooper = new ALooper();
- mCryptoLooper->setName("CryptoAsyncLooper");
- mCryptoLooper->registerHandler(mCryptoAsync);
- status_t err = mCryptoLooper->start();
- if (err != OK) {
- ALOGE("Crypto Looper failed to start");
- mCryptoAsync = nullptr;
- mCryptoLooper = nullptr;
+ // set kFlagUseCryptoAsync but do-not use this for block model
+ // this is to propagate the error in onCryptoError()
+ // TODO (b/274628160): Enable Use of CONFIG_FLAG_USE_CRYPTO_ASYNC
+ // with CONFIGURE_FLAG_USE_BLOCK_MODEL)
+ if (!(mFlags & kFlagUseBlockModel)) {
+ mCryptoAsync = new CryptoAsync(mBufferChannel);
+ mCryptoAsync->setCallback(
+ std::make_unique<CryptoAsyncCallback>(new AMessage(kWhatCodecNotify, this)));
+ mCryptoLooper = new ALooper();
+ mCryptoLooper->setName("CryptoAsyncLooper");
+ mCryptoLooper->registerHandler(mCryptoAsync);
+ status_t err = mCryptoLooper->start();
+ if (err != OK) {
+ ALOGE("Crypto Looper failed to start");
+ mCryptoAsync = nullptr;
+ mCryptoLooper = nullptr;
+ }
}
}
@@ -5510,9 +5515,24 @@
if (c2Buffer) {
err = mBufferChannel->attachBuffer(c2Buffer, buffer);
} else if (memory) {
+ AString errorDetailMsg;
err = mBufferChannel->attachEncryptedBuffer(
memory, (mFlags & kFlagIsSecure), key, iv, mode, pattern,
- offset, subSamples, numSubSamples, buffer);
+ offset, subSamples, numSubSamples, buffer, &errorDetailMsg);
+ if (err != OK && hasCryptoOrDescrambler()
+ && (mFlags & kFlagUseCryptoAsync)) {
+ // create error detail
+ AString errorDetailMsg;
+ sp<AMessage> cryptoErrorInfo = new AMessage();
+ buildCryptoInfoAMessage(cryptoErrorInfo, CryptoAsync::kActionDecrypt);
+ cryptoErrorInfo->setInt32("err", err);
+ cryptoErrorInfo->setInt32("actionCode", ACTION_CODE_FATAL);
+ cryptoErrorInfo->setString("errorDetail", errorDetailMsg);
+ onCryptoError(cryptoErrorInfo);
+ // we want cryptoError to be in the callback
+ // but Codec IllegalStateException to be triggered.
+ err = INVALID_OPERATION;
+ }
} else {
err = UNKNOWN_ERROR;
}
diff --git a/media/libstagefright/include/ACodecBufferChannel.h b/media/libstagefright/include/ACodecBufferChannel.h
index f3b0600..903280f 100644
--- a/media/libstagefright/include/ACodecBufferChannel.h
+++ b/media/libstagefright/include/ACodecBufferChannel.h
@@ -94,7 +94,8 @@
size_t offset,
const CryptoPlugin::SubSample *subSamples,
size_t numSubSamples,
- const sp<MediaCodecBuffer> &buffer) override;
+ const sp<MediaCodecBuffer> &buffer,
+ AString* errorDetailMsg) override;
virtual status_t renderOutputBuffer(
const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) override;
virtual void pollForRenderedBuffers() override;
diff --git a/media/libstagefright/include/media/stagefright/CodecBase.h b/media/libstagefright/include/media/stagefright/CodecBase.h
index aa02151..916d41e 100644
--- a/media/libstagefright/include/media/stagefright/CodecBase.h
+++ b/media/libstagefright/include/media/stagefright/CodecBase.h
@@ -385,7 +385,8 @@
size_t offset,
const CryptoPlugin::SubSample *subSamples,
size_t numSubSamples,
- const sp<MediaCodecBuffer> &buffer) {
+ const sp<MediaCodecBuffer> &buffer,
+ AString* errorDetailMsg) {
(void)memory;
(void)secure;
(void)key;
@@ -396,6 +397,7 @@
(void)subSamples;
(void)numSubSamples;
(void)buffer;
+ (void)errorDetailMsg;
return -ENOSYS;
}
/**
diff --git a/media/libstagefright/tests/mediacodec/MediaCodecTest.cpp b/media/libstagefright/tests/mediacodec/MediaCodecTest.cpp
index ecdaac5..71ddbe5 100644
--- a/media/libstagefright/tests/mediacodec/MediaCodecTest.cpp
+++ b/media/libstagefright/tests/mediacodec/MediaCodecTest.cpp
@@ -62,7 +62,8 @@
size_t offset,
const CryptoPlugin::SubSample *subSamples,
size_t numSubSamples,
- const sp<MediaCodecBuffer> &buffer),
+ const sp<MediaCodecBuffer> &buffer,
+ AString* errorDetailMsg),
(override));
MOCK_METHOD(status_t, renderOutputBuffer,
(const sp<MediaCodecBuffer> &buffer, int64_t timestampNs),