stagefright: remove OMXNodeInstance usage from GraphicBufferSource
This is a preliminary to separate GraphicBufferSource from IOMX.
- Use IOMX instead of internal OMXNodeInstance.
- Keep track of codec buffers by buffer_id, do not write to the
OMX buffer headers directly
- Upon data space change, notify IOMX to handle it
bug: 31399200
Change-Id: I86534d7602294f70da582457b5af2eb9b6a58eda
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index 6d5e7f6..5a3717e 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -55,6 +55,7 @@
FREE_BUFFER,
FILL_BUFFER,
EMPTY_BUFFER,
+ EMPTY_GRAPHIC_BUFFER,
GET_EXTENSION_INDEX,
OBSERVER_ON_MSG,
GET_GRAPHIC_BUFFER_USAGE,
@@ -62,6 +63,7 @@
UPDATE_GRAPHIC_BUFFER_IN_META,
CONFIGURE_VIDEO_TUNNEL_MODE,
UPDATE_NATIVE_HANDLE_IN_META,
+ DISPATCH_MESSAGE,
};
class BpOMX : public BpInterface<IOMX> {
@@ -585,6 +587,27 @@
return reply.readInt32();
}
+ virtual status_t emptyGraphicBuffer(
+ node_id node,
+ buffer_id buffer,
+ const sp<GraphicBuffer> &graphicBuffer,
+ OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+ data.writeInt32((int32_t)node);
+ data.writeInt32((int32_t)buffer);
+ data.write(*graphicBuffer);
+ data.writeInt32(flags);
+ data.writeInt64(timestamp);
+ data.writeInt32(fenceFd >= 0);
+ if (fenceFd >= 0) {
+ data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
+ }
+ remote()->transact(EMPTY_GRAPHIC_BUFFER, data, &reply);
+
+ return reply.readInt32();
+ }
+
virtual status_t getExtensionIndex(
node_id node,
const char *parameter_name,
@@ -623,6 +646,22 @@
return reply.readInt32();
}
+
+ virtual status_t dispatchMessage(const omx_message &msg) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+ data.writeInt32((int32_t)msg.node);
+ data.writeInt32(msg.fenceFd >= 0);
+ if (msg.fenceFd >= 0) {
+ data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
+ }
+ data.writeInt32(msg.type);
+ data.write(&msg.u, sizeof(msg.u));
+
+ remote()->transact(DISPATCH_MESSAGE, data, &reply);
+
+ return reply.readInt32();
+ }
};
IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
@@ -1193,6 +1232,24 @@
return NO_ERROR;
}
+ case EMPTY_GRAPHIC_BUFFER:
+ {
+ CHECK_OMX_INTERFACE(IOMX, data, reply);
+
+ node_id node = (node_id)data.readInt32();
+ buffer_id buffer = (buffer_id)data.readInt32();
+ sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
+ data.read(*graphicBuffer);
+ OMX_U32 flags = data.readInt32();
+ OMX_TICKS timestamp = data.readInt64();
+ bool haveFence = data.readInt32();
+ int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
+ reply->writeInt32(emptyGraphicBuffer(
+ node, buffer, graphicBuffer, flags, timestamp, fenceFd));
+
+ return NO_ERROR;
+ }
+
case GET_EXTENSION_INDEX:
{
CHECK_OMX_INTERFACE(IOMX, data, reply);
@@ -1218,6 +1275,24 @@
return OK;
}
+ case DISPATCH_MESSAGE:
+ {
+ CHECK_OMX_INTERFACE(IOMX, data, reply);
+ omx_message msg;
+ msg.node = data.readInt32();
+ int haveFence = data.readInt32();
+ msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
+ msg.type = (typeof(msg.type))data.readInt32();
+ status_t err = data.read(&msg.u, sizeof(msg.u));
+
+ if (err == OK) {
+ err = dispatchMessage(msg);
+ }
+ reply->writeInt32(err);
+
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}