summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/CameraSource.cpp
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-07-22 16:28:26 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-07-22 16:28:26 -0700
commit55cb2b8319e6b36e88658de121c534e95cd240b4 (patch)
treec6d266f434dacf09eeb964d05090088f78f4d3d2 /media/libstagefright/CameraSource.cpp
parentf661058d77d1484e5911d1962f8e1e8466240687 (diff)
parent00fba4994e33d1b8384ff8bc2221c2de933f387e (diff)
downloadframeworks_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.cpp51
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;
}