1 /*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "NdkCameraCaptureSession"
19 #define ATRACE_TAG ATRACE_TAG_CAMERA
20
21 #include <utils/Log.h>
22 #include <utils/Mutex.h>
23 #include <utils/StrongPointer.h>
24 #include <utils/Trace.h>
25
26 #include "NdkCameraDevice.h"
27 #include <NdkCaptureRequest.h>
28 #include <NdkCameraCaptureSession.h>
29 #include "impl/ACameraCaptureSession.h"
30
31 using namespace android;
32
33 EXPORT
ACameraCaptureSession_close(ACameraCaptureSession * session)34 void ACameraCaptureSession_close(ACameraCaptureSession* session) {
35 ATRACE_CALL();
36 if (session != nullptr) {
37 session->closeByApp();
38 }
39 return;
40 }
41
42 EXPORT
ACameraCaptureSession_getDevice(ACameraCaptureSession * session,ACameraDevice ** device)43 camera_status_t ACameraCaptureSession_getDevice(
44 ACameraCaptureSession* session, ACameraDevice **device) {
45 ATRACE_CALL();
46 if (session == nullptr || device == nullptr) {
47 ALOGE("%s: Error: invalid input: session %p, device %p",
48 __FUNCTION__, session, device);
49 return ACAMERA_ERROR_INVALID_PARAMETER;
50 }
51
52 if (session->isClosed()) {
53 ALOGE("%s: session %p is already closed", __FUNCTION__, session);
54 *device = nullptr;
55 return ACAMERA_ERROR_SESSION_CLOSED;
56 }
57
58 *device = session->getDevice();
59 if (*device == nullptr) {
60 // Should not reach here
61 ALOGE("%s: unknown failure: device is null", __FUNCTION__);
62 return ACAMERA_ERROR_UNKNOWN;
63 }
64 return ACAMERA_OK;
65 }
66
67 EXPORT
ACameraCaptureSession_capture(ACameraCaptureSession * session,ACameraCaptureSession_captureCallbacks * cbs,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)68 camera_status_t ACameraCaptureSession_capture(
69 ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
70 int numRequests, ACaptureRequest** requests,
71 /*optional*/int* captureSequenceId) {
72 ATRACE_CALL();
73 if (session == nullptr || requests == nullptr || numRequests < 1) {
74 ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p",
75 __FUNCTION__, session, numRequests, requests);
76 return ACAMERA_ERROR_INVALID_PARAMETER;
77 }
78
79 if (session->isClosed()) {
80 ALOGE("%s: session %p is already closed", __FUNCTION__, session);
81 *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
82 return ACAMERA_ERROR_SESSION_CLOSED;
83 }
84
85 return session->capture(cbs, numRequests, requests, captureSequenceId);
86 }
87
88 EXPORT
ACameraCaptureSession_setRepeatingRequest(ACameraCaptureSession * session,ACameraCaptureSession_captureCallbacks * cbs,int numRequests,ACaptureRequest ** requests,int * captureSequenceId)89 camera_status_t ACameraCaptureSession_setRepeatingRequest(
90 ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
91 int numRequests, ACaptureRequest** requests,
92 /*optional*/int* captureSequenceId) {
93 ATRACE_CALL();
94 if (session == nullptr || requests == nullptr || numRequests < 1) {
95 ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p",
96 __FUNCTION__, session, numRequests, requests);
97 return ACAMERA_ERROR_INVALID_PARAMETER;
98 }
99
100 if (session->isClosed()) {
101 ALOGE("%s: session %p is already closed", __FUNCTION__, session);
102 *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
103 return ACAMERA_ERROR_SESSION_CLOSED;
104 }
105
106 return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId);
107 }
108
109 EXPORT
ACameraCaptureSession_stopRepeating(ACameraCaptureSession * session)110 camera_status_t ACameraCaptureSession_stopRepeating(ACameraCaptureSession* session) {
111 ATRACE_CALL();
112 if (session == nullptr) {
113 ALOGE("%s: Error: session is null", __FUNCTION__);
114 return ACAMERA_ERROR_INVALID_PARAMETER;
115 }
116
117 if (session->isClosed()) {
118 ALOGE("%s: session %p is already closed", __FUNCTION__, session);
119 return ACAMERA_ERROR_SESSION_CLOSED;
120 }
121 return session->stopRepeating();
122 }
123
124 EXPORT
ACameraCaptureSession_abortCaptures(ACameraCaptureSession * session)125 camera_status_t ACameraCaptureSession_abortCaptures(ACameraCaptureSession* session) {
126 ATRACE_CALL();
127 if (session == nullptr) {
128 ALOGE("%s: Error: session is null", __FUNCTION__);
129 return ACAMERA_ERROR_INVALID_PARAMETER;
130 }
131
132 if (session->isClosed()) {
133 ALOGE("%s: session %p is already closed", __FUNCTION__, session);
134 return ACAMERA_ERROR_SESSION_CLOSED;
135 }
136 return session->abortCaptures();
137 }
138