Stagefright: Use the ANW min undequeued bufs query.

This change modifies Stagefright's ANativeWindow initialization to use
the new MIN_UNDEQUEUED_BUFFERS query on the ANativeWindow.

Change-Id: I62565945e90ac40de326de77adcfa5577ed89975
Related-Bug: 3356050
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 5d502e7..1a37928 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1738,15 +1738,6 @@
         return err;
     }
 
-    // Increase the buffer count by one to allow for the ANativeWindow to hold
-    // on to one of the buffers.
-    def.nBufferCountActual++;
-    err = mOMX->setParameter(
-            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
-    if (err != OK) {
-        return err;
-    }
-
     err = applyRotation();
     if (err != OK) {
         return err;
@@ -1761,6 +1752,30 @@
         return err;
     }
 
+    int minUndequeuedBufs = 0;
+    err = mNativeWindow->query(mNativeWindow.get(),
+            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs);
+    if (err != 0) {
+        LOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)",
+                strerror(-err), -err);
+        return err;
+    }
+
+    // XXX: Is this the right logic to use?  It's not clear to me what the OMX
+    // buffer counts refer to - how do they account for the renderer holding on
+    // to buffers?
+    if (def.nBufferCountActual < def.nBufferCountMin + minUndequeuedBufs) {
+        OMX_U32 newBufferCount = def.nBufferCountMin + minUndequeuedBufs;
+        def.nBufferCountActual = newBufferCount;
+        err = mOMX->setParameter(
+                mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+        if (err != OK) {
+            CODEC_LOGE("setting nBufferCountActual to %lu failed: %d",
+                    newBufferCount, err);
+            return err;
+        }
+    }
+
     err = native_window_set_buffer_count(
             mNativeWindow.get(), def.nBufferCountActual);
     if (err != 0) {
@@ -1818,10 +1833,7 @@
         cancelEnd = i;
     } else {
         // Return the last two buffers to the native window.
-        // XXX TODO: The number of buffers the native window owns should probably be
-        // queried from it when we put the native window in fixed buffer pool mode
-        // (which needs to be implemented).  Currently it's hard-coded to 2.
-        cancelStart = def.nBufferCountActual - 2;
+        cancelStart = def.nBufferCountActual - minUndequeuedBufs;
         cancelEnd = def.nBufferCountActual;
     }