From: Igor Murashkin Date: Tue, 21 May 2013 18:38:49 +0000 (-0700) Subject: camera3: Fix recording failure when switching resolutions while preview on X-Git-Tag: android-x86-4.4-r1~23^2~1^2~31^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=82db9e6126812dd2ee74e33e4c475cae2c7e48f6;p=android-x86%2Fframeworks-av.git camera3: Fix recording failure when switching resolutions while preview on Bug: 9069574 Change-Id: Ife2ae5467f799dbe37e66714b3a6c9a51e1fe328 --- diff --git a/services/camera/libcameraservice/Camera2Client.cpp b/services/camera/libcameraservice/Camera2Client.cpp index 2e01dae1bd..dd50e3cb5f 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 status_t Camera2Client::updateProcessorStream(sp processor, camera2::Parameters params) { + // No default template arguments until C++11, so we need this overload + return updateProcessorStream( + processor, params); +} + +template +status_t Camera2Client::updateProcessorStream(sp processor, + Parameters params) { status_t res; - res = processor->updateStream(params); + // Get raw pointer since sp 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 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 f42d0220c4..8ab46b18df 100644 --- a/services/camera/libcameraservice/Camera2Client.h +++ b/services/camera/libcameraservice/Camera2Client.h @@ -161,6 +161,9 @@ private: template status_t updateProcessorStream(sp processor, Parameters params); + template + status_t updateProcessorStream(sp processor, Parameters params); sp mFrameProcessor; diff --git a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp index ab83714855..f4a92176b2 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);