diff options
author | Zhijun He <zhijunhe@google.com> | 2013-07-24 20:56:24 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-07-24 20:56:24 +0000 |
commit | 39a60318dcd78b2cb406d2c7dba57cbe9c99c3e7 (patch) | |
tree | 051b766a3e07e57eafb02d0ae9ed568591ea1b56 | |
parent | 2a65cc84b764c6c5f63d8631fd618f82b0421904 (diff) | |
parent | 2ab500c632569e2f131a1a2288459933da70c4ee (diff) | |
download | frameworks_av-39a60318dcd78b2cb406d2c7dba57cbe9c99c3e7.zip frameworks_av-39a60318dcd78b2cb406d2c7dba57cbe9c99c3e7.tar.gz frameworks_av-39a60318dcd78b2cb406d2c7dba57cbe9c99c3e7.tar.bz2 |
Merge "camera2: Implement ICameraDeviceUser::waitUntilIdle"
5 files changed, 45 insertions, 1 deletions
diff --git a/camera/photography/ICameraDeviceUser.cpp b/camera/photography/ICameraDeviceUser.cpp index 325f94d..95609da 100644 --- a/camera/photography/ICameraDeviceUser.cpp +++ b/camera/photography/ICameraDeviceUser.cpp @@ -40,6 +40,7 @@ enum { CREATE_STREAM, CREATE_DEFAULT_REQUEST, GET_CAMERA_INFO, + WAIT_UNTIL_IDLE, }; class BpCameraDeviceUser : public BpInterface<ICameraDeviceUser> @@ -172,6 +173,15 @@ public: return result; } + virtual status_t waitUntilIdle() + { + ALOGV("waitUntilIdle"); + Parcel data, reply; + data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); + remote()->transact(WAIT_UNTIL_IDLE, data, &reply); + reply.readExceptionCode(); + return reply.readInt32(); + } private: @@ -296,6 +306,12 @@ status_t BnCameraDeviceUser::onTransact( return NO_ERROR; } break; + case WAIT_UNTIL_IDLE: { + CHECK_INTERFACE(ICameraDeviceUser, data, reply); + reply->writeNoException(); + reply->writeInt32(waitUntilIdle()); + return NO_ERROR; + } break; default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/include/camera/photography/ICameraDeviceUser.h b/include/camera/photography/ICameraDeviceUser.h index 3ea49f4..45988d0 100644 --- a/include/camera/photography/ICameraDeviceUser.h +++ b/include/camera/photography/ICameraDeviceUser.h @@ -61,6 +61,8 @@ public: virtual status_t getCameraInfo(/*out*/ CameraMetadata* info) = 0; + // Wait until all the submitted requests have finished processing + virtual status_t waitUntilIdle() = 0; }; // ---------------------------------------------------------------------------- diff --git a/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp b/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp index f085443..0ec2b05 100644 --- a/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp +++ b/services/camera/libcameraservice/camera3/Camera3OutputStream.cpp @@ -304,7 +304,7 @@ status_t Camera3OutputStream::configureQueueLocked() { ALOGV("%s: Consumer wants %d buffers, HAL wants %d", __FUNCTION__, maxConsumerBuffers, camera3_stream::max_buffers); if (camera3_stream::max_buffers == 0) { - ALOGE("%s: Camera HAL requested no max_buffers, requires at least 1", + ALOGE("%s: Camera HAL requested max_buffer count: %d, requires at least 1", __FUNCTION__, camera3_stream::max_buffers); return INVALID_OPERATION; } diff --git a/services/camera/libcameraservice/photography/CameraDeviceClient.cpp b/services/camera/libcameraservice/photography/CameraDeviceClient.cpp index e1c7e79..dd845f6 100644 --- a/services/camera/libcameraservice/photography/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/photography/CameraDeviceClient.cpp @@ -412,6 +412,30 @@ status_t CameraDeviceClient::getCameraInfo(/*out*/CameraMetadata* info) return res; } +status_t CameraDeviceClient::waitUntilIdle() +{ + ATRACE_CALL(); + ALOGV("%s", __FUNCTION__); + + status_t res = OK; + if ( (res = checkPid(__FUNCTION__) ) != OK) return res; + + Mutex::Autolock icl(mBinderSerializationLock); + + if (!mDevice.get()) return DEAD_OBJECT; + + // FIXME: Also need check repeating burst. + if (!mStreamingRequestList.isEmpty()) { + ALOGE("%s: Camera %d: Try to waitUntilIdle when there are active streaming requests", + __FUNCTION__, mCameraId); + return INVALID_OPERATION; + } + res = mDevice->waitUntilDrained(); + ALOGV("%s Done", __FUNCTION__); + + return res; +} + status_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) { String8 result; result.appendFormat("CameraDeviceClient[%d] (%p) PID: %d, dump:\n", diff --git a/services/camera/libcameraservice/photography/CameraDeviceClient.h b/services/camera/libcameraservice/photography/CameraDeviceClient.h index c6c241a..bb2949c 100644 --- a/services/camera/libcameraservice/photography/CameraDeviceClient.h +++ b/services/camera/libcameraservice/photography/CameraDeviceClient.h @@ -87,6 +87,8 @@ public: // -- Caller owns the newly allocated metadata virtual status_t getCameraInfo(/*out*/CameraMetadata* info); + // Wait until all the submitted requests have finished processing + virtual status_t waitUntilIdle(); /** * Interface used by CameraService */ |