Camera3: Remove unnecessary heap allocations

 Remove unneeded heap allocations that could
 lead to future leaks.

Bug: 13301331

Change-Id: Ib7671b88ddbe36575beaa8418c147ffaba3ef9de

Conflicts:
	QCamera2/HAL3/QCamera3Channel.cpp
	QCamera2/HAL3/QCamera3Channel.h
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index 589d616..cae05ea 100755
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -445,11 +445,8 @@
                     cam_stream_type_t stream_type) :
                         QCamera3Channel(cam_handle, cam_ops, cb_routine,
                                                 paddingInfo, userData),
-                        mMemory(NULL),
                         mCamera3Stream(stream),
                         mNumBufs(0),
-                        mRegisteredBuffers(0),
-                        mCamera3Buffers(NULL),
                         mStreamType(stream_type)
 {
 }
@@ -465,9 +462,7 @@
  *==========================================================================*/
 QCamera3RegularChannel::~QCamera3RegularChannel()
 {
-    if (mCamera3Buffers) {
-        delete[] mCamera3Buffers;
-    }
+    mCamera3Buffers.clear();
 }
 
 /*===========================================================================
@@ -505,11 +500,6 @@
     }
 
     mNumBufs = CAM_MAX_NUM_BUFS_PER_STREAM;
-    mCamera3Buffers = new buffer_handle_t*[mNumBufs];
-    if (mCamera3Buffers == NULL) {
-        ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
-        return -ENOMEM;
-    }
 
     if (mCamera3Stream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
         if (mStreamType ==  CAM_STREAM_TYPE_VIDEO) {
@@ -561,7 +551,7 @@
 {
     int32_t rc = NO_ERROR;
 
-    if (0 < mRegisteredBuffers) {
+    if (0 < mCamera3Buffers.size()) {
         rc = QCamera3Channel::start();
     }
 
@@ -583,7 +573,7 @@
     int32_t index;
     if(buffer == NULL)
         return NULL;
-    index = mMemory->getMatchBufIndex((void*)buffer);
+    index = mMemory.getMatchBufIndex((void*)buffer);
     if(index < 0) {
         ALOGE("%s: Could not find object among registered buffers",__func__);
         return NULL;
@@ -631,12 +621,7 @@
         ALOGV("%s: Request on an existing stream",__func__);
     }
 
-    if(!mMemory) {
-        ALOGE("%s: error, Gralloc Memory object not yet created for this stream",__func__);
-        return NO_MEMORY;
-    }
-
-    index = mMemory->getMatchBufIndex((void*)buffer);
+    index = mMemory.getMatchBufIndex((void*)buffer);
     if(index < 0) {
         rc = registerBuffer(buffer);
         if (NO_ERROR != rc) {
@@ -645,7 +630,7 @@
             return rc;
         }
 
-        index = mMemory->getMatchBufIndex((void*)buffer);
+        index = mMemory.getMatchBufIndex((void*)buffer);
         if (index < 0) {
             ALOGE("%s: Could not find object among registered buffers",
                     __func__);
@@ -659,7 +644,7 @@
         return rc;
     }
 
-    rc = mMemory->markFrameNumber(index, frameNumber);
+    rc = mMemory.markFrameNumber(index, frameNumber);
     return rc;
 }
 
@@ -679,7 +664,7 @@
 {
     int rc = 0;
 
-    if (mRegisteredBuffers > (mNumBufs - 1)) {
+    if (mCamera3Buffers.size() > (mNumBufs - 1)) {
         ALOGE("%s: Trying to register more buffers than initially requested",
                 __func__);
         return BAD_VALUE;
@@ -694,14 +679,7 @@
         }
     }
 
-    if(NULL == mMemory) {
-        mMemory = new QCamera3GrallocMemory();
-        if (mMemory == NULL) {
-            return NO_MEMORY;
-        }
-    }
-
-    rc = mMemory->registerBuffer(buffer);
+    rc = mMemory.registerBuffer(buffer);
     if (ALREADY_EXISTS == rc) {
         return NO_ERROR;
     } else if (NO_ERROR != rc) {
@@ -709,8 +687,7 @@
         return rc;
     }
 
-    mCamera3Buffers[mRegisteredBuffers] = buffer;
-    mRegisteredBuffers++;
+    mCamera3Buffers.add(buffer);
 
     return rc;
 }
@@ -751,7 +728,7 @@
 
     ////Use below data to issue framework callback
     resultBuffer = mCamera3Buffers[frameIndex];
-    resultFrameNumber = mMemory->getFrameNumber(frameIndex);
+    resultFrameNumber = mMemory.getFrameNumber(frameIndex);
 
     result.stream = mCamera3Stream;
     result.buffer = resultBuffer;
@@ -766,23 +743,12 @@
 
 QCamera3Memory* QCamera3RegularChannel::getStreamBufs(uint32_t /*len*/)
 {
-    if(NULL == mMemory) {
-        mMemory = new QCamera3GrallocMemory();
-        if (mMemory == NULL) {
-            return NULL;
-        }
-    }
-
-    return mMemory;
+    return &mMemory;
 }
 
 void QCamera3RegularChannel::putStreamBufs()
 {
-    if (NULL != mMemory) {
-        mMemory->unregisterBuffers();
-        delete mMemory;
-        mMemory = NULL;
-    }
+    mMemory.unregisterBuffers();
 }
 
 int QCamera3RegularChannel::kMaxBuffers = 7;
