summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/camera/Camera.cpp3
-rw-r--r--media/libstagefright/CameraSource.cpp23
2 files changed, 6 insertions, 20 deletions
diff --git a/libs/camera/Camera.cpp b/libs/camera/Camera.cpp
index 148e86407e4e..450971d39dba 100644
--- a/libs/camera/Camera.cpp
+++ b/libs/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 b8450fbf74b9..d9ff723f2e77 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;