am 1090a29d: Merge "Avoid repeatedly allocating and freeing memory in CameraSource" into kraken

This commit is contained in:
James Dong
2010-05-26 17:02:45 -07:00
committed by Android Git Automerger
2 changed files with 29 additions and 1 deletions

View File

@@ -19,6 +19,7 @@
#define CAMERA_SOURCE_H_ #define CAMERA_SOURCE_H_
#include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaSource.h> #include <media/stagefright/MediaSource.h>
#include <utils/List.h> #include <utils/List.h>
#include <utils/RefBase.h> #include <utils/RefBase.h>
@@ -61,6 +62,7 @@ private:
int32_t mNumFramesReceived; int32_t mNumFramesReceived;
int32_t mNumFramesEncoded; int32_t mNumFramesEncoded;
int32_t mNumFramesDropped; int32_t mNumFramesDropped;
MediaBufferGroup *mBufferGroup;
bool mStarted; bool mStarted;
CameraSource(const sp<Camera> &camera); CameraSource(const sp<Camera> &camera);

View File

@@ -104,6 +104,7 @@ CameraSource::CameraSource(const sp<Camera> &camera)
mNumFramesReceived(0), mNumFramesReceived(0),
mNumFramesEncoded(0), mNumFramesEncoded(0),
mNumFramesDropped(0), mNumFramesDropped(0),
mBufferGroup(NULL),
mStarted(false) { mStarted(false) {
String8 s = mCamera->getParameters(); String8 s = mCamera->getParameters();
printf("params: \"%s\"\n", s.string()); printf("params: \"%s\"\n", s.string());
@@ -118,6 +119,23 @@ CameraSource::~CameraSource() {
} }
} }
static int bytesPerPixelTimes10(const char *colorFormat) {
LOGI("color format: %s", colorFormat);
return 20;
#if 0
// XXX: Fix Camera Hal bug?
// On sholes, it returns CameraParameters::PIXEL_FORMAT_YUV420SP???
if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV422SP) ||
!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV422I) ||
!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_RGB565)) {
return 20;
} else if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV420SP)) {
return 15;
}
CHECK_EQ(0, "Unknown color format");
#endif
}
status_t CameraSource::start(MetaData *) { status_t CameraSource::start(MetaData *) {
LOGV("start"); LOGV("start");
CHECK(!mStarted); CHECK(!mStarted);
@@ -126,6 +144,12 @@ status_t CameraSource::start(MetaData *) {
CHECK_EQ(OK, mCamera->startRecording()); CHECK_EQ(OK, mCamera->startRecording());
mStarted = true; mStarted = true;
mBufferGroup = new MediaBufferGroup();
String8 s = mCamera->getParameters();
CameraParameters params(s);
const char *colorFormat = params.getPreviewFormat();
const int size = (mWidth * mHeight * bytesPerPixelTimes10(colorFormat))/10;
mBufferGroup->add_buffer(new MediaBuffer(size));
return OK; return OK;
} }
@@ -139,6 +163,8 @@ status_t CameraSource::stop() {
mCamera->stopRecording(); mCamera->stopRecording();
releaseQueuedFrames(); releaseQueuedFrames();
delete mBufferGroup;
mBufferGroup = NULL;
LOGI("Frames received/encoded/dropped: %d/%d/%d, timestamp (us) last/first: %lld/%lld", LOGI("Frames received/encoded/dropped: %d/%d/%d, timestamp (us) last/first: %lld/%lld",
mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped, mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped,
mLastFrameTimestampUs, mFirstFrameTimeUs); mLastFrameTimestampUs, mFirstFrameTimeUs);
@@ -197,7 +223,7 @@ status_t CameraSource::read(
++mNumFramesEncoded; ++mNumFramesEncoded;
} }
*buffer = new MediaBuffer(frame->size()); mBufferGroup->acquire_buffer(buffer);
memcpy((*buffer)->data(), frame->pointer(), frame->size()); memcpy((*buffer)->data(), frame->pointer(), frame->size());
(*buffer)->set_range(0, frame->size()); (*buffer)->set_range(0, frame->size());
mCamera->releaseRecordingFrame(frame); mCamera->releaseRecordingFrame(frame);