Fix no-copy-overhead OMXCodec implementation to actually work.
This commit is contained in:
@@ -82,9 +82,13 @@ public:
|
||||
node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms,
|
||||
buffer_id *buffer) = 0;
|
||||
|
||||
// This API clearly only makes sense if the caller lives in the
|
||||
// same process as the callee, i.e. is the media_server, as the
|
||||
// returned "buffer_data" pointer is just that, a pointer into local
|
||||
// address space.
|
||||
virtual status_t allocateBuffer(
|
||||
node_id node, OMX_U32 port_index, size_t size,
|
||||
buffer_id *buffer) = 0;
|
||||
buffer_id *buffer, void **buffer_data) = 0;
|
||||
|
||||
virtual status_t allocateBufferWithBackup(
|
||||
node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms,
|
||||
|
||||
@@ -100,6 +100,8 @@ private:
|
||||
IOMX::buffer_id mBuffer;
|
||||
bool mOwnedByComponent;
|
||||
sp<IMemory> mMem;
|
||||
size_t mSize;
|
||||
void *mData;
|
||||
MediaBuffer *mMediaBuffer;
|
||||
};
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ public:
|
||||
|
||||
virtual status_t allocateBuffer(
|
||||
node_id node, OMX_U32 port_index, size_t size,
|
||||
buffer_id *buffer) {
|
||||
buffer_id *buffer, void **buffer_data) {
|
||||
Parcel data, reply;
|
||||
data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
|
||||
data.writeIntPtr((intptr_t)node);
|
||||
@@ -255,7 +255,8 @@ public:
|
||||
return err;
|
||||
}
|
||||
|
||||
*buffer = (void*)reply.readIntPtr();
|
||||
*buffer = (void *)reply.readIntPtr();
|
||||
*buffer_data = (void *)reply.readIntPtr();
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -569,11 +570,14 @@ status_t BnOMX::onTransact(
|
||||
size_t size = data.readInt32();
|
||||
|
||||
buffer_id buffer;
|
||||
status_t err = allocateBuffer(node, port_index, size, &buffer);
|
||||
void *buffer_data;
|
||||
status_t err = allocateBuffer(
|
||||
node, port_index, size, &buffer, &buffer_data);
|
||||
reply->writeInt32(err);
|
||||
|
||||
if (err == OK) {
|
||||
reply->writeIntPtr((intptr_t)buffer);
|
||||
reply->writeIntPtr((intptr_t)buffer_data);
|
||||
}
|
||||
|
||||
return NO_ERROR;
|
||||
|
||||
@@ -1189,12 +1189,19 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
|
||||
sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize);
|
||||
CHECK(mem.get() != NULL);
|
||||
|
||||
BufferInfo info;
|
||||
info.mData = NULL;
|
||||
info.mSize = def.nBufferSize;
|
||||
|
||||
IOMX::buffer_id buffer;
|
||||
if (portIndex == kPortIndexInput
|
||||
&& (mQuirks & kRequiresAllocateBufferOnInputPorts)) {
|
||||
if (mOMXLivesLocally) {
|
||||
mem.clear();
|
||||
|
||||
err = mOMX->allocateBuffer(
|
||||
mNode, portIndex, def.nBufferSize, &buffer);
|
||||
mNode, portIndex, def.nBufferSize, &buffer,
|
||||
&info.mData);
|
||||
} else {
|
||||
err = mOMX->allocateBufferWithBackup(
|
||||
mNode, portIndex, mem, &buffer);
|
||||
@@ -1202,8 +1209,11 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
|
||||
} else if (portIndex == kPortIndexOutput
|
||||
&& (mQuirks & kRequiresAllocateBufferOnOutputPorts)) {
|
||||
if (mOMXLivesLocally) {
|
||||
mem.clear();
|
||||
|
||||
err = mOMX->allocateBuffer(
|
||||
mNode, portIndex, def.nBufferSize, &buffer);
|
||||
mNode, portIndex, def.nBufferSize, &buffer,
|
||||
&info.mData);
|
||||
} else {
|
||||
err = mOMX->allocateBufferWithBackup(
|
||||
mNode, portIndex, mem, &buffer);
|
||||
@@ -1217,14 +1227,17 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
|
||||
return err;
|
||||
}
|
||||
|
||||
BufferInfo info;
|
||||
if (mem != NULL) {
|
||||
info.mData = mem->pointer();
|
||||
}
|
||||
|
||||
info.mBuffer = buffer;
|
||||
info.mOwnedByComponent = false;
|
||||
info.mMem = mem;
|
||||
info.mMediaBuffer = NULL;
|
||||
|
||||
if (portIndex == kPortIndexOutput) {
|
||||
info.mMediaBuffer = new MediaBuffer(mem->pointer(), mem->size());
|
||||
info.mMediaBuffer = new MediaBuffer(info.mData, info.mSize);
|
||||
info.mMediaBuffer->setObserver(this);
|
||||
}
|
||||
|
||||
@@ -1599,6 +1612,8 @@ void OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) {
|
||||
}
|
||||
|
||||
void OMXCodec::onStateChange(OMX_STATETYPE newState) {
|
||||
CODEC_LOGV("onStateChange %d", newState);
|
||||
|
||||
switch (newState) {
|
||||
case OMX_StateIdle:
|
||||
{
|
||||
@@ -1666,6 +1681,12 @@ void OMXCodec::onStateChange(OMX_STATETYPE newState) {
|
||||
break;
|
||||
}
|
||||
|
||||
case OMX_StateInvalid:
|
||||
{
|
||||
setState(ERROR);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
CHECK(!"should not be here.");
|
||||
@@ -1845,16 +1866,16 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
|
||||
static const uint8_t kNALStartCode[4] =
|
||||
{ 0x00, 0x00, 0x00, 0x01 };
|
||||
|
||||
CHECK(info->mMem->size() >= specific->mSize + 4);
|
||||
CHECK(info->mSize >= specific->mSize + 4);
|
||||
|
||||
size += 4;
|
||||
|
||||
memcpy(info->mMem->pointer(), kNALStartCode, 4);
|
||||
memcpy((uint8_t *)info->mMem->pointer() + 4,
|
||||
memcpy(info->mData, kNALStartCode, 4);
|
||||
memcpy((uint8_t *)info->mData + 4,
|
||||
specific->mData, specific->mSize);
|
||||
} else {
|
||||
CHECK(info->mMem->size() >= specific->mSize);
|
||||
memcpy(info->mMem->pointer(), specific->mData, specific->mSize);
|
||||
CHECK(info->mSize >= specific->mSize);
|
||||
memcpy(info->mData, specific->mData, specific->mSize);
|
||||
}
|
||||
|
||||
mNoMoreOutputData = false;
|
||||
@@ -1901,12 +1922,12 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
|
||||
|
||||
srcLength = srcBuffer->range_length();
|
||||
|
||||
if (info->mMem->size() < srcLength) {
|
||||
LOGE("info->mMem->size() = %d, srcLength = %d",
|
||||
info->mMem->size(), srcLength);
|
||||
if (info->mSize < srcLength) {
|
||||
LOGE("info->mSize = %d, srcLength = %d",
|
||||
info->mSize, srcLength);
|
||||
}
|
||||
CHECK(info->mMem->size() >= srcLength);
|
||||
memcpy(info->mMem->pointer(),
|
||||
CHECK(info->mSize >= srcLength);
|
||||
memcpy(info->mData,
|
||||
(const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
|
||||
srcLength);
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
|
||||
virtual status_t allocateBuffer(
|
||||
node_id node, OMX_U32 port_index, size_t size,
|
||||
buffer_id *buffer);
|
||||
buffer_id *buffer, void **buffer_data);
|
||||
|
||||
virtual status_t allocateBufferWithBackup(
|
||||
node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms,
|
||||
|
||||
@@ -54,7 +54,8 @@ struct OMXNodeInstance {
|
||||
OMX::buffer_id *buffer);
|
||||
|
||||
status_t allocateBuffer(
|
||||
OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer);
|
||||
OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
|
||||
void **buffer_data);
|
||||
|
||||
status_t allocateBufferWithBackup(
|
||||
OMX_U32 portIndex, const sp<IMemory> ¶ms,
|
||||
|
||||
@@ -280,9 +280,9 @@ status_t OMX::useBuffer(
|
||||
|
||||
status_t OMX::allocateBuffer(
|
||||
node_id node, OMX_U32 port_index, size_t size,
|
||||
buffer_id *buffer) {
|
||||
buffer_id *buffer, void **buffer_data) {
|
||||
return findInstance(node)->allocateBuffer(
|
||||
port_index, size, buffer);
|
||||
port_index, size, buffer, buffer_data);
|
||||
}
|
||||
|
||||
status_t OMX::allocateBufferWithBackup(
|
||||
|
||||
@@ -258,7 +258,8 @@ status_t OMXNodeInstance::useBuffer(
|
||||
}
|
||||
|
||||
status_t OMXNodeInstance::allocateBuffer(
|
||||
OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) {
|
||||
OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
|
||||
void **buffer_data) {
|
||||
Mutex::Autolock autoLock(mLock);
|
||||
|
||||
BufferMeta *buffer_meta = new BufferMeta(size);
|
||||
@@ -280,6 +281,7 @@ status_t OMXNodeInstance::allocateBuffer(
|
||||
}
|
||||
|
||||
*buffer = header;
|
||||
*buffer_data = header->pBuffer;
|
||||
|
||||
addActiveBuffer(portIndex, *buffer);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user