diff options
author | Igor Murashkin <iam@google.com> | 2013-05-22 12:58:34 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-05-22 12:58:34 -0700 |
commit | c7722457d9896c10fd33816fbea831852af68330 (patch) | |
tree | cc2ad7494f656937b939ed6d211d98158450d09a /services/camera | |
parent | 65e218ee5249d722a1af0bab6546709f3de62f8c (diff) | |
parent | b7337d56a72c9b20abf57e853953126d0aa3dd1a (diff) | |
download | frameworks_av-c7722457d9896c10fd33816fbea831852af68330.zip frameworks_av-c7722457d9896c10fd33816fbea831852af68330.tar.gz frameworks_av-c7722457d9896c10fd33816fbea831852af68330.tar.bz2 |
am b7337d56: am ed49d7b5: Merge "camera3: Fix recording failure when switching resolutions while preview on" into jb-mr2-dev
* commit 'b7337d56a72c9b20abf57e853953126d0aa3dd1a':
camera3: Fix recording failure when switching resolutions while preview on
Diffstat (limited to 'services/camera')
-rw-r--r-- | services/camera/libcameraservice/Camera2Client.cpp | 20 | ||||
-rw-r--r-- | services/camera/libcameraservice/Camera2Client.h | 3 | ||||
-rw-r--r-- | services/camera/libcameraservice/camera2/StreamingProcessor.cpp | 8 |
3 files changed, 27 insertions, 4 deletions
diff --git a/services/camera/libcameraservice/Camera2Client.cpp b/services/camera/libcameraservice/Camera2Client.cpp index 871c273..391960e 100644 --- a/services/camera/libcameraservice/Camera2Client.cpp +++ b/services/camera/libcameraservice/Camera2Client.cpp @@ -958,7 +958,10 @@ status_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { } } - res = mStreamingProcessor->updateRecordingStream(params); + res = updateProcessorStream< + StreamingProcessor, + &StreamingProcessor::updateRecordingStream>(mStreamingProcessor, + params); if (res != OK) { ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); @@ -1679,9 +1682,20 @@ status_t Camera2Client::syncWithDevice() { template <typename ProcessorT> status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, camera2::Parameters params) { + // No default template arguments until C++11, so we need this overload + return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>( + processor, params); +} + +template <typename ProcessorT, + status_t (ProcessorT::*updateStreamF)(const Parameters &)> +status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, + Parameters params) { status_t res; - res = processor->updateStream(params); + // Get raw pointer since sp<T> doesn't have operator->* + ProcessorT *processorPtr = processor.get(); + res = (processorPtr->*updateStreamF)(params); /** * Can't update the stream if it's busy? @@ -1702,7 +1716,7 @@ status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor, __FUNCTION__, mCameraId, strerror(-res), res); } - res = processor->updateStream(params); + res = (processorPtr->*updateStreamF)(params); if (res != OK) { ALOGE("%s: Camera %d: Failed to update processing stream " " despite having halted streaming first: %s (%d)", diff --git a/services/camera/libcameraservice/Camera2Client.h b/services/camera/libcameraservice/Camera2Client.h index 9dec50f..078e3a3 100644 --- a/services/camera/libcameraservice/Camera2Client.h +++ b/services/camera/libcameraservice/Camera2Client.h @@ -164,6 +164,9 @@ private: template <typename ProcessorT> status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params); + template <typename ProcessorT, + status_t (ProcessorT::*updateStreamF)(const Parameters &)> + status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params); sp<camera2::FrameProcessor> mFrameProcessor; diff --git a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp index ab83714..f4a9217 100644 --- a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp @@ -316,7 +316,13 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters ¶ms) { currentHeight != (uint32_t)params.videoHeight) { // TODO: Should wait to be sure previous recording has finished res = device->deleteStream(mRecordingStreamId); - if (res != OK) { + + if (res == -EBUSY) { + ALOGV("%s: Camera %d: Device is busy, call " + "updateRecordingStream after it becomes idle", + __FUNCTION__, mId); + return res; + } else if (res != OK) { ALOGE("%s: Camera %d: Unable to delete old output stream " "for recording: %s (%d)", __FUNCTION__, mId, strerror(-res), res); |