Merge change Iedebfe8d into eclair-mr2

* changes:
  Some decoders will return an error on OMX_EmptyThisBuffer to indicate that they don't support the media format, deal with this.
diff --git a/include/media/IOMX.h b/include/media/IOMX.h
index 10e0197..e551d17 100644
--- a/include/media/IOMX.h
+++ b/include/media/IOMX.h
@@ -84,9 +84,9 @@
     virtual status_t observe_node(
             node_id node, const sp<IOMXObserver> &observer) = 0;
 
-    virtual void fill_buffer(node_id node, buffer_id buffer) = 0;
+    virtual status_t fill_buffer(node_id node, buffer_id buffer) = 0;
 
-    virtual void empty_buffer(
+    virtual status_t empty_buffer(
             node_id node,
             buffer_id buffer,
             OMX_U32 range_offset, OMX_U32 range_length,
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index 0cec7bb..e74f1a9 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -289,15 +289,17 @@
         return reply.readInt32();
     }
 
-    virtual void fill_buffer(node_id node, buffer_id buffer) {
+    virtual status_t fill_buffer(node_id node, buffer_id buffer) {
         Parcel data, reply;
         data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
         data.writeIntPtr((intptr_t)node);
         data.writeIntPtr((intptr_t)buffer);
-        remote()->transact(FILL_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
+        remote()->transact(FILL_BUFFER, data, &reply);
+
+        return reply.readInt32();
     }
 
-    virtual void empty_buffer(
+    virtual status_t empty_buffer(
             node_id node,
             buffer_id buffer,
             OMX_U32 range_offset, OMX_U32 range_length,
@@ -310,7 +312,9 @@
         data.writeInt32(range_length);
         data.writeInt32(flags);
         data.writeInt64(timestamp);
-        remote()->transact(EMPTY_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
+        remote()->transact(EMPTY_BUFFER, data, &reply);
+
+        return reply.readInt32();
     }
 
     virtual status_t get_extension_index(
@@ -601,7 +605,7 @@
 
             node_id node = (void*)data.readIntPtr();
             buffer_id buffer = (void*)data.readIntPtr();
-            fill_buffer(node, buffer);
+            reply->writeInt32(fill_buffer(node, buffer));
 
             return NO_ERROR;
         }
@@ -617,9 +621,10 @@
             OMX_U32 flags = data.readInt32();
             OMX_TICKS timestamp = data.readInt64();
 
-            empty_buffer(
-                    node, buffer, range_offset, range_length,
-                    flags, timestamp);
+            reply->writeInt32(
+                    empty_buffer(
+                        node, buffer, range_offset, range_length,
+                        flags, timestamp));
 
             return NO_ERROR;
         }
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index cd9c991..297cb87 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1412,10 +1412,11 @@
             memcpy(info->mMem->pointer(), specific->mData, specific->mSize);
         }
 
-        mOMX->empty_buffer(
+        status_t err = mOMX->empty_buffer(
                 mNode, info->mBuffer, 0, size,
                 OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_CODECCONFIG,
                 0);
+        CHECK_EQ(err, OK);
 
         info->mOwnedByComponent = true;
 
@@ -1468,16 +1469,21 @@
         }
     }
 
-    mOMX->empty_buffer(
-            mNode, info->mBuffer, 0, srcLength,
-            flags, timestamp);
-
-    info->mOwnedByComponent = true;
-
     if (srcBuffer != NULL) {
         srcBuffer->release();
         srcBuffer = NULL;
     }
+
+    err = mOMX->empty_buffer(
+            mNode, info->mBuffer, 0, srcLength,
+            flags, timestamp);
+
+    if (err != OK) {
+        setState(ERROR);
+        return;
+    }
+
+    info->mOwnedByComponent = true;
 }
 
 void OMXCodec::fillOutputBuffer(BufferInfo *info) {
@@ -1490,7 +1496,8 @@
     }
 
     CODEC_LOGV("Calling fill_buffer on buffer %p", info->mBuffer);
-    mOMX->fill_buffer(mNode, info->mBuffer);
+    status_t err = mOMX->fill_buffer(mNode, info->mBuffer);
+    CHECK_EQ(err, OK);
 
     info->mOwnedByComponent = true;
 }
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 8b83dd6..bf876af 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -529,7 +529,7 @@
     return OK;
 }
 
-void OMX::fill_buffer(node_id node, buffer_id buffer) {
+status_t OMX::fill_buffer(node_id node, buffer_id buffer) {
     OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
     header->nFilledLen = 0;
     header->nOffset = 0;
@@ -539,10 +539,11 @@
 
     OMX_ERRORTYPE err =
         OMX_FillThisBuffer(node_meta->handle(), header);
-    CHECK_EQ(err, OMX_ErrorNone);
+
+    return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
 }
 
-void OMX::empty_buffer(
+status_t OMX::empty_buffer(
         node_id node,
         buffer_id buffer,
         OMX_U32 range_offset, OMX_U32 range_length,
@@ -561,7 +562,8 @@
 
     OMX_ERRORTYPE err =
         OMX_EmptyThisBuffer(node_meta->handle(), header);
-    CHECK_EQ(err, OMX_ErrorNone);
+
+    return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
 }
 
 status_t OMX::get_extension_index(
diff --git a/media/libstagefright/omx/OMX.h b/media/libstagefright/omx/OMX.h
index 6325f79..4c14dd9 100644
--- a/media/libstagefright/omx/OMX.h
+++ b/media/libstagefright/omx/OMX.h
@@ -70,9 +70,9 @@
     virtual status_t observe_node(
             node_id node, const sp<IOMXObserver> &observer);
 
-    virtual void fill_buffer(node_id node, buffer_id buffer);
+    virtual status_t fill_buffer(node_id node, buffer_id buffer);
 
-    virtual void empty_buffer(
+    virtual status_t empty_buffer(
             node_id node,
             buffer_id buffer,
             OMX_U32 range_offset, OMX_U32 range_length,