Merge "Fixed a race condition where some recording frames may not be released."

This commit is contained in:
James Dong
2010-11-15 13:31:54 -08:00
committed by Android (Google) Code Review
2 changed files with 6 additions and 20 deletions

View File

@@ -372,6 +372,9 @@ void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<
}
if (listener != NULL) {
listener->postDataTimestamp(timestamp, msgType, dataPtr);
} else {
LOGW("No listener was set. Drop a recording frame.");
releaseRecordingFrame(dataPtr);
}
}

View File

@@ -495,26 +495,6 @@ status_t CameraSource::init(
mIsMetaDataStoredInVideoBuffers = true;
}
/*
* 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);
@@ -565,8 +545,11 @@ status_t CameraSource::start(MetaData *meta) {
mStartTimeUs = startTimeUs;
}
// Call setListener first before calling startCameraRecording()
// to avoid recording frames being dropped.
int64_t token = IPCThreadState::self()->clearCallingIdentity();
mCamera->setListener(new CameraSourceListener(this));
startCameraRecording();
IPCThreadState::self()->restoreCallingIdentity(token);
mStarted = true;