summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/ACodec.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-05-08 20:30:02 -0700
committerLajos Molnar <lajos@google.com>2015-05-08 20:36:00 -0700
commite66c5a42f01e2f445857b54a9d7bbb8ee062edeb (patch)
tree7fe14ba80918fa8aea83f5973da974b07d499b52 /media/libstagefright/ACodec.cpp
parentbadb2c466b9a9e84ad1cd794c52052a436b661fa (diff)
downloadframeworks_av-e66c5a42f01e2f445857b54a9d7bbb8ee062edeb.zip
frameworks_av-e66c5a42f01e2f445857b54a9d7bbb8ee062edeb.tar.gz
frameworks_av-e66c5a42f01e2f445857b54a9d7bbb8ee062edeb.tar.bz2
stagefright: fix legacy-adaptive experiment
Now that we are checking for unregistered buffers, we need to preregister the buffers on allocation. Bug: 20894716 Change-Id: Ie89663232c4c0d5bc2dfbd58c3347581c25fb041
Diffstat (limited to 'media/libstagefright/ACodec.cpp')
-rw-r--r--media/libstagefright/ACodec.cpp69
1 files changed, 35 insertions, 34 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 0843ad1..b9ae125 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -972,8 +972,36 @@ status_t ACodec::allocateOutputMetaDataBuffers() {
return err;
mNumUndequeuedBuffers = minUndequeuedBuffers;
+ ALOGV("[%s] Allocating %u meta buffers on output port",
+ mComponentName.c_str(), bufferCount);
+
+ size_t totalSize = bufferCount * 8;
+ mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec");
+
+ // Dequeue buffers and send them to OMX
+ for (OMX_U32 i = 0; i < bufferCount; i++) {
+ BufferInfo info;
+ info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
+ info.mGraphicBuffer = NULL;
+ info.mDequeuedAt = mDequeueCounter;
+
+ sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate(
+ sizeof(struct VideoDecoderOutputMetaData));
+ CHECK(mem.get() != NULL);
+ info.mData = new ABuffer(mem->pointer(), mem->size());
+
+ // we use useBuffer for metadata regardless of quirks
+ err = mOMX->useBuffer(
+ mNode, kPortIndexOutput, mem, &info.mBufferID);
+
+ mBuffers[kPortIndexOutput].push(info);
+
+ ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)",
+ mComponentName.c_str(), info.mBufferID, mem->pointer());
+ }
+
if (mLegacyAdaptiveExperiment) {
- // preallocate buffers
+ // preallocate and preregister buffers
static_cast<Surface *>(mNativeWindow.get())
->getIGraphicBufferProducer()->allowAllocation(true);
@@ -983,6 +1011,8 @@ status_t ACodec::allocateOutputMetaDataBuffers() {
// Dequeue buffers then cancel them all
for (OMX_U32 i = 0; i < bufferCount; i++) {
+ BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i);
+
ANativeWindowBuffer *buf;
err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf);
if (err != 0) {
@@ -991,10 +1021,10 @@ status_t ACodec::allocateOutputMetaDataBuffers() {
}
sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false));
- BufferInfo info;
- info.mStatus = BufferInfo::OWNED_BY_US;
- info.mGraphicBuffer = graphicBuffer;
- mBuffers[kPortIndexOutput].push(info);
+ mOMX->updateGraphicBufferInMeta(
+ mNode, kPortIndexOutput, graphicBuffer, info->mBufferID);
+ info->mStatus = BufferInfo::OWNED_BY_US;
+ info->mGraphicBuffer = graphicBuffer;
}
for (OMX_U32 i = 0; i < mBuffers[kPortIndexOutput].size(); i++) {
@@ -1005,39 +1035,10 @@ status_t ACodec::allocateOutputMetaDataBuffers() {
}
}
- mBuffers[kPortIndexOutput].clear();
static_cast<Surface*>(mNativeWindow.get())
->getIGraphicBufferProducer()->allowAllocation(false);
}
- ALOGV("[%s] Allocating %u meta buffers on output port",
- mComponentName.c_str(), bufferCount);
-
- size_t totalSize = bufferCount * 8;
- mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec");
-
- // Dequeue buffers and send them to OMX
- for (OMX_U32 i = 0; i < bufferCount; i++) {
- BufferInfo info;
- info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
- info.mGraphicBuffer = NULL;
- info.mDequeuedAt = mDequeueCounter;
-
- sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate(
- sizeof(struct VideoDecoderOutputMetaData));
- CHECK(mem.get() != NULL);
- info.mData = new ABuffer(mem->pointer(), mem->size());
-
- // we use useBuffer for metadata regardless of quirks
- err = mOMX->useBuffer(
- mNode, kPortIndexOutput, mem, &info.mBufferID);
-
- mBuffers[kPortIndexOutput].push(info);
-
- ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)",
- mComponentName.c_str(), info.mBufferID, mem->pointer());
- }
-
mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers;
return err;
}