Merge "Fix log spamming during time lapse video recording" into ics-mr1

This commit is contained in:
James Dong
2011-11-21 20:28:27 -08:00
committed by Android (Google) Code Review
4 changed files with 18 additions and 14 deletions

View File

@@ -153,6 +153,9 @@ protected:
bool mStarted; bool mStarted;
int32_t mNumFramesEncoded; int32_t mNumFramesEncoded;
// Time between capture of two frames.
int64_t mTimeBetweenFrameCaptureUs;
CameraSource(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, CameraSource(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
int32_t cameraId, int32_t cameraId,
Size videoSize, int32_t frameRate, Size videoSize, int32_t frameRate,

View File

@@ -57,10 +57,6 @@ private:
int32_t mVideoWidth; int32_t mVideoWidth;
int32_t mVideoHeight; int32_t mVideoHeight;
// Time between capture of two frames during time lapse recording
// Negative value indicates that timelapse is disabled.
int64_t mTimeBetweenTimeLapseFrameCaptureUs;
// Time between two frames in final video (1/frameRate) // Time between two frames in final video (1/frameRate)
int64_t mTimeBetweenTimeLapseVideoFramesUs; int64_t mTimeBetweenTimeLapseVideoFramesUs;

View File

@@ -33,6 +33,8 @@
namespace android { namespace android {
static const int64_t CAMERA_SOURCE_TIMEOUT_NS = 3000000000LL;
struct CameraSourceListener : public CameraListener { struct CameraSourceListener : public CameraListener {
CameraSourceListener(const sp<CameraSource> &source); CameraSourceListener(const sp<CameraSource> &source);
@@ -156,6 +158,7 @@ CameraSource::CameraSource(
mLastFrameTimestampUs(0), mLastFrameTimestampUs(0),
mStarted(false), mStarted(false),
mNumFramesEncoded(0), mNumFramesEncoded(0),
mTimeBetweenFrameCaptureUs(0),
mFirstFrameTimeUs(0), mFirstFrameTimeUs(0),
mNumFramesDropped(0), mNumFramesDropped(0),
mNumGlitches(0), mNumGlitches(0),
@@ -644,7 +647,8 @@ status_t CameraSource::stop() {
releaseQueuedFrames(); releaseQueuedFrames();
while (!mFramesBeingEncoded.empty()) { while (!mFramesBeingEncoded.empty()) {
if (NO_ERROR != if (NO_ERROR !=
mFrameCompleteCondition.waitRelative(mLock, 3000000000LL)) { mFrameCompleteCondition.waitRelative(mLock,
mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) {
LOGW("Timed out waiting for outstanding frames being encoded: %d", LOGW("Timed out waiting for outstanding frames being encoded: %d",
mFramesBeingEncoded.size()); mFramesBeingEncoded.size());
} }
@@ -736,7 +740,8 @@ status_t CameraSource::read(
Mutex::Autolock autoLock(mLock); Mutex::Autolock autoLock(mLock);
while (mStarted && mFramesReceived.empty()) { while (mStarted && mFramesReceived.empty()) {
if (NO_ERROR != if (NO_ERROR !=
mFrameAvailableCondition.waitRelative(mLock, 1000000000LL)) { mFrameAvailableCondition.waitRelative(mLock,
mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) {
if (mCameraRecordingProxy != 0 && if (mCameraRecordingProxy != 0 &&
!mCameraRecordingProxy->asBinder()->isBinderAlive()) { !mCameraRecordingProxy->asBinder()->isBinderAlive()) {
LOGW("camera recording proxy is gone"); LOGW("camera recording proxy is gone");

View File

@@ -39,12 +39,12 @@ CameraSourceTimeLapse *CameraSourceTimeLapse::CreateFromCamera(
Size videoSize, Size videoSize,
int32_t videoFrameRate, int32_t videoFrameRate,
const sp<Surface>& surface, const sp<Surface>& surface,
int64_t timeBetweenTimeLapseFrameCaptureUs) { int64_t timeBetweenFrameCaptureUs) {
CameraSourceTimeLapse *source = new CameraSourceTimeLapse *source = new
CameraSourceTimeLapse(camera, proxy, cameraId, CameraSourceTimeLapse(camera, proxy, cameraId,
videoSize, videoFrameRate, surface, videoSize, videoFrameRate, surface,
timeBetweenTimeLapseFrameCaptureUs); timeBetweenFrameCaptureUs);
if (source != NULL) { if (source != NULL) {
if (source->initCheck() != OK) { if (source->initCheck() != OK) {
@@ -62,15 +62,15 @@ CameraSourceTimeLapse::CameraSourceTimeLapse(
Size videoSize, Size videoSize,
int32_t videoFrameRate, int32_t videoFrameRate,
const sp<Surface>& surface, const sp<Surface>& surface,
int64_t timeBetweenTimeLapseFrameCaptureUs) int64_t timeBetweenFrameCaptureUs)
: CameraSource(camera, proxy, cameraId, videoSize, videoFrameRate, surface, true), : CameraSource(camera, proxy, cameraId, videoSize, videoFrameRate, surface, true),
mTimeBetweenTimeLapseFrameCaptureUs(timeBetweenTimeLapseFrameCaptureUs),
mTimeBetweenTimeLapseVideoFramesUs(1E6/videoFrameRate), mTimeBetweenTimeLapseVideoFramesUs(1E6/videoFrameRate),
mLastTimeLapseFrameRealTimestampUs(0), mLastTimeLapseFrameRealTimestampUs(0),
mSkipCurrentFrame(false) { mSkipCurrentFrame(false) {
mTimeBetweenFrameCaptureUs = timeBetweenFrameCaptureUs;
LOGD("starting time lapse mode: %lld us", LOGD("starting time lapse mode: %lld us",
mTimeBetweenTimeLapseFrameCaptureUs); mTimeBetweenFrameCaptureUs);
mVideoWidth = videoSize.width; mVideoWidth = videoSize.width;
mVideoHeight = videoSize.height; mVideoHeight = videoSize.height;
@@ -271,14 +271,14 @@ bool CameraSourceTimeLapse::skipFrameAndModifyTimeStamp(int64_t *timestampUs) {
// The first 2 output frames from the encoder are: decoder specific info and // The first 2 output frames from the encoder are: decoder specific info and
// the compressed video frame data for the first input video frame. // the compressed video frame data for the first input video frame.
if (mNumFramesEncoded >= 1 && *timestampUs < if (mNumFramesEncoded >= 1 && *timestampUs <
(mLastTimeLapseFrameRealTimestampUs + mTimeBetweenTimeLapseFrameCaptureUs)) { (mLastTimeLapseFrameRealTimestampUs + mTimeBetweenFrameCaptureUs)) {
// Skip all frames from last encoded frame until // Skip all frames from last encoded frame until
// sufficient time (mTimeBetweenTimeLapseFrameCaptureUs) has passed. // sufficient time (mTimeBetweenFrameCaptureUs) has passed.
// Tell the camera to release its recording frame and return. // Tell the camera to release its recording frame and return.
LOGV("dataCallbackTimestamp timelapse: skipping intermediate frame"); LOGV("dataCallbackTimestamp timelapse: skipping intermediate frame");
return true; return true;
} else { } else {
// Desired frame has arrived after mTimeBetweenTimeLapseFrameCaptureUs time: // Desired frame has arrived after mTimeBetweenFrameCaptureUs time:
// - Reset mLastTimeLapseFrameRealTimestampUs to current time. // - Reset mLastTimeLapseFrameRealTimestampUs to current time.
// - Artificially modify timestampUs to be one frame time (1/framerate) ahead // - Artificially modify timestampUs to be one frame time (1/framerate) ahead
// of the last encoded frame's time stamp. // of the last encoded frame's time stamp.