Merge "MediaCodec: fix encrypted block handling" into rvc-dev

gugelfrei
Wonsik Kim 4 years ago committed by Android (Google) Code Review
commit 6021501137

@ -15,6 +15,7 @@
*/ */
//#define LOG_NDEBUG 0 //#define LOG_NDEBUG 0
#include "hidl/HidlSupport.h"
#define LOG_TAG "MediaCodec" #define LOG_TAG "MediaCodec"
#include <utils/Log.h> #include <utils/Log.h>
@ -37,6 +38,7 @@
#include <cutils/properties.h> #include <cutils/properties.h>
#include <gui/BufferQueue.h> #include <gui/BufferQueue.h>
#include <gui/Surface.h> #include <gui/Surface.h>
#include <hidlmemory/FrameworkUtils.h>
#include <mediadrm/ICrypto.h> #include <mediadrm/ICrypto.h>
#include <media/IOMX.h> #include <media/IOMX.h>
#include <media/MediaCodecBuffer.h> #include <media/MediaCodecBuffer.h>
@ -3431,19 +3433,42 @@ status_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
sp<ABuffer> csd = *mCSD.begin(); sp<ABuffer> csd = *mCSD.begin();
mCSD.erase(mCSD.begin()); mCSD.erase(mCSD.begin());
std::shared_ptr<C2Buffer> c2Buffer; std::shared_ptr<C2Buffer> c2Buffer;
sp<hardware::HidlMemory> memory;
size_t offset = 0;
if ((mFlags & kFlagUseBlockModel) && mOwnerName.startsWith("codec2::")) { if ((mFlags & kFlagUseBlockModel) && mOwnerName.startsWith("codec2::")) {
std::shared_ptr<C2LinearBlock> block = if (mCrypto) {
FetchLinearBlock(csd->size(), {std::string{mComponentName.c_str()}}); constexpr size_t kInitialDealerCapacity = 1048576; // 1MB
C2WriteView view{block->map().get()}; thread_local sp<MemoryDealer> sDealer = new MemoryDealer(
if (view.error() != C2_OK) { kInitialDealerCapacity, "CSD(1MB)");
return -EINVAL; sp<IMemory> mem = sDealer->allocate(csd->size());
} if (mem == nullptr) {
if (csd->size() > view.capacity()) { size_t newDealerCapacity = sDealer->getMemoryHeap()->getSize() * 2;
return -EINVAL; while (csd->size() * 2 > newDealerCapacity) {
newDealerCapacity *= 2;
}
sDealer = new MemoryDealer(
newDealerCapacity,
AStringPrintf("CSD(%dMB)", newDealerCapacity / 1048576).c_str());
mem = sDealer->allocate(csd->size());
}
memcpy(mem->unsecurePointer(), csd->data(), csd->size());
ssize_t heapOffset;
memory = hardware::fromHeap(mem->getMemory(&heapOffset, nullptr));
offset += heapOffset;
} else {
std::shared_ptr<C2LinearBlock> block =
FetchLinearBlock(csd->size(), {std::string{mComponentName.c_str()}});
C2WriteView view{block->map().get()};
if (view.error() != C2_OK) {
return -EINVAL;
}
if (csd->size() > view.capacity()) {
return -EINVAL;
}
memcpy(view.base(), csd->data(), csd->size());
c2Buffer = C2Buffer::CreateLinearBuffer(block->share(0, csd->size(), C2Fence{}));
} }
memcpy(view.base(), csd->data(), csd->size());
c2Buffer = C2Buffer::CreateLinearBuffer(block->share(0, csd->size(), C2Fence{}));
} else { } else {
const BufferInfo &info = mPortBuffers[kPortIndexInput][bufferIndex]; const BufferInfo &info = mPortBuffers[kPortIndexInput][bufferIndex];
const sp<MediaCodecBuffer> &codecInputData = info.mData; const sp<MediaCodecBuffer> &codecInputData = info.mData;
@ -3473,6 +3498,11 @@ status_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
new WrapperObject<std::shared_ptr<C2Buffer>>{c2Buffer}}; new WrapperObject<std::shared_ptr<C2Buffer>>{c2Buffer}};
msg->setObject("c2buffer", obj); msg->setObject("c2buffer", obj);
msg->setMessage("tunings", new AMessage); msg->setMessage("tunings", new AMessage);
} else if (memory) {
sp<WrapperObject<sp<hardware::HidlMemory>>> obj{
new WrapperObject<sp<hardware::HidlMemory>>{memory}};
msg->setObject("memory", obj);
msg->setMessage("tunings", new AMessage);
} }
return onQueueInputBuffer(msg); return onQueueInputBuffer(msg);
@ -3590,6 +3620,7 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
} else if (msg->findObject("memory", &obj)) { } else if (msg->findObject("memory", &obj)) {
CHECK(obj); CHECK(obj);
memory = static_cast<WrapperObject<sp<hardware::HidlMemory>> *>(obj.get())->value; memory = static_cast<WrapperObject<sp<hardware::HidlMemory>> *>(obj.get())->value;
CHECK(msg->findSize("offset", &offset));
} else { } else {
CHECK(msg->findSize("offset", &offset)); CHECK(msg->findSize("offset", &offset));
} }
@ -3688,7 +3719,7 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
} }
status_t err = OK; status_t err = OK;
if (hasCryptoOrDescrambler()) { if (hasCryptoOrDescrambler() && !c2Buffer && !memory) {
AString *errorDetailMsg; AString *errorDetailMsg;
CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg));

Loading…
Cancel
Save