stagefright: Add deferred release option

 * Fill in stub methods to improve video encoding performance.

Change-Id: I2bbf192e022043d161429c6cabf4a7d740802d20
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h
index 0dd5995..2a3df22 100644
--- a/include/media/stagefright/MetaData.h
+++ b/include/media/stagefright/MetaData.h
@@ -205,6 +205,10 @@
 
     kKeyPCMFormat         = 'pfmt',
     kKeyArbitraryMode     = 'ArbM',
+
+    // Indicate if it is OK to hold on to the MediaBuffer and not
+    // release it immediately
+    kKeyCanDeferRelease   = 'drel', // bool (int32_t)
 };
 
 enum {
diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h
index 968eb6d..b0e4bb5 100644
--- a/media/libavextensions/stagefright/AVExtensions.h
+++ b/media/libavextensions/stagefright/AVExtensions.h
@@ -36,10 +36,10 @@
 #include <media/mediarecorder.h>
 #include <media/IOMX.h>
 #include <media/AudioParameter.h>
+#include <media/stagefright/MetaData.h>
 
 namespace android {
 
-class MetaData;
 class MediaExtractor;
 class MPEG4Writer;
 struct ABuffer;
@@ -160,8 +160,14 @@
 
     virtual bool useQCHWEncoder(const sp<AMessage> &, AString &) { return false; }
 
-    virtual bool canDeferRelease(const sp<MetaData> &/*meta*/) { return false; }
-    virtual void setDeferRelease(sp<MetaData> &/*meta*/) {}
+    virtual bool canDeferRelease(const sp<MetaData> &meta) {
+        int32_t deferRelease = false;
+        return meta->findInt32(kKeyCanDeferRelease, &deferRelease) && deferRelease;
+    }
+
+    virtual void setDeferRelease(sp<MetaData> &meta) {
+        meta->setInt32(kKeyCanDeferRelease, true);
+    }
 
     struct HEVCMuxer {