OSDN Git Service

DO NOT MERGE: 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>
Wed, 30 Nov 2011 21:47:34 +0000 (13:47 -0800)
Minimal cherry-pick from MR1.

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..c9efe76 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;
     }