fix onFrameAvailable

Change-Id: I391fe9f6684ac9fd4f91416ce18b583f7087d966
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index 55b1a9c..d7c449c 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -385,6 +385,10 @@
 
 status_t SurfaceTexture::queueBuffer(int buf, int64_t timestamp) {
     LOGV("SurfaceTexture::queueBuffer");
+
+    sp<FrameAvailableListener> listener;
+
+    { // scope for the lock
     Mutex::Autolock lock(mMutex);
     if (buf < 0 || buf >= mBufferCount) {
         LOGE("queueBuffer: slot index out of range [0, %d]: %d",
@@ -403,6 +407,10 @@
         return -EINVAL;
     }
 
+    if (mQueue.empty()) {
+        listener = mFrameAvailableListener;
+    }
+
     if (mSynchronousMode) {
         // in synchronous mode we queue all buffers in a FIFO
         mQueue.push_back(buf);
@@ -423,11 +431,13 @@
     mSlots[buf].mLastQueuedCrop = mNextCrop;
     mSlots[buf].mLastQueuedTransform = mNextTransform;
     mSlots[buf].mLastQueuedTimestamp = timestamp;
-
-    if (mFrameAvailableListener != 0) {
-        mFrameAvailableListener->onFrameAvailable();
-    }
     mDequeueCondition.signal();
+    } // scope for the lock
+
+    // call back without lock held
+    if (listener != 0) {
+        listener->onFrameAvailable();
+    }
     return OK;
 }
 
@@ -463,6 +473,7 @@
 
 status_t SurfaceTexture::updateTexImage() {
     LOGV("SurfaceTexture::updateTexImage");
+
     Mutex::Autolock lock(mMutex);
 
     int buf = mCurrentTexture;
@@ -496,7 +507,7 @@
 
         GLint error;
         while ((error = glGetError()) != GL_NO_ERROR) {
-            LOGE("GL error cleared before updating SurfaceTexture: %#04x", error);
+            LOGW("updateTexImage: clearing GL error: %#04x", error);
         }
 
         GLenum target = getTextureTarget(mSlots[buf].mGraphicBuffer->format);
@@ -539,6 +550,11 @@
     return OK;
 }
 
+size_t SurfaceTexture::getQueuedCount() const {
+    Mutex::Autolock lock(mMutex);
+    return mQueue.size();
+}
+
 bool SurfaceTexture::isExternalFormat(uint32_t format)
 {
     switch (format) {