summaryrefslogtreecommitdiffstats
path: root/services/camera/libcameraservice/device3
diff options
context:
space:
mode:
authorJianing Wei <jianingwei@google.com>2014-03-12 18:29:36 -0700
committerJianing Wei <jianingwei@google.com>2014-03-21 16:12:24 -0700
commit90e59c98c343e941b1a75307ffa4b4b5f1eb50d6 (patch)
treee7fa81cc62b2dd7fbaa30d059b7faacc9633e7b6 /services/camera/libcameraservice/device3
parenta44148187c21d431aec7c7a6915f0fad2c44cd70 (diff)
downloadframeworks_av-90e59c98c343e941b1a75307ffa4b4b5f1eb50d6.zip
frameworks_av-90e59c98c343e941b1a75307ffa4b4b5f1eb50d6.tar.gz
frameworks_av-90e59c98c343e941b1a75307ffa4b4b5f1eb50d6.tar.bz2
CameraService: Add support for burst capture and repeating burst.
Bug: 10749500 Change-Id: I292a485b222e5cf97388d76bf0d956a6ac54bb2f
Diffstat (limited to 'services/camera/libcameraservice/device3')
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.cpp106
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.h12
2 files changed, 118 insertions, 0 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index da3e121..a700f30 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -388,6 +388,45 @@ const CameraMetadata& Camera3Device::info() const {
return mDeviceInfo;
}
+status_t Camera3Device::checkStatusOkToCaptureLocked() {
+ switch (mStatus) {
+ case STATUS_ERROR:
+ CLOGE("Device has encountered a serious error");
+ return INVALID_OPERATION;
+ case STATUS_UNINITIALIZED:
+ CLOGE("Device not initialized");
+ return INVALID_OPERATION;
+ case STATUS_UNCONFIGURED:
+ case STATUS_CONFIGURED:
+ case STATUS_ACTIVE:
+ // OK
+ break;
+ default:
+ SET_ERR_L("Unexpected status: %d", mStatus);
+ return INVALID_OPERATION;
+ }
+ return OK;
+}
+
+status_t Camera3Device::convertMetadataListToRequestListLocked(
+ const List<const CameraMetadata> &metadataList, RequestList *requestList) {
+ if (requestList == NULL) {
+ CLOGE("requestList cannot be NULL.");
+ return BAD_VALUE;
+ }
+
+ for (List<const CameraMetadata>::const_iterator it = metadataList.begin();
+ it != metadataList.end(); ++it) {
+ sp<CaptureRequest> newRequest = setUpRequestLocked(*it);
+ if (newRequest == 0) {
+ CLOGE("Can't create capture request");
+ return BAD_VALUE;
+ }
+ requestList->push_back(newRequest);
+ }
+ return OK;
+}
+
status_t Camera3Device::capture(CameraMetadata &request) {
ATRACE_CALL();
status_t res;
@@ -428,10 +467,59 @@ status_t Camera3Device::capture(CameraMetadata &request) {
kActiveTimeout/1e9);
}
ALOGV("Camera %d: Capture request enqueued", mId);
+ } else {
+ CLOGE("Cannot queue request. Impossible."); // queueRequest always returns OK.
+ return BAD_VALUE;
}
return res;
}
+status_t Camera3Device::submitRequestsHelper(
+ const List<const CameraMetadata> &requests, bool repeating) {
+ ATRACE_CALL();
+ Mutex::Autolock il(mInterfaceLock);
+ Mutex::Autolock l(mLock);
+
+ status_t res = checkStatusOkToCaptureLocked();
+ if (res != OK) {
+ // error logged by previous call
+ return res;
+ }
+
+ RequestList requestList;
+
+ res = convertMetadataListToRequestListLocked(requests, /*out*/&requestList);
+ if (res != OK) {
+ // error logged by previous call
+ return res;
+ }
+
+ if (repeating) {
+ res = mRequestThread->setRepeatingRequests(requestList);
+ } else {
+ res = mRequestThread->queueRequestList(requestList);
+ }
+
+ if (res == OK) {
+ waitUntilStateThenRelock(/*active*/true, kActiveTimeout);
+ if (res != OK) {
+ SET_ERR_L("Can't transition to active in %f seconds!",
+ kActiveTimeout/1e9);
+ }
+ ALOGV("Camera %d: Capture request enqueued", mId);
+ } else {
+ CLOGE("Cannot queue request. Impossible.");
+ return BAD_VALUE;
+ }
+
+ return res;
+}
+
+status_t Camera3Device::captureList(const List<const CameraMetadata> &requests) {
+ ATRACE_CALL();
+
+ return submitRequestsHelper(requests, /*repeating*/false);
+}
status_t Camera3Device::setStreamingRequest(const CameraMetadata &request) {
ATRACE_CALL();
@@ -478,6 +566,11 @@ status_t Camera3Device::setStreamingRequest(const CameraMetadata &request) {
return res;
}
+status_t Camera3Device::setStreamingRequestList(const List<const CameraMetadata> &requests) {
+ ATRACE_CALL();
+
+ return submitRequestsHelper(requests, /*repeating*/true);
+}
sp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
const CameraMetadata &request) {
@@ -1913,6 +2006,19 @@ status_t Camera3Device::RequestThread::queueRequest(
return OK;
}
+status_t Camera3Device::RequestThread::queueRequestList(
+ List<sp<CaptureRequest> > &requests) {
+ Mutex::Autolock l(mRequestLock);
+ for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end();
+ ++it) {
+ mRequestQueue.push_back(*it);
+ }
+
+ unpauseForNewRequests();
+
+ return OK;
+}
+
status_t Camera3Device::RequestThread::queueTrigger(
RequestTrigger trigger[],
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 468f641..bbdb65d 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -79,7 +79,9 @@ class Camera3Device :
// Capture and setStreamingRequest will configure streams if currently in
// idle state
virtual status_t capture(CameraMetadata &request);
+ virtual status_t captureList(const List<const CameraMetadata> &requests);
virtual status_t setStreamingRequest(const CameraMetadata &request);
+ virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests);
virtual status_t clearStreamingRequest();
virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
@@ -202,6 +204,14 @@ class Camera3Device :
};
typedef List<sp<CaptureRequest> > RequestList;
+ status_t checkStatusOkToCaptureLocked();
+
+ status_t convertMetadataListToRequestListLocked(
+ const List<const CameraMetadata> &metadataList,
+ /*out*/RequestList *requestList);
+
+ status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating);
+
/**
* Get the last request submitted to the hal by the request thread.
*
@@ -313,6 +323,8 @@ class Camera3Device :
status_t queueRequest(sp<CaptureRequest> request);
+ status_t queueRequestList(List<sp<CaptureRequest> > &requests);
+
/**
* Remove all queued and repeating requests, and pending triggers
*/