OSDN Git Service

Fix ordering of SurfaceTexture startup in SurfaceTextureSource.
authorEino-Ville Talvala <etalvala@google.com>
Thu, 17 Nov 2011 19:34:20 +0000 (11:34 -0800)
committerEino-Ville Talvala <etalvala@google.com>
Thu, 17 Nov 2011 20:17:45 +0000 (12:17 -0800)
An asynchronous SurfaceTexture only sends out a frame available
callback the first time a new buffer comes in; if a onFrameAvailable-
listener is not registered at this point, the callback never happens
even when new frames come in.

SurfaceTextureSource was calling its
onSurfaceTextureSourceReady-listener with a newly created
SurfaceTexture before hooking up the SurfaceTexture's
onFrameAvailable-listener. This opened a window of time for the
onSurfaceTextureSourceReady-listener to set up the provider end of the
SurfaceTexture, and for the provider to get buffers into the
SurfaceTexture queue before the onFrameAvailable-listener was
registered.

And as a result, no new frame callback ever fired, and
SurfaceTextureSource eventually times out, or goes into permanent
sleep.

This change simply makes sure the onFrameAvailable-listener is
registered before the onSurfaceTextureSourceReady callback is fired.

Bug: 5614661
Change-Id: I8d6a72444ffc36b5c48952d0b1edd530ecb76478

mca/filterpacks/videosrc/java/SurfaceTextureSource.java

index 29eaa01..37fa242 100644 (file)
@@ -181,10 +181,10 @@ public class SurfaceTextureSource extends Filter {
         if (mLogVerbose) Log.v(TAG, "Opening SurfaceTextureSource");
         // Create SurfaceTexture anew each time - it can use substantial memory.
         mSurfaceTexture = new SurfaceTexture(mMediaFrame.getTextureId());
-        // Connect SurfaceTexture to source
-        mSourceListener.onSurfaceTextureSourceReady(mSurfaceTexture);
         // Connect SurfaceTexture to callback
         mSurfaceTexture.setOnFrameAvailableListener(onFrameAvailableListener);
+        // Connect SurfaceTexture to source
+        mSourceListener.onSurfaceTextureSourceReady(mSurfaceTexture);
         mFirstFrame = true;
     }
 
@@ -258,7 +258,7 @@ public class SurfaceTextureSource extends Filter {
     private SurfaceTexture.OnFrameAvailableListener onFrameAvailableListener =
             new SurfaceTexture.OnFrameAvailableListener() {
         public void onFrameAvailable(SurfaceTexture surfaceTexture) {
-            if (mLogVerbose) Log.v(TAG, "New frame from SurfaceTextureSource");
+            if (mLogVerbose) Log.v(TAG, "New frame from SurfaceTexture");
             mNewFrameAvailable.open();
         }
     };