summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-11-15 10:38:37 -0800
committerJames Dong <jdong@google.com>2010-11-15 13:14:59 -0800
commitc42478ed7b8a379d2f8a43d4d349680c8a37573f (patch)
tree5e0130097b1017a6348c101a5093269a82431fd6
parentc2db5a15b819368c2c19099cc912c095a45e6bac (diff)
downloadframeworks_av-c42478ed7b8a379d2f8a43d4d349680c8a37573f.zip
frameworks_av-c42478ed7b8a379d2f8a43d4d349680c8a37573f.tar.gz
frameworks_av-c42478ed7b8a379d2f8a43d4d349680c8a37573f.tar.bz2
Fixed a race condition where some recording frames may not be released.
When startRecording() is called before setListener(), recording frames are sent right after startRecording(), but there is no listener to release the recording frames. This causes the hang in media server. bug - 3166356 Change-Id: I19366ca682ef9f6b847590c190c30a15ed32b8e4
-rw-r--r--camera/Camera.cpp3
-rw-r--r--media/libstagefright/CameraSource.cpp23
2 files changed, 6 insertions, 20 deletions
diff --git a/camera/Camera.cpp b/camera/Camera.cpp
index 148e864..450971d 100644
--- a/camera/Camera.cpp
+++ b/camera/Camera.cpp
@@ -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);
}
}
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index b8450fb..d9ff723 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -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;