Avoid unnecessary buffer copying if at all possible, detect if running in the mediaserver process.
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index b43e48f..277bce1 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -12,6 +12,7 @@
 
 enum {
     CONNECT = IBinder::FIRST_CALL_TRANSACTION,
+    LIVES_LOCALLY,
     LIST_NODES,
     ALLOCATE_NODE,
     FREE_NODE,
@@ -75,6 +76,15 @@
         : BpInterface<IOMX>(impl) {
     }
 
+    virtual bool livesLocally(pid_t pid) {
+        Parcel data, reply;
+        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+        data.writeInt32(pid);
+        remote()->transact(LIVES_LOCALLY, data, &reply);
+
+        return reply.readInt32() != 0;
+    }
+
     virtual status_t listNodes(List<ComponentInfo> *list) {
         list->clear();
 
@@ -369,6 +379,14 @@
 status_t BnOMX::onTransact(
     uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
     switch (code) {
+        case LIVES_LOCALLY:
+        {
+            CHECK_INTERFACE(IOMX, data, reply);
+            reply->writeInt32(livesLocally((pid_t)data.readInt32()));
+
+            return OK;
+        }
+
         case LIST_NODES:
         {
             CHECK_INTERFACE(IOMX, data, reply);
@@ -408,7 +426,7 @@
             if (err == OK) {
                 reply->writeIntPtr((intptr_t)node);
             }
-                
+
             return NO_ERROR;
         }
 
@@ -419,7 +437,7 @@
             node_id node = (void*)data.readIntPtr();
 
             reply->writeInt32(freeNode(node));
-                
+
             return NO_ERROR;
         }
 
@@ -631,7 +649,7 @@
 
             node_id node = (void*)data.readIntPtr();
             const char *parameter_name = data.readCString();
-            
+
             OMX_INDEXTYPE index;
             status_t err = getExtensionIndex(node, parameter_name, &index);