OSDN Git Service

camera3: Fix recording failure when switching resolutions while preview on
authorIgor Murashkin <iam@google.com>
Tue, 21 May 2013 18:38:49 +0000 (11:38 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Wed, 22 May 2013 17:30:23 +0000 (17:30 +0000)
Bug: 9069574
Change-Id: Ife2ae5467f799dbe37e66714b3a6c9a51e1fe328

services/camera/libcameraservice/Camera2Client.cpp
services/camera/libcameraservice/Camera2Client.h
services/camera/libcameraservice/camera2/StreamingProcessor.cpp

index 2e01dae..dd50e3c 100644 (file)
@@ -889,7 +889,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);
@@ -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)",
index f42d022..8ab46b1 100644 (file)
@@ -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;
 
index ab83714..f4a9217 100644 (file)
@@ -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);