blob: e804f7768915b3f41ca93cd9ae4e1938d13c76bf [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
2 * Copyright (C) 2012 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
Eino-Ville Talvala852c3812012-09-24 09:46:53 -070017#define LOG_TAG "Camera2"
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070018#define ATRACE_TAG ATRACE_TAG_CAMERA
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070019//#define LOG_NDEBUG 0
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070020
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070021#include <utils/Log.h>
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070022#include <utils/Trace.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070023
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
James Painterc3dbf1a2012-09-05 18:02:32 -070027#include "camera2/Parameters.h"
James Painterfe140e82012-09-07 16:36:50 -070028#include "Camera2Client.h"
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070029
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
31#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
32
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070033namespace android {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070034using namespace camera2;
35
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070036static int getCallingPid() {
37 return IPCThreadState::self()->getCallingPid();
38}
39
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070040// Interface used by CameraService
41
42Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
43 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070044 int cameraId,
45 int cameraFacing,
Igor Murashkin8dcdb952012-10-02 16:05:11 -070046 int clientPid,
47 int servicePid):
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070048 Client(cameraService, cameraClient,
Igor Murashkin8dcdb952012-10-02 16:05:11 -070049 cameraId, cameraFacing, clientPid, servicePid),
Eino-Ville Talvala177bd342012-08-28 01:25:43 -070050 mSharedCameraClient(cameraClient),
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -070051 mParameters(cameraId, cameraFacing)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070052{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070053 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070054 ALOGI("Camera %d: Opened", cameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070055
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070056 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -070057
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070058 SharedParameters::Lock l(mParameters);
59 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070060}
61
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070062status_t Camera2Client::checkPid(const char* checkLocation) const {
63 int callingPid = getCallingPid();
Eino-Ville Talvala61704882012-10-09 22:16:58 -070064 if (callingPid == mClientPid) return NO_ERROR;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070065
66 ALOGE("%s: attempt to use a locked camera from a different process"
Eino-Ville Talvala61704882012-10-09 22:16:58 -070067 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070068 return PERMISSION_DENIED;
69}
70
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070071status_t Camera2Client::initialize(camera_module_t *module)
72{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070073 ATRACE_CALL();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070074 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070075 status_t res;
76
77 res = mDevice->initialize(module);
78 if (res != OK) {
79 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
80 __FUNCTION__, mCameraId, strerror(-res), res);
81 return NO_INIT;
82 }
83
Eino-Ville Talvala174181e2012-08-03 13:53:39 -070084 res = mDevice->setNotifyCallback(this);
85
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070086 SharedParameters::Lock l(mParameters);
87
88 res = l.mParameters.initialize(&(mDevice->info()));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070089 if (res != OK) {
90 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
91 __FUNCTION__, mCameraId, strerror(-res), res);
92 return NO_INIT;
93 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070094
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070095 String8 threadName;
Eino-Ville Talvala177bd342012-08-28 01:25:43 -070096
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -070097 mStreamingProcessor = new StreamingProcessor(this);
98
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070099 mFrameProcessor = new FrameProcessor(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700100 threadName = String8::format("C2-%d-FrameProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700101 mCameraId);
102 mFrameProcessor->run(threadName.string());
103
104 mCaptureSequencer = new CaptureSequencer(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700105 threadName = String8::format("C2-%d-CaptureSeq",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700106 mCameraId);
107 mCaptureSequencer->run(threadName.string());
108
109 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700110 threadName = String8::format("C2-%d-JpegProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700111 mCameraId);
112 mJpegProcessor->run(threadName.string());
113
114 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700115 threadName = String8::format("C2-%d-ZslProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700116 mCameraId);
117 mZslProcessor->run(threadName.string());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700118
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700119 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700120 threadName = String8::format("C2-%d-CallbkProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700121 mCameraId);
122 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700123
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700124 if (gLogLevel >= 1) {
125 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
126 mCameraId);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700127 ALOGD("%s", l.mParameters.paramsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700128 }
129
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700130 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700131}
132
133Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700134 ATRACE_CALL();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700135
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700136 mDestructionStarted = true;
137
Eino-Ville Talvala61704882012-10-09 22:16:58 -0700138 disconnect();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700139
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700140 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700141}
142
143status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700144 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700145 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700146 mCameraId,
147 getCameraClient()->asBinder().get(),
148 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700149 result.append(" State: ");
150#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
151
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700152 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700153
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700154 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700155
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700156 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700157 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700158 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700159 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700160 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700161 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700162 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700163 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700164 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700165 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700166 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700167 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700168 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700169 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700170 p.jpegQuality, p.jpegThumbQuality);
171 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700172 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700173 p.gpsEnabled ? "enabled" : "disabled");
174 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700175 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700176 p.gpsCoordinates[0], p.gpsCoordinates[1],
177 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700178 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700179 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700180 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700181 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700182 }
183
184 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700185 switch (p.wbMode) {
Igor Murashkin2d2b40b2012-11-27 16:25:46 -0800186 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
187 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
188 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
189 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
190 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
191 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
192 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
193 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700194 default: result.append("UNKNOWN\n");
195 }
196
197 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700198 switch (p.effectMode) {
Igor Murashkin2d2b40b2012-11-27 16:25:46 -0800199 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
200 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
201 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
202 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
203 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
204 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
205 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
206 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
207 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700208 default: result.append("UNKNOWN\n");
209 }
210
211 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700212 switch (p.antibandingMode) {
Igor Murashkin2d2b40b2012-11-27 16:25:46 -0800213 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
214 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
215 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
216 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700217 default: result.append("UNKNOWN\n");
218 }
219
220 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700221 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700222 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
223 result.append("AUTO\n"); break;
224 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
225 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
226 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
227 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
228 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
229 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
230 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
231 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
232 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
233 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
234 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
235 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
236 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
237 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
238 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
239 default: result.append("UNKNOWN\n");
240 }
241
242 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700243 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700244 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
245 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
246 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
247 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
248 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
249 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
250 default: result.append("UNKNOWN\n");
251 }
252
253 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700254 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700255 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
256 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
257 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
258 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
259 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
260 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
261 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
262 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
263 default: result.append("UNKNOWN\n");
264 }
265
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -0700266 result.append(" Focus state: ");
267 switch (p.focusState) {
268 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
269 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
270 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
271 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
272 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
273 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
274 default: result.append("UNKNOWN\n");
275 }
276
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700277 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700278 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700279 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700280 p.focusingAreas[i].left,
281 p.focusingAreas[i].top,
282 p.focusingAreas[i].right,
283 p.focusingAreas[i].bottom,
284 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700285 }
286
287 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700288 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700289
290 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700291 p.autoExposureLock ? "enabled" : "disabled",
292 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700293
294 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700295 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700296 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700297 p.meteringAreas[i].left,
298 p.meteringAreas[i].top,
299 p.meteringAreas[i].right,
300 p.meteringAreas[i].bottom,
301 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700302 }
303
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700304 result.appendFormat(" Zoom index: %d\n", p.zoom);
305 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
306 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700307
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700308 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700309 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700310
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700311 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700312 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700313
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700314 result.append(" Current streams:\n");
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700315 result.appendFormat(" Preview stream ID: %d\n",
316 getPreviewStreamId());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700317 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700318 getCaptureStreamId());
319 result.appendFormat(" Recording stream ID: %d\n",
320 getRecordingStreamId());
Eino-Ville Talvala596cb972012-10-02 18:14:49 -0700321
322 result.append(" Quirks for this camera:\n");
323 bool haveQuirk = false;
324 if (p.quirks.triggerAfWithAuto) {
325 result.appendFormat(" triggerAfWithAuto\n");
326 haveQuirk = true;
327 }
328 if (p.quirks.useZslFormat) {
329 result.appendFormat(" useZslFormat\n");
330 haveQuirk = true;
331 }
Igor Murashkin3a6e4532012-09-28 15:30:03 -0700332 if (p.quirks.meteringCropRegion) {
333 result.appendFormat(" meteringCropRegion\n");
334 haveQuirk = true;
335 }
Eino-Ville Talvala596cb972012-10-02 18:14:49 -0700336 if (!haveQuirk) {
337 result.appendFormat(" none\n");
338 }
339
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700340 write(fd, result.string(), result.size());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700341
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700342 mStreamingProcessor->dump(fd, args);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700343
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700344 mCaptureSequencer->dump(fd, args);
345
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700346 mFrameProcessor->dump(fd, args);
347
Eino-Ville Talvala22745492012-09-17 17:55:07 -0700348 mZslProcessor->dump(fd, args);
349
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700350 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700351 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700352
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700353 status_t res = mDevice->dump(fd, args);
354 if (res != OK) {
355 result = String8::format(" Error dumping device: %s (%d)",
356 strerror(-res), res);
357 write(fd, result.string(), result.size());
358 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700359
360#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700361 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700362}
363
364// ICamera interface
365
366void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700367 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700368 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61704882012-10-09 22:16:58 -0700369
370 // Allow both client and the media server to disconnect at all times
371 int callingPid = getCallingPid();
372 if (callingPid != mClientPid && callingPid != mServicePid) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700373
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700374 if (mDevice == 0) return;
375
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700376 ALOGV("Camera %d: Shutting down", mCameraId);
377
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700378 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700379
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700380 {
381 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala61704882012-10-09 22:16:58 -0700382 if (l.mParameters.state == Parameters::DISCONNECTED) return;
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700383 l.mParameters.state = Parameters::DISCONNECTED;
384 }
385
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700386 mStreamingProcessor->deletePreviewStream();
387 mStreamingProcessor->deleteRecordingStream();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700388 mJpegProcessor->deleteStream();
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700389 mCallbackProcessor->deleteStream();
Eino-Ville Talvala7d8b92b2012-09-05 19:02:43 -0700390 mZslProcessor->deleteStream();
391
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700392 mFrameProcessor->requestExit();
393 mCaptureSequencer->requestExit();
394 mJpegProcessor->requestExit();
395 mZslProcessor->requestExit();
396 mCallbackProcessor->requestExit();
397
398 ALOGV("Camera %d: Waiting for threads", mCameraId);
399
400 mFrameProcessor->join();
401 mCaptureSequencer->join();
402 mJpegProcessor->join();
403 mZslProcessor->join();
404 mCallbackProcessor->join();
405
406 ALOGV("Camera %d: Disconnecting device", mCameraId);
407
408 mDevice->disconnect();
409
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700410 mDevice.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700411
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700412 CameraService::Client::disconnect();
413}
414
415status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700416 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700417 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700418 Mutex::Autolock icl(mICameraLock);
419
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700420 if (mClientPid != 0 && getCallingPid() != mClientPid) {
421 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
422 "current locked to pid %d", __FUNCTION__,
423 mCameraId, getCallingPid(), mClientPid);
424 return BAD_VALUE;
425 }
426
427 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700428
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700429 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700430 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700431
432 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700433}
434
435status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700436 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700437 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700438 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700439 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
440 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700441
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700442 if (mClientPid == 0) {
443 mClientPid = getCallingPid();
444 return OK;
445 }
446
447 if (mClientPid != getCallingPid()) {
448 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
449 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
450 return EBUSY;
451 }
452
453 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700454}
455
456status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700457 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700458 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700459 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700460 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
461 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700462
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700463 if (mClientPid == getCallingPid()) {
Eino-Ville Talvalacfee40e2012-10-10 15:28:53 -0700464 SharedParameters::Lock l(mParameters);
465 if (l.mParameters.state == Parameters::RECORD ||
466 l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
467 ALOGD("Not allowed to unlock camera during recording.");
468 return INVALID_OPERATION;
469 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700470 mClientPid = 0;
471 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700472 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700473 return OK;
474 }
475
476 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
477 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
478 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700479}
480
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700481status_t Camera2Client::setPreviewDisplay(
482 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700483 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700484 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700485 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700486 status_t res;
487 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700488
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700489 sp<IBinder> binder;
490 sp<ANativeWindow> window;
491 if (surface != 0) {
492 binder = surface->asBinder();
493 window = surface;
494 }
495
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700496 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700497}
498
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700499status_t Camera2Client::setPreviewTexture(
500 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700501 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700502 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700503 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700504 status_t res;
505 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700506
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700507 sp<IBinder> binder;
508 sp<ANativeWindow> window;
509 if (surfaceTexture != 0) {
510 binder = surfaceTexture->asBinder();
511 window = new SurfaceTextureClient(surfaceTexture);
512 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700513 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700514}
515
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700516status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700517 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700518 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700519 status_t res;
520
521 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700522 ALOGV("%s: Camera %d: New window is same as old window",
523 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700524 return NO_ERROR;
525 }
526
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700527 Parameters::State state;
528 {
529 SharedParameters::Lock l(mParameters);
530 state = l.mParameters.state;
531 }
532 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700533 case Parameters::DISCONNECTED:
534 case Parameters::RECORD:
535 case Parameters::STILL_CAPTURE:
536 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700537 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700538 __FUNCTION__, mCameraId,
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700539 Parameters::getStateName(state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700540 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700541 case Parameters::STOPPED:
542 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700543 // OK
544 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700545 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700546 // Already running preview - need to stop and create a new stream
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700547 mStreamingProcessor->stopStream();
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700548 state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700549 break;
550 }
551
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700552 mPreviewSurface = binder;
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700553 res = mStreamingProcessor->setPreviewWindow(window);
554 if (res != OK) {
555 ALOGE("%s: Unable to set new preview window: %s (%d)",
556 __FUNCTION__, strerror(-res), res);
557 return res;
558 }
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700559
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700560 if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
561 SharedParameters::Lock l(mParameters);
562 l.mParameters.state = state;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700563 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700564 }
565
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700566 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700567}
568
569void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700570 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700571 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700572 Mutex::Autolock icl(mICameraLock);
Igor Murashkinebe3f692012-10-12 16:56:11 -0700573
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700574 if ( checkPid(__FUNCTION__) != OK) return;
575
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700576 SharedParameters::Lock l(mParameters);
577 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700578}
579
580void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
581 status_t res = OK;
582 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
583 ALOGV("%s: setting oneshot", __FUNCTION__);
584 params.previewCallbackOneShot = true;
585 }
586 if (params.previewCallbackFlags != (uint32_t)flag) {
587 params.previewCallbackFlags = flag;
588 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700589 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700590 res = startPreviewL(params, true);
591 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700592 case Parameters::RECORD:
593 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700594 res = startRecordingL(params, true);
595 break;
596 default:
597 break;
598 }
599 if (res != OK) {
600 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700601 __FUNCTION__, mCameraId,
602 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700603 }
604 }
605
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700606}
607
608status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700609 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700610 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700611 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700612 status_t res;
613 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700614 SharedParameters::Lock l(mParameters);
615 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700616}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700617
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700618status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700619 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700620 status_t res;
Igor Murashkin0cb290b2012-10-02 19:07:14 -0700621
622 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
623
Eino-Ville Talvala411ddcc2012-10-10 17:17:01 -0700624 if ( (params.state == Parameters::PREVIEW ||
625 params.state == Parameters::RECORD ||
626 params.state == Parameters::VIDEO_SNAPSHOT)
627 && !restart) {
628 // Succeed attempt to re-enter a streaming state
629 ALOGI("%s: Camera %d: Preview already active, ignoring restart",
630 __FUNCTION__, mCameraId);
Alex Ray71d64542012-09-26 15:52:50 -0700631 return OK;
632 }
633 if (params.state > Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700634 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700635 __FUNCTION__,
636 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700637 return INVALID_OPERATION;
638 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700639
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700640 if (!mStreamingProcessor->haveValidPreviewWindow()) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700641 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700642 return OK;
643 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700644 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700645
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700646 res = mStreamingProcessor->updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700647 if (res != OK) {
648 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
649 __FUNCTION__, mCameraId, strerror(-res), res);
650 return res;
651 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700652
653 Vector<uint8_t> outputStreams;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700654 bool callbacksEnabled = params.previewCallbackFlags &
655 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
656 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700657 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700658 if (res != OK) {
659 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
660 __FUNCTION__, mCameraId, strerror(-res), res);
661 return res;
662 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700663 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700664 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700665 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700666 res = mZslProcessor->updateStream(params);
667 if (res != OK) {
668 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
669 __FUNCTION__, mCameraId, strerror(-res), res);
670 return res;
671 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700672 outputStreams.push(getZslStreamId());
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700673 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700674
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700675 outputStreams.push(getPreviewStreamId());
676
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700677 if (!params.recordingHint) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700678 if (!restart) {
679 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700680 if (res != OK) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700681 ALOGE("%s: Camera %d: Can't set up preview request: "
682 "%s (%d)", __FUNCTION__, mCameraId,
683 strerror(-res), res);
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700684 return res;
685 }
686 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700687 res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
688 outputStreams);
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700689 } else {
690 // With recording hint set, we're going to be operating under the
691 // assumption that the user will record video. To optimize recording
692 // startup time, create the necessary output streams for recording and
693 // video snapshot now if they don't already exist.
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700694 res = mJpegProcessor->updateStream(params);
695 if (res != OK) {
696 ALOGE("%s: Camera %d: Can't pre-configure still image "
697 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700698 __FUNCTION__, mCameraId, strerror(-res), res);
699 return res;
700 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700701
702 if (!restart) {
703 res = mStreamingProcessor->updateRecordingRequest(params);
704 if (res != OK) {
705 ALOGE("%s: Camera %d: Can't set up preview request with "
706 "record hint: %s (%d)", __FUNCTION__, mCameraId,
707 strerror(-res), res);
708 return res;
709 }
710 }
711 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
712 outputStreams);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700713 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700714 if (res != OK) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700715 ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700716 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700717 return res;
718 }
719
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700720 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700721 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700722}
723
724void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700725 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700726 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700727 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700728 status_t res;
729 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700730 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700731}
732
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700733void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700734 ATRACE_CALL();
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700735 status_t res;
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700736 const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700737 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700738 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700739 SharedParameters::Lock l(mParameters);
740 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700741 }
742
743 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700744 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700745 ALOGE("%s: Camera %d: Call before initialized",
746 __FUNCTION__, mCameraId);
747 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700748 case Parameters::STOPPED:
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700749 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700750 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700751 mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
752 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700753 case Parameters::RECORD:
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700754 case Parameters::PREVIEW:
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700755 mStreamingProcessor->stopStream();
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700756 res = mDevice->waitUntilDrained();
757 if (res != OK) {
758 ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
759 __FUNCTION__, mCameraId, strerror(-res), res);
760 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700761 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700762 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
763 SharedParameters::Lock l(mParameters);
764 l.mParameters.state = Parameters::STOPPED;
765 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700766 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700767 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700768 default:
769 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700770 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700771 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700772}
773
774bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700775 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700776 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700777 status_t res;
778 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
779
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700780 SharedParameters::Lock l(mParameters);
781 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700782}
783
784status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700785 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700786 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700787 status_t res;
788 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
789
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700790 SharedParameters::Lock l(mParameters);
791 switch (l.mParameters.state) {
792 case Parameters::RECORD:
793 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700794 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700795 __FUNCTION__, mCameraId,
796 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700797 return INVALID_OPERATION;
798 default:
799 // OK
800 break;
801 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700802
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700803 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700804
805 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700806}
807
808status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700809 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700810 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700811 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700812 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700813 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700814 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700815
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700816 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700817}
818
819status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
820 status_t res;
Igor Murashkin0cb290b2012-10-02 19:07:14 -0700821
822 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
823
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700824 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700825 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700826 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700827 if (res != OK) return res;
828 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700829 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700830 // Ready to go
831 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700832 case Parameters::RECORD:
833 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700834 // OK to call this when recording is already on, just skip unless
835 // we're looking to restart
836 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700837 break;
838 default:
839 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700840 __FUNCTION__, mCameraId,
841 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700842 return INVALID_OPERATION;
843 };
844
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700845 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700846 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
847 "non-metadata recording mode requested!", __FUNCTION__,
848 mCameraId);
849 return INVALID_OPERATION;
850 }
851
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700852 if (!restart) {
853 mCameraService->playSound(CameraService::SOUND_RECORDING);
854 mStreamingProcessor->updateRecordingRequest(params);
855 if (res != OK) {
856 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
857 __FUNCTION__, mCameraId, strerror(-res), res);
858 return res;
859 }
860 }
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700861
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700862 res = mStreamingProcessor->updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700863 if (res != OK) {
864 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
865 __FUNCTION__, mCameraId, strerror(-res), res);
866 return res;
867 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700868
869 Vector<uint8_t> outputStreams;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700870 bool callbacksEnabled = params.previewCallbackFlags &
871 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
872 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700873 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700874 if (res != OK) {
875 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
876 __FUNCTION__, mCameraId, strerror(-res), res);
877 return res;
878 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700879 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700880 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700881 outputStreams.push(getPreviewStreamId());
882 outputStreams.push(getRecordingStreamId());
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700883
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700884 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
885 outputStreams);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700886 if (res != OK) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700887 ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700888 __FUNCTION__, mCameraId, strerror(-res), res);
889 return res;
890 }
891
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700892 if (params.state < Parameters::RECORD) {
893 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700894 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700895
896 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700897}
898
899void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700900 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700901 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700902 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700903 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700904
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700905 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700906 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
907
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700908 switch (l.mParameters.state) {
909 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700910 // OK to stop
911 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700912 case Parameters::STOPPED:
913 case Parameters::PREVIEW:
914 case Parameters::STILL_CAPTURE:
915 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700916 default:
917 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700918 __FUNCTION__, mCameraId,
919 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700920 return;
921 };
922
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700923 mCameraService->playSound(CameraService::SOUND_RECORDING);
924
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700925 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700926 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700927 ALOGE("%s: Camera %d: Unable to return to preview",
928 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700929 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700930}
931
932bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700933 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700934 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700935
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700936 if ( checkPid(__FUNCTION__) != OK) return false;
937
James Dong8da4cd72012-08-04 19:58:07 -0700938 return recordingEnabledL();
939}
940
941bool Camera2Client::recordingEnabledL() {
942 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700943 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700944
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700945 return (l.mParameters.state == Parameters::RECORD
946 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700947}
948
949void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700950 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700951 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700952 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700953
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700954 mStreamingProcessor->releaseRecordingFrame(mem);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700955}
956
957status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700958 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700959 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -0700960 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700961 status_t res;
962 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
963
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700964 int triggerId;
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -0700965 bool notifyImmediately = false;
966 bool notifySuccess = false;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700967 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700968 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700969 if (l.mParameters.state < Parameters::PREVIEW) {
970 return INVALID_OPERATION;
971 }
972
Igor Murashkin5b44bee2012-10-08 18:05:12 -0700973 /**
974 * If the camera does not support auto-focus, it is a no-op and
975 * onAutoFocus(boolean, Camera) callback will be called immediately
976 * with a fake value of success set to true.
977 */
978 if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED) {
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -0700979 notifyImmediately = true;
980 notifySuccess = true;
981 }
982 /**
983 * If we're in CAF mode, and AF has already been locked, just fire back
984 * the callback right away; the HAL would not send a notification since
985 * no state change would happen on a AF trigger.
986 */
987 if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
988 l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
989 l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
990 notifyImmediately = true;
991 notifySuccess = true;
992 }
993 /**
994 * Send immediate notification back to client
995 */
996 if (notifyImmediately) {
Igor Murashkin5b44bee2012-10-08 18:05:12 -0700997 SharedCameraClient::Lock l(mSharedCameraClient);
998 if (l.mCameraClient != 0) {
999 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001000 notifySuccess ? 1 : 0, 0);
Igor Murashkin5b44bee2012-10-08 18:05:12 -07001001 }
Igor Murashkin5b44bee2012-10-08 18:05:12 -07001002 return OK;
1003 }
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001004 /**
1005 * Handle quirk mode for AF in scene modes
1006 */
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001007 if (l.mParameters.quirks.triggerAfWithAuto &&
1008 l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
Eino-Ville Talvala65dc3fc2012-10-16 12:58:21 -07001009 l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1010 !l.mParameters.focusingAreas[0].isEmpty()) {
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001011 ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
1012 __FUNCTION__, l.mParameters.focusMode);
1013 l.mParameters.shadowFocusMode = l.mParameters.focusMode;
1014 l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1015 updateRequests(l.mParameters);
1016 }
1017
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001018 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1019 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001020 }
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001021 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001022
1023 mDevice->triggerAutofocus(triggerId);
1024
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001025 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001026}
1027
1028status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001029 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001030 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001031 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001032 status_t res;
1033 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1034
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001035 int triggerId;
1036 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001037 SharedParameters::Lock l(mParameters);
1038 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001039
1040 // When using triggerAfWithAuto quirk, may need to reset focus mode to
Eino-Ville Talvala65dc3fc2012-10-16 12:58:21 -07001041 // the real state at this point. No need to cancel explicitly if
1042 // changing the AF mode.
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001043 if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
1044 ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
1045 l.mParameters.shadowFocusMode);
1046 l.mParameters.focusMode = l.mParameters.shadowFocusMode;
1047 l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
1048 updateRequests(l.mParameters);
Eino-Ville Talvala65dc3fc2012-10-16 12:58:21 -07001049
1050 return OK;
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001051 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001052 }
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001053 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001054
1055 mDevice->triggerCancelAutofocus(triggerId);
1056
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001057 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001058}
1059
Ben Murdoch72421522012-11-28 13:58:29 +00001060status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001061 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001062 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001063 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001064 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001065
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001066 {
1067 SharedParameters::Lock l(mParameters);
1068 switch (l.mParameters.state) {
1069 case Parameters::DISCONNECTED:
1070 case Parameters::STOPPED:
1071 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1072 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001073 __FUNCTION__, mCameraId);
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001074 return INVALID_OPERATION;
1075 case Parameters::PREVIEW:
1076 // Good to go for takePicture
1077 res = commandStopFaceDetectionL(l.mParameters);
1078 if (res != OK) {
1079 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1080 __FUNCTION__, mCameraId);
1081 return res;
1082 }
1083 l.mParameters.state = Parameters::STILL_CAPTURE;
1084 break;
1085 case Parameters::RECORD:
1086 // Good to go for video snapshot
1087 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1088 break;
1089 case Parameters::STILL_CAPTURE:
1090 case Parameters::VIDEO_SNAPSHOT:
1091 ALOGE("%s: Camera %d: Already taking a picture",
1092 __FUNCTION__, mCameraId);
1093 return INVALID_OPERATION;
1094 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001095
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001096 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001097
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001098 res = mJpegProcessor->updateStream(l.mParameters);
1099 if (res != OK) {
1100 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1101 __FUNCTION__, mCameraId, strerror(-res), res);
1102 return res;
1103 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001104 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001105
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001106 // Need HAL to have correct settings before (possibly) triggering precapture
1107 syncWithDevice();
1108
Igor Murashkin786a8da2012-11-26 10:50:55 -08001109 res = mCaptureSequencer->startCapture(msgType);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001110 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001111 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001112 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001113 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001114
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001115 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001116}
1117
1118status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001119 ATRACE_CALL();
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001120 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001121 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001122 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001123 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1124
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001125 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001126
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001127 res = l.mParameters.set(params);
1128 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001129
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001130 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001131
1132 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001133}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001134
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001135String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001136 ATRACE_CALL();
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001137 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001138 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001139 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001140
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001141 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001142
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001143 return l.mParameters.get();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001144}
1145
1146status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001147 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001148 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001149 status_t res;
1150 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001151
1152 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1153 cmd, arg1, arg2);
1154
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001155 switch (cmd) {
1156 case CAMERA_CMD_START_SMOOTH_ZOOM:
1157 return commandStartSmoothZoomL();
1158 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1159 return commandStopSmoothZoomL();
1160 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1161 return commandSetDisplayOrientationL(arg1);
1162 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1163 return commandEnableShutterSoundL(arg1 == 1);
1164 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1165 return commandPlayRecordingSoundL();
1166 case CAMERA_CMD_START_FACE_DETECTION:
1167 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001168 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001169 SharedParameters::Lock l(mParameters);
1170 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001171 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001172 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1173 return commandEnableFocusMoveMsgL(arg1 == 1);
1174 case CAMERA_CMD_PING:
1175 return commandPingL();
1176 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1177 return commandSetVideoBufferCountL(arg1);
1178 default:
1179 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1180 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001181 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001182 }
1183}
James Dong983cf232012-08-01 16:39:55 -07001184
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001185status_t Camera2Client::commandStartSmoothZoomL() {
1186 ALOGE("%s: Unimplemented!", __FUNCTION__);
1187 return OK;
1188}
James Dong983cf232012-08-01 16:39:55 -07001189
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001190status_t Camera2Client::commandStopSmoothZoomL() {
1191 ALOGE("%s: Unimplemented!", __FUNCTION__);
1192 return OK;
1193}
James Dong983cf232012-08-01 16:39:55 -07001194
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001195status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001196 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001197 mCameraFacing == CAMERA_FACING_FRONT);
1198 if (transform == -1) {
1199 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1200 __FUNCTION__, mCameraId, degrees);
1201 return BAD_VALUE;
1202 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001203 SharedParameters::Lock l(mParameters);
1204 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001205 getPreviewStreamId() != NO_STREAM) {
1206 mDevice->setStreamTransform(getPreviewStreamId(), transform);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001207 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001208 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001209 return OK;
1210}
1211
1212status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001213 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001214 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001215 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001216 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001217 }
1218
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001219 // Disabling shutter sound may not be allowed. In that case only
1220 // allow the mediaserver process to disable the sound.
1221 char value[PROPERTY_VALUE_MAX];
1222 property_get("ro.camera.sound.forced", value, "0");
1223 if (strncmp(value, "0", 2) != 0) {
1224 // Disabling shutter sound is not allowed. Deny if the current
1225 // process is not mediaserver.
1226 if (getCallingPid() != getpid()) {
1227 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1228 getCallingPid());
1229 return PERMISSION_DENIED;
1230 }
1231 }
1232
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001233 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001234 return OK;
1235}
1236
1237status_t Camera2Client::commandPlayRecordingSoundL() {
1238 mCameraService->playSound(CameraService::SOUND_RECORDING);
1239 return OK;
1240}
1241
Igor Murashkinebe3f692012-10-12 16:56:11 -07001242status_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001243 ALOGV("%s: Camera %d: Starting face detection",
1244 __FUNCTION__, mCameraId);
1245 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001246 SharedParameters::Lock l(mParameters);
1247 switch (l.mParameters.state) {
1248 case Parameters::DISCONNECTED:
1249 case Parameters::STOPPED:
1250 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1251 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001252 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1253 __FUNCTION__, mCameraId);
1254 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001255 case Parameters::PREVIEW:
1256 case Parameters::RECORD:
1257 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001258 // Good to go for starting face detect
1259 break;
1260 }
1261 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001262 if (l.mParameters.fastInfo.bestFaceDetectMode ==
Igor Murashkin2d2b40b2012-11-27 16:25:46 -08001263 ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001264 ALOGE("%s: Camera %d: Face detection not supported",
1265 __FUNCTION__, mCameraId);
1266 return INVALID_OPERATION;
1267 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001268 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001269
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001270 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001271
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001272 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001273
1274 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001275}
1276
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001277status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001278 status_t res = OK;
1279 ALOGV("%s: Camera %d: Stopping face detection",
1280 __FUNCTION__, mCameraId);
1281
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001282 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001283
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001284 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001285
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001286 if (params.state == Parameters::PREVIEW
1287 || params.state == Parameters::RECORD
1288 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001289 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001290 }
1291
1292 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001293}
1294
1295status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001296 SharedParameters::Lock l(mParameters);
1297 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001298
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001299 return OK;
1300}
1301
1302status_t Camera2Client::commandPingL() {
1303 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001304 SharedParameters::Lock l(mParameters);
1305 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001306 return OK;
1307 } else {
1308 return NO_INIT;
1309 }
1310}
1311
1312status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001313 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001314 ALOGE("%s: Camera %d: Error setting video buffer count after "
1315 "recording was started", __FUNCTION__, mCameraId);
1316 return INVALID_OPERATION;
1317 }
1318
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001319 return mStreamingProcessor->setRecordingBufferCount(count);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001320}
1321
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001322/** Device-related methods */
1323
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001324void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1325 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1326}
1327
1328void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
Igor Murashkinebe3f692012-10-12 16:56:11 -07001329 (void)frameNumber;
1330 (void)timestamp;
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001331 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1332 frameNumber, timestamp);
1333}
1334
1335void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1336 ALOGV("%s: Autofocus state now %d, last trigger %d",
1337 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001338 bool sendCompletedMessage = false;
1339 bool sendMovingMessage = false;
1340
1341 bool success = false;
1342 bool afInMotion = false;
1343 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001344 SharedParameters::Lock l(mParameters);
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001345 l.mParameters.focusState = newState;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001346 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001347 case Parameters::FOCUS_MODE_AUTO:
1348 case Parameters::FOCUS_MODE_MACRO:
1349 // Don't send notifications upstream if they're not for the current AF
1350 // trigger. For example, if cancel was called in between, or if we
1351 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001352 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001353 switch (newState) {
1354 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1355 success = true;
1356 // no break
1357 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1358 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001359 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001360 break;
1361 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1362 // Just starting focusing, ignore
1363 break;
1364 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1365 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1366 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1367 default:
1368 // Unexpected in AUTO/MACRO mode
1369 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1370 __FUNCTION__, newState);
1371 break;
1372 }
1373 break;
1374 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1375 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1376 switch (newState) {
1377 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1378 success = true;
1379 // no break
1380 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1381 // Don't send notifications upstream if they're not for
1382 // the current AF trigger. For example, if cancel was
1383 // called in between, or if we already sent a
1384 // notification about this AF call.
1385 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001386 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001387 sendCompletedMessage = true;
1388 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001389 if (l.mParameters.enableFocusMoveMessages &&
1390 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001391 sendMovingMessage = true;
1392 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001393 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001394 break;
1395 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1396 // Cancel was called, or we switched state; care if
1397 // currently moving
1398 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001399 if (l.mParameters.enableFocusMoveMessages &&
1400 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001401 sendMovingMessage = true;
1402 }
1403 break;
1404 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1405 // Start passive scan, inform upstream
1406 afInMotion = true;
1407 // no break
1408 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1409 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001410 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001411 sendMovingMessage = true;
1412 }
1413 break;
1414 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001415 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001416 break;
1417 case Parameters::FOCUS_MODE_EDOF:
1418 case Parameters::FOCUS_MODE_INFINITY:
1419 case Parameters::FOCUS_MODE_FIXED:
1420 default:
1421 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001422 ALOGE("%s: Unexpected AF state change %d "
1423 "(ID %d) in focus mode %d",
1424 __FUNCTION__, newState, triggerId,
1425 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001426 }
1427 }
1428 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001429 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001430 SharedCameraClient::Lock l(mSharedCameraClient);
1431 if (l.mCameraClient != 0) {
1432 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001433 afInMotion ? 1 : 0, 0);
1434 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001435 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001436 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001437 SharedCameraClient::Lock l(mSharedCameraClient);
1438 if (l.mCameraClient != 0) {
1439 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1440 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001441 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001442 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001443}
1444
1445void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1446 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1447 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001448 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001449}
1450
1451void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
Igor Murashkinebe3f692012-10-12 16:56:11 -07001452 (void)newState;
1453 (void)triggerId;
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001454 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1455 __FUNCTION__, newState, triggerId);
1456}
1457
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001458int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001459 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001460}
1461
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001462const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1463 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001464}
1465
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001466const sp<CameraService>& Camera2Client::getCameraService() {
1467 return mCameraService;
1468}
1469
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001470camera2::SharedParameters& Camera2Client::getParameters() {
1471 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001472}
1473
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001474int Camera2Client::getPreviewStreamId() const {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001475 return mStreamingProcessor->getPreviewStreamId();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001476}
1477
1478int Camera2Client::getCaptureStreamId() const {
1479 return mJpegProcessor->getStreamId();
1480}
1481
1482int Camera2Client::getCallbackStreamId() const {
1483 return mCallbackProcessor->getStreamId();
1484}
1485
1486int Camera2Client::getRecordingStreamId() const {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001487 return mStreamingProcessor->getRecordingStreamId();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001488}
1489
1490int Camera2Client::getZslStreamId() const {
1491 return mZslProcessor->getStreamId();
1492}
1493
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001494status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001495 wp<camera2::FrameProcessor::FilteredListener> listener) {
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001496 return mFrameProcessor->registerListener(minId, maxId, listener);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001497}
1498
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001499status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1500 wp<camera2::FrameProcessor::FilteredListener> listener) {
1501 return mFrameProcessor->removeListener(minId, maxId, listener);
1502}
1503
1504status_t Camera2Client::stopStream() {
1505 return mStreamingProcessor->stopStream();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001506}
1507
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001508Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1509 mCameraClient(client.mCameraClient),
1510 mSharedClient(client) {
1511 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001512}
1513
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001514Camera2Client::SharedCameraClient::Lock::~Lock() {
1515 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001516}
1517
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001518Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1519 mCameraClient(client) {
1520}
1521
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001522Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1523 const sp<ICameraClient>&client) {
1524 Mutex::Autolock l(mCameraClientLock);
1525 mCameraClient = client;
1526 return *this;
1527}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001528
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001529void Camera2Client::SharedCameraClient::clear() {
1530 Mutex::Autolock l(mCameraClientLock);
1531 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001532}
1533
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001534const int32_t Camera2Client::kPreviewRequestIdStart;
1535const int32_t Camera2Client::kPreviewRequestIdEnd;
1536const int32_t Camera2Client::kRecordingRequestIdStart;
1537const int32_t Camera2Client::kRecordingRequestIdEnd;
1538const int32_t Camera2Client::kCaptureRequestIdStart;
1539const int32_t Camera2Client::kCaptureRequestIdEnd;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001540
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001541/** Utility methods */
1542
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001543status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001544 status_t res;
1545
Igor Murashkin0cb290b2012-10-02 19:07:14 -07001546 ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1547
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001548 res = mStreamingProcessor->incrementStreamingIds();
1549 if (res != OK) {
1550 ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1551 __FUNCTION__, mCameraId, strerror(-res), res);
1552 return res;
1553 }
1554
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001555 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001556 if (res != OK) {
1557 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1558 __FUNCTION__, mCameraId, strerror(-res), res);
1559 return res;
1560 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001561 res = mStreamingProcessor->updateRecordingRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001562 if (res != OK) {
1563 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1564 __FUNCTION__, mCameraId, strerror(-res), res);
1565 return res;
1566 }
1567
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001568 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001569 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001570 if (res != OK) {
1571 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1572 __FUNCTION__, mCameraId, strerror(-res), res);
1573 return res;
1574 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001575 } else if (params.state == Parameters::RECORD ||
1576 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001577 res = startRecordingL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001578 if (res != OK) {
1579 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1580 __FUNCTION__, mCameraId, strerror(-res), res);
1581 return res;
1582 }
1583 }
1584 return res;
1585}
1586
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001587
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001588size_t Camera2Client::calculateBufferSize(int width, int height,
1589 int format, int stride) {
1590 switch (format) {
1591 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1592 return width * height * 2;
1593 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1594 return width * height * 3 / 2;
1595 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1596 return width * height * 2;
1597 case HAL_PIXEL_FORMAT_YV12: { // YV12
1598 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001599 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001600 size_t uvSize = uvStride * height / 2;
1601 return ySize + uvSize * 2;
1602 }
1603 case HAL_PIXEL_FORMAT_RGB_565:
1604 return width * height * 2;
1605 case HAL_PIXEL_FORMAT_RGBA_8888:
1606 return width * height * 4;
1607 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1608 return width * height * 2;
1609 default:
1610 ALOGE("%s: Unknown preview format: %x",
1611 __FUNCTION__, format);
1612 return 0;
1613 }
1614}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001615
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001616status_t Camera2Client::syncWithDevice() {
1617 ATRACE_CALL();
Eino-Ville Talvalab66e9d62012-10-23 09:09:01 -07001618 const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001619 status_t res;
1620
1621 int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1622 if (activeRequestId == 0) return OK;
1623
1624 res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1625 if (res == TIMED_OUT) {
1626 ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1627 __FUNCTION__, mCameraId);
1628 } else if (res != OK) {
1629 ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1630 __FUNCTION__, mCameraId);
1631 }
1632 return res;
1633}
1634
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001635} // namespace android