@@ -925,7 +891,7 @@
         convertToRaw16(super_frame->bufs[0]);
 
     //Make sure cache coherence because extra processing is done
-    mMemory->cleanInvalidateCache(super_frame->bufs[0]->buf_idx);
+    mMemory.cleanInvalidateCache(super_frame->bufs[0]->buf_idx);
 
     QCamera3RegularChannel::streamCbRoutine(super_frame, stream);
     return;
@@ -1055,14 +1021,14 @@
         char* jpeg_buf = (char *)p_output->buf_vaddr;
 
         // Gralloc provides a proper sized (no padding) buffer already.
-        maxJpegSize = obj->mMemory->getSize(obj->mCurrentBufIndex);
+        maxJpegSize = obj->mMemory.getSize(obj->mCurrentBufIndex);
         jpeg_eof = &jpeg_buf[maxJpegSize-sizeof(jpegHeader)];
         memcpy(jpeg_eof, &jpegHeader, sizeof(jpegHeader));
-        obj->mMemory->cleanInvalidateCache(obj->mCurrentBufIndex);
+        obj->mMemory.cleanInvalidateCache(obj->mCurrentBufIndex);
 
         ////Use below data to issue framework callback
         resultBuffer = obj->mCamera3Buffers[obj->mCurrentBufIndex];
-        resultFrameNumber = obj->mMemory->getFrameNumber(obj->mCurrentBufIndex);
+        resultFrameNumber = obj->mMemory.getFrameNumber(obj->mCurrentBufIndex);
 
         result.stream = obj->mCamera3Stream;
         result.buffer = resultBuffer;
@@ -1096,10 +1062,7 @@
                         m_postprocessor(this),
                         mCamera3Stream(stream),
                         mNumBufs(0),
-                        mCamera3Buffers(NULL),
                         mCurrentBufIndex(-1),
-                        mRegisteredBuffers(0),
-                        mMemory(NULL),
                         mYuvMemory(NULL),
                         mMetaFrame(NULL)
 {
@@ -1117,9 +1080,8 @@
     if (rc != 0) {
         ALOGE("De-init Postprocessor failed");
     }
-    if (mCamera3Buffers) {
-        delete[] mCamera3Buffers;
-    }
+
+    mCamera3Buffers.clear();
 }
 
 int32_t QCamera3PicChannel::initialize()
@@ -1159,14 +1121,7 @@
     streamDim.height = mYuvHeight;
 
     int num_buffers = 1;
-
     mNumBufs = CAM_MAX_NUM_BUFS_PER_STREAM;
-    mCamera3Buffers = new buffer_handle_t*[num_buffers];
-    if (mCamera3Buffers == NULL) {
-        ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
-        return -ENOMEM;
-    }
-
     rc = QCamera3Channel::addStream(streamType, streamFormat, streamDim,
             num_buffers);
 
@@ -1188,14 +1143,7 @@
         return NO_INIT;
     }
 
-    if(NULL == mMemory) {
-        mMemory = new QCamera3GrallocMemory();
-        if (mMemory == NULL) {
-            return NO_MEMORY;
-        }
-    }
-
-    index = mMemory->getMatchBufIndex((void*)buffer);
+    index = mMemory.getMatchBufIndex((void*)buffer);
     if(index < 0) {
         rc = registerBuffer(buffer);
         if (NO_ERROR != rc) {
@@ -1204,19 +1152,19 @@
             return rc;
         }
 
-        index = mMemory->getMatchBufIndex((void*)buffer);
+        index = mMemory.getMatchBufIndex((void*)buffer);
         if (index < 0) {
             ALOGE("%s: Could not find object among registered buffers",__func__);
             return DEAD_OBJECT;
         }
     }
