blob: 323948379a3b4bae7db3b8770be33d36d2feac41 [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 Talvala4bb81182012-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 Paintere5382062012-09-05 18:02:32 -070027#include "camera2/Parameters.h"
James Painter10894e52012-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 Murashkinecf17e82012-10-02 16:05:11 -070050 int clientPid,
51 int servicePid):
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070052 Client(cameraService, cameraClient,
Igor Murashkinecf17e82012-10-02 16:05:11 -070053 cameraId, cameraFacing, clientPid, servicePid),
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070054 mSharedCameraClient(cameraClient),
Eino-Ville Talvala73bbd1f2012-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 Talvalada6665c2012-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();
Igor Murashkinecf17e82012-10-02 16:05:11 -070068 if (callingPid == mClientPid || callingPid == mServicePid) 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"
Igor Murashkinecf17e82012-10-02 16:05:11 -070071 " (old pid %d, new pid %d, servicePid %d)", checkLocation, mClientPid, callingPid, mServicePid);
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 Talvalada6665c2012-08-29 17:37:16 -070099 String8 threadName;
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700100
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700101 mStreamingProcessor = new StreamingProcessor(this);
102
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700103 mFrameProcessor = new FrameProcessor(this);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700104 threadName = String8::format("C2-%d-FrameProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700105 mCameraId);
106 mFrameProcessor->run(threadName.string());
107
108 mCaptureSequencer = new CaptureSequencer(this);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700109 threadName = String8::format("C2-%d-CaptureSeq",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700110 mCameraId);
111 mCaptureSequencer->run(threadName.string());
112
113 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700114 threadName = String8::format("C2-%d-JpegProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700115 mCameraId);
116 mJpegProcessor->run(threadName.string());
117
118 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700119 threadName = String8::format("C2-%d-ZslProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700120 mCameraId);
121 mZslProcessor->run(threadName.string());
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700122
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700123 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700124 threadName = String8::format("C2-%d-CallbkProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700125 mCameraId);
126 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvalad86a6882012-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
Igor Murashkinecf17e82012-10-02 16:05:11 -0700142 Parameters::State state;
143 // warning:
144 // holding on to locks more than necessary may be hazardous to your health
145 {
146 SharedParameters::Lock l(mParameters);
147 state = l.mParameters.state;
148 }
149
150 if (state != Parameters::DISCONNECTED) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700151 // Rewrite mClientPid to allow shutdown by CameraService
152 mClientPid = getCallingPid();
153 disconnect();
154 }
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700155
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700156 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700157}
158
159status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700160 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700161 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700162 mCameraId,
163 getCameraClient()->asBinder().get(),
164 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700165 result.append(" State: ");
166#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
167
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700168 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700169
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700170 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700171
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700172 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700173 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700174 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700175 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700176 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700177 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700178 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700179 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700180 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700181 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700182 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700183 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700184 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700185 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700186 p.jpegQuality, p.jpegThumbQuality);
187 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700188 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700189 p.gpsEnabled ? "enabled" : "disabled");
190 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700191 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700192 p.gpsCoordinates[0], p.gpsCoordinates[1],
193 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700194 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700195 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700196 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700197 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700198 }
199
200 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700201 switch (p.wbMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700202 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
203 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
204 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
205 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
206 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
207 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
208 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
209 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
210 default: result.append("UNKNOWN\n");
211 }
212
213 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700214 switch (p.effectMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700215 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
216 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
217 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
218 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
219 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
220 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
221 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
222 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
223 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
224 default: result.append("UNKNOWN\n");
225 }
226
227 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700228 switch (p.antibandingMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700229 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
230 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
231 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
232 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
233 default: result.append("UNKNOWN\n");
234 }
235
236 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700237 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700238 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
239 result.append("AUTO\n"); break;
240 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
241 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
242 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
243 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
244 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
245 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
246 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
247 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
248 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
249 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
250 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
251 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
252 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
253 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
254 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
255 default: result.append("UNKNOWN\n");
256 }
257
258 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700259 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700260 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
261 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
262 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
263 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
264 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
265 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
266 default: result.append("UNKNOWN\n");
267 }
268
269 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700270 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700271 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
272 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
273 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
274 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
275 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
276 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
277 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
278 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
279 default: result.append("UNKNOWN\n");
280 }
281
282 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700283 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700284 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700285 p.focusingAreas[i].left,
286 p.focusingAreas[i].top,
287 p.focusingAreas[i].right,
288 p.focusingAreas[i].bottom,
289 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700290 }
291
292 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700293 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700294
295 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700296 p.autoExposureLock ? "enabled" : "disabled",
297 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700298
299 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700300 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700301 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700302 p.meteringAreas[i].left,
303 p.meteringAreas[i].top,
304 p.meteringAreas[i].right,
305 p.meteringAreas[i].bottom,
306 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700307 }
308
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700309 result.appendFormat(" Zoom index: %d\n", p.zoom);
310 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
311 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700312
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700313 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700314 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700315
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700316 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700317 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700318
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700319 result.append(" Current streams:\n");
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700320 result.appendFormat(" Preview stream ID: %d\n",
321 getPreviewStreamId());
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700322 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700323 getCaptureStreamId());
324 result.appendFormat(" Recording stream ID: %d\n",
325 getRecordingStreamId());
Eino-Ville Talvalae382ee22012-10-02 18:14:49 -0700326
327 result.append(" Quirks for this camera:\n");
328 bool haveQuirk = false;
329 if (p.quirks.triggerAfWithAuto) {
330 result.appendFormat(" triggerAfWithAuto\n");
331 haveQuirk = true;
332 }
333 if (p.quirks.useZslFormat) {
334 result.appendFormat(" useZslFormat\n");
335 haveQuirk = true;
336 }
Igor Murashkin7373cbe2012-09-28 15:30:03 -0700337 if (p.quirks.meteringCropRegion) {
338 result.appendFormat(" meteringCropRegion\n");
339 haveQuirk = true;
340 }
Eino-Ville Talvalae382ee22012-10-02 18:14:49 -0700341 if (!haveQuirk) {
342 result.appendFormat(" none\n");
343 }
344
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700345 write(fd, result.string(), result.size());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700346
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700347 mStreamingProcessor->dump(fd, args);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700348
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700349 mCaptureSequencer->dump(fd, args);
350
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700351 mFrameProcessor->dump(fd, args);
352
Eino-Ville Talvala97b38a82012-09-17 17:55:07 -0700353 mZslProcessor->dump(fd, args);
354
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700355 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700356 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700357
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700358 status_t res = mDevice->dump(fd, args);
359 if (res != OK) {
360 result = String8::format(" Error dumping device: %s (%d)",
361 strerror(-res), res);
362 write(fd, result.string(), result.size());
363 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700364
365#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700366 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700367}
368
369// ICamera interface
370
371void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700372 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700373 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700374 status_t res;
375 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700376
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700377 if (mDevice == 0) return;
378
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700379 ALOGV("Camera %d: Shutting down", mCameraId);
380
Eino-Ville Talvalaf6e09d22012-10-04 17:01:25 -0700381 res = mStreamingProcessor->stopStream();
382 if (res != OK) {
383 ALOGE("%s: Problem stopping streaming: %s (%d)",
384 __FUNCTION__, strerror(-res), res);
385 }
386 res = mDevice->waitUntilDrained();
387 if (res != OK) {
388 ALOGE("%s: Problem waiting for HAL: %s (%d)",
389 __FUNCTION__, strerror(-res), res);
390 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700391
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700392 {
393 SharedParameters::Lock l(mParameters);
394 l.mParameters.state = Parameters::DISCONNECTED;
395 }
396
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700397 mStreamingProcessor->deletePreviewStream();
398 mStreamingProcessor->deleteRecordingStream();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700399 mJpegProcessor->deleteStream();
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700400 mCallbackProcessor->deleteStream();
Eino-Ville Talvalacf70d342012-09-05 19:02:43 -0700401 mZslProcessor->deleteStream();
402
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700403 mFrameProcessor->requestExit();
404 mCaptureSequencer->requestExit();
405 mJpegProcessor->requestExit();
406 mZslProcessor->requestExit();
407 mCallbackProcessor->requestExit();
408
409 ALOGV("Camera %d: Waiting for threads", mCameraId);
410
411 mFrameProcessor->join();
412 mCaptureSequencer->join();
413 mJpegProcessor->join();
414 mZslProcessor->join();
415 mCallbackProcessor->join();
416
417 ALOGV("Camera %d: Disconnecting device", mCameraId);
418
419 mDevice->disconnect();
420
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700421 mDevice.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700422
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700423 CameraService::Client::disconnect();
424}
425
426status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700427 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700428 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700429 Mutex::Autolock icl(mICameraLock);
430
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700431 if (mClientPid != 0 && getCallingPid() != mClientPid) {
432 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
433 "current locked to pid %d", __FUNCTION__,
434 mCameraId, getCallingPid(), mClientPid);
435 return BAD_VALUE;
436 }
437
438 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700439
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700440 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700441 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700442
443 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700444}
445
446status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700447 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700448 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700449 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700450 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
451 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700452
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700453 if (mClientPid == 0) {
454 mClientPid = getCallingPid();
455 return OK;
456 }
457
458 if (mClientPid != getCallingPid()) {
459 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
460 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
461 return EBUSY;
462 }
463
464 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700465}
466
467status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700468 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700469 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700470 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700471 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
472 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700473
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700474 // TODO: Check for uninterruptable conditions
475
476 if (mClientPid == getCallingPid()) {
477 mClientPid = 0;
478 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700479 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700480 return OK;
481 }
482
483 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
484 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
485 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700486}
487
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700488status_t Camera2Client::setPreviewDisplay(
489 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700490 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700491 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700492 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700493 status_t res;
494 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700495
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700496 sp<IBinder> binder;
497 sp<ANativeWindow> window;
498 if (surface != 0) {
499 binder = surface->asBinder();
500 window = surface;
501 }
502
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700503 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700504}
505
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700506status_t Camera2Client::setPreviewTexture(
507 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700508 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700509 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700510 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700511 status_t res;
512 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700513
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700514 sp<IBinder> binder;
515 sp<ANativeWindow> window;
516 if (surfaceTexture != 0) {
517 binder = surfaceTexture->asBinder();
518 window = new SurfaceTextureClient(surfaceTexture);
519 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700520 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700521}
522
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700523status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700524 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700525 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700526 status_t res;
527
528 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700529 ALOGV("%s: Camera %d: New window is same as old window",
530 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700531 return NO_ERROR;
532 }
533
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700534 SharedParameters::Lock l(mParameters);
535 switch (l.mParameters.state) {
536 case Parameters::DISCONNECTED:
537 case Parameters::RECORD:
538 case Parameters::STILL_CAPTURE:
539 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700540 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700541 __FUNCTION__, mCameraId,
542 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700543 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700544 case Parameters::STOPPED:
545 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700546 // OK
547 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700548 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700549 // Already running preview - need to stop and create a new stream
550 // TODO: Optimize this so that we don't wait for old stream to drain
551 // before spinning up new stream
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700552 mStreamingProcessor->stopStream();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700553 l.mParameters.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 Talvala73bbd1f2012-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 Talvala2e19c3c2012-08-26 09:29:28 -0700565 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
566 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700567 }
568
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700569 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700570}
571
572void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700573 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700574 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700575 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700576 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700577 if ( checkPid(__FUNCTION__) != OK) return;
578
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700579 SharedParameters::Lock l(mParameters);
580 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700581}
582
583void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
584 status_t res = OK;
585 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
586 ALOGV("%s: setting oneshot", __FUNCTION__);
587 params.previewCallbackOneShot = true;
588 }
589 if (params.previewCallbackFlags != (uint32_t)flag) {
590 params.previewCallbackFlags = flag;
591 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700592 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700593 res = startPreviewL(params, true);
594 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700595 case Parameters::RECORD:
596 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700597 res = startRecordingL(params, true);
598 break;
599 default:
600 break;
601 }
602 if (res != OK) {
603 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700604 __FUNCTION__, mCameraId,
605 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700606 }
607 }
608
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700609}
610
611status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700612 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700613 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700614 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700615 status_t res;
616 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700617 SharedParameters::Lock l(mParameters);
618 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700619}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700620
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700621status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700622 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700623 status_t res;
Igor Murashkin22d58d32012-10-02 19:07:14 -0700624
625 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
626
Alex Ray77449ad2012-09-26 15:52:50 -0700627 if (params.state == Parameters::PREVIEW && !restart) {
628 // Succeed attempt to re-enter preview state
629 ALOGI("%s: Not starting preview; already in preview state.",
630 __FUNCTION__);
631 return OK;
632 }
633 if (params.state > Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700634 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700635 __FUNCTION__,
636 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700637 return INVALID_OPERATION;
638 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700639
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700640 if (!mStreamingProcessor->haveValidPreviewWindow()) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700641 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700642 return OK;
643 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700644 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700645
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700646 res = mStreamingProcessor->updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700647 if (res != OK) {
648 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
649 __FUNCTION__, mCameraId, strerror(-res), res);
650 return res;
651 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700652
653 Vector<uint8_t> outputStreams;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700654 bool callbacksEnabled = params.previewCallbackFlags &
655 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
656 if (callbacksEnabled) {
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700657 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700658 if (res != OK) {
659 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
660 __FUNCTION__, mCameraId, strerror(-res), res);
661 return res;
662 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700663 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700664 }
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700665 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700666 res = mZslProcessor->updateStream(params);
667 if (res != OK) {
668 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
669 __FUNCTION__, mCameraId, strerror(-res), res);
670 return res;
671 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700672 outputStreams.push(getZslStreamId());
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700673 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700674
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700675 outputStreams.push(getPreviewStreamId());
676
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700677 if (!params.recordingHint) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700678 if (!restart) {
679 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700680 if (res != OK) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700681 ALOGE("%s: Camera %d: Can't set up preview request: "
682 "%s (%d)", __FUNCTION__, mCameraId,
683 strerror(-res), res);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700684 return res;
685 }
686 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700687 res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
688 outputStreams);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700689 } else {
690 // With recording hint set, we're going to be operating under the
691 // assumption that the user will record video. To optimize recording
692 // startup time, create the necessary output streams for recording and
693 // video snapshot now if they don't already exist.
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700694 res = mJpegProcessor->updateStream(params);
695 if (res != OK) {
696 ALOGE("%s: Camera %d: Can't pre-configure still image "
697 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700698 __FUNCTION__, mCameraId, strerror(-res), res);
699 return res;
700 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700701
702 if (!restart) {
703 res = mStreamingProcessor->updateRecordingRequest(params);
704 if (res != OK) {
705 ALOGE("%s: Camera %d: Can't set up preview request with "
706 "record hint: %s (%d)", __FUNCTION__, mCameraId,
707 strerror(-res), res);
708 return res;
709 }
710 }
711 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
712 outputStreams);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700713 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700714 if (res != OK) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700715 ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700716 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700717 return res;
718 }
719
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700720 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700721 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700722}
723
724void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700725 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700726 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700727 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700728 status_t res;
729 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700730 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700731}
732
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700733void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700734 ATRACE_CALL();
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700735 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700736 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700737 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700738 SharedParameters::Lock l(mParameters);
739 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700740 }
741
742 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700743 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700744 ALOGE("%s: Camera %d: Call before initialized",
745 __FUNCTION__, mCameraId);
746 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700747 case Parameters::STOPPED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700748 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700749 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700750 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
751 __FUNCTION__, mCameraId);
752 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700753 case Parameters::RECORD:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700754 // no break - identical to preview
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700755 case Parameters::PREVIEW:
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700756 mStreamingProcessor->stopStream();
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700757 res = mDevice->waitUntilDrained();
758 if (res != OK) {
759 ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
760 __FUNCTION__, mCameraId, strerror(-res), res);
761 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700762 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700763 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
764 SharedParameters::Lock l(mParameters);
765 l.mParameters.state = Parameters::STOPPED;
766 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700767 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700768 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700769 default:
770 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700771 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700772 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700773}
774
775bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700776 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700777 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700778 status_t res;
779 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
780
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700781 SharedParameters::Lock l(mParameters);
782 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700783}
784
785status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700786 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700787 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700788 status_t res;
789 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
790
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700791 SharedParameters::Lock l(mParameters);
792 switch (l.mParameters.state) {
793 case Parameters::RECORD:
794 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700795 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700796 __FUNCTION__, mCameraId,
797 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700798 return INVALID_OPERATION;
799 default:
800 // OK
801 break;
802 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700803
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700804 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700805
806 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700807}
808
809status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700810 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700811 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700812 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700813 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700814 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700815 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700816
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700817 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700818}
819
820status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
821 status_t res;
Igor Murashkin22d58d32012-10-02 19:07:14 -0700822
823 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
824
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700825 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700826 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700827 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700828 if (res != OK) return res;
829 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700830 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700831 // Ready to go
832 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700833 case Parameters::RECORD:
834 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700835 // OK to call this when recording is already on, just skip unless
836 // we're looking to restart
837 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700838 break;
839 default:
840 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700841 __FUNCTION__, mCameraId,
842 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700843 return INVALID_OPERATION;
844 };
845
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700846 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700847 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
848 "non-metadata recording mode requested!", __FUNCTION__,
849 mCameraId);
850 return INVALID_OPERATION;
851 }
852
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700853 if (!restart) {
854 mCameraService->playSound(CameraService::SOUND_RECORDING);
855 mStreamingProcessor->updateRecordingRequest(params);
856 if (res != OK) {
857 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
858 __FUNCTION__, mCameraId, strerror(-res), res);
859 return res;
860 }
861 }
Eino-Ville Talvala609acc02012-09-06 18:26:58 -0700862
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700863 res = mStreamingProcessor->updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700864 if (res != OK) {
865 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
866 __FUNCTION__, mCameraId, strerror(-res), res);
867 return res;
868 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700869
870 Vector<uint8_t> outputStreams;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700871 bool callbacksEnabled = params.previewCallbackFlags &
872 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
873 if (callbacksEnabled) {
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700874 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700875 if (res != OK) {
876 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
877 __FUNCTION__, mCameraId, strerror(-res), res);
878 return res;
879 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700880 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700881 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700882 outputStreams.push(getPreviewStreamId());
883 outputStreams.push(getRecordingStreamId());
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700884
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700885 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
886 outputStreams);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700887 if (res != OK) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700888 ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700889 __FUNCTION__, mCameraId, strerror(-res), res);
890 return res;
891 }
892
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700893 if (params.state < Parameters::RECORD) {
894 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700895 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700896
897 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700898}
899
900void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700901 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700902 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700903 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700904 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700905
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700906 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700907 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
908
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700909 switch (l.mParameters.state) {
910 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700911 // OK to stop
912 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700913 case Parameters::STOPPED:
914 case Parameters::PREVIEW:
915 case Parameters::STILL_CAPTURE:
916 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700917 default:
918 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700919 __FUNCTION__, mCameraId,
920 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700921 return;
922 };
923
Eino-Ville Talvala609acc02012-09-06 18:26:58 -0700924 mCameraService->playSound(CameraService::SOUND_RECORDING);
925
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700926 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700927 if (res != OK) {
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700928 ALOGE("%s: Camera %d: Unable to return to preview",
929 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700930 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700931}
932
933bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700934 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700935 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700936
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700937 if ( checkPid(__FUNCTION__) != OK) return false;
938
James Dong8da4cd72012-08-04 19:58:07 -0700939 return recordingEnabledL();
940}
941
942bool Camera2Client::recordingEnabledL() {
943 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700944 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700945
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700946 return (l.mParameters.state == Parameters::RECORD
947 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700948}
949
950void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700951 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700952 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700953 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700954
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700955 mStreamingProcessor->releaseRecordingFrame(mem);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700956}
957
958status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700959 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700960 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -0700961 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700962 status_t res;
963 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
964
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700965 int triggerId;
966 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700967 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700968 if (l.mParameters.state < Parameters::PREVIEW) {
969 return INVALID_OPERATION;
970 }
971
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -0700972 if (l.mParameters.quirks.triggerAfWithAuto &&
973 l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
974 l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO) {
975 ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
976 __FUNCTION__, l.mParameters.focusMode);
977 l.mParameters.shadowFocusMode = l.mParameters.focusMode;
978 l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
979 updateRequests(l.mParameters);
980 }
981
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700982 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
983 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700984 }
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700985 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700986
987 mDevice->triggerAutofocus(triggerId);
988
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700989 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700990}
991
992status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700993 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700994 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -0700995 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700996 status_t res;
997 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
998
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700999 int triggerId;
1000 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001001 SharedParameters::Lock l(mParameters);
1002 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -07001003
1004 // When using triggerAfWithAuto quirk, may need to reset focus mode to
1005 // the real state at this point.
1006 if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
1007 ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
1008 l.mParameters.shadowFocusMode);
1009 l.mParameters.focusMode = l.mParameters.shadowFocusMode;
1010 l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
1011 updateRequests(l.mParameters);
1012 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001013 }
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001014 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001015
1016 mDevice->triggerCancelAutofocus(triggerId);
1017
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001018 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001019}
1020
1021status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001022 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001023 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001024 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001025 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001026
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001027 SharedParameters::Lock l(mParameters);
1028 switch (l.mParameters.state) {
1029 case Parameters::DISCONNECTED:
1030 case Parameters::STOPPED:
1031 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001032 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1033 __FUNCTION__, mCameraId);
1034 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001035 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001036 // Good to go for takePicture
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001037 res = commandStopFaceDetectionL(l.mParameters);
1038 if (res != OK) {
1039 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1040 __FUNCTION__, mCameraId);
1041 return res;
1042 }
1043 l.mParameters.state = Parameters::STILL_CAPTURE;
1044 break;
1045 case Parameters::RECORD:
1046 // Good to go for video snapshot
1047 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001048 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001049 case Parameters::STILL_CAPTURE:
1050 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001051 ALOGE("%s: Camera %d: Already taking a picture",
1052 __FUNCTION__, mCameraId);
1053 return INVALID_OPERATION;
1054 }
1055
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001056 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001057
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001058 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001059 if (res != OK) {
1060 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1061 __FUNCTION__, mCameraId, strerror(-res), res);
1062 return res;
1063 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001064
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001065 // Need HAL to have correct settings before (possibly) triggering precapture
1066 syncWithDevice();
1067
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001068 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001069 if (res != OK) {
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001070 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001071 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001072 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001073
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001074 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001075}
1076
1077status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001078 ATRACE_CALL();
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001079 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001080 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001081 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001082 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1083
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001084 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001085
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001086 res = l.mParameters.set(params);
1087 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001088
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001089 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001090
1091 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001092}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001093
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001094String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001095 ATRACE_CALL();
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001096 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001097 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001098 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001099
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001100 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001101
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001102 return l.mParameters.get();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001103}
1104
1105status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001106 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001107 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001108 status_t res;
1109 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001110
1111 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1112 cmd, arg1, arg2);
1113
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001114 switch (cmd) {
1115 case CAMERA_CMD_START_SMOOTH_ZOOM:
1116 return commandStartSmoothZoomL();
1117 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1118 return commandStopSmoothZoomL();
1119 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1120 return commandSetDisplayOrientationL(arg1);
1121 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1122 return commandEnableShutterSoundL(arg1 == 1);
1123 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1124 return commandPlayRecordingSoundL();
1125 case CAMERA_CMD_START_FACE_DETECTION:
1126 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001127 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001128 SharedParameters::Lock l(mParameters);
1129 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001130 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001131 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1132 return commandEnableFocusMoveMsgL(arg1 == 1);
1133 case CAMERA_CMD_PING:
1134 return commandPingL();
1135 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1136 return commandSetVideoBufferCountL(arg1);
1137 default:
1138 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1139 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001140 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001141 }
1142}
James Dong983cf232012-08-01 16:39:55 -07001143
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001144status_t Camera2Client::commandStartSmoothZoomL() {
1145 ALOGE("%s: Unimplemented!", __FUNCTION__);
1146 return OK;
1147}
James Dong983cf232012-08-01 16:39:55 -07001148
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001149status_t Camera2Client::commandStopSmoothZoomL() {
1150 ALOGE("%s: Unimplemented!", __FUNCTION__);
1151 return OK;
1152}
James Dong983cf232012-08-01 16:39:55 -07001153
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001154status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001155 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001156 mCameraFacing == CAMERA_FACING_FRONT);
1157 if (transform == -1) {
1158 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1159 __FUNCTION__, mCameraId, degrees);
1160 return BAD_VALUE;
1161 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001162 SharedParameters::Lock l(mParameters);
1163 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001164 getPreviewStreamId() != NO_STREAM) {
1165 mDevice->setStreamTransform(getPreviewStreamId(), transform);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001166 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001167 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001168 return OK;
1169}
1170
1171status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001172 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001173 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001174 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001175 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001176 }
1177
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001178 // Disabling shutter sound may not be allowed. In that case only
1179 // allow the mediaserver process to disable the sound.
1180 char value[PROPERTY_VALUE_MAX];
1181 property_get("ro.camera.sound.forced", value, "0");
1182 if (strncmp(value, "0", 2) != 0) {
1183 // Disabling shutter sound is not allowed. Deny if the current
1184 // process is not mediaserver.
1185 if (getCallingPid() != getpid()) {
1186 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1187 getCallingPid());
1188 return PERMISSION_DENIED;
1189 }
1190 }
1191
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001192 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001193 return OK;
1194}
1195
1196status_t Camera2Client::commandPlayRecordingSoundL() {
1197 mCameraService->playSound(CameraService::SOUND_RECORDING);
1198 return OK;
1199}
1200
1201status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001202 ALOGV("%s: Camera %d: Starting face detection",
1203 __FUNCTION__, mCameraId);
1204 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001205 SharedParameters::Lock l(mParameters);
1206 switch (l.mParameters.state) {
1207 case Parameters::DISCONNECTED:
1208 case Parameters::STOPPED:
1209 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1210 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001211 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1212 __FUNCTION__, mCameraId);
1213 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001214 case Parameters::PREVIEW:
1215 case Parameters::RECORD:
1216 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001217 // Good to go for starting face detect
1218 break;
1219 }
1220 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001221 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1222 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001223 ALOGE("%s: Camera %d: Face detection not supported",
1224 __FUNCTION__, mCameraId);
1225 return INVALID_OPERATION;
1226 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001227 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001228
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001229 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001230
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001231 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001232
1233 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001234}
1235
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001236status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001237 status_t res = OK;
1238 ALOGV("%s: Camera %d: Stopping face detection",
1239 __FUNCTION__, mCameraId);
1240
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001241 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001242
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001243 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001244
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001245 if (params.state == Parameters::PREVIEW
1246 || params.state == Parameters::RECORD
1247 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001248 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001249 }
1250
1251 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001252}
1253
1254status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001255 SharedParameters::Lock l(mParameters);
1256 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001257
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001258 return OK;
1259}
1260
1261status_t Camera2Client::commandPingL() {
1262 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001263 SharedParameters::Lock l(mParameters);
1264 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001265 return OK;
1266 } else {
1267 return NO_INIT;
1268 }
1269}
1270
1271status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001272 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001273 ALOGE("%s: Camera %d: Error setting video buffer count after "
1274 "recording was started", __FUNCTION__, mCameraId);
1275 return INVALID_OPERATION;
1276 }
1277
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001278 return mStreamingProcessor->setRecordingBufferCount(count);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001279}
1280
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001281/** Device-related methods */
1282
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001283void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1284 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1285}
1286
1287void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1288 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1289 frameNumber, timestamp);
1290}
1291
1292void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1293 ALOGV("%s: Autofocus state now %d, last trigger %d",
1294 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001295 bool sendCompletedMessage = false;
1296 bool sendMovingMessage = false;
1297
1298 bool success = false;
1299 bool afInMotion = false;
1300 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001301 SharedParameters::Lock l(mParameters);
1302 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001303 case Parameters::FOCUS_MODE_AUTO:
1304 case Parameters::FOCUS_MODE_MACRO:
1305 // Don't send notifications upstream if they're not for the current AF
1306 // trigger. For example, if cancel was called in between, or if we
1307 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001308 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001309 switch (newState) {
1310 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1311 success = true;
1312 // no break
1313 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1314 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001315 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001316 break;
1317 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1318 // Just starting focusing, ignore
1319 break;
1320 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1321 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1322 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1323 default:
1324 // Unexpected in AUTO/MACRO mode
1325 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1326 __FUNCTION__, newState);
1327 break;
1328 }
1329 break;
1330 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1331 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1332 switch (newState) {
1333 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1334 success = true;
1335 // no break
1336 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1337 // Don't send notifications upstream if they're not for
1338 // the current AF trigger. For example, if cancel was
1339 // called in between, or if we already sent a
1340 // notification about this AF call.
1341 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001342 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001343 sendCompletedMessage = true;
1344 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001345 if (l.mParameters.enableFocusMoveMessages &&
1346 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001347 sendMovingMessage = true;
1348 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001349 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001350 break;
1351 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1352 // Cancel was called, or we switched state; care if
1353 // currently moving
1354 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001355 if (l.mParameters.enableFocusMoveMessages &&
1356 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001357 sendMovingMessage = true;
1358 }
1359 break;
1360 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1361 // Start passive scan, inform upstream
1362 afInMotion = true;
1363 // no break
1364 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1365 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001366 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001367 sendMovingMessage = true;
1368 }
1369 break;
1370 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001371 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001372 break;
1373 case Parameters::FOCUS_MODE_EDOF:
1374 case Parameters::FOCUS_MODE_INFINITY:
1375 case Parameters::FOCUS_MODE_FIXED:
1376 default:
1377 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001378 ALOGE("%s: Unexpected AF state change %d "
1379 "(ID %d) in focus mode %d",
1380 __FUNCTION__, newState, triggerId,
1381 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001382 }
1383 }
1384 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001385 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001386 SharedCameraClient::Lock l(mSharedCameraClient);
1387 if (l.mCameraClient != 0) {
1388 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001389 afInMotion ? 1 : 0, 0);
1390 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001391 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001392 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001393 SharedCameraClient::Lock l(mSharedCameraClient);
1394 if (l.mCameraClient != 0) {
1395 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1396 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001397 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001398 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001399}
1400
1401void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1402 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1403 __FUNCTION__, newState, triggerId);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001404 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001405}
1406
1407void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1408 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1409 __FUNCTION__, newState, triggerId);
1410}
1411
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001412int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001413 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001414}
1415
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001416const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1417 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001418}
1419
Eino-Ville Talvala609acc02012-09-06 18:26:58 -07001420const sp<CameraService>& Camera2Client::getCameraService() {
1421 return mCameraService;
1422}
1423
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001424camera2::SharedParameters& Camera2Client::getParameters() {
1425 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001426}
1427
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001428int Camera2Client::getPreviewStreamId() const {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001429 return mStreamingProcessor->getPreviewStreamId();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001430}
1431
1432int Camera2Client::getCaptureStreamId() const {
1433 return mJpegProcessor->getStreamId();
1434}
1435
1436int Camera2Client::getCallbackStreamId() const {
1437 return mCallbackProcessor->getStreamId();
1438}
1439
1440int Camera2Client::getRecordingStreamId() const {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001441 return mStreamingProcessor->getRecordingStreamId();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001442}
1443
1444int Camera2Client::getZslStreamId() const {
1445 return mZslProcessor->getStreamId();
1446}
1447
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001448status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001449 wp<camera2::FrameProcessor::FilteredListener> listener) {
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001450 return mFrameProcessor->registerListener(minId, maxId, listener);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001451}
1452
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001453status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1454 wp<camera2::FrameProcessor::FilteredListener> listener) {
1455 return mFrameProcessor->removeListener(minId, maxId, listener);
1456}
1457
1458status_t Camera2Client::stopStream() {
1459 return mStreamingProcessor->stopStream();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001460}
1461
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001462Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1463 mCameraClient(client.mCameraClient),
1464 mSharedClient(client) {
1465 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001466}
1467
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001468Camera2Client::SharedCameraClient::Lock::~Lock() {
1469 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001470}
1471
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -07001472Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1473 mCameraClient(client) {
1474}
1475
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001476Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1477 const sp<ICameraClient>&client) {
1478 Mutex::Autolock l(mCameraClientLock);
1479 mCameraClient = client;
1480 return *this;
1481}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001482
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001483void Camera2Client::SharedCameraClient::clear() {
1484 Mutex::Autolock l(mCameraClientLock);
1485 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001486}
1487
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001488const int32_t Camera2Client::kPreviewRequestIdStart;
1489const int32_t Camera2Client::kPreviewRequestIdEnd;
1490const int32_t Camera2Client::kRecordingRequestIdStart;
1491const int32_t Camera2Client::kRecordingRequestIdEnd;
1492const int32_t Camera2Client::kCaptureRequestIdStart;
1493const int32_t Camera2Client::kCaptureRequestIdEnd;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001494
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001495/** Utility methods */
1496
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -07001497status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001498 status_t res;
1499
Igor Murashkin22d58d32012-10-02 19:07:14 -07001500 ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1501
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001502 res = mStreamingProcessor->incrementStreamingIds();
1503 if (res != OK) {
1504 ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1505 __FUNCTION__, mCameraId, strerror(-res), res);
1506 return res;
1507 }
1508
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001509 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001510 if (res != OK) {
1511 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1512 __FUNCTION__, mCameraId, strerror(-res), res);
1513 return res;
1514 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001515 res = mStreamingProcessor->updateRecordingRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001516 if (res != OK) {
1517 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1518 __FUNCTION__, mCameraId, strerror(-res), res);
1519 return res;
1520 }
1521
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001522 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -07001523 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001524 if (res != OK) {
1525 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1526 __FUNCTION__, mCameraId, strerror(-res), res);
1527 return res;
1528 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001529 } else if (params.state == Parameters::RECORD ||
1530 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001531 res = startRecordingL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001532 if (res != OK) {
1533 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1534 __FUNCTION__, mCameraId, strerror(-res), res);
1535 return res;
1536 }
1537 }
1538 return res;
1539}
1540
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001541
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001542size_t Camera2Client::calculateBufferSize(int width, int height,
1543 int format, int stride) {
1544 switch (format) {
1545 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1546 return width * height * 2;
1547 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1548 return width * height * 3 / 2;
1549 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1550 return width * height * 2;
1551 case HAL_PIXEL_FORMAT_YV12: { // YV12
1552 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001553 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001554 size_t uvSize = uvStride * height / 2;
1555 return ySize + uvSize * 2;
1556 }
1557 case HAL_PIXEL_FORMAT_RGB_565:
1558 return width * height * 2;
1559 case HAL_PIXEL_FORMAT_RGBA_8888:
1560 return width * height * 4;
1561 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1562 return width * height * 2;
1563 default:
1564 ALOGE("%s: Unknown preview format: %x",
1565 __FUNCTION__, format);
1566 return 0;
1567 }
1568}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001569
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001570status_t Camera2Client::syncWithDevice() {
1571 ATRACE_CALL();
1572 const nsecs_t kMaxSyncTimeout = 100000000; // 100 ms
1573 status_t res;
1574
1575 int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1576 if (activeRequestId == 0) return OK;
1577
1578 res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1579 if (res == TIMED_OUT) {
1580 ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1581 __FUNCTION__, mCameraId);
1582 } else if (res != OK) {
1583 ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1584 __FUNCTION__, mCameraId);
1585 }
1586 return res;
1587}
1588
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001589} // namespace android