SurfaceTexture: Fully refactored from BufferQueue

SurfaceTexture and BufferQueue are separate objects.

Change-Id: I230bc0ae6f78d0f9b2b5df902f40ab443ed5a055
diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp
index 54ee6ce..0f9c7c5 100644
--- a/libs/gui/BufferQueue.cpp
+++ b/libs/gui/BufferQueue.cpp
@@ -83,7 +83,10 @@
     mConnectedApi(NO_CONNECTED_API),
     mAbandoned(false),
     mFrameCounter(0),
-    mBufferHasBeenQueued(false)
+    mBufferHasBeenQueued(false),
+    mDefaultBufferFormat(0),
+    mConsumerUsageBits(0),
+    mTransformHint(0)
 {
     // Choose a name using the PID and a process-unique ID.
     mConsumerName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());
@@ -128,6 +131,7 @@
         // dequeueBuffer.
 
         mServerBufferCount = bufferCount;
+        mDequeueCondition.broadcast();
     }
     return OK;
 }
@@ -149,6 +153,24 @@
     mFrameAvailableListener = listener;
 }
 
+status_t BufferQueue::setDefaultBufferFormat(uint32_t defaultFormat) {
+    Mutex::Autolock lock(mMutex);
+    mDefaultBufferFormat = defaultFormat;
+    return OK;
+}
+
+status_t BufferQueue::setConsumerUsageBits(uint32_t usage) {
+    Mutex::Autolock lock(mMutex);
+    mConsumerUsageBits = usage;
+    return OK;
+}
+
+status_t BufferQueue::setTransformHint(uint32_t hint) {
+    Mutex::Autolock lock(mMutex);
+    mTransformHint = hint;
+    return OK;
+}
+
 status_t BufferQueue::setBufferCount(int bufferCount) {
     ST_LOGV("setBufferCount: count=%d", bufferCount);
     Mutex::Autolock lock(mMutex);
@@ -263,6 +285,12 @@
     { // Scope for the lock
         Mutex::Autolock lock(mMutex);
 
+        if (format == 0) {
+            format = mDefaultBufferFormat;
+        }
+        // turn on usage bits the consumer requested
+        usage |= mConsumerUsageBits;
+
         int found = -1;
         int foundSync = -1;
         int dequeuedCount = 0;
@@ -563,7 +591,7 @@
 
         *outWidth = mDefaultWidth;
         *outHeight = mDefaultHeight;
-        *outTransform = 0;
+        *outTransform = mTransformHint;
 
         ATRACE_INT(mConsumerName.string(), mQueue.size());
     } // scope for the lock
@@ -846,7 +874,8 @@
         ATRACE_INT(mConsumerName.string(), mQueue.size());
     }
     else {
-        return -EINVAL; //should be a better return code
+        // should be a better return code?
+        return -EINVAL;
     }
 
     return OK;
@@ -880,9 +909,10 @@
 
 status_t BufferQueue::consumerDisconnect() {
     Mutex::Autolock lock(mMutex);
-    // Once the SurfaceTexture disconnects, the BufferQueue
-    // is considered abandoned
+
     mAbandoned = true;
+
+    mQueue.clear();
     freeAllBuffersLocked();
     mDequeueCondition.broadcast();
     return OK;