blob: e59a24093800a03e1d91683940ee1992263112d7 [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
40static int getCallingUid() {
41 return IPCThreadState::self()->getCallingUid();
42}
43
44// Interface used by CameraService
45
46Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
47 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070048 int cameraId,
49 int cameraFacing,
Igor Murashkin8dcdb952012-10-02 16:05:11 -070050 int clientPid,
51 int servicePid):
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070052 Client(cameraService, cameraClient,
Igor Murashkin8dcdb952012-10-02 16:05:11 -070053 cameraId, cameraFacing, clientPid, servicePid),
Eino-Ville Talvala177bd342012-08-28 01:25:43 -070054 mSharedCameraClient(cameraClient),
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -070055 mParameters(cameraId, cameraFacing)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070056{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070057 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070058 ALOGI("Camera %d: Opened", cameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070059
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070060 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -070061
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070062 SharedParameters::Lock l(mParameters);
63 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070064}
65
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070066status_t Camera2Client::checkPid(const char* checkLocation) const {
67 int callingPid = getCallingPid();
Eino-Ville Talvala61704882012-10-09 22:16:58 -070068 if (callingPid == mClientPid) return NO_ERROR;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070069
70 ALOGE("%s: attempt to use a locked camera from a different process"
Eino-Ville Talvala61704882012-10-09 22:16:58 -070071 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070072 return PERMISSION_DENIED;
73}
74
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070075status_t Camera2Client::initialize(camera_module_t *module)
76{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070077 ATRACE_CALL();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070078 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070079 status_t res;
80
81 res = mDevice->initialize(module);
82 if (res != OK) {
83 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
84 __FUNCTION__, mCameraId, strerror(-res), res);
85 return NO_INIT;
86 }
87
Eino-Ville Talvala174181e2012-08-03 13:53:39 -070088 res = mDevice->setNotifyCallback(this);
89
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070090 SharedParameters::Lock l(mParameters);
91
92 res = l.mParameters.initialize(&(mDevice->info()));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070093 if (res != OK) {
94 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
95 __FUNCTION__, mCameraId, strerror(-res), res);
96 return NO_INIT;
97 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070098
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070099 String8 threadName;
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700100
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700101 mStreamingProcessor = new StreamingProcessor(this);
102
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700103 mFrameProcessor = new FrameProcessor(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700104 threadName = String8::format("C2-%d-FrameProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700105 mCameraId);
106 mFrameProcessor->run(threadName.string());
107
108 mCaptureSequencer = new CaptureSequencer(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700109 threadName = String8::format("C2-%d-CaptureSeq",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700110 mCameraId);
111 mCaptureSequencer->run(threadName.string());
112
113 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700114 threadName = String8::format("C2-%d-JpegProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700115 mCameraId);
116 mJpegProcessor->run(threadName.string());
117
118 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700119 threadName = String8::format("C2-%d-ZslProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700120 mCameraId);
121 mZslProcessor->run(threadName.string());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700122
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700123 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700124 threadName = String8::format("C2-%d-CallbkProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700125 mCameraId);
126 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700127
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700128 if (gLogLevel >= 1) {
129 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
130 mCameraId);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700131 ALOGD("%s", l.mParameters.paramsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700132 }
133
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700134 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700135}
136
137Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700138 ATRACE_CALL();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700139
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700140 mDestructionStarted = true;
141
Eino-Ville Talvala61704882012-10-09 22:16:58 -0700142 disconnect();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700143
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700144 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700145}
146
147status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700148 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700149 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700150 mCameraId,
151 getCameraClient()->asBinder().get(),
152 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700153 result.append(" State: ");
154#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
155
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700156 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700157
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700158 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700159
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700160 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700161 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700162 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700163 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700164 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700165 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700166 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700167 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700168 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700169 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700170 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700171 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700172 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700173 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700174 p.jpegQuality, p.jpegThumbQuality);
175 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700176 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700177 p.gpsEnabled ? "enabled" : "disabled");
178 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700179 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700180 p.gpsCoordinates[0], p.gpsCoordinates[1],
181 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700182 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700183 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700184 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700185 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700186 }
187
188 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700189 switch (p.wbMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700190 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
191 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
192 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
193 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
194 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
195 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
196 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
197 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
198 default: result.append("UNKNOWN\n");
199 }
200
201 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700202 switch (p.effectMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700203 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
204 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
205 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
206 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
207 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
208 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
209 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
210 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
211 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
212 default: result.append("UNKNOWN\n");
213 }
214
215 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700216 switch (p.antibandingMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700217 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
218 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
219 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
220 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
221 default: result.append("UNKNOWN\n");
222 }
223
224 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700225 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700226 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
227 result.append("AUTO\n"); break;
228 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
229 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
230 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
231 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
232 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
233 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
234 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
235 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
236 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
237 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
238 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
239 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
240 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
241 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
242 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
243 default: result.append("UNKNOWN\n");
244 }
245
246 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700247 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700248 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
249 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
250 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
251 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
252 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
253 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
254 default: result.append("UNKNOWN\n");
255 }
256
257 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700258 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700259 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
260 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
261 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
262 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
263 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
264 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
265 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
266 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
267 default: result.append("UNKNOWN\n");
268 }
269
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -0700270 result.append(" Focus state: ");
271 switch (p.focusState) {
272 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
273 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
274 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
275 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
276 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
277 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
278 default: result.append("UNKNOWN\n");
279 }
280
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700281 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700282 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700283 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700284 p.focusingAreas[i].left,
285 p.focusingAreas[i].top,
286 p.focusingAreas[i].right,
287 p.focusingAreas[i].bottom,
288 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700289 }
290
291 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700292 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700293
294 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700295 p.autoExposureLock ? "enabled" : "disabled",
296 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700297
298 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700299 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700300 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700301 p.meteringAreas[i].left,
302 p.meteringAreas[i].top,
303 p.meteringAreas[i].right,
304 p.meteringAreas[i].bottom,
305 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700306 }
307
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700308 result.appendFormat(" Zoom index: %d\n", p.zoom);
309 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
310 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700311
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700312 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700313 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700314
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700315 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700316 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700317
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700318 result.append(" Current streams:\n");
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700319 result.appendFormat(" Preview stream ID: %d\n",
320 getPreviewStreamId());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700321 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700322 getCaptureStreamId());
323 result.appendFormat(" Recording stream ID: %d\n",
324 getRecordingStreamId());
Eino-Ville Talvala596cb972012-10-02 18:14:49 -0700325
326 result.append(" Quirks for this camera:\n");
327 bool haveQuirk = false;
328 if (p.quirks.triggerAfWithAuto) {
329 result.appendFormat(" triggerAfWithAuto\n");
330 haveQuirk = true;
331 }
332 if (p.quirks.useZslFormat) {
333 result.appendFormat(" useZslFormat\n");
334 haveQuirk = true;
335 }
Igor Murashkin3a6e4532012-09-28 15:30:03 -0700336 if (p.quirks.meteringCropRegion) {
337 result.appendFormat(" meteringCropRegion\n");
338 haveQuirk = true;
339 }
Eino-Ville Talvala596cb972012-10-02 18:14:49 -0700340 if (!haveQuirk) {
341 result.appendFormat(" none\n");
342 }
343
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700344 write(fd, result.string(), result.size());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700345
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700346 mStreamingProcessor->dump(fd, args);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700347
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700348 mCaptureSequencer->dump(fd, args);
349
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700350 mFrameProcessor->dump(fd, args);
351
Eino-Ville Talvala22745492012-09-17 17:55:07 -0700352 mZslProcessor->dump(fd, args);
353
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700354 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700355 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700356
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700357 status_t res = mDevice->dump(fd, args);
358 if (res != OK) {
359 result = String8::format(" Error dumping device: %s (%d)",
360 strerror(-res), res);
361 write(fd, result.string(), result.size());
362 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700363
364#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700365 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700366}
367
368// ICamera interface
369
370void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700371 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700372 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700373 status_t res;
Eino-Ville Talvala61704882012-10-09 22:16:58 -0700374
375 // Allow both client and the media server to disconnect at all times
376 int callingPid = getCallingPid();
377 if (callingPid != mClientPid && callingPid != mServicePid) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700378
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700379 if (mDevice == 0) return;
380
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700381 ALOGV("Camera %d: Shutting down", mCameraId);
382
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700383 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700384
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700385 {
386 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala61704882012-10-09 22:16:58 -0700387 if (l.mParameters.state == Parameters::DISCONNECTED) return;
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700388 l.mParameters.state = Parameters::DISCONNECTED;
389 }
390
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700391 mStreamingProcessor->deletePreviewStream();
392 mStreamingProcessor->deleteRecordingStream();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700393 mJpegProcessor->deleteStream();
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700394 mCallbackProcessor->deleteStream();
Eino-Ville Talvala7d8b92b2012-09-05 19:02:43 -0700395 mZslProcessor->deleteStream();
396
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700397 mFrameProcessor->requestExit();
398 mCaptureSequencer->requestExit();
399 mJpegProcessor->requestExit();
400 mZslProcessor->requestExit();
401 mCallbackProcessor->requestExit();
402
403 ALOGV("Camera %d: Waiting for threads", mCameraId);
404
405 mFrameProcessor->join();
406 mCaptureSequencer->join();
407 mJpegProcessor->join();
408 mZslProcessor->join();
409 mCallbackProcessor->join();
410
411 ALOGV("Camera %d: Disconnecting device", mCameraId);
412
413 mDevice->disconnect();
414
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700415 mDevice.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700416
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700417 CameraService::Client::disconnect();
418}
419
420status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700421 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700422 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700423 Mutex::Autolock icl(mICameraLock);
424
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700425 if (mClientPid != 0 && getCallingPid() != mClientPid) {
426 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
427 "current locked to pid %d", __FUNCTION__,
428 mCameraId, getCallingPid(), mClientPid);
429 return BAD_VALUE;
430 }
431
432 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700433
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700434 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700435 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700436
437 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700438}
439
440status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700441 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700442 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700443 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700444 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
445 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700446
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700447 if (mClientPid == 0) {
448 mClientPid = getCallingPid();
449 return OK;
450 }
451
452 if (mClientPid != getCallingPid()) {
453 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
454 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
455 return EBUSY;
456 }
457
458 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700459}
460
461status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700462 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700463 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700464 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700465 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
466 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700467
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700468 if (mClientPid == getCallingPid()) {
Eino-Ville Talvalacfee40e2012-10-10 15:28:53 -0700469 SharedParameters::Lock l(mParameters);
470 if (l.mParameters.state == Parameters::RECORD ||
471 l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
472 ALOGD("Not allowed to unlock camera during recording.");
473 return INVALID_OPERATION;
474 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700475 mClientPid = 0;
476 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700477 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700478 return OK;
479 }
480
481 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
482 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
483 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700484}
485
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700486status_t Camera2Client::setPreviewDisplay(
487 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700488 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700489 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700490 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700491 status_t res;
492 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700493
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700494 sp<IBinder> binder;
495 sp<ANativeWindow> window;
496 if (surface != 0) {
497 binder = surface->asBinder();
498 window = surface;
499 }
500
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700501 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700502}
503
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700504status_t Camera2Client::setPreviewTexture(
505 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700506 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700507 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700508 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700509 status_t res;
510 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700511
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700512 sp<IBinder> binder;
513 sp<ANativeWindow> window;
514 if (surfaceTexture != 0) {
515 binder = surfaceTexture->asBinder();
516 window = new SurfaceTextureClient(surfaceTexture);
517 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700518 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700519}
520
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700521status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700522 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700523 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700524 status_t res;
525
526 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700527 ALOGV("%s: Camera %d: New window is same as old window",
528 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700529 return NO_ERROR;
530 }
531
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700532 Parameters::State state;
533 {
534 SharedParameters::Lock l(mParameters);
535 state = l.mParameters.state;
536 }
537 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700538 case Parameters::DISCONNECTED:
539 case Parameters::RECORD:
540 case Parameters::STILL_CAPTURE:
541 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700542 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700543 __FUNCTION__, mCameraId,
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700544 Parameters::getStateName(state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700545 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700546 case Parameters::STOPPED:
547 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700548 // OK
549 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700550 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700551 // Already running preview - need to stop and create a new stream
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700552 mStreamingProcessor->stopStream();
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700553 state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700554 break;
555 }
556
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700557 mPreviewSurface = binder;
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700558 res = mStreamingProcessor->setPreviewWindow(window);
559 if (res != OK) {
560 ALOGE("%s: Unable to set new preview window: %s (%d)",
561 __FUNCTION__, strerror(-res), res);
562 return res;
563 }
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700564
Eino-Ville Talvalac0fdb982012-10-17 16:32:34 -0700565 if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
566 SharedParameters::Lock l(mParameters);
567 l.mParameters.state = state;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700568 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700569 }
570
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700571 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700572}
573
574void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700575 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700576 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700577 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700578 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700579 if ( checkPid(__FUNCTION__) != OK) return;
580
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700581 SharedParameters::Lock l(mParameters);
582 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700583}
584
585void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
586 status_t res = OK;
587 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
588 ALOGV("%s: setting oneshot", __FUNCTION__);
589 params.previewCallbackOneShot = true;
590 }
591 if (params.previewCallbackFlags != (uint32_t)flag) {
592 params.previewCallbackFlags = flag;
593 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700594 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700595 res = startPreviewL(params, true);
596 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700597 case Parameters::RECORD:
598 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700599 res = startRecordingL(params, true);
600 break;
601 default:
602 break;
603 }
604 if (res != OK) {
605 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700606 __FUNCTION__, mCameraId,
607 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700608 }
609 }
610
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700611}
612
613status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700614 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700615 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700616 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700617 status_t res;
618 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700619 SharedParameters::Lock l(mParameters);
620 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700621}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700622
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700623status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700624 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700625 status_t res;
Igor Murashkin0cb290b2012-10-02 19:07:14 -0700626
627 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
628
Eino-Ville Talvala411ddcc2012-10-10 17:17:01 -0700629 if ( (params.state == Parameters::PREVIEW ||
630 params.state == Parameters::RECORD ||
631 params.state == Parameters::VIDEO_SNAPSHOT)
632 && !restart) {
633 // Succeed attempt to re-enter a streaming state
634 ALOGI("%s: Camera %d: Preview already active, ignoring restart",
635 __FUNCTION__, mCameraId);
Alex Ray71d64542012-09-26 15:52:50 -0700636 return OK;
637 }
638 if (params.state > Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700639 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700640 __FUNCTION__,
641 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700642 return INVALID_OPERATION;
643 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700644
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700645 if (!mStreamingProcessor->haveValidPreviewWindow()) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700646 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700647 return OK;
648 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700649 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700650
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700651 res = mStreamingProcessor->updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700652 if (res != OK) {
653 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
654 __FUNCTION__, mCameraId, strerror(-res), res);
655 return res;
656 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700657
658 Vector<uint8_t> outputStreams;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700659 bool callbacksEnabled = params.previewCallbackFlags &
660 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
661 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700662 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700663 if (res != OK) {
664 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
665 __FUNCTION__, mCameraId, strerror(-res), res);
666 return res;
667 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700668 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700669 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700670 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700671 res = mZslProcessor->updateStream(params);
672 if (res != OK) {
673 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
674 __FUNCTION__, mCameraId, strerror(-res), res);
675 return res;
676 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700677 outputStreams.push(getZslStreamId());
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700678 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700679
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700680 outputStreams.push(getPreviewStreamId());
681
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700682 if (!params.recordingHint) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700683 if (!restart) {
684 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700685 if (res != OK) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700686 ALOGE("%s: Camera %d: Can't set up preview request: "
687 "%s (%d)", __FUNCTION__, mCameraId,
688 strerror(-res), res);
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700689 return res;
690 }
691 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700692 res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
693 outputStreams);
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700694 } else {
695 // With recording hint set, we're going to be operating under the
696 // assumption that the user will record video. To optimize recording
697 // startup time, create the necessary output streams for recording and
698 // video snapshot now if they don't already exist.
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700699 res = mJpegProcessor->updateStream(params);
700 if (res != OK) {
701 ALOGE("%s: Camera %d: Can't pre-configure still image "
702 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700703 __FUNCTION__, mCameraId, strerror(-res), res);
704 return res;
705 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700706
707 if (!restart) {
708 res = mStreamingProcessor->updateRecordingRequest(params);
709 if (res != OK) {
710 ALOGE("%s: Camera %d: Can't set up preview request with "
711 "record hint: %s (%d)", __FUNCTION__, mCameraId,
712 strerror(-res), res);
713 return res;
714 }
715 }
716 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
717 outputStreams);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700718 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700719 if (res != OK) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700720 ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700721 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700722 return res;
723 }
724
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700725 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700726 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700727}
728
729void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700730 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700731 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700732 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700733 status_t res;
734 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700735 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700736}
737
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700738void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700739 ATRACE_CALL();
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700740 status_t res;
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700741 const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700742 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700743 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700744 SharedParameters::Lock l(mParameters);
745 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700746 }
747
748 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700749 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700750 ALOGE("%s: Camera %d: Call before initialized",
751 __FUNCTION__, mCameraId);
752 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700753 case Parameters::STOPPED:
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700754 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700755 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalae0493842012-10-05 12:03:10 -0700756 mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
757 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700758 case Parameters::RECORD:
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700759 case Parameters::PREVIEW:
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700760 mStreamingProcessor->stopStream();
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700761 res = mDevice->waitUntilDrained();
762 if (res != OK) {
763 ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
764 __FUNCTION__, mCameraId, strerror(-res), res);
765 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700766 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700767 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
768 SharedParameters::Lock l(mParameters);
769 l.mParameters.state = Parameters::STOPPED;
770 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700771 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700772 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700773 default:
774 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700775 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700776 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700777}
778
779bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700780 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700781 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700782 status_t res;
783 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
784
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700785 SharedParameters::Lock l(mParameters);
786 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700787}
788
789status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700790 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700791 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700792 status_t res;
793 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
794
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700795 SharedParameters::Lock l(mParameters);
796 switch (l.mParameters.state) {
797 case Parameters::RECORD:
798 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700799 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700800 __FUNCTION__, mCameraId,
801 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700802 return INVALID_OPERATION;
803 default:
804 // OK
805 break;
806 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700807
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700808 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700809
810 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700811}
812
813status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700814 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700815 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700816 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700817 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700818 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700819 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700820
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700821 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700822}
823
824status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
825 status_t res;
Igor Murashkin0cb290b2012-10-02 19:07:14 -0700826
827 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
828
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700829 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700830 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700831 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700832 if (res != OK) return res;
833 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700834 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700835 // Ready to go
836 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700837 case Parameters::RECORD:
838 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700839 // OK to call this when recording is already on, just skip unless
840 // we're looking to restart
841 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700842 break;
843 default:
844 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700845 __FUNCTION__, mCameraId,
846 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700847 return INVALID_OPERATION;
848 };
849
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700850 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700851 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
852 "non-metadata recording mode requested!", __FUNCTION__,
853 mCameraId);
854 return INVALID_OPERATION;
855 }
856
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700857 if (!restart) {
858 mCameraService->playSound(CameraService::SOUND_RECORDING);
859 mStreamingProcessor->updateRecordingRequest(params);
860 if (res != OK) {
861 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
862 __FUNCTION__, mCameraId, strerror(-res), res);
863 return res;
864 }
865 }
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700866
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700867 res = mStreamingProcessor->updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700868 if (res != OK) {
869 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
870 __FUNCTION__, mCameraId, strerror(-res), res);
871 return res;
872 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700873
874 Vector<uint8_t> outputStreams;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700875 bool callbacksEnabled = params.previewCallbackFlags &
876 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
877 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700878 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700879 if (res != OK) {
880 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
881 __FUNCTION__, mCameraId, strerror(-res), res);
882 return res;
883 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700884 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700885 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700886 outputStreams.push(getPreviewStreamId());
887 outputStreams.push(getRecordingStreamId());
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700888
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700889 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
890 outputStreams);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700891 if (res != OK) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700892 ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700893 __FUNCTION__, mCameraId, strerror(-res), res);
894 return res;
895 }
896
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700897 if (params.state < Parameters::RECORD) {
898 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700899 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700900
901 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700902}
903
904void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700905 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700906 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700907 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700908 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700909
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700910 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700911 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
912
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700913 switch (l.mParameters.state) {
914 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700915 // OK to stop
916 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700917 case Parameters::STOPPED:
918 case Parameters::PREVIEW:
919 case Parameters::STILL_CAPTURE:
920 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700921 default:
922 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700923 __FUNCTION__, mCameraId,
924 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700925 return;
926 };
927
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700928 mCameraService->playSound(CameraService::SOUND_RECORDING);
929
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700930 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700931 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700932 ALOGE("%s: Camera %d: Unable to return to preview",
933 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700934 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700935}
936
937bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700938 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700939 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700940
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700941 if ( checkPid(__FUNCTION__) != OK) return false;
942
James Dong8da4cd72012-08-04 19:58:07 -0700943 return recordingEnabledL();
944}
945
946bool Camera2Client::recordingEnabledL() {
947 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700948 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700949
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700950 return (l.mParameters.state == Parameters::RECORD
951 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700952}
953
954void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700955 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700956 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700957 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700958
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -0700959 mStreamingProcessor->releaseRecordingFrame(mem);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700960}
961
962status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700963 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700964 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -0700965 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700966 status_t res;
967 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
968
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700969 int triggerId;
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -0700970 bool notifyImmediately = false;
971 bool notifySuccess = false;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700972 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700973 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -0700974 if (l.mParameters.state < Parameters::PREVIEW) {
975 return INVALID_OPERATION;
976 }
977
Igor Murashkin5b44bee2012-10-08 18:05:12 -0700978 /**
979 * If the camera does not support auto-focus, it is a no-op and
980 * onAutoFocus(boolean, Camera) callback will be called immediately
981 * with a fake value of success set to true.
982 */
983 if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED) {
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -0700984 notifyImmediately = true;
985 notifySuccess = true;
986 }
987 /**
988 * If we're in CAF mode, and AF has already been locked, just fire back
989 * the callback right away; the HAL would not send a notification since
990 * no state change would happen on a AF trigger.
991 */
992 if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
993 l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
994 l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
995 notifyImmediately = true;
996 notifySuccess = true;
997 }
998 /**
999 * Send immediate notification back to client
1000 */
1001 if (notifyImmediately) {
Igor Murashkin5b44bee2012-10-08 18:05:12 -07001002 SharedCameraClient::Lock l(mSharedCameraClient);
1003 if (l.mCameraClient != 0) {
1004 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001005 notifySuccess ? 1 : 0, 0);
Igor Murashkin5b44bee2012-10-08 18:05:12 -07001006 }
Igor Murashkin5b44bee2012-10-08 18:05:12 -07001007 return OK;
1008 }
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001009 /**
1010 * Handle quirk mode for AF in scene modes
1011 */
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001012 if (l.mParameters.quirks.triggerAfWithAuto &&
1013 l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
Eino-Ville Talvala65dc3fc2012-10-16 12:58:21 -07001014 l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1015 !l.mParameters.focusingAreas[0].isEmpty()) {
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001016 ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
1017 __FUNCTION__, l.mParameters.focusMode);
1018 l.mParameters.shadowFocusMode = l.mParameters.focusMode;
1019 l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1020 updateRequests(l.mParameters);
1021 }
1022
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001023 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1024 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001025 }
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001026 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001027
1028 mDevice->triggerAutofocus(triggerId);
1029
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001030 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001031}
1032
1033status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001034 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001035 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001036 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001037 status_t res;
1038 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1039
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001040 int triggerId;
1041 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001042 SharedParameters::Lock l(mParameters);
1043 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001044
1045 // When using triggerAfWithAuto quirk, may need to reset focus mode to
Eino-Ville Talvala65dc3fc2012-10-16 12:58:21 -07001046 // the real state at this point. No need to cancel explicitly if
1047 // changing the AF mode.
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001048 if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
1049 ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
1050 l.mParameters.shadowFocusMode);
1051 l.mParameters.focusMode = l.mParameters.shadowFocusMode;
1052 l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
1053 updateRequests(l.mParameters);
Eino-Ville Talvala65dc3fc2012-10-16 12:58:21 -07001054
1055 return OK;
Eino-Ville Talvala4c843702012-10-04 00:56:40 -07001056 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001057 }
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001058 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001059
1060 mDevice->triggerCancelAutofocus(triggerId);
1061
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001062 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001063}
1064
1065status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001066 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001067 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001068 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001069 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001070
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001071 {
1072 SharedParameters::Lock l(mParameters);
1073 switch (l.mParameters.state) {
1074 case Parameters::DISCONNECTED:
1075 case Parameters::STOPPED:
1076 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1077 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001078 __FUNCTION__, mCameraId);
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001079 return INVALID_OPERATION;
1080 case Parameters::PREVIEW:
1081 // Good to go for takePicture
1082 res = commandStopFaceDetectionL(l.mParameters);
1083 if (res != OK) {
1084 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1085 __FUNCTION__, mCameraId);
1086 return res;
1087 }
1088 l.mParameters.state = Parameters::STILL_CAPTURE;
1089 break;
1090 case Parameters::RECORD:
1091 // Good to go for video snapshot
1092 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1093 break;
1094 case Parameters::STILL_CAPTURE:
1095 case Parameters::VIDEO_SNAPSHOT:
1096 ALOGE("%s: Camera %d: Already taking a picture",
1097 __FUNCTION__, mCameraId);
1098 return INVALID_OPERATION;
1099 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001100
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001101 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001102
Eino-Ville Talvala1d838ce2012-10-24 17:30:30 -07001103 res = mJpegProcessor->updateStream(l.mParameters);
1104 if (res != OK) {
1105 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1106 __FUNCTION__, mCameraId, strerror(-res), res);
1107 return res;
1108 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001109 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001110
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001111 // Need HAL to have correct settings before (possibly) triggering precapture
1112 syncWithDevice();
1113
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001114 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001115 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001116 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001117 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001118 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001119
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001120 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001121}
1122
1123status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001124 ATRACE_CALL();
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001125 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001126 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001127 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001128 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1129
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001130 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001131
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001132 res = l.mParameters.set(params);
1133 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001134
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001135 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001136
1137 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001138}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001139
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001140String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001141 ATRACE_CALL();
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001142 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001143 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001144 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001145
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001146 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001147
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001148 return l.mParameters.get();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001149}
1150
1151status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001152 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001153 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001154 status_t res;
1155 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001156
1157 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1158 cmd, arg1, arg2);
1159
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001160 switch (cmd) {
1161 case CAMERA_CMD_START_SMOOTH_ZOOM:
1162 return commandStartSmoothZoomL();
1163 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1164 return commandStopSmoothZoomL();
1165 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1166 return commandSetDisplayOrientationL(arg1);
1167 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1168 return commandEnableShutterSoundL(arg1 == 1);
1169 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1170 return commandPlayRecordingSoundL();
1171 case CAMERA_CMD_START_FACE_DETECTION:
1172 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001173 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001174 SharedParameters::Lock l(mParameters);
1175 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001176 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001177 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1178 return commandEnableFocusMoveMsgL(arg1 == 1);
1179 case CAMERA_CMD_PING:
1180 return commandPingL();
1181 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1182 return commandSetVideoBufferCountL(arg1);
1183 default:
1184 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1185 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001186 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001187 }
1188}
James Dong983cf232012-08-01 16:39:55 -07001189
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001190status_t Camera2Client::commandStartSmoothZoomL() {
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::commandStopSmoothZoomL() {
1196 ALOGE("%s: Unimplemented!", __FUNCTION__);
1197 return OK;
1198}
James Dong983cf232012-08-01 16:39:55 -07001199
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001200status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001201 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001202 mCameraFacing == CAMERA_FACING_FRONT);
1203 if (transform == -1) {
1204 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1205 __FUNCTION__, mCameraId, degrees);
1206 return BAD_VALUE;
1207 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001208 SharedParameters::Lock l(mParameters);
1209 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001210 getPreviewStreamId() != NO_STREAM) {
1211 mDevice->setStreamTransform(getPreviewStreamId(), transform);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001212 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001213 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001214 return OK;
1215}
1216
1217status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001218 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001219 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001220 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001221 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001222 }
1223
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001224 // Disabling shutter sound may not be allowed. In that case only
1225 // allow the mediaserver process to disable the sound.
1226 char value[PROPERTY_VALUE_MAX];
1227 property_get("ro.camera.sound.forced", value, "0");
1228 if (strncmp(value, "0", 2) != 0) {
1229 // Disabling shutter sound is not allowed. Deny if the current
1230 // process is not mediaserver.
1231 if (getCallingPid() != getpid()) {
1232 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1233 getCallingPid());
1234 return PERMISSION_DENIED;
1235 }
1236 }
1237
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001238 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001239 return OK;
1240}
1241
1242status_t Camera2Client::commandPlayRecordingSoundL() {
1243 mCameraService->playSound(CameraService::SOUND_RECORDING);
1244 return OK;
1245}
1246
1247status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001248 ALOGV("%s: Camera %d: Starting face detection",
1249 __FUNCTION__, mCameraId);
1250 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001251 SharedParameters::Lock l(mParameters);
1252 switch (l.mParameters.state) {
1253 case Parameters::DISCONNECTED:
1254 case Parameters::STOPPED:
1255 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1256 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001257 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1258 __FUNCTION__, mCameraId);
1259 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001260 case Parameters::PREVIEW:
1261 case Parameters::RECORD:
1262 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001263 // Good to go for starting face detect
1264 break;
1265 }
1266 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001267 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1268 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001269 ALOGE("%s: Camera %d: Face detection not supported",
1270 __FUNCTION__, mCameraId);
1271 return INVALID_OPERATION;
1272 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001273 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001274
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001275 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001276
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001277 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001278
1279 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001280}
1281
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001282status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001283 status_t res = OK;
1284 ALOGV("%s: Camera %d: Stopping face detection",
1285 __FUNCTION__, mCameraId);
1286
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001287 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001288
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001289 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001290
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001291 if (params.state == Parameters::PREVIEW
1292 || params.state == Parameters::RECORD
1293 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001294 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001295 }
1296
1297 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001298}
1299
1300status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001301 SharedParameters::Lock l(mParameters);
1302 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001303
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001304 return OK;
1305}
1306
1307status_t Camera2Client::commandPingL() {
1308 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001309 SharedParameters::Lock l(mParameters);
1310 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001311 return OK;
1312 } else {
1313 return NO_INIT;
1314 }
1315}
1316
1317status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001318 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001319 ALOGE("%s: Camera %d: Error setting video buffer count after "
1320 "recording was started", __FUNCTION__, mCameraId);
1321 return INVALID_OPERATION;
1322 }
1323
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001324 return mStreamingProcessor->setRecordingBufferCount(count);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001325}
1326
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001327/** Device-related methods */
1328
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001329void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1330 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1331}
1332
1333void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1334 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1335 frameNumber, timestamp);
1336}
1337
1338void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1339 ALOGV("%s: Autofocus state now %d, last trigger %d",
1340 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001341 bool sendCompletedMessage = false;
1342 bool sendMovingMessage = false;
1343
1344 bool success = false;
1345 bool afInMotion = false;
1346 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001347 SharedParameters::Lock l(mParameters);
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001348 l.mParameters.focusState = newState;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001349 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001350 case Parameters::FOCUS_MODE_AUTO:
1351 case Parameters::FOCUS_MODE_MACRO:
1352 // Don't send notifications upstream if they're not for the current AF
1353 // trigger. For example, if cancel was called in between, or if we
1354 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001355 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001356 switch (newState) {
1357 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1358 success = true;
1359 // no break
1360 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1361 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001362 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001363 break;
1364 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1365 // Just starting focusing, ignore
1366 break;
1367 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1368 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1369 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1370 default:
1371 // Unexpected in AUTO/MACRO mode
1372 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1373 __FUNCTION__, newState);
1374 break;
1375 }
1376 break;
1377 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1378 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1379 switch (newState) {
1380 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1381 success = true;
1382 // no break
1383 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1384 // Don't send notifications upstream if they're not for
1385 // the current AF trigger. For example, if cancel was
1386 // called in between, or if we already sent a
1387 // notification about this AF call.
1388 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001389 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001390 sendCompletedMessage = true;
1391 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001392 if (l.mParameters.enableFocusMoveMessages &&
1393 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001394 sendMovingMessage = true;
1395 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001396 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001397 break;
1398 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1399 // Cancel was called, or we switched state; care if
1400 // currently moving
1401 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001402 if (l.mParameters.enableFocusMoveMessages &&
1403 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001404 sendMovingMessage = true;
1405 }
1406 break;
1407 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1408 // Start passive scan, inform upstream
1409 afInMotion = true;
1410 // no break
1411 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1412 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001413 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001414 sendMovingMessage = true;
1415 }
1416 break;
1417 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001418 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001419 break;
1420 case Parameters::FOCUS_MODE_EDOF:
1421 case Parameters::FOCUS_MODE_INFINITY:
1422 case Parameters::FOCUS_MODE_FIXED:
1423 default:
1424 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001425 ALOGE("%s: Unexpected AF state change %d "
1426 "(ID %d) in focus mode %d",
1427 __FUNCTION__, newState, triggerId,
1428 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001429 }
1430 }
1431 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001432 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001433 SharedCameraClient::Lock l(mSharedCameraClient);
1434 if (l.mCameraClient != 0) {
1435 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001436 afInMotion ? 1 : 0, 0);
1437 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001438 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001439 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001440 SharedCameraClient::Lock l(mSharedCameraClient);
1441 if (l.mCameraClient != 0) {
1442 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1443 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001444 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001445 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001446}
1447
1448void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1449 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1450 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001451 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001452}
1453
1454void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1455 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1456 __FUNCTION__, newState, triggerId);
1457}
1458
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001459int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001460 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001461}
1462
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001463const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1464 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001465}
1466
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001467const sp<CameraService>& Camera2Client::getCameraService() {
1468 return mCameraService;
1469}
1470
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001471camera2::SharedParameters& Camera2Client::getParameters() {
1472 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001473}
1474
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001475int Camera2Client::getPreviewStreamId() const {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001476 return mStreamingProcessor->getPreviewStreamId();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001477}
1478
1479int Camera2Client::getCaptureStreamId() const {
1480 return mJpegProcessor->getStreamId();
1481}
1482
1483int Camera2Client::getCallbackStreamId() const {
1484 return mCallbackProcessor->getStreamId();
1485}
1486
1487int Camera2Client::getRecordingStreamId() const {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001488 return mStreamingProcessor->getRecordingStreamId();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001489}
1490
1491int Camera2Client::getZslStreamId() const {
1492 return mZslProcessor->getStreamId();
1493}
1494
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001495status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001496 wp<camera2::FrameProcessor::FilteredListener> listener) {
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001497 return mFrameProcessor->registerListener(minId, maxId, listener);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001498}
1499
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001500status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1501 wp<camera2::FrameProcessor::FilteredListener> listener) {
1502 return mFrameProcessor->removeListener(minId, maxId, listener);
1503}
1504
1505status_t Camera2Client::stopStream() {
1506 return mStreamingProcessor->stopStream();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001507}
1508
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001509Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1510 mCameraClient(client.mCameraClient),
1511 mSharedClient(client) {
1512 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001513}
1514
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001515Camera2Client::SharedCameraClient::Lock::~Lock() {
1516 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001517}
1518
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001519Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1520 mCameraClient(client) {
1521}
1522
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001523Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1524 const sp<ICameraClient>&client) {
1525 Mutex::Autolock l(mCameraClientLock);
1526 mCameraClient = client;
1527 return *this;
1528}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001529
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001530void Camera2Client::SharedCameraClient::clear() {
1531 Mutex::Autolock l(mCameraClientLock);
1532 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001533}
1534
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001535const int32_t Camera2Client::kPreviewRequestIdStart;
1536const int32_t Camera2Client::kPreviewRequestIdEnd;
1537const int32_t Camera2Client::kRecordingRequestIdStart;
1538const int32_t Camera2Client::kRecordingRequestIdEnd;
1539const int32_t Camera2Client::kCaptureRequestIdStart;
1540const int32_t Camera2Client::kCaptureRequestIdEnd;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001541
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001542/** Utility methods */
1543
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001544status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001545 status_t res;
1546
Igor Murashkin0cb290b2012-10-02 19:07:14 -07001547 ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1548
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001549 res = mStreamingProcessor->incrementStreamingIds();
1550 if (res != OK) {
1551 ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1552 __FUNCTION__, mCameraId, strerror(-res), res);
1553 return res;
1554 }
1555
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001556 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001557 if (res != OK) {
1558 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1559 __FUNCTION__, mCameraId, strerror(-res), res);
1560 return res;
1561 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001562 res = mStreamingProcessor->updateRecordingRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001563 if (res != OK) {
1564 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1565 __FUNCTION__, mCameraId, strerror(-res), res);
1566 return res;
1567 }
1568
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001569 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001570 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001571 if (res != OK) {
1572 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1573 __FUNCTION__, mCameraId, strerror(-res), res);
1574 return res;
1575 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001576 } else if (params.state == Parameters::RECORD ||
1577 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001578 res = startRecordingL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001579 if (res != OK) {
1580 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1581 __FUNCTION__, mCameraId, strerror(-res), res);
1582 return res;
1583 }
1584 }
1585 return res;
1586}
1587
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001588
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001589size_t Camera2Client::calculateBufferSize(int width, int height,
1590 int format, int stride) {
1591 switch (format) {
1592 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1593 return width * height * 2;
1594 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1595 return width * height * 3 / 2;
1596 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1597 return width * height * 2;
1598 case HAL_PIXEL_FORMAT_YV12: { // YV12
1599 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001600 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001601 size_t uvSize = uvStride * height / 2;
1602 return ySize + uvSize * 2;
1603 }
1604 case HAL_PIXEL_FORMAT_RGB_565:
1605 return width * height * 2;
1606 case HAL_PIXEL_FORMAT_RGBA_8888:
1607 return width * height * 4;
1608 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1609 return width * height * 2;
1610 default:
1611 ALOGE("%s: Unknown preview format: %x",
1612 __FUNCTION__, format);
1613 return 0;
1614 }
1615}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001616
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001617status_t Camera2Client::syncWithDevice() {
1618 ATRACE_CALL();
Eino-Ville Talvalab66e9d62012-10-23 09:09:01 -07001619 const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001620 status_t res;
1621
1622 int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1623 if (activeRequestId == 0) return OK;
1624
1625 res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1626 if (res == TIMED_OUT) {
1627 ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1628 __FUNCTION__, mCameraId);
1629 } else if (res != OK) {
1630 ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1631 __FUNCTION__, mCameraId);
1632 }
1633 return res;
1634}
1635
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001636} // namespace android