summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/CameraSource.cpp
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-10-09 01:16:58 -0700
committerJames Dong <jdong@google.com>2010-10-09 01:21:20 -0700
commit2b37ced30f89437c804c3945b901019b86d210ae (patch)
treededc3b20bb9d067758e5e87bdf957bc7801c86cd /media/libstagefright/CameraSource.cpp
parent54ff19ac69ace7c05ea90d225e26dab3b133f487 (diff)
downloadframeworks_av-2b37ced30f89437c804c3945b901019b86d210ae.zip
frameworks_av-2b37ced30f89437c804c3945b901019b86d210ae.tar.gz
frameworks_av-2b37ced30f89437c804c3945b901019b86d210ae.tar.bz2
0-memcpy video recording framework
Part III: Move startRecording() call earlier, asking camera hal to allocate video buffers before CameraSource.start() is called. Change-Id: I3f1d7d5636ca2644fe52af61f297d48c6b1ce89d
Diffstat (limited to 'media/libstagefright/CameraSource.cpp')
-rw-r--r--media/libstagefright/CameraSource.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index f7b76f8..1eb394a 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -451,6 +451,27 @@ status_t CameraSource::init(
// This CHECK is good, since we just passed the lock/unlock
// check earlier by calling mCamera->setParameters().
CHECK_EQ(OK, mCamera->setPreviewDisplay(mSurface));
+
+ /*
+ * mCamera->startRecording() signals camera hal to make
+ * available the video buffers (for instance, allocation
+ * of the video buffers may be triggered when camera hal's
+ * startRecording() method is called). Making available these
+ * video buffers earlier (before calling start()) is critical,
+ * if one wants to configure omx video encoders to use these
+ * buffers for passing video frame data during video recording
+ * without the need to memcpy the video frame data stored
+ * in these buffers. Eliminating memcpy for video frame data
+ * is crucial in performance for HD quality video recording
+ * applications.
+ *
+ * Based on OMX IL spec, configuring the omx video encoders
+ * must occur in loaded state. When start() is called, omx
+ * video encoders are already in idle state, which is too
+ * late. Thus, we must call mCamera->startRecording() earlier.
+ */
+ startCameraRecording();
+
IPCThreadState::self()->restoreCallingIdentity(token);
int64_t glitchDurationUs = (1000000LL / mVideoFrameRate);
@@ -478,6 +499,7 @@ CameraSource::~CameraSource() {
void CameraSource::startCameraRecording() {
CHECK_EQ(OK, mCamera->startRecording());
+ CHECK(mCamera->recordingEnabled());
}
status_t CameraSource::start(MetaData *meta) {
@@ -501,7 +523,6 @@ status_t CameraSource::start(MetaData *meta) {
int64_t token = IPCThreadState::self()->clearCallingIdentity();
mCamera->setListener(new CameraSourceListener(this));
- startCameraRecording();
IPCThreadState::self()->restoreCallingIdentity(token);
mStarted = true;