blob: 96bde903d4c7d1aa864de982a68eba975195e041 [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>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070025#include <gui/Surface.h>
James Paintere5382062012-09-05 18:02:32 -070026#include "camera2/Parameters.h"
James Painter10894e52012-09-07 16:36:50 -070027#include "Camera2Client.h"
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080028#include "Camera2Device.h"
29#include "Camera3Device.h"
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030
Igor Murashkinae500e52013-04-22 14:03:54 -070031#include "camera2/ZslProcessor.h"
32#include "camera2/ZslProcessor3.h"
33
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070034#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
35#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
36
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070037namespace android {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070038using namespace camera2;
39
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070040static int getCallingPid() {
41 return IPCThreadState::self()->getCallingPid();
42}
43
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070044// Interface used by CameraService
45
46Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
47 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080048 const String16& clientPackageName,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070049 int cameraId,
50 int cameraFacing,
Igor Murashkinecf17e82012-10-02 16:05:11 -070051 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080052 uid_t clientUid,
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080053 int servicePid,
54 int deviceVersion):
Igor Murashkin44cfcf02013-03-01 16:22:28 -080055 Camera2ClientBase(cameraService, cameraClient, clientPackageName,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080056 cameraId, cameraFacing, clientPid, clientUid, servicePid),
Igor Murashkinae500e52013-04-22 14:03:54 -070057 mParameters(cameraId, cameraFacing),
58 mDeviceVersion(deviceVersion)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070059{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070060 ATRACE_CALL();
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
66status_t Camera2Client::initialize(camera_module_t *module)
67{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070068 ATRACE_CALL();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070069 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070070 status_t res;
71
Igor Murashkine6800ce2013-03-04 17:25:57 -080072 res = Camera2ClientBase::initialize(module);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080073 if (res != OK) {
74 return res;
75 }
76
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070077 SharedParameters::Lock l(mParameters);
78
79 res = l.mParameters.initialize(&(mDevice->info()));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070080 if (res != OK) {
81 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
82 __FUNCTION__, mCameraId, strerror(-res), res);
83 return NO_INIT;
84 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070085
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070086 String8 threadName;
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070087
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -070088 mStreamingProcessor = new StreamingProcessor(this);
Eino-Ville Talvala254446a2013-06-04 16:34:35 -070089 threadName = String8::format("C2-%d-StreamProc",
90 mCameraId);
91 mStreamingProcessor->run(threadName.string());
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -070092
Igor Murashkince124da2013-03-04 14:53:08 -080093 mFrameProcessor = new FrameProcessor(mDevice, this);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -070094 threadName = String8::format("C2-%d-FrameProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070095 mCameraId);
96 mFrameProcessor->run(threadName.string());
97
98 mCaptureSequencer = new CaptureSequencer(this);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -070099 threadName = String8::format("C2-%d-CaptureSeq",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700100 mCameraId);
101 mCaptureSequencer->run(threadName.string());
102
103 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700104 threadName = String8::format("C2-%d-JpegProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700105 mCameraId);
106 mJpegProcessor->run(threadName.string());
107
Igor Murashkinae500e52013-04-22 14:03:54 -0700108 switch (mDeviceVersion) {
109 case CAMERA_DEVICE_API_VERSION_2_0: {
110 sp<ZslProcessor> zslProc =
111 new ZslProcessor(this, mCaptureSequencer);
112 mZslProcessor = zslProc;
113 mZslProcessorThread = zslProc;
114 break;
115 }
116 case CAMERA_DEVICE_API_VERSION_3_0:{
117 sp<ZslProcessor3> zslProc =
118 new ZslProcessor3(this, mCaptureSequencer);
119 mZslProcessor = zslProc;
120 mZslProcessorThread = zslProc;
121 break;
122 }
123 default:
124 break;
125 }
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700126 threadName = String8::format("C2-%d-ZslProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700127 mCameraId);
Igor Murashkinae500e52013-04-22 14:03:54 -0700128 mZslProcessorThread->run(threadName.string());
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700129
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700130 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -0700131 threadName = String8::format("C2-%d-CallbkProc",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700132 mCameraId);
133 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700134
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700135 if (gLogLevel >= 1) {
136 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
137 mCameraId);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700138 ALOGD("%s", l.mParameters.paramsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700139 }
140
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700141 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700142}
143
144Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700145 ATRACE_CALL();
Eino-Ville Talvalad09801b2013-04-23 15:16:57 -0700146 ALOGV("~Camera2Client");
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700147
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700148 mDestructionStarted = true;
149
Eino-Ville Talvalac0379202012-10-09 22:16:58 -0700150 disconnect();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700151
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700152 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700153}
154
155status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700156 String8 result;
Eino-Ville Talvalad0158c32013-03-11 14:13:50 -0700157 result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700158 mCameraId,
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800159 getRemoteCallback()->asBinder().get(),
Eino-Ville Talvalad0158c32013-03-11 14:13:50 -0700160 String8(mClientPackageName).string(),
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700161 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700162 result.append(" State: ");
163#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
164
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700165 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700166
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700167 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700168
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700169 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700170 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700171 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700172 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700173 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700174 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700175 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700176 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700177 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700178 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700179 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700180 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700181 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700182 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700183 p.jpegQuality, p.jpegThumbQuality);
184 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700185 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700186 p.gpsEnabled ? "enabled" : "disabled");
187 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700188 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700189 p.gpsCoordinates[0], p.gpsCoordinates[1],
190 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700191 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700192 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700193 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700194 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700195 }
196
197 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700198 switch (p.wbMode) {
Igor Murashkind32b99b2012-11-27 16:25:46 -0800199 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
200 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
201 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
202 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
203 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
204 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
205 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
206 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700207 default: result.append("UNKNOWN\n");
208 }
209
210 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700211 switch (p.effectMode) {
Igor Murashkind32b99b2012-11-27 16:25:46 -0800212 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
213 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
214 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
215 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
216 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
217 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
218 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
219 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
220 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700221 default: result.append("UNKNOWN\n");
222 }
223
224 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700225 switch (p.antibandingMode) {
Igor Murashkind32b99b2012-11-27 16:25:46 -0800226 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
227 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
228 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
229 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700230 default: result.append("UNKNOWN\n");
231 }
232
233 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700234 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700235 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
236 result.append("AUTO\n"); break;
237 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
238 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
239 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
240 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
241 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
242 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
243 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
244 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
245 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
246 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
247 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
248 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
249 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
250 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
251 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
252 default: result.append("UNKNOWN\n");
253 }
254
255 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700256 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700257 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
258 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
259 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
260 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
261 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
262 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
263 default: result.append("UNKNOWN\n");
264 }
265
266 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700267 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700268 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
269 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
270 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
271 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
272 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
273 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
274 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
275 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
276 default: result.append("UNKNOWN\n");
277 }
278
Eino-Ville Talvalad6cc4a62012-10-16 10:17:30 -0700279 result.append(" Focus state: ");
280 switch (p.focusState) {
281 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
282 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
283 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
284 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
285 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
286 CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
287 default: result.append("UNKNOWN\n");
288 }
289
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700290 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700291 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700292 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700293 p.focusingAreas[i].left,
294 p.focusingAreas[i].top,
295 p.focusingAreas[i].right,
296 p.focusingAreas[i].bottom,
297 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700298 }
299
300 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700301 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700302
303 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700304 p.autoExposureLock ? "enabled" : "disabled",
305 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700306
307 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700308 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700309 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700310 p.meteringAreas[i].left,
311 p.meteringAreas[i].top,
312 p.meteringAreas[i].right,
313 p.meteringAreas[i].bottom,
314 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700315 }
316
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700317 result.appendFormat(" Zoom index: %d\n", p.zoom);
318 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
319 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700320
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700321 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700322 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700323
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700324 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700325 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700326
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700327 result.append(" Current streams:\n");
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700328 result.appendFormat(" Preview stream ID: %d\n",
329 getPreviewStreamId());
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700330 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700331 getCaptureStreamId());
332 result.appendFormat(" Recording stream ID: %d\n",
333 getRecordingStreamId());
Eino-Ville Talvalae382ee22012-10-02 18:14:49 -0700334
335 result.append(" Quirks for this camera:\n");
336 bool haveQuirk = false;
337 if (p.quirks.triggerAfWithAuto) {
338 result.appendFormat(" triggerAfWithAuto\n");
339 haveQuirk = true;
340 }
341 if (p.quirks.useZslFormat) {
342 result.appendFormat(" useZslFormat\n");
343 haveQuirk = true;
344 }
Igor Murashkin7373cbe2012-09-28 15:30:03 -0700345 if (p.quirks.meteringCropRegion) {
346 result.appendFormat(" meteringCropRegion\n");
347 haveQuirk = true;
348 }
Eino-Ville Talvalae382ee22012-10-02 18:14:49 -0700349 if (!haveQuirk) {
350 result.appendFormat(" none\n");
351 }
352
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700353 write(fd, result.string(), result.size());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700354
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700355 mStreamingProcessor->dump(fd, args);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700356
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700357 mCaptureSequencer->dump(fd, args);
358
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700359 mFrameProcessor->dump(fd, args);
360
Eino-Ville Talvala97b38a82012-09-17 17:55:07 -0700361 mZslProcessor->dump(fd, args);
362
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800363 return dumpDevice(fd, args);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700364#undef CASE_APPEND_ENUM
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700365}
366
367// ICamera interface
368
369void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700370 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800371 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvalac0379202012-10-09 22:16:58 -0700372
373 // Allow both client and the media server to disconnect at all times
374 int callingPid = getCallingPid();
375 if (callingPid != mClientPid && callingPid != mServicePid) 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 Talvalad09801b2013-04-23 15:16:57 -0700381 /**
382 * disconnect() cannot call any methods that might need to promote a
383 * wp<Camera2Client>, since disconnect can be called from the destructor, at
384 * which point all such promotions will fail.
385 */
386
Eino-Ville Talvalad5087f92012-10-05 12:03:10 -0700387 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700388
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700389 {
390 SharedParameters::Lock l(mParameters);
Eino-Ville Talvalac0379202012-10-09 22:16:58 -0700391 if (l.mParameters.state == Parameters::DISCONNECTED) return;
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700392 l.mParameters.state = Parameters::DISCONNECTED;
393 }
394
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700395 mStreamingProcessor->deletePreviewStream();
396 mStreamingProcessor->deleteRecordingStream();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700397 mJpegProcessor->deleteStream();
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700398 mCallbackProcessor->deleteStream();
Eino-Ville Talvalacf70d342012-09-05 19:02:43 -0700399 mZslProcessor->deleteStream();
400
Eino-Ville Talvala254446a2013-06-04 16:34:35 -0700401 mStreamingProcessor->requestExit();
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700402 mFrameProcessor->requestExit();
403 mCaptureSequencer->requestExit();
404 mJpegProcessor->requestExit();
Igor Murashkinae500e52013-04-22 14:03:54 -0700405 mZslProcessorThread->requestExit();
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700406 mCallbackProcessor->requestExit();
407
408 ALOGV("Camera %d: Waiting for threads", mCameraId);
409
Eino-Ville Talvala254446a2013-06-04 16:34:35 -0700410 mStreamingProcessor->join();
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700411 mFrameProcessor->join();
412 mCaptureSequencer->join();
413 mJpegProcessor->join();
Igor Murashkinae500e52013-04-22 14:03:54 -0700414 mZslProcessorThread->join();
Eino-Ville Talvala98bb82d2012-09-20 14:44:20 -0700415 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__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800429 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700430
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
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800440 mRemoteCallback = client;
441 mSharedCameraCallbacks = 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__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800449 Mutex::Autolock icl(mBinderSerializationLock);
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__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800470 Mutex::Autolock icl(mBinderSerializationLock);
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 if (mClientPid == getCallingPid()) {
Eino-Ville Talvala907e5652012-10-10 15:28:53 -0700475 SharedParameters::Lock l(mParameters);
476 if (l.mParameters.state == Parameters::RECORD ||
477 l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
478 ALOGD("Not allowed to unlock camera during recording.");
479 return INVALID_OPERATION;
480 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700481 mClientPid = 0;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800482 mRemoteCallback.clear();
483 mSharedCameraCallbacks.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700484 return OK;
485 }
486
487 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
488 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
489 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700490}
491
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700492status_t Camera2Client::setPreviewDisplay(
493 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700494 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700495 ALOGV("%s: E", __FUNCTION__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800496 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700497 status_t res;
498 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700499
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700500 sp<IBinder> binder;
501 sp<ANativeWindow> window;
502 if (surface != 0) {
Mathias Agopian9e1cdea2013-02-19 18:25:33 -0800503 binder = surface->getIGraphicBufferProducer()->asBinder();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700504 window = surface;
505 }
506
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700507 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700508}
509
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700510status_t Camera2Client::setPreviewTexture(
Andy McFadden8ba01022012-12-18 09:46:54 -0800511 const sp<IGraphicBufferProducer>& bufferProducer) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700512 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700513 ALOGV("%s: E", __FUNCTION__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800514 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700515 status_t res;
516 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700517
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700518 sp<IBinder> binder;
519 sp<ANativeWindow> window;
Andy McFadden8ba01022012-12-18 09:46:54 -0800520 if (bufferProducer != 0) {
521 binder = bufferProducer->asBinder();
Mathias Agopian1a2952a2013-02-14 17:11:27 -0800522 window = new Surface(bufferProducer);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700523 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700524 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700525}
526
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700527status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700528 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700529 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700530 status_t res;
531
532 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700533 ALOGV("%s: Camera %d: New window is same as old window",
534 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700535 return NO_ERROR;
536 }
537
Eino-Ville Talvalaf1945f02012-10-17 16:32:34 -0700538 Parameters::State state;
539 {
540 SharedParameters::Lock l(mParameters);
541 state = l.mParameters.state;
542 }
543 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700544 case Parameters::DISCONNECTED:
545 case Parameters::RECORD:
546 case Parameters::STILL_CAPTURE:
547 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700548 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700549 __FUNCTION__, mCameraId,
Eino-Ville Talvalaf1945f02012-10-17 16:32:34 -0700550 Parameters::getStateName(state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700551 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700552 case Parameters::STOPPED:
553 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700554 // OK
555 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700556 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700557 // Already running preview - need to stop and create a new stream
Eino-Ville Talvalad09801b2013-04-23 15:16:57 -0700558 res = stopStream();
559 if (res != OK) {
560 ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
561 __FUNCTION__, strerror(-res), res);
562 return res;
563 }
Eino-Ville Talvalaf1945f02012-10-17 16:32:34 -0700564 state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700565 break;
566 }
567
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700568 mPreviewSurface = binder;
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700569 res = mStreamingProcessor->setPreviewWindow(window);
570 if (res != OK) {
571 ALOGE("%s: Unable to set new preview window: %s (%d)",
572 __FUNCTION__, strerror(-res), res);
573 return res;
574 }
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700575
Eino-Ville Talvalaf1945f02012-10-17 16:32:34 -0700576 if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
577 SharedParameters::Lock l(mParameters);
578 l.mParameters.state = state;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700579 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700580 }
581
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700582 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700583}
584
585void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700586 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700587 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800588 Mutex::Autolock icl(mBinderSerializationLock);
Igor Murashkinddf3c502012-10-12 16:56:11 -0700589
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700590 if ( checkPid(__FUNCTION__) != OK) return;
591
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700592 SharedParameters::Lock l(mParameters);
593 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700594}
595
596void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
597 status_t res = OK;
Eino-Ville Talvalaa691ff32013-06-26 18:23:23 -0700598
599 switch(params.state) {
600 case Parameters::STOPPED:
601 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
602 case Parameters::PREVIEW:
603 // OK
604 break;
605 default:
606 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
607 ALOGE("%s: Camera %d: Can't use preview callbacks "
608 "in state %d", __FUNCTION__, mCameraId, params.state);
609 return;
610 }
611 }
612
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700613 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
614 ALOGV("%s: setting oneshot", __FUNCTION__);
615 params.previewCallbackOneShot = true;
616 }
617 if (params.previewCallbackFlags != (uint32_t)flag) {
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700618
619 if (flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) {
620 // Disable any existing preview callback window when enabling
621 // preview callback flags
622 res = mCallbackProcessor->setCallbackWindow(NULL);
623 if (res != OK) {
624 ALOGE("%s: Camera %d: Unable to clear preview callback surface:"
625 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
626 return;
627 }
628 params.previewCallbackSurface = false;
629 }
630
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700631 params.previewCallbackFlags = flag;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700632
Eino-Ville Talvalaa691ff32013-06-26 18:23:23 -0700633 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700634 res = startPreviewL(params, true);
Eino-Ville Talvalaa691ff32013-06-26 18:23:23 -0700635 if (res != OK) {
636 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
637 __FUNCTION__, mCameraId,
638 Parameters::getStateName(params.state));
639 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700640 }
641 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700642}
643
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700644status_t Camera2Client::setPreviewCallbackTarget(
645 const sp<IGraphicBufferProducer>& callbackProducer) {
646 ATRACE_CALL();
647 ALOGV("%s: E", __FUNCTION__);
648 Mutex::Autolock icl(mBinderSerializationLock);
649 status_t res;
650 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
651
652 sp<ANativeWindow> window;
653 if (callbackProducer != 0) {
654 window = new Surface(callbackProducer);
655 }
656
657 res = mCallbackProcessor->setCallbackWindow(window);
658 if (res != OK) {
659 ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
660 __FUNCTION__, mCameraId, strerror(-res), res);
661 return res;
662 }
663
664 SharedParameters::Lock l(mParameters);
665
666 if (window != NULL) {
667 // Disable traditional callbacks when a valid callback target is given
668 l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
669 l.mParameters.previewCallbackOneShot = false;
670 l.mParameters.previewCallbackSurface = true;
671 } else {
672 // Disable callback target if given a NULL interface.
673 l.mParameters.previewCallbackSurface = false;
674 }
675
676 switch(l.mParameters.state) {
677 case Parameters::PREVIEW:
678 res = startPreviewL(l.mParameters, true);
679 break;
680 case Parameters::RECORD:
681 case Parameters::VIDEO_SNAPSHOT:
682 res = startRecordingL(l.mParameters, true);
683 break;
684 default:
685 break;
686 }
687 if (res != OK) {
688 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
689 __FUNCTION__, mCameraId,
690 Parameters::getStateName(l.mParameters.state));
691 }
692
693 return OK;
694}
695
696
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700697status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700698 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700699 ALOGV("%s: E", __FUNCTION__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800700 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700701 status_t res;
702 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700703 SharedParameters::Lock l(mParameters);
704 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700705}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700706
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700707status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700708 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700709 status_t res;
Igor Murashkin22d58d32012-10-02 19:07:14 -0700710
711 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
712
Eino-Ville Talvalaa14be592012-10-10 17:17:01 -0700713 if ( (params.state == Parameters::PREVIEW ||
714 params.state == Parameters::RECORD ||
715 params.state == Parameters::VIDEO_SNAPSHOT)
716 && !restart) {
717 // Succeed attempt to re-enter a streaming state
718 ALOGI("%s: Camera %d: Preview already active, ignoring restart",
719 __FUNCTION__, mCameraId);
Alex Ray77449ad2012-09-26 15:52:50 -0700720 return OK;
721 }
722 if (params.state > Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700723 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700724 __FUNCTION__,
725 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700726 return INVALID_OPERATION;
727 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700728
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700729 if (!mStreamingProcessor->haveValidPreviewWindow()) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700730 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700731 return OK;
732 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700733 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700734
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700735 res = mStreamingProcessor->updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700736 if (res != OK) {
737 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
738 __FUNCTION__, mCameraId, strerror(-res), res);
739 return res;
740 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700741
Eino-Ville Talvalaa9c64a92013-06-10 15:12:01 -0700742 // We could wait to create the JPEG output stream until first actual use
743 // (first takePicture call). However, this would substantially increase the
744 // first capture latency on HAL3 devices, and potentially on some HAL2
745 // devices. So create it unconditionally at preview start. As a drawback,
746 // this increases gralloc memory consumption for applications that don't
747 // ever take a picture.
748 // TODO: Find a better compromise, though this likely would involve HAL
749 // changes.
750 res = updateProcessorStream(mJpegProcessor, params);
751 if (res != OK) {
752 ALOGE("%s: Camera %d: Can't pre-configure still image "
753 "stream: %s (%d)",
754 __FUNCTION__, mCameraId, strerror(-res), res);
755 return res;
756 }
757
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700758 Vector<uint8_t> outputStreams;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700759 bool callbacksEnabled = (params.previewCallbackFlags &
760 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
761 params.previewCallbackSurface;
762
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700763 if (callbacksEnabled) {
Eino-Ville Talvalaa691ff32013-06-26 18:23:23 -0700764 // Can't have recording stream hanging around when enabling callbacks,
765 // since it exceeds the max stream count on some devices.
766 if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
767 ALOGV("%s: Camera %d: Clearing out recording stream before "
768 "creating callback stream", __FUNCTION__, mCameraId);
769 res = mStreamingProcessor->stopStream();
770 if (res != OK) {
771 ALOGE("%s: Camera %d: Can't stop streaming to delete "
772 "recording stream", __FUNCTION__, mCameraId);
773 return res;
774 }
775 res = mStreamingProcessor->deleteRecordingStream();
776 if (res != OK) {
777 ALOGE("%s: Camera %d: Unable to delete recording stream before "
778 "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
779 strerror(-res), res);
780 return res;
781 }
782 }
783
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700784 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700785 if (res != OK) {
786 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
787 __FUNCTION__, mCameraId, strerror(-res), res);
788 return res;
789 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700790 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700791 }
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700792 if (params.zslMode && !params.recordingHint) {
Igor Murashkindca254a2013-05-13 14:53:44 -0700793 res = updateProcessorStream(mZslProcessor, params);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700794 if (res != OK) {
795 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
796 __FUNCTION__, mCameraId, strerror(-res), res);
797 return res;
798 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700799 outputStreams.push(getZslStreamId());
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700800 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700801
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700802 outputStreams.push(getPreviewStreamId());
803
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700804 if (!params.recordingHint) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700805 if (!restart) {
806 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700807 if (res != OK) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700808 ALOGE("%s: Camera %d: Can't set up preview request: "
809 "%s (%d)", __FUNCTION__, mCameraId,
810 strerror(-res), res);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700811 return res;
812 }
813 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700814 res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
815 outputStreams);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700816 } else {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700817 if (!restart) {
818 res = mStreamingProcessor->updateRecordingRequest(params);
819 if (res != OK) {
820 ALOGE("%s: Camera %d: Can't set up preview request with "
821 "record hint: %s (%d)", __FUNCTION__, mCameraId,
822 strerror(-res), res);
823 return res;
824 }
825 }
826 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
827 outputStreams);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700828 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700829 if (res != OK) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700830 ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700831 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700832 return res;
833 }
834
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700835 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700836 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700837}
838
839void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700840 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700841 ALOGV("%s: E", __FUNCTION__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800842 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700843 status_t res;
844 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700845 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700846}
847
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700848void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700849 ATRACE_CALL();
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700850 status_t res;
Eino-Ville Talvalad5087f92012-10-05 12:03:10 -0700851 const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700852 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700853 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700854 SharedParameters::Lock l(mParameters);
855 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700856 }
857
858 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700859 case Parameters::DISCONNECTED:
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800860 // Nothing to do.
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700861 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700862 case Parameters::STOPPED:
Eino-Ville Talvalad5087f92012-10-05 12:03:10 -0700863 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700864 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad5087f92012-10-05 12:03:10 -0700865 mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
866 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700867 case Parameters::RECORD:
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700868 case Parameters::PREVIEW:
Eino-Ville Talvalad09801b2013-04-23 15:16:57 -0700869 res = stopStream();
870 if (res != OK) {
871 ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
872 __FUNCTION__, mCameraId, strerror(-res), res);
873 }
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700874 res = mDevice->waitUntilDrained();
875 if (res != OK) {
876 ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
877 __FUNCTION__, mCameraId, strerror(-res), res);
878 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700879 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700880 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
881 SharedParameters::Lock l(mParameters);
882 l.mParameters.state = Parameters::STOPPED;
883 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700884 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700885 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700886 default:
887 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700888 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700889 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700890}
891
892bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700893 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800894 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700895 status_t res;
896 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
897
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700898 SharedParameters::Lock l(mParameters);
899 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700900}
901
902status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700903 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800904 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700905 status_t res;
906 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
907
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700908 SharedParameters::Lock l(mParameters);
909 switch (l.mParameters.state) {
910 case Parameters::RECORD:
911 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700912 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700913 __FUNCTION__, mCameraId,
914 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700915 return INVALID_OPERATION;
916 default:
917 // OK
918 break;
919 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700920
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700921 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700922
923 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700924}
925
926status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700927 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700928 ALOGV("%s: E", __FUNCTION__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800929 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700930 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700931 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700932 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700933
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700934 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700935}
936
937status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
938 status_t res;
Igor Murashkin22d58d32012-10-02 19:07:14 -0700939
940 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
941
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700942 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700943 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700944 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700945 if (res != OK) return res;
946 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700947 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700948 // Ready to go
949 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700950 case Parameters::RECORD:
951 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700952 // OK to call this when recording is already on, just skip unless
953 // we're looking to restart
954 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700955 break;
956 default:
957 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700958 __FUNCTION__, mCameraId,
959 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700960 return INVALID_OPERATION;
961 };
962
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700963 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700964 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
965 "non-metadata recording mode requested!", __FUNCTION__,
966 mCameraId);
967 return INVALID_OPERATION;
968 }
969
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700970 if (!restart) {
971 mCameraService->playSound(CameraService::SOUND_RECORDING);
972 mStreamingProcessor->updateRecordingRequest(params);
973 if (res != OK) {
974 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
975 __FUNCTION__, mCameraId, strerror(-res), res);
976 return res;
977 }
978 }
Eino-Ville Talvala609acc02012-09-06 18:26:58 -0700979
Eino-Ville Talvalaa691ff32013-06-26 18:23:23 -0700980 // Not all devices can support a preview callback stream and a recording
981 // stream at the same time, so assume none of them can.
982 if (mCallbackProcessor->getStreamId() != NO_STREAM) {
983 ALOGV("%s: Camera %d: Clearing out callback stream before "
984 "creating recording stream", __FUNCTION__, mCameraId);
985 res = mStreamingProcessor->stopStream();
986 if (res != OK) {
987 ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
988 __FUNCTION__, mCameraId);
989 return res;
990 }
991 res = mCallbackProcessor->deleteStream();
992 if (res != OK) {
993 ALOGE("%s: Camera %d: Unable to delete callback stream before "
994 "record: %s (%d)", __FUNCTION__, mCameraId,
995 strerror(-res), res);
996 return res;
997 }
998 }
999 // Disable callbacks if they're enabled; can't record and use callbacks,
1000 // and we can't fail record start without stagefright asserting.
1001 params.previewCallbackFlags = 0;
1002
Igor Murashkin82db9e62013-05-21 11:38:49 -07001003 res = updateProcessorStream<
1004 StreamingProcessor,
1005 &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
1006 params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001007 if (res != OK) {
1008 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
1009 __FUNCTION__, mCameraId, strerror(-res), res);
1010 return res;
1011 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001012
1013 Vector<uint8_t> outputStreams;
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001014 outputStreams.push(getPreviewStreamId());
1015 outputStreams.push(getRecordingStreamId());
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001016
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001017 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
1018 outputStreams);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001019 if (res != OK) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001020 ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001021 __FUNCTION__, mCameraId, strerror(-res), res);
1022 return res;
1023 }
1024
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001025 if (params.state < Parameters::RECORD) {
1026 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001027 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001028
1029 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001030}
1031
1032void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001033 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001034 ALOGV("%s: E", __FUNCTION__);
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001035 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001036 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001037
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001038 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001039 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
1040
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001041 switch (l.mParameters.state) {
1042 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001043 // OK to stop
1044 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001045 case Parameters::STOPPED:
1046 case Parameters::PREVIEW:
1047 case Parameters::STILL_CAPTURE:
1048 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001049 default:
1050 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001051 __FUNCTION__, mCameraId,
1052 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001053 return;
1054 };
1055
Eino-Ville Talvala609acc02012-09-06 18:26:58 -07001056 mCameraService->playSound(CameraService::SOUND_RECORDING);
1057
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -07001058 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001059 if (res != OK) {
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -07001060 ALOGE("%s: Camera %d: Unable to return to preview",
1061 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001062 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001063}
1064
1065bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001066 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001067 Mutex::Autolock icl(mBinderSerializationLock);
James Dong8da4cd72012-08-04 19:58:07 -07001068
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001069 if ( checkPid(__FUNCTION__) != OK) return false;
1070
James Dong8da4cd72012-08-04 19:58:07 -07001071 return recordingEnabledL();
1072}
1073
1074bool Camera2Client::recordingEnabledL() {
1075 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001076 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -07001077
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001078 return (l.mParameters.state == Parameters::RECORD
1079 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001080}
1081
1082void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001083 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001084 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001085 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001086
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001087 mStreamingProcessor->releaseRecordingFrame(mem);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001088}
1089
1090status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001091 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001092 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001093 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001094 status_t res;
1095 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1096
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001097 int triggerId;
Eino-Ville Talvalad6cc4a62012-10-16 10:17:30 -07001098 bool notifyImmediately = false;
1099 bool notifySuccess = false;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001100 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001101 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001102 if (l.mParameters.state < Parameters::PREVIEW) {
1103 return INVALID_OPERATION;
1104 }
1105
Igor Murashkin5f0714e2012-10-08 18:05:12 -07001106 /**
1107 * If the camera does not support auto-focus, it is a no-op and
1108 * onAutoFocus(boolean, Camera) callback will be called immediately
1109 * with a fake value of success set to true.
Eino-Ville Talvala9454a972013-06-03 16:50:53 -07001110 *
1111 * Similarly, if focus mode is set to INFINITY, there's no reason to
1112 * bother the HAL.
Igor Murashkin5f0714e2012-10-08 18:05:12 -07001113 */
Eino-Ville Talvala9454a972013-06-03 16:50:53 -07001114 if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
1115 l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
Eino-Ville Talvalad6cc4a62012-10-16 10:17:30 -07001116 notifyImmediately = true;
1117 notifySuccess = true;
1118 }
1119 /**
1120 * If we're in CAF mode, and AF has already been locked, just fire back
1121 * the callback right away; the HAL would not send a notification since
1122 * no state change would happen on a AF trigger.
1123 */
1124 if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1125 l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1126 l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1127 notifyImmediately = true;
1128 notifySuccess = true;
1129 }
1130 /**
1131 * Send immediate notification back to client
1132 */
1133 if (notifyImmediately) {
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001134 SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1135 if (l.mRemoteCallback != 0) {
1136 l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
Eino-Ville Talvalad6cc4a62012-10-16 10:17:30 -07001137 notifySuccess ? 1 : 0, 0);
Igor Murashkin5f0714e2012-10-08 18:05:12 -07001138 }
Igor Murashkin5f0714e2012-10-08 18:05:12 -07001139 return OK;
1140 }
Eino-Ville Talvalad6cc4a62012-10-16 10:17:30 -07001141 /**
1142 * Handle quirk mode for AF in scene modes
1143 */
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -07001144 if (l.mParameters.quirks.triggerAfWithAuto &&
1145 l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
Eino-Ville Talvalaac0cd562012-10-16 12:58:21 -07001146 l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1147 !l.mParameters.focusingAreas[0].isEmpty()) {
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -07001148 ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
1149 __FUNCTION__, l.mParameters.focusMode);
1150 l.mParameters.shadowFocusMode = l.mParameters.focusMode;
1151 l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1152 updateRequests(l.mParameters);
1153 }
1154
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001155 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1156 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001157 }
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001158 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001159
1160 mDevice->triggerAutofocus(triggerId);
1161
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001162 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001163}
1164
1165status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001166 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001167 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001168 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001169 status_t res;
1170 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1171
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001172 int triggerId;
1173 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001174 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala9454a972013-06-03 16:50:53 -07001175 // Canceling does nothing in FIXED or INFINITY modes
1176 if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
1177 l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1178 return OK;
1179 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001180 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -07001181
1182 // When using triggerAfWithAuto quirk, may need to reset focus mode to
Eino-Ville Talvalaac0cd562012-10-16 12:58:21 -07001183 // the real state at this point. No need to cancel explicitly if
1184 // changing the AF mode.
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -07001185 if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
1186 ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
1187 l.mParameters.shadowFocusMode);
1188 l.mParameters.focusMode = l.mParameters.shadowFocusMode;
1189 l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
1190 updateRequests(l.mParameters);
Eino-Ville Talvalaac0cd562012-10-16 12:58:21 -07001191
1192 return OK;
Eino-Ville Talvala95069fe2012-10-04 00:56:40 -07001193 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001194 }
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001195 syncWithDevice();
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001196
1197 mDevice->triggerCancelAutofocus(triggerId);
1198
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001199 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001200}
1201
Ben Murdochff823702012-11-28 13:58:29 +00001202status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001203 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001204 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001205 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001206 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001207
Eino-Ville Talvalab8d6efb2012-10-24 17:30:30 -07001208 {
1209 SharedParameters::Lock l(mParameters);
1210 switch (l.mParameters.state) {
1211 case Parameters::DISCONNECTED:
1212 case Parameters::STOPPED:
1213 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1214 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001215 __FUNCTION__, mCameraId);
Eino-Ville Talvalab8d6efb2012-10-24 17:30:30 -07001216 return INVALID_OPERATION;
1217 case Parameters::PREVIEW:
1218 // Good to go for takePicture
1219 res = commandStopFaceDetectionL(l.mParameters);
1220 if (res != OK) {
1221 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1222 __FUNCTION__, mCameraId);
1223 return res;
1224 }
1225 l.mParameters.state = Parameters::STILL_CAPTURE;
1226 break;
1227 case Parameters::RECORD:
1228 // Good to go for video snapshot
1229 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1230 break;
1231 case Parameters::STILL_CAPTURE:
1232 case Parameters::VIDEO_SNAPSHOT:
1233 ALOGE("%s: Camera %d: Already taking a picture",
1234 __FUNCTION__, mCameraId);
1235 return INVALID_OPERATION;
1236 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001237
Eino-Ville Talvalab8d6efb2012-10-24 17:30:30 -07001238 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001239
Igor Murashkindca254a2013-05-13 14:53:44 -07001240 res = updateProcessorStream(mJpegProcessor, l.mParameters);
Eino-Ville Talvalab8d6efb2012-10-24 17:30:30 -07001241 if (res != OK) {
1242 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1243 __FUNCTION__, mCameraId, strerror(-res), res);
1244 return res;
1245 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001246 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001247
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001248 // Need HAL to have correct settings before (possibly) triggering precapture
1249 syncWithDevice();
1250
Igor Murashkinaa9e3e02012-11-26 10:50:55 -08001251 res = mCaptureSequencer->startCapture(msgType);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001252 if (res != OK) {
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001253 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001254 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001255 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001256
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001257 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001258}
1259
1260status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001261 ATRACE_CALL();
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001262 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001263 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001264 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001265 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1266
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001267 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001268
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001269 res = l.mParameters.set(params);
1270 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001271
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001272 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001273
1274 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001275}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001276
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001277String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001278 ATRACE_CALL();
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001279 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001280 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001281 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001282
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001283 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001284
Eino-Ville Talvala8a42dd82012-10-02 13:30:04 -07001285 return l.mParameters.get();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001286}
1287
1288status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001289 ATRACE_CALL();
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001290 Mutex::Autolock icl(mBinderSerializationLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001291 status_t res;
1292 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001293
1294 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1295 cmd, arg1, arg2);
1296
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001297 switch (cmd) {
1298 case CAMERA_CMD_START_SMOOTH_ZOOM:
1299 return commandStartSmoothZoomL();
1300 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1301 return commandStopSmoothZoomL();
1302 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1303 return commandSetDisplayOrientationL(arg1);
1304 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1305 return commandEnableShutterSoundL(arg1 == 1);
1306 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1307 return commandPlayRecordingSoundL();
1308 case CAMERA_CMD_START_FACE_DETECTION:
1309 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001310 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001311 SharedParameters::Lock l(mParameters);
1312 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001313 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001314 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1315 return commandEnableFocusMoveMsgL(arg1 == 1);
1316 case CAMERA_CMD_PING:
1317 return commandPingL();
1318 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1319 return commandSetVideoBufferCountL(arg1);
1320 default:
1321 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1322 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001323 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001324 }
1325}
James Dong983cf232012-08-01 16:39:55 -07001326
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001327status_t Camera2Client::commandStartSmoothZoomL() {
1328 ALOGE("%s: Unimplemented!", __FUNCTION__);
1329 return OK;
1330}
James Dong983cf232012-08-01 16:39:55 -07001331
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001332status_t Camera2Client::commandStopSmoothZoomL() {
1333 ALOGE("%s: Unimplemented!", __FUNCTION__);
1334 return OK;
1335}
James Dong983cf232012-08-01 16:39:55 -07001336
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001337status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001338 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001339 mCameraFacing == CAMERA_FACING_FRONT);
1340 if (transform == -1) {
1341 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1342 __FUNCTION__, mCameraId, degrees);
1343 return BAD_VALUE;
1344 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001345 SharedParameters::Lock l(mParameters);
1346 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001347 getPreviewStreamId() != NO_STREAM) {
1348 mDevice->setStreamTransform(getPreviewStreamId(), transform);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001349 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001350 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001351 return OK;
1352}
1353
1354status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001355 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001356 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001357 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001358 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001359 }
1360
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001361 // Disabling shutter sound may not be allowed. In that case only
1362 // allow the mediaserver process to disable the sound.
1363 char value[PROPERTY_VALUE_MAX];
1364 property_get("ro.camera.sound.forced", value, "0");
1365 if (strncmp(value, "0", 2) != 0) {
1366 // Disabling shutter sound is not allowed. Deny if the current
1367 // process is not mediaserver.
1368 if (getCallingPid() != getpid()) {
1369 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1370 getCallingPid());
1371 return PERMISSION_DENIED;
1372 }
1373 }
1374
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001375 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001376 return OK;
1377}
1378
1379status_t Camera2Client::commandPlayRecordingSoundL() {
1380 mCameraService->playSound(CameraService::SOUND_RECORDING);
1381 return OK;
1382}
1383
Igor Murashkinddf3c502012-10-12 16:56:11 -07001384status_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001385 ALOGV("%s: Camera %d: Starting face detection",
1386 __FUNCTION__, mCameraId);
1387 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001388 SharedParameters::Lock l(mParameters);
1389 switch (l.mParameters.state) {
1390 case Parameters::DISCONNECTED:
1391 case Parameters::STOPPED:
1392 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1393 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001394 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1395 __FUNCTION__, mCameraId);
1396 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001397 case Parameters::PREVIEW:
1398 case Parameters::RECORD:
1399 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001400 // Good to go for starting face detect
1401 break;
1402 }
1403 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001404 if (l.mParameters.fastInfo.bestFaceDetectMode ==
Igor Murashkind32b99b2012-11-27 16:25:46 -08001405 ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001406 ALOGE("%s: Camera %d: Face detection not supported",
1407 __FUNCTION__, mCameraId);
Ziv Hendelcaf3a9c2013-03-21 03:25:32 +02001408 return BAD_VALUE;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001409 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001410 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001411
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001412 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001413
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001414 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001415
1416 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001417}
1418
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001419status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001420 status_t res = OK;
1421 ALOGV("%s: Camera %d: Stopping face detection",
1422 __FUNCTION__, mCameraId);
1423
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001424 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001425
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001426 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001427
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001428 if (params.state == Parameters::PREVIEW
1429 || params.state == Parameters::RECORD
1430 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001431 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001432 }
1433
1434 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001435}
1436
1437status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001438 SharedParameters::Lock l(mParameters);
1439 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001440
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001441 return OK;
1442}
1443
1444status_t Camera2Client::commandPingL() {
1445 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001446 SharedParameters::Lock l(mParameters);
1447 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001448 return OK;
1449 } else {
1450 return NO_INIT;
1451 }
1452}
1453
1454status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001455 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001456 ALOGE("%s: Camera %d: Error setting video buffer count after "
1457 "recording was started", __FUNCTION__, mCameraId);
1458 return INVALID_OPERATION;
1459 }
1460
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001461 return mStreamingProcessor->setRecordingBufferCount(count);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001462}
1463
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001464/** Device-related methods */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001465void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1466 ALOGV("%s: Autofocus state now %d, last trigger %d",
1467 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001468 bool sendCompletedMessage = false;
1469 bool sendMovingMessage = false;
1470
1471 bool success = false;
1472 bool afInMotion = false;
1473 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001474 SharedParameters::Lock l(mParameters);
Eino-Ville Talvalad6cc4a62012-10-16 10:17:30 -07001475 l.mParameters.focusState = newState;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001476 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001477 case Parameters::FOCUS_MODE_AUTO:
1478 case Parameters::FOCUS_MODE_MACRO:
1479 // Don't send notifications upstream if they're not for the current AF
1480 // trigger. For example, if cancel was called in between, or if we
1481 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001482 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001483 switch (newState) {
1484 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1485 success = true;
1486 // no break
1487 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1488 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001489 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001490 break;
1491 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1492 // Just starting focusing, ignore
1493 break;
1494 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1495 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1496 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1497 default:
1498 // Unexpected in AUTO/MACRO mode
1499 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1500 __FUNCTION__, newState);
1501 break;
1502 }
1503 break;
1504 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1505 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1506 switch (newState) {
1507 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1508 success = true;
1509 // no break
1510 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1511 // Don't send notifications upstream if they're not for
1512 // the current AF trigger. For example, if cancel was
1513 // called in between, or if we already sent a
1514 // notification about this AF call.
1515 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001516 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001517 sendCompletedMessage = true;
1518 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001519 if (l.mParameters.enableFocusMoveMessages &&
1520 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001521 sendMovingMessage = true;
1522 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001523 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001524 break;
1525 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1526 // Cancel was called, or we switched state; care if
1527 // currently moving
1528 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001529 if (l.mParameters.enableFocusMoveMessages &&
1530 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001531 sendMovingMessage = true;
1532 }
1533 break;
1534 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1535 // Start passive scan, inform upstream
1536 afInMotion = true;
1537 // no break
1538 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1539 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001540 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001541 sendMovingMessage = true;
1542 }
1543 break;
1544 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001545 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001546 break;
1547 case Parameters::FOCUS_MODE_EDOF:
1548 case Parameters::FOCUS_MODE_INFINITY:
1549 case Parameters::FOCUS_MODE_FIXED:
1550 default:
1551 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001552 ALOGE("%s: Unexpected AF state change %d "
1553 "(ID %d) in focus mode %d",
1554 __FUNCTION__, newState, triggerId,
1555 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001556 }
1557 }
1558 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001559 if (sendMovingMessage) {
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001560 SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1561 if (l.mRemoteCallback != 0) {
1562 l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001563 afInMotion ? 1 : 0, 0);
1564 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001565 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001566 if (sendCompletedMessage) {
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001567 SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1568 if (l.mRemoteCallback != 0) {
1569 l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001570 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001571 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001572 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001573}
1574
1575void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1576 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1577 __FUNCTION__, newState, triggerId);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001578 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001579}
1580
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001581camera2::SharedParameters& Camera2Client::getParameters() {
1582 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001583}
1584
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001585int Camera2Client::getPreviewStreamId() const {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001586 return mStreamingProcessor->getPreviewStreamId();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001587}
1588
1589int Camera2Client::getCaptureStreamId() const {
1590 return mJpegProcessor->getStreamId();
1591}
1592
1593int Camera2Client::getCallbackStreamId() const {
1594 return mCallbackProcessor->getStreamId();
1595}
1596
1597int Camera2Client::getRecordingStreamId() const {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001598 return mStreamingProcessor->getRecordingStreamId();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001599}
1600
1601int Camera2Client::getZslStreamId() const {
1602 return mZslProcessor->getStreamId();
1603}
1604
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001605status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001606 wp<camera2::FrameProcessor::FilteredListener> listener) {
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001607 return mFrameProcessor->registerListener(minId, maxId, listener);
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001608}
1609
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001610status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1611 wp<camera2::FrameProcessor::FilteredListener> listener) {
1612 return mFrameProcessor->removeListener(minId, maxId, listener);
1613}
1614
1615status_t Camera2Client::stopStream() {
1616 return mStreamingProcessor->stopStream();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001617}
1618
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001619const int32_t Camera2Client::kPreviewRequestIdStart;
1620const int32_t Camera2Client::kPreviewRequestIdEnd;
1621const int32_t Camera2Client::kRecordingRequestIdStart;
1622const int32_t Camera2Client::kRecordingRequestIdEnd;
1623const int32_t Camera2Client::kCaptureRequestIdStart;
1624const int32_t Camera2Client::kCaptureRequestIdEnd;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -07001625
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001626/** Utility methods */
1627
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -07001628status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001629 status_t res;
1630
Igor Murashkin22d58d32012-10-02 19:07:14 -07001631 ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1632
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001633 res = mStreamingProcessor->incrementStreamingIds();
1634 if (res != OK) {
1635 ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1636 __FUNCTION__, mCameraId, strerror(-res), res);
1637 return res;
1638 }
1639
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001640 res = mStreamingProcessor->updatePreviewRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001641 if (res != OK) {
1642 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1643 __FUNCTION__, mCameraId, strerror(-res), res);
1644 return res;
1645 }
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001646 res = mStreamingProcessor->updateRecordingRequest(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001647 if (res != OK) {
1648 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1649 __FUNCTION__, mCameraId, strerror(-res), res);
1650 return res;
1651 }
1652
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001653 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -07001654 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001655 if (res != OK) {
1656 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1657 __FUNCTION__, mCameraId, strerror(-res), res);
1658 return res;
1659 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001660 } else if (params.state == Parameters::RECORD ||
1661 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -07001662 res = startRecordingL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001663 if (res != OK) {
1664 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1665 __FUNCTION__, mCameraId, strerror(-res), res);
1666 return res;
1667 }
1668 }
1669 return res;
1670}
1671
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001672
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001673size_t Camera2Client::calculateBufferSize(int width, int height,
1674 int format, int stride) {
1675 switch (format) {
1676 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1677 return width * height * 2;
1678 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1679 return width * height * 3 / 2;
1680 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1681 return width * height * 2;
1682 case HAL_PIXEL_FORMAT_YV12: { // YV12
1683 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001684 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001685 size_t uvSize = uvStride * height / 2;
1686 return ySize + uvSize * 2;
1687 }
1688 case HAL_PIXEL_FORMAT_RGB_565:
1689 return width * height * 2;
1690 case HAL_PIXEL_FORMAT_RGBA_8888:
1691 return width * height * 4;
1692 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1693 return width * height * 2;
1694 default:
1695 ALOGE("%s: Unknown preview format: %x",
1696 __FUNCTION__, format);
1697 return 0;
1698 }
1699}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001700
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001701status_t Camera2Client::syncWithDevice() {
1702 ATRACE_CALL();
Eino-Ville Talvala43b7ac62012-10-23 09:09:01 -07001703 const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
Eino-Ville Talvala4865c522012-10-02 13:30:28 -07001704 status_t res;
1705
1706 int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1707 if (activeRequestId == 0) return OK;
1708
1709 res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1710 if (res == TIMED_OUT) {
1711 ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1712 __FUNCTION__, mCameraId);
1713 } else if (res != OK) {
1714 ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1715 __FUNCTION__, mCameraId);
1716 }
1717 return res;
1718}
1719
Igor Murashkindca254a2013-05-13 14:53:44 -07001720template <typename ProcessorT>
1721status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1722 camera2::Parameters params) {
Igor Murashkin82db9e62013-05-21 11:38:49 -07001723 // No default template arguments until C++11, so we need this overload
1724 return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
1725 processor, params);
1726}
1727
1728template <typename ProcessorT,
1729 status_t (ProcessorT::*updateStreamF)(const Parameters &)>
1730status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1731 Parameters params) {
Igor Murashkindca254a2013-05-13 14:53:44 -07001732 status_t res;
1733
Igor Murashkin82db9e62013-05-21 11:38:49 -07001734 // Get raw pointer since sp<T> doesn't have operator->*
1735 ProcessorT *processorPtr = processor.get();
1736 res = (processorPtr->*updateStreamF)(params);
Igor Murashkindca254a2013-05-13 14:53:44 -07001737
1738 /**
1739 * Can't update the stream if it's busy?
1740 *
1741 * Then we need to stop the device (by temporarily clearing the request
1742 * queue) and then try again. Resume streaming once we're done.
1743 */
1744 if (res == -EBUSY) {
Eino-Ville Talvalaa691ff32013-06-26 18:23:23 -07001745 ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
1746 mCameraId);
Igor Murashkindca254a2013-05-13 14:53:44 -07001747 res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1748 if (res != OK) {
1749 ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1750 __FUNCTION__, mCameraId, strerror(-res), res);
1751 }
1752
1753 res = mDevice->waitUntilDrained();
1754 if (res != OK) {
1755 ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1756 __FUNCTION__, mCameraId, strerror(-res), res);
1757 }
1758
Igor Murashkin82db9e62013-05-21 11:38:49 -07001759 res = (processorPtr->*updateStreamF)(params);
Igor Murashkindca254a2013-05-13 14:53:44 -07001760 if (res != OK) {
1761 ALOGE("%s: Camera %d: Failed to update processing stream "
1762 " despite having halted streaming first: %s (%d)",
1763 __FUNCTION__, mCameraId, strerror(-res), res);
1764 }
1765
1766 res = mStreamingProcessor->togglePauseStream(/*pause*/false);
1767 if (res != OK) {
1768 ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
1769 __FUNCTION__, mCameraId, strerror(-res), res);
1770 }
1771 }
1772
1773 return res;
1774}
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001775
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001776} // namespace android