diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2012-10-02 13:30:28 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-10-04 16:31:05 -0700 |
commit | 4c9eb718352697cd75269752344c0bcc6b05e708 (patch) | |
tree | fdc28a651a64b53e4cc14e3543347a2e64a80f38 /services/camera/libcameraservice/camera2/StreamingProcessor.cpp | |
parent | 1daada32f8eefd8951541ba243969b341deaaba5 (diff) | |
download | frameworks_av-4c9eb718352697cd75269752344c0bcc6b05e708.zip frameworks_av-4c9eb718352697cd75269752344c0bcc6b05e708.tar.gz frameworks_av-4c9eb718352697cd75269752344c0bcc6b05e708.tar.bz2 |
Camera2: Synchronize mode changes and triggers
Make sure that changes to various parameters have reached the HAL
before triggering asynchronous events like autofocus or precapture
metering.
Bug: 7107220
Change-Id: I3c50038de1671968eb32004ce538435121934e7e
Diffstat (limited to 'services/camera/libcameraservice/camera2/StreamingProcessor.cpp')
-rw-r--r-- | services/camera/libcameraservice/camera2/StreamingProcessor.cpp | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp index 8921172..207f780 100644 --- a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp @@ -33,7 +33,10 @@ namespace camera2 { StreamingProcessor::StreamingProcessor(wp<Camera2Client> client): mClient(client), + mActiveRequest(NONE), + mPreviewRequestId(Camera2Client::kPreviewRequestIdStart), mPreviewStreamId(NO_STREAM), + mRecordingRequestId(Camera2Client::kRecordingRequestIdStart), mRecordingStreamId(NO_STREAM), mRecordingHeapCount(kDefaultRecordingHeapCount) { @@ -90,7 +93,12 @@ status_t StreamingProcessor::updatePreviewRequest(const Parameters ¶ms) { } res = mPreviewRequest.update(ANDROID_REQUEST_ID, - &Camera2Client::kPreviewRequestId, 1); + &mPreviewRequestId, 1); + if (res != OK) { + ALOGE("%s: Camera %d: Unable to update request id for preview: %s (%d)", + __FUNCTION__, client->getCameraId(), strerror(-res), res); + return res; + } return OK; } @@ -190,7 +198,7 @@ status_t StreamingProcessor::deletePreviewStream() { return OK; } -status_t StreamingProcessor::getPreviewStreamId() const { +int StreamingProcessor::getPreviewStreamId() const { Mutex::Autolock m(mMutex); return mPreviewStreamId; } @@ -246,6 +254,14 @@ status_t StreamingProcessor::updateRecordingRequest(const Parameters ¶ms) { return res; } + res = mRecordingRequest.update(ANDROID_REQUEST_ID, + &mRecordingRequestId, 1); + if (res != OK) { + ALOGE("%s: Camera %d: Unable to update request id for request: %s (%d)", + __FUNCTION__, client->getCameraId(), strerror(-res), res); + return res; + } + return OK; } @@ -342,7 +358,7 @@ status_t StreamingProcessor::deleteRecordingStream() { return OK; } -status_t StreamingProcessor::getRecordingStreamId() const { +int StreamingProcessor::getRecordingStreamId() const { return mRecordingStreamId; } @@ -351,6 +367,8 @@ status_t StreamingProcessor::startStream(StreamType type, ATRACE_CALL(); status_t res; + if (type == NONE) return INVALID_OPERATION; + sp<Camera2Client> client = mClient.promote(); if (client == 0) return INVALID_OPERATION; @@ -384,6 +402,7 @@ status_t StreamingProcessor::startStream(StreamType type, __FUNCTION__, client->getCameraId(), strerror(-res), res); return res; } + mActiveRequest = type; return OK; } @@ -392,6 +411,8 @@ status_t StreamingProcessor::stopStream() { ATRACE_CALL(); status_t res; + Mutex::Autolock m(mMutex); + sp<Camera2Client> client = mClient.promote(); if (client == 0) return INVALID_OPERATION; sp<Camera2Device> device = client->getCameraDevice(); @@ -402,11 +423,38 @@ status_t StreamingProcessor::stopStream() { __FUNCTION__, client->getCameraId(), strerror(-res), res); return res; } - res = device->waitUntilDrained(); - if (res != OK) { - ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", - __FUNCTION__, client->getCameraId(), strerror(-res), res); - return res; + mActiveRequest = NONE; + + return OK; +} + +int32_t StreamingProcessor::getActiveRequestId() const { + Mutex::Autolock m(mMutex); + switch (mActiveRequest) { + case NONE: + return 0; + case PREVIEW: + return mPreviewRequestId; + case RECORD: + return mRecordingRequestId; + default: + ALOGE("%s: Unexpected mode %d", __FUNCTION__, mActiveRequest); + return 0; + } +} + +status_t StreamingProcessor::incrementStreamingIds() { + ATRACE_CALL(); + Mutex::Autolock m(mMutex); + + status_t res; + mPreviewRequestId++; + if (mPreviewRequestId >= Camera2Client::kPreviewRequestIdEnd) { + mPreviewRequestId = Camera2Client::kPreviewRequestIdStart; + } + mRecordingRequestId++; + if (mRecordingRequestId >= Camera2Client::kRecordingRequestIdEnd) { + mRecordingRequestId = Camera2Client::kRecordingRequestIdStart; } return OK; } |