OSDN Git Service

remote destructors are not synchronously executed by the binder...
authorAndreas Huber <andih@google.com>
Thu, 10 Dec 2009 23:32:12 +0000 (15:32 -0800)
committerAndreas Huber <andih@google.com>
Fri, 11 Dec 2009 16:39:42 +0000 (08:39 -0800)
media/libstagefright/AwesomePlayer.cpp

index a7a0a12..973815b 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "include/AwesomePlayer.h"
 
+#include <binder/IPCThreadState.h>
 #include <media/stagefright/AudioPlayer.h>
 #include <media/stagefright/DataSource.h>
 #include <media/stagefright/FileSource.h>
@@ -313,6 +314,12 @@ void AwesomePlayer::initRenderer_l() {
         CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
         CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
 
+        mVideoRenderer.clear();
+
+        // Must ensure that mVideoRenderer's destructor is actually executed
+        // before creating a new one.
+        IPCThreadState::self()->flushCommands();
+
         mVideoRenderer =
             mClient.interface()->createRenderer(
                     mISurface, component,
@@ -530,6 +537,12 @@ void AwesomePlayer::onEvent(int32_t code) {
                 return;
             }
 
+            if (mVideoBuffer->range_length() == 0) {
+                mVideoBuffer->release();
+                mVideoBuffer = NULL;
+                continue;
+            }
+
             break;
         }
     }