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;