-    rc = mMemory->markFrameNumber(index, frameNumber);
+    rc = mMemory.markFrameNumber(index, frameNumber);
 
     //Start the postprocessor for jpeg encoding. Pass mMemory as destination buffer
     mCurrentBufIndex = index;
 
     // Start postprocessor
-    m_postprocessor.start(mMemory, this, metadata);
+    m_postprocessor.start(&mMemory, this, metadata);
 
     // Queue jpeg settings
     rc = queueJpegSetting(index, metadata);
@@ -1301,7 +1249,7 @@
 {
     int rc = 0;
 
-    if (mRegisteredBuffers > (mNumBufs - 1)) {
+    if (mCamera3Buffers.size() > (mNumBufs - 1)) {
         ALOGE("%s: Trying to register more buffers than initially requested",
                 __func__);
         return BAD_VALUE;
@@ -1316,14 +1264,7 @@
         }
     }
 
-    if(NULL == mMemory) {
-        mMemory = new QCamera3GrallocMemory();
-        if (mMemory == NULL) {
-            return NO_MEMORY;
-        }
-    }
-
-    rc = mMemory->registerBuffer(buffer);
+    rc = mMemory.registerBuffer(buffer);
     if (ALREADY_EXISTS == rc) {
         return NO_ERROR;
     } else if (NO_ERROR != rc) {
@@ -1331,8 +1272,7 @@
         return rc;
     }
 
-    mCamera3Buffers[mRegisteredBuffers] = buffer;
-    mRegisteredBuffers++;
+    mCamera3Buffers.add(buffer);
 
     return rc;
 }
@@ -1391,18 +1331,6 @@
 {
     int rc = 0;
 
-    if (mNumBufs == 0 || mCamera3Buffers == NULL) {
-        ALOGE("%s: buffers not registered yet", __func__);
-        return NULL;
-    }
-
-    if(NULL == mMemory) {
-        mMemory = new QCamera3GrallocMemory();
-        if (mMemory == NULL) {
-            return NULL;
-        }
-    }
-
     mYuvMemory = new QCamera3HeapMemory();
     if (!mYuvMemory) {
         ALOGE("%s: unable to create metadata memory", __func__);
@@ -1422,11 +1350,7 @@
 
 void QCamera3PicChannel::putStreamBufs()
 {
-    if (NULL != mMemory) {
-        mMemory->unregisterBuffers();
-        delete mMemory;
-        mMemory = NULL;
-    }
+    mMemory.unregisterBuffers();
 
     mYuvMemory->deallocate();
     delete mYuvMemory;
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.h b/camera/QCamera2/HAL3/QCamera3Channel.h
index 6ae6be9..a7da610 100755
--- a/camera/QCamera2/HAL3/QCamera3Channel.h
+++ b/camera/QCamera2/HAL3/QCamera3Channel.h
@@ -35,6 +35,7 @@
 #include "QCamera3Mem.h"
 #include "QCamera3PostProc.h"
 #include "QCamera3HALHeader.h"
+#include "utils/Vector.h"
 
 extern "C" {
 #include <mm_camera_interface.h>
@@ -144,12 +145,11 @@
 public:
     static int kMaxBuffers;
 protected:
-    QCamera3GrallocMemory *mMemory;
+    QCamera3GrallocMemory mMemory;
 private:
     camera3_stream_t *mCamera3Stream;
     uint32_t mNumBufs;
-    uint32_t mRegisteredBuffers;
-    buffer_handle_t **mCamera3Buffers;
+    Vector<buffer_handle_t *> mCamera3Buffers;
 
     cam_stream_type_t mStreamType; // Stream type
 };
@@ -290,13 +290,12 @@
 private:
     camera3_stream_t *mCamera3Stream;
     uint32_t mNumBufs;
-    buffer_handle_t **mCamera3Buffers;
+    Vector<buffer_handle_t *> mCamera3Buffers;
     int32_t mCurrentBufIndex;
     bool m_bWNROn;
     uint32_t mYuvWidth, mYuvHeight;
-    uint32_t mRegisteredBuffers;
 
-    QCamera3GrallocMemory *mMemory;
+    QCamera3GrallocMemory mMemory;
     QCamera3HeapMemory *mYuvMemory;
     QCamera3Channel *m_pMetaChannel;
     mm_camera_super_buf_t *mMetaFrame;