auto import from //depot/cupcake/@137055
diff --git a/camera/libcameraservice/CameraHardwareStub.cpp b/camera/libcameraservice/CameraHardwareStub.cpp
index 9a47705..0f1ae8e 100644
--- a/camera/libcameraservice/CameraHardwareStub.cpp
+++ b/camera/libcameraservice/CameraHardwareStub.cpp
@@ -29,7 +29,8 @@
 
 CameraHardwareStub::CameraHardwareStub()
                   : mParameters(),
-                    mHeap(0),
+                    mPreviewHeap(0),
+                    mRawHeap(0),
                     mFakeCamera(0),
                     mPreviewFrameSize(0),
                     mRawPictureCallback(0),
@@ -62,13 +63,17 @@
 
 void CameraHardwareStub::initHeapLocked()
 {
-    int width, height;
-    mParameters.getPreviewSize(&width, &height);
+    // Create raw heap.
+    int picture_width, picture_height;
+    mParameters.getPictureSize(&picture_width, &picture_height);
+    mRawHeap = new MemoryHeapBase(picture_width * 2 * picture_height);
 
-    LOGD("initHeapLocked: preview size=%dx%d", width, height);
+    int preview_width, preview_height;
+    mParameters.getPreviewSize(&preview_width, &preview_height);
+    LOGD("initHeapLocked: preview size=%dx%d", preview_width, preview_height);
 
     // Note that we enforce yuv422 in setParameters().
-    int how_big = width * height * 2;
+    int how_big = preview_width * preview_height * 2;
 
     // If we are being reinitialized to the same size as before, no
     // work needs to be done.
@@ -79,15 +84,15 @@
 
     // Make a new mmap'ed heap that can be shared across processes. 
     // use code below to test with pmem
-    mHeap = new MemoryHeapBase(mPreviewFrameSize * kBufferCount);
+    mPreviewHeap = new MemoryHeapBase(mPreviewFrameSize * kBufferCount);
     // Make an IMemory for each frame so that we can reuse them in callbacks.
     for (int i = 0; i < kBufferCount; i++) {
-        mBuffers[i] = new MemoryBase(mHeap, i * mPreviewFrameSize, mPreviewFrameSize);
+        mBuffers[i] = new MemoryBase(mPreviewHeap, i * mPreviewFrameSize, mPreviewFrameSize);
     }
-
+    
     // Recreate the fake camera to reflect the current size.
     delete mFakeCamera;
-    mFakeCamera = new FakeCamera(width, height);
+    mFakeCamera = new FakeCamera(preview_width, preview_height);
 }
 
 CameraHardwareStub::~CameraHardwareStub()
@@ -99,7 +104,12 @@
 
 sp<IMemoryHeap> CameraHardwareStub::getPreviewHeap() const
 {
-    return mHeap;
+    return mPreviewHeap;
+}
+
+sp<IMemoryHeap> CameraHardwareStub::getRawHeap() const
+{
+    return mRawHeap;
 }
 
 // ---------------------------------------------------------------------------
@@ -114,7 +124,7 @@
         // Find the offset within the heap of the current buffer.
         ssize_t offset = mCurrentPreviewFrame * mPreviewFrameSize;
 
-        sp<MemoryHeapBase> heap = mHeap;
+        sp<MemoryHeapBase> heap = mPreviewHeap;
     
         // this assumes the internal state of fake camera doesn't change
         // (or is thread safe)
@@ -255,10 +265,9 @@
         // In the meantime just make another fake camera picture.
         int w, h;
         mParameters.getPictureSize(&w, &h);
-        sp<MemoryHeapBase> heap = new MemoryHeapBase(w * 2 * h);
-        sp<MemoryBase> mem = new MemoryBase(heap, 0, w * 2 * h);
+        sp<MemoryBase> mem = new MemoryBase(mRawHeap, 0, w * 2 * h);
         FakeCamera cam(w, h);
-        cam.getNextFrameAsYuv422((uint8_t *)heap->base());
+        cam.getNextFrameAsYuv422((uint8_t *)mRawHeap->base());
         if (mRawPictureCallback)
             mRawPictureCallback(mem, mPictureCallbackCookie);
     }