blob: 067540056c10df5a02348e7f8bb5648c0434fbb3 [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 Talvala2e19c3c2012-08-26 09:29:28 -07001071 SharedParameters::Lock l(mParameters);
1072 switch (l.mParameters.state) {
1073 case Parameters::DISCONNECTED:
1074 case Parameters::STOPPED:
1075 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001076 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1077 __FUNCTION__, mCameraId);
1078 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001079 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001080 // Good to go for takePicture
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001081 res = commandStopFaceDetectionL(l.mParameters);
1082 if (res != OK) {
1083 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1084 __FUNCTION__, mCameraId);
1085 return res;
1086 }
1087 l.mParameters.state = Parameters::STILL_CAPTURE;
1088 break;
1089 case Parameters::RECORD:
1090 // Good to go for video snapshot
1091 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001092 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001093 case Parameters::STILL_CAPTURE:
1094 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001095 ALOGE("%s: Camera %d: Already taking a picture",
1096 __FUNCTION__, mCameraId);
1097 return INVALID_OPERATION;
1098 }
1099
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001100 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001101
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001102 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001103 if (res != OK) {
1104 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1105 __FUNCTION__, mCameraId, strerror(-res), res);
1106 return res;
1107 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001108
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001109 // Need HAL to have correct settings before (possibly) triggering precapture
1110 syncWithDevice();
1111
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001112 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001113 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001114 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001115 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001116 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001117
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001118 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001119}
1120
1121status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001122 ATRACE_CALL();
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001123 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001124 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001125 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001126 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1127
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001128 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001129
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001130 res = l.mParameters.set(params);
1131 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001132
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001133 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001134
1135 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001136}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001137
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001138String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001139 ATRACE_CALL();
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001140 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001141 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001142 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001143
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001144 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001145
Eino-Ville Talvalac85f8262012-10-02 13:30:04 -07001146 return l.mParameters.get();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001147}
1148
1149status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001150 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001151 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001152 status_t res;
1153 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001154
1155 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1156 cmd, arg1, arg2);
1157
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001158 switch (cmd) {
1159 case CAMERA_CMD_START_SMOOTH_ZOOM:
1160 return commandStartSmoothZoomL();
1161 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1162 return commandStopSmoothZoomL();
1163 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1164 return commandSetDisplayOrientationL(arg1);
1165 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1166 return commandEnableShutterSoundL(arg1 == 1);
1167 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1168 return commandPlayRecordingSoundL();
1169 case CAMERA_CMD_START_FACE_DETECTION:
1170 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001171 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001172 SharedParameters::Lock l(mParameters);
1173 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001174 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001175 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1176 return commandEnableFocusMoveMsgL(arg1 == 1);
1177 case CAMERA_CMD_PING:
1178 return commandPingL();
1179 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1180 return commandSetVideoBufferCountL(arg1);
1181 default:
1182 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1183 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001184 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001185 }
1186}
James Dong983cf232012-08-01 16:39:55 -07001187
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001188status_t Camera2Client::commandStartSmoothZoomL() {
1189 ALOGE("%s: Unimplemented!", __FUNCTION__);
1190 return OK;
1191}
James Dong983cf232012-08-01 16:39:55 -07001192
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001193status_t Camera2Client::commandStopSmoothZoomL() {
1194 ALOGE("%s: Unimplemented!", __FUNCTION__);
1195 return OK;
1196}
James Dong983cf232012-08-01 16:39:55 -07001197
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001198status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001199 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001200 mCameraFacing == CAMERA_FACING_FRONT);
1201 if (transform == -1) {
1202 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1203 __FUNCTION__, mCameraId, degrees);
1204 return BAD_VALUE;
1205 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001206 SharedParameters::Lock l(mParameters);
1207 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001208 getPreviewStreamId() != NO_STREAM) {
1209 mDevice->setStreamTransform(getPreviewStreamId(), transform);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001210 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001211 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001212 return OK;
1213}
1214
1215status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001216 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001217 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001218 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001219 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001220 }
1221
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001222 // Disabling shutter sound may not be allowed. In that case only
1223 // allow the mediaserver process to disable the sound.
1224 char value[PROPERTY_VALUE_MAX];
1225 property_get("ro.camera.sound.forced", value, "0");
1226 if (strncmp(value, "0", 2) != 0) {
1227 // Disabling shutter sound is not allowed. Deny if the current
1228 // process is not mediaserver.
1229 if (getCallingPid() != getpid()) {
1230 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1231 getCallingPid());
1232 return PERMISSION_DENIED;
1233 }
1234 }
1235
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001236 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001237 return OK;
1238}
1239
1240status_t Camera2Client::commandPlayRecordingSoundL() {
1241 mCameraService->playSound(CameraService::SOUND_RECORDING);
1242 return OK;
1243}
1244
1245status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001246 ALOGV("%s: Camera %d: Starting face detection",
1247 __FUNCTION__, mCameraId);
1248 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001249 SharedParameters::Lock l(mParameters);
1250 switch (l.mParameters.state) {
1251 case Parameters::DISCONNECTED:
1252 case Parameters::STOPPED:
1253 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1254 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001255 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1256 __FUNCTION__, mCameraId);
1257 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001258 case Parameters::PREVIEW:
1259 case Parameters::RECORD:
1260 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001261 // Good to go for starting face detect
1262 break;
1263 }
1264 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001265 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1266 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001267 ALOGE("%s: Camera %d: Face detection not supported",
1268 __FUNCTION__, mCameraId);
1269 return INVALID_OPERATION;
1270 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001271 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001272
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001273 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001274
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001275 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001276
1277 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001278}
1279
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001280status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001281 status_t res = OK;
1282 ALOGV("%s: Camera %d: Stopping face detection",
1283 __FUNCTION__, mCameraId);
1284
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001285 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001286
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001287 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001288
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001289 if (params.state == Parameters::PREVIEW
1290 || params.state == Parameters::RECORD
1291 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001292 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001293 }
1294
1295 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001296}
1297
1298status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001299 SharedParameters::Lock l(mParameters);
1300 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001301
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001302 return OK;
1303}
1304
1305status_t Camera2Client::commandPingL() {
1306 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001307 SharedParameters::Lock l(mParameters);
1308 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001309 return OK;
1310 } else {
1311 return NO_INIT;
1312 }
1313}
1314
1315status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001316 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001317 ALOGE("%s: Camera %d: Error setting video buffer count after "
1318 "recording was started", __FUNCTION__, mCameraId);
1319 return INVALID_OPERATION;
1320 }
1321
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001322 return mStreamingProcessor->setRecordingBufferCount(count);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001323}
1324
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001325/** Device-related methods */
1326
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001327void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1328 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1329}
1330
1331void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1332 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1333 frameNumber, timestamp);
1334}
1335
1336void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1337 ALOGV("%s: Autofocus state now %d, last trigger %d",
1338 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001339 bool sendCompletedMessage = false;
1340 bool sendMovingMessage = false;
1341
1342 bool success = false;
1343 bool afInMotion = false;
1344 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001345 SharedParameters::Lock l(mParameters);
Eino-Ville Talvalaf1a6e0d2012-10-16 10:17:30 -07001346 l.mParameters.focusState = newState;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001347 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001348 case Parameters::FOCUS_MODE_AUTO:
1349 case Parameters::FOCUS_MODE_MACRO:
1350 // Don't send notifications upstream if they're not for the current AF
1351 // trigger. For example, if cancel was called in between, or if we
1352 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001353 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001354 switch (newState) {
1355 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1356 success = true;
1357 // no break
1358 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1359 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001360 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001361 break;
1362 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1363 // Just starting focusing, ignore
1364 break;
1365 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1366 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1367 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1368 default:
1369 // Unexpected in AUTO/MACRO mode
1370 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1371 __FUNCTION__, newState);
1372 break;
1373 }
1374 break;
1375 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1376 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1377 switch (newState) {
1378 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1379 success = true;
1380 // no break
1381 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1382 // Don't send notifications upstream if they're not for
1383 // the current AF trigger. For example, if cancel was
1384 // called in between, or if we already sent a
1385 // notification about this AF call.
1386 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001387 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001388 sendCompletedMessage = true;
1389 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001390 if (l.mParameters.enableFocusMoveMessages &&
1391 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001392 sendMovingMessage = true;
1393 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001394 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001395 break;
1396 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1397 // Cancel was called, or we switched state; care if
1398 // currently moving
1399 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001400 if (l.mParameters.enableFocusMoveMessages &&
1401 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001402 sendMovingMessage = true;
1403 }
1404 break;
1405 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1406 // Start passive scan, inform upstream
1407 afInMotion = true;
1408 // no break
1409 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1410 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001411 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001412 sendMovingMessage = true;
1413 }
1414 break;
1415 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001416 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001417 break;
1418 case Parameters::FOCUS_MODE_EDOF:
1419 case Parameters::FOCUS_MODE_INFINITY:
1420 case Parameters::FOCUS_MODE_FIXED:
1421 default:
1422 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001423 ALOGE("%s: Unexpected AF state change %d "
1424 "(ID %d) in focus mode %d",
1425 __FUNCTION__, newState, triggerId,
1426 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001427 }
1428 }
1429 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001430 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001431 SharedCameraClient::Lock l(mSharedCameraClient);
1432 if (l.mCameraClient != 0) {
1433 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001434 afInMotion ? 1 : 0, 0);
1435 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001436 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001437 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001438 SharedCameraClient::Lock l(mSharedCameraClient);
1439 if (l.mCameraClient != 0) {
1440 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1441 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001442 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001443 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001444}
1445
1446void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1447 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1448 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001449 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001450}
1451
1452void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1453 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1454 __FUNCTION__, newState, triggerId);
1455}
1456
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001457int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001458 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001459}
1460
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001461const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1462 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001463}
1464
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001465const sp<CameraService>& Camera2Client::getCameraService() {
1466 return mCameraService;
1467}
1468
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001469camera2::SharedParameters& Camera2Client::getParameters() {
1470 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001471}
1472
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001473int Camera2Client::getPreviewStreamId() const {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001474 return mStreamingProcessor->getPreviewStreamId();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001475}
1476
1477int Camera2Client::getCaptureStreamId() const {
1478 return mJpegProcessor->getStreamId();
1479}
1480
1481int Camera2Client::getCallbackStreamId() const {
1482 return mCallbackProcessor->getStreamId();
1483}
1484
1485int Camera2Client::getRecordingStreamId() const {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001486 return mStreamingProcessor->getRecordingStreamId();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001487}
1488
1489int Camera2Client::getZslStreamId() const {
1490 return mZslProcessor->getStreamId();
1491}
1492
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001493status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001494 wp<camera2::FrameProcessor::FilteredListener> listener) {
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001495 return mFrameProcessor->registerListener(minId, maxId, listener);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001496}
1497
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001498status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1499 wp<camera2::FrameProcessor::FilteredListener> listener) {
1500 return mFrameProcessor->removeListener(minId, maxId, listener);
1501}
1502
1503status_t Camera2Client::stopStream() {
1504 return mStreamingProcessor->stopStream();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001505}
1506
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001507Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1508 mCameraClient(client.mCameraClient),
1509 mSharedClient(client) {
1510 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001511}
1512
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001513Camera2Client::SharedCameraClient::Lock::~Lock() {
1514 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001515}
1516
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001517Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1518 mCameraClient(client) {
1519}
1520
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001521Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1522 const sp<ICameraClient>&client) {
1523 Mutex::Autolock l(mCameraClientLock);
1524 mCameraClient = client;
1525 return *this;
1526}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001527
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001528void Camera2Client::SharedCameraClient::clear() {
1529 Mutex::Autolock l(mCameraClientLock);
1530 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001531}
1532
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001533const int32_t Camera2Client::kPreviewRequestIdStart;
1534const int32_t Camera2Client::kPreviewRequestIdEnd;
1535const int32_t Camera2Client::kRecordingRequestIdStart;
1536const int32_t Camera2Client::kRecordingRequestIdEnd;
1537const int32_t Camera2Client::kCaptureRequestIdStart;
1538const int32_t Camera2Client::kCaptureRequestIdEnd;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001539
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001540/** Utility methods */
1541
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001542status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001543 status_t res;
1544
Igor Murashkin0cb290b2012-10-02 19:07:14 -07001545 ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1546
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001547 res = mStreamingProcessor->incrementStreamingIds();
1548 if (res != OK) {
1549 ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1550 __FUNCTION__, mCameraId, strerror(-res), res);
1551 return res;
1552 }
1553
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001554 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001555 if (res != OK) {
1556 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1557 __FUNCTION__, mCameraId, strerror(-res), res);
1558 return res;
1559 }
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001560 res = mStreamingProcessor->updateRecordingRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001561 if (res != OK) {
1562 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1563 __FUNCTION__, mCameraId, strerror(-res), res);
1564 return res;
1565 }
1566
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001567 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001568 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001569 if (res != OK) {
1570 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1571 __FUNCTION__, mCameraId, strerror(-res), res);
1572 return res;
1573 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001574 } else if (params.state == Parameters::RECORD ||
1575 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala43cbdc52012-09-26 10:45:47 -07001576 res = startRecordingL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001577 if (res != OK) {
1578 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1579 __FUNCTION__, mCameraId, strerror(-res), res);
1580 return res;
1581 }
1582 }
1583 return res;
1584}
1585
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001586
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001587size_t Camera2Client::calculateBufferSize(int width, int height,
1588 int format, int stride) {
1589 switch (format) {
1590 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1591 return width * height * 2;
1592 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1593 return width * height * 3 / 2;
1594 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1595 return width * height * 2;
1596 case HAL_PIXEL_FORMAT_YV12: { // YV12
1597 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001598 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001599 size_t uvSize = uvStride * height / 2;
1600 return ySize + uvSize * 2;
1601 }
1602 case HAL_PIXEL_FORMAT_RGB_565:
1603 return width * height * 2;
1604 case HAL_PIXEL_FORMAT_RGBA_8888:
1605 return width * height * 4;
1606 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1607 return width * height * 2;
1608 default:
1609 ALOGE("%s: Unknown preview format: %x",
1610 __FUNCTION__, format);
1611 return 0;
1612 }
1613}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001614
Eino-Ville Talvala4c9eb712012-10-02 13:30:28 -07001615status_t Camera2Client::syncWithDevice() {
1616 ATRACE_CALL();
1617 const nsecs_t kMaxSyncTimeout = 100000000; // 100 ms
1618 status_t res;
1619
1620 int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1621 if (activeRequestId == 0) return OK;
1622
1623 res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1624 if (res == TIMED_OUT) {
1625 ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1626 __FUNCTION__, mCameraId);
1627 } else if (res != OK) {
1628 ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1629 __FUNCTION__, mCameraId);
1630 }
1631 return res;
1632}
1633
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001634} // namespace android