diff options
| -rw-r--r-- | libs/camera/Camera.cpp | 3 | ||||
| -rw-r--r-- | media/libstagefright/CameraSource.cpp | 23 |
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; |