am 1090a29d: Merge "Avoid repeatedly allocating and freeing memory in CameraSource" into kraken
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user