diff options
author | James Dong <jdong@google.com> | 2010-07-22 16:28:26 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-07-22 16:28:26 -0700 |
commit | 55cb2b8319e6b36e88658de121c534e95cd240b4 (patch) | |
tree | c6d266f434dacf09eeb964d05090088f78f4d3d2 /media/libstagefright/CameraSource.cpp | |
parent | f661058d77d1484e5911d1962f8e1e8466240687 (diff) | |
parent | 00fba4994e33d1b8384ff8bc2221c2de933f387e (diff) | |
download | frameworks_av-55cb2b8319e6b36e88658de121c534e95cd240b4.zip frameworks_av-55cb2b8319e6b36e88658de121c534e95cd240b4.tar.gz frameworks_av-55cb2b8319e6b36e88658de121c534e95cd240b4.tar.bz2 |
am 9bc4dc11: am 53d4e0d5: Allows the authoring engine to skip frame.
Merge commit '9bc4dc114fce58606a81d65d4cb31348cc7c1bae'
* commit '9bc4dc114fce58606a81d65d4cb31348cc7c1bae':
Allows the authoring engine to skip frame.
Diffstat (limited to 'media/libstagefright/CameraSource.cpp')
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index f4d269f..5e7dd5c 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -292,23 +292,44 @@ status_t CameraSource::read( { Mutex::Autolock autoLock(mLock); - while (mStarted && mFramesReceived.empty()) { - mFrameAvailableCondition.wait(mLock); - } - if (!mStarted) { - return OK; - } - frame = *mFramesReceived.begin(); - mFramesReceived.erase(mFramesReceived.begin()); + while (mStarted) { + while(mFramesReceived.empty()) { + mFrameAvailableCondition.wait(mLock); + } + + if (!mStarted) { + return OK; + } - frameTime = *mFrameTimes.begin(); - mFrameTimes.erase(mFrameTimes.begin()); + frame = *mFramesReceived.begin(); + mFramesReceived.erase(mFramesReceived.begin()); - mFramesBeingEncoded.push_back(frame); - *buffer = new MediaBuffer(frame->pointer(), frame->size()); - (*buffer)->setObserver(this); - (*buffer)->add_ref(); - (*buffer)->meta_data()->setInt64(kKeyTime, frameTime); + frameTime = *mFrameTimes.begin(); + mFrameTimes.erase(mFrameTimes.begin()); + int64_t skipTimeUs; + if (!options || !options->getSkipFrame(&skipTimeUs)) { + skipTimeUs = frameTime; + } + if (skipTimeUs > frameTime) { + LOGV("skipTimeUs: %lld us > frameTime: %lld us", + skipTimeUs, frameTime); + releaseOneRecordingFrame(frame); + ++mNumFramesDropped; + // Safeguard against the abuse of the kSkipFrame_Option. + if (skipTimeUs - frameTime >= 1E6) { + LOGE("Frame skipping requested is way too long: %lld us", + skipTimeUs - frameTime); + return UNKNOWN_ERROR; + } + } else { + mFramesBeingEncoded.push_back(frame); + *buffer = new MediaBuffer(frame->pointer(), frame->size()); + (*buffer)->setObserver(this); + (*buffer)->add_ref(); + (*buffer)->meta_data()->setInt64(kKeyTime, frameTime); + return OK; + } + } } return OK; } |