OSDN Git Service

Fix crash in PMEM heap destructor due to sequencing issue.
authorDave Sparks <davidsparks@android.com>
Fri, 26 Jun 2009 02:27:59 +0000 (19:27 -0700)
committerDave Sparks <davidsparks@android.com>
Fri, 26 Jun 2009 15:36:46 +0000 (08:36 -0700)
Bug 1919195.

android/android_surface_output.cpp
android/android_surface_output.h

index 78797a9..570d68a 100644 (file)
@@ -68,7 +68,7 @@ status_t AndroidSurfaceOutput::setVideoSurface(const sp<ISurface>& surface)
     }
     mSurface = surface;
     // register buffers for the new surface
-    if ((mSurface != NULL) && (mFrameHeap != NULL)) {
+    if ((mSurface != NULL) && (mBufferHeap.heap != NULL)) {
         LOGV("registerBuffers from old surface");
         mSurface->registerBuffers(mBufferHeap);
     }
@@ -329,7 +329,7 @@ PVMFCommandId AndroidSurfaceOutput::Start(const OsclAny* aContext)
 void AndroidSurfaceOutput::postLastFrame()
 {
     // ignore if no surface or heap
-    if ((mSurface == NULL) || (mFrameHeap == NULL)) return;
+    if ((mSurface == NULL) || (mBufferHeap.heap == NULL)) return;
     mSurface->postBuffer(mFrameBuffers[mFrameBufferIndex]);
 }
 
@@ -970,14 +970,14 @@ OSCL_EXPORT_REF bool AndroidSurfaceOutput::initCheck()
     frameSize = frameWidth * frameHeight * 2;
 
     // create frame buffer heap and register with surfaceflinger
-    mFrameHeap = new MemoryHeapBase(frameSize * kBufferCount);
-    if (mFrameHeap->heapID() < 0) {
-    LOGE("Error creating frame buffer heap");
-    return false;
+    sp<MemoryHeapBase> heap = new MemoryHeapBase(frameSize * kBufferCount);
+    if (heap->heapID() < 0) {
+        LOGE("Error creating frame buffer heap");
+        return false;
     }
     
     mBufferHeap = ISurface::BufferHeap(displayWidth, displayHeight,
-            frameWidth, frameHeight, PIXEL_FORMAT_RGB_565, mFrameHeap);
+            frameWidth, frameHeight, PIXEL_FORMAT_RGB_565, heap);
     mSurface->registerBuffers(mBufferHeap);
 
     // create frame buffers
@@ -1006,9 +1006,9 @@ OSCL_EXPORT_REF bool AndroidSurfaceOutput::initCheck()
 OSCL_EXPORT_REF PVMFStatus AndroidSurfaceOutput::writeFrameBuf(uint8* aData, uint32 aDataLen, const PvmiMediaXferHeader& data_header_info)
 {
     // post to SurfaceFlinger
-    if ((mSurface != NULL) && (mFrameHeap != NULL)) {
+    if ((mSurface != NULL) && (mBufferHeap.heap != NULL)) {
         if (++mFrameBufferIndex == kBufferCount) mFrameBufferIndex = 0;
-        iColorConverter->Convert(aData, static_cast<uint8*>(mFrameHeap->base()) + mFrameBuffers[mFrameBufferIndex]);
+        iColorConverter->Convert(aData, static_cast<uint8*>(mBufferHeap.heap->base()) + mFrameBuffers[mFrameBufferIndex]);
         mSurface->postBuffer(mFrameBuffers[mFrameBufferIndex]);
     }
     return PVMFSuccess;
@@ -1032,8 +1032,8 @@ OSCL_EXPORT_REF void AndroidSurfaceOutput::closeFrameBuf()
     }
 
     // free heaps
-    LOGV("free mFrameHeap");
-    mFrameHeap.clear();
+    LOGV("free frame heap");
+    mBufferHeap.heap.clear();
 
     // free color converter
     if (iColorConverter != 0)
index 2604425..86eca96 100644 (file)
@@ -307,7 +307,6 @@ protected:
     // frame buffer support
     static const int kBufferCount = 2;
     int                         mFrameBufferIndex;
-    sp<MemoryHeapBase>          mFrameHeap;
     ISurface::BufferHeap        mBufferHeap;
     size_t                      mFrameBuffers[kBufferCount];