diff options
author | Igor Murashkin <iam@google.com> | 2013-05-22 19:54:28 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-05-22 19:54:28 +0000 |
commit | ed49d7b57e66cc2520817b345ef9de289d688bd4 (patch) | |
tree | a30203eb74abdce9bdae94ffdbfb7ee669b3779d /services | |
parent | c2c874d88df1b4be52f5415de6606785691bba1f (diff) | |
parent | 82db9e6126812dd2ee74e33e4c475cae2c7e48f6 (diff) | |
download | frameworks_av-ed49d7b57e66cc2520817b345ef9de289d688bd4.zip frameworks_av-ed49d7b57e66cc2520817b345ef9de289d688bd4.tar.gz frameworks_av-ed49d7b57e66cc2520817b345ef9de289d688bd4.tar.bz2 |
Merge "camera3: Fix recording failure when switching resolutions while preview on" into jb-mr2-dev
Diffstat (limited to 'services')
-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 2e01dae..dd50e3c 100644 --- a/services/camera/libcameraservice/Camera2Client.cpp +++ b/services/camera/libcameraservice/Camera2Client.cpp @@ -889,7 +889,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); @@ -1608,9 +1611,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? @@ -1631,7 +1645,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 f42d022..8ab46b1 100644 --- a/services/camera/libcameraservice/Camera2Client.h +++ b/services/camera/libcameraservice/Camera2Client.h @@ -161,6 +161,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); |