summaryrefslogtreecommitdiffstats
path: root/services/camera
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2013-05-22 12:58:34 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-05-22 12:58:34 -0700
commitc7722457d9896c10fd33816fbea831852af68330 (patch)
treecc2ad7494f656937b939ed6d211d98158450d09a /services/camera
parent65e218ee5249d722a1af0bab6546709f3de62f8c (diff)
parentb7337d56a72c9b20abf57e853953126d0aa3dd1a (diff)
downloadframeworks_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.cpp20
-rw-r--r--services/camera/libcameraservice/Camera2Client.h3
-rw-r--r--services/camera/libcameraservice/camera2/StreamingProcessor.cpp8
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 &params, 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 &params) {
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);