blob: 50812895c50478e05e8ad4f440d51cbe63d33589 [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
17#define LOG_TAG "Camera2Client"
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070018#define ATRACE_TAG ATRACE_TAG_CAMERA
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070019//#define LOG_NDEBUG 0
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070020
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070021#include <utils/Log.h>
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070022#include <utils/Trace.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070023
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
Eino-Ville Talvala78822d72012-07-18 17:52:18 -070027#include <media/hardware/MetadataBufferType.h>
James Painterc3dbf1a2012-09-05 18:02:32 -070028#include "camera2/Parameters.h"
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070029
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
31#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
32
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070033namespace android {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070034using namespace camera2;
35
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070036static int getCallingPid() {
37 return IPCThreadState::self()->getCallingPid();
38}
39
40static int getCallingUid() {
41 return IPCThreadState::self()->getCallingUid();
42}
43
44// Interface used by CameraService
45
46Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
47 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070048 int cameraId,
49 int cameraFacing,
50 int clientPid):
51 Client(cameraService, cameraClient,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070052 cameraId, cameraFacing, clientPid),
Eino-Ville Talvala177bd342012-08-28 01:25:43 -070053 mSharedCameraClient(cameraClient),
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070054 mParameters(cameraId, cameraFacing),
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -070055 mPreviewStreamId(NO_STREAM),
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -070056 mRecordingStreamId(NO_STREAM),
James Dong983cf232012-08-01 16:39:55 -070057 mRecordingHeapCount(kDefaultRecordingHeapCount)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070058{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070059 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070060 ALOGI("Camera %d: Opened", cameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070061
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070062 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -070063
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070064 SharedParameters::Lock l(mParameters);
65 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070066
67 char value[PROPERTY_VALUE_MAX];
68 property_get("camera.zsl_mode", value, "0");
69 if (!strcmp(value,"1")) {
70 ALOGI("Camera %d: Enabling ZSL mode", cameraId);
71 l.mParameters.zslMode = true;
72 } else {
73 l.mParameters.zslMode = false;
74 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070075}
76
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070077status_t Camera2Client::checkPid(const char* checkLocation) const {
78 int callingPid = getCallingPid();
79 if (callingPid == mClientPid) return NO_ERROR;
80
81 ALOGE("%s: attempt to use a locked camera from a different process"
82 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
83 return PERMISSION_DENIED;
84}
85
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070086status_t Camera2Client::initialize(camera_module_t *module)
87{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070088 ATRACE_CALL();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070089 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070090 status_t res;
91
92 res = mDevice->initialize(module);
93 if (res != OK) {
94 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
95 __FUNCTION__, mCameraId, strerror(-res), res);
96 return NO_INIT;
97 }
98
Eino-Ville Talvala174181e2012-08-03 13:53:39 -070099 res = mDevice->setNotifyCallback(this);
100
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700101 SharedParameters::Lock l(mParameters);
102
103 res = l.mParameters.initialize(&(mDevice->info()));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700104 if (res != OK) {
105 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
106 __FUNCTION__, mCameraId, strerror(-res), res);
107 return NO_INIT;
108 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700109
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700110 String8 threadName;
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700111
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700112 mFrameProcessor = new FrameProcessor(this);
113 threadName = String8::format("Camera2Client[%d]::FrameProcessor",
114 mCameraId);
115 mFrameProcessor->run(threadName.string());
116
117 mCaptureSequencer = new CaptureSequencer(this);
118 threadName = String8::format("Camera2Client[%d]::CaptureSequencer",
119 mCameraId);
120 mCaptureSequencer->run(threadName.string());
121
122 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
123 threadName = String8::format("Camera2Client[%d]::JpegProcessor",
124 mCameraId);
125 mJpegProcessor->run(threadName.string());
126
127 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
128 threadName = String8::format("Camera2Client[%d]::ZslProcessor",
129 mCameraId);
130 mZslProcessor->run(threadName.string());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700131
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700132 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700133 threadName = String8::format("Camera2Client[%d]::CallbackProcessor",
134 mCameraId);
135 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700136
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700137 if (gLogLevel >= 1) {
138 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
139 mCameraId);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700140 ALOGD("%s", l.mParameters.paramsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700141 }
142
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700143 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700144}
145
146Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700147 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700148 ALOGV("Camera %d: Shutting down", mCameraId);
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700149
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700150 mDestructionStarted = true;
151
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700152 // Rewrite mClientPid to allow shutdown by CameraService
153 mClientPid = getCallingPid();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700154 disconnect();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700155
156 mFrameProcessor->requestExit();
Eino-Ville Talvala7d8b92b2012-09-05 19:02:43 -0700157 mCaptureSequencer->requestExit();
158 mJpegProcessor->requestExit();
159 mZslProcessor->requestExit();
160 mCallbackProcessor->requestExit();
161
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700162 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700163}
164
165status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700166 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700167 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700168 mCameraId,
169 getCameraClient()->asBinder().get(),
170 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700171 result.append(" State: ");
172#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
173
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700174 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700175
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700176 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700177
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700178 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700179 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700180 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700181 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700182 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700183 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700184 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700185 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700186 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700187 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700188 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700189 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700190 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700191 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700192 p.jpegQuality, p.jpegThumbQuality);
193 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700194 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700195 p.gpsEnabled ? "enabled" : "disabled");
196 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700197 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700198 p.gpsCoordinates[0], p.gpsCoordinates[1],
199 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700200 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700201 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700202 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700203 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700204 }
205
206 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700207 switch (p.wbMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700208 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
209 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
210 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
211 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
212 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
213 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
214 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
215 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
216 default: result.append("UNKNOWN\n");
217 }
218
219 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700220 switch (p.effectMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700221 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
222 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
223 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
224 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
225 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
226 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
227 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
228 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
229 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
230 default: result.append("UNKNOWN\n");
231 }
232
233 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700234 switch (p.antibandingMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700235 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
236 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
237 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
238 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
239 default: result.append("UNKNOWN\n");
240 }
241
242 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700243 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700244 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
245 result.append("AUTO\n"); break;
246 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
247 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
248 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
249 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
250 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
251 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
252 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
253 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
254 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
255 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
256 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
257 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
258 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
259 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
260 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
261 default: result.append("UNKNOWN\n");
262 }
263
264 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700265 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700266 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
267 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
268 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
269 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
270 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
271 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
272 default: result.append("UNKNOWN\n");
273 }
274
275 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700276 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700277 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
278 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
279 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
280 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
281 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
282 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
283 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
284 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
285 default: result.append("UNKNOWN\n");
286 }
287
288 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700289 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700290 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700291 p.focusingAreas[i].left,
292 p.focusingAreas[i].top,
293 p.focusingAreas[i].right,
294 p.focusingAreas[i].bottom,
295 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700296 }
297
298 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700299 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700300
301 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700302 p.autoExposureLock ? "enabled" : "disabled",
303 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700304
305 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700306 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700307 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700308 p.meteringAreas[i].left,
309 p.meteringAreas[i].top,
310 p.meteringAreas[i].right,
311 p.meteringAreas[i].bottom,
312 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700313 }
314
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700315 result.appendFormat(" Zoom index: %d\n", p.zoom);
316 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
317 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700318
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700319 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700320 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700321
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700322 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700323 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700324
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700325 result.append(" Current streams:\n");
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700326 result.appendFormat(" Preview stream ID: %d\n",
327 getPreviewStreamId());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700328 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700329 getCaptureStreamId());
330 result.appendFormat(" Recording stream ID: %d\n",
331 getRecordingStreamId());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700332
333 result.append(" Current requests:\n");
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700334 if (mPreviewRequest.entryCount() != 0) {
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700335 result.append(" Preview request:\n");
336 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700337 mPreviewRequest.dump(fd, 2, 6);
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700338 } else {
339 result.append(" Preview request: undefined\n");
340 write(fd, result.string(), result.size());
341 }
342
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700343 if (mRecordingRequest.entryCount() != 0) {
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700344 result = " Recording request:\n";
345 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700346 mRecordingRequest.dump(fd, 2, 6);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700347 } else {
348 result = " Recording request: undefined\n";
349 write(fd, result.string(), result.size());
350 }
351
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700352 mCaptureSequencer->dump(fd, args);
353
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700354 mFrameProcessor->dump(fd, args);
355
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700356 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700357 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700358
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700359 status_t res = mDevice->dump(fd, args);
360 if (res != OK) {
361 result = String8::format(" Error dumping device: %s (%d)",
362 strerror(-res), res);
363 write(fd, result.string(), result.size());
364 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700365
366#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700367 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700368}
369
370// ICamera interface
371
372void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700373 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700374 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700375 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700376 status_t res;
377 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700378
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700379 if (mDevice == 0) return;
380
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700381 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700382
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700383 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700384 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700385 mPreviewStreamId = NO_STREAM;
386 }
387
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700388 mJpegProcessor->deleteStream();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700389
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -0700390 if (mRecordingStreamId != NO_STREAM) {
391 mDevice->deleteStream(mRecordingStreamId);
392 mRecordingStreamId = NO_STREAM;
393 }
394
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700395 mCallbackProcessor->deleteStream();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700396
Eino-Ville Talvala7d8b92b2012-09-05 19:02:43 -0700397 mZslProcessor->deleteStream();
398
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700399 mDevice.clear();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700400 SharedParameters::Lock l(mParameters);
401 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700402
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700403 CameraService::Client::disconnect();
404}
405
406status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700407 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700408 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700409 Mutex::Autolock icl(mICameraLock);
410
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700411 if (mClientPid != 0 && getCallingPid() != mClientPid) {
412 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
413 "current locked to pid %d", __FUNCTION__,
414 mCameraId, getCallingPid(), mClientPid);
415 return BAD_VALUE;
416 }
417
418 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700419
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700420 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700421 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700422
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700423 SharedParameters::Lock l(mParameters);
424 l.mParameters.state = Parameters::STOPPED;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700425
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700426 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700427}
428
429status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700430 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700431 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700432 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700433 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
434 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700435
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700436 if (mClientPid == 0) {
437 mClientPid = getCallingPid();
438 return OK;
439 }
440
441 if (mClientPid != getCallingPid()) {
442 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
443 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
444 return EBUSY;
445 }
446
447 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700448}
449
450status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700451 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700452 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700453 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700454 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
455 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700456
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700457 // TODO: Check for uninterruptable conditions
458
459 if (mClientPid == getCallingPid()) {
460 mClientPid = 0;
461 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700462 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700463 return OK;
464 }
465
466 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
467 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
468 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700469}
470
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700471status_t Camera2Client::setPreviewDisplay(
472 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700473 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700474 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700475 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700476 status_t res;
477 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700478
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700479 sp<IBinder> binder;
480 sp<ANativeWindow> window;
481 if (surface != 0) {
482 binder = surface->asBinder();
483 window = surface;
484 }
485
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700486 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700487}
488
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700489status_t Camera2Client::setPreviewTexture(
490 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700491 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700492 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700493 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700494 status_t res;
495 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700496
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700497 sp<IBinder> binder;
498 sp<ANativeWindow> window;
499 if (surfaceTexture != 0) {
500 binder = surfaceTexture->asBinder();
501 window = new SurfaceTextureClient(surfaceTexture);
502 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700503 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700504}
505
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700506status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700507 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700508 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700509 status_t res;
510
511 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700512 ALOGV("%s: Camera %d: New window is same as old window",
513 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700514 return NO_ERROR;
515 }
516
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700517 SharedParameters::Lock l(mParameters);
518 switch (l.mParameters.state) {
519 case Parameters::DISCONNECTED:
520 case Parameters::RECORD:
521 case Parameters::STILL_CAPTURE:
522 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700523 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700524 __FUNCTION__, mCameraId,
525 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700526 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700527 case Parameters::STOPPED:
528 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700529 // OK
530 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700531 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700532 // Already running preview - need to stop and create a new stream
533 // TODO: Optimize this so that we don't wait for old stream to drain
534 // before spinning up new stream
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700535 mDevice->clearStreamingRequest();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700536 l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700537 break;
538 }
539
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700540 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700541 res = mDevice->waitUntilDrained();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700542 if (res != OK) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700543 ALOGE("%s: Error waiting for preview to drain: %s (%d)",
544 __FUNCTION__, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700545 return res;
546 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700547 res = mDevice->deleteStream(mPreviewStreamId);
548 if (res != OK) {
549 ALOGE("%s: Unable to delete old preview stream: %s (%d)",
550 __FUNCTION__, strerror(-res), res);
551 return res;
552 }
553 mPreviewStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700554 }
555
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700556 mPreviewSurface = binder;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700557 mPreviewWindow = window;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700558
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700559 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
560 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700561 }
562
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700563 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700564}
565
566void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700567 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700568 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700569 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700570 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700571 if ( checkPid(__FUNCTION__) != OK) return;
572
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700573 SharedParameters::Lock l(mParameters);
574 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700575}
576
577void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
578 status_t res = OK;
579 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
580 ALOGV("%s: setting oneshot", __FUNCTION__);
581 params.previewCallbackOneShot = true;
582 }
583 if (params.previewCallbackFlags != (uint32_t)flag) {
584 params.previewCallbackFlags = flag;
585 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700586 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700587 res = startPreviewL(params, true);
588 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700589 case Parameters::RECORD:
590 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700591 res = startRecordingL(params, true);
592 break;
593 default:
594 break;
595 }
596 if (res != OK) {
597 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700598 __FUNCTION__, mCameraId,
599 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700600 }
601 }
602
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700603}
604
605status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700606 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700607 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700608 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700609 status_t res;
610 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700611 SharedParameters::Lock l(mParameters);
612 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700613}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700614
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700615status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700616 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700617 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700618 if (params.state >= Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700619 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700620 __FUNCTION__,
621 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700622 return INVALID_OPERATION;
623 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700624
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700625 if (mPreviewWindow == 0) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700626 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700627 return OK;
628 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700629 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700630
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700631 res = updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700632 if (res != OK) {
633 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
634 __FUNCTION__, mCameraId, strerror(-res), res);
635 return res;
636 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700637 bool callbacksEnabled = params.previewCallbackFlags &
638 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
639 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700640 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700641 if (res != OK) {
642 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
643 __FUNCTION__, mCameraId, strerror(-res), res);
644 return res;
645 }
646 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700647 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700648 res = mZslProcessor->updateStream(params);
649 if (res != OK) {
650 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
651 __FUNCTION__, mCameraId, strerror(-res), res);
652 return res;
653 }
654 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700655
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700656 CameraMetadata *request;
657 if (!params.recordingHint) {
658 if (mPreviewRequest.entryCount() == 0) {
659 res = updatePreviewRequest(params);
660 if (res != OK) {
661 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
662 __FUNCTION__, mCameraId, strerror(-res), res);
663 return res;
664 }
665 }
666 request = &mPreviewRequest;
667 } else {
668 // With recording hint set, we're going to be operating under the
669 // assumption that the user will record video. To optimize recording
670 // startup time, create the necessary output streams for recording and
671 // video snapshot now if they don't already exist.
672 if (mRecordingRequest.entryCount() == 0) {
673 res = updateRecordingRequest(params);
674 if (res != OK) {
675 ALOGE("%s: Camera %d: Unable to create recording preview "
676 "request: %s (%d)",
677 __FUNCTION__, mCameraId, strerror(-res), res);
678 return res;
679 }
680 }
681 request = &mRecordingRequest;
682
683 res = updateRecordingStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700684 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700685 ALOGE("%s: Camera %d: Unable to pre-configure recording "
686 "stream: %s (%d)",
687 __FUNCTION__, mCameraId, strerror(-res), res);
688 return res;
689 }
690
691 res = mJpegProcessor->updateStream(params);
692 if (res != OK) {
693 ALOGE("%s: Camera %d: Can't pre-configure still image "
694 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700695 __FUNCTION__, mCameraId, strerror(-res), res);
696 return res;
697 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700698 }
699
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700700 Vector<uint8_t> outputStreams;
701 outputStreams.push(getPreviewStreamId());
702
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700703 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700704 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700705 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700706 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700707 outputStreams.push(getZslStreamId());
708 }
709
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700710 res = request->update(
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700711 ANDROID_REQUEST_OUTPUT_STREAMS,
712 outputStreams);
713
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700714 if (res != OK) {
715 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
716 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700717 return res;
718 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700719 res = request->sort();
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700720 if (res != OK) {
721 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
722 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700723 return res;
724 }
725
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700726 res = mDevice->setStreamingRequest(*request);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700727 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700728 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
729 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700730 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700731 return res;
732 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700733 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700734
735 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700736}
737
738void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700739 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700740 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700741 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700742 status_t res;
743 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700744 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700745}
746
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700747void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700748 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700749 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700750 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700751 SharedParameters::Lock l(mParameters);
752 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700753 }
754
755 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700756 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700757 ALOGE("%s: Camera %d: Call before initialized",
758 __FUNCTION__, mCameraId);
759 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700760 case Parameters::STOPPED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700761 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700762 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700763 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
764 __FUNCTION__, mCameraId);
765 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700766 case Parameters::RECORD:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700767 // no break - identical to preview
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700768 case Parameters::PREVIEW:
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700769 mDevice->clearStreamingRequest();
Eino-Ville Talvala22671062012-07-20 18:30:37 -0700770 mDevice->waitUntilDrained();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700771 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700772 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
773 SharedParameters::Lock l(mParameters);
774 l.mParameters.state = Parameters::STOPPED;
775 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700776 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700777 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700778 default:
779 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700780 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700781 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700782}
783
784bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700785 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700786 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700787 status_t res;
788 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
789
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700790 SharedParameters::Lock l(mParameters);
791 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700792}
793
794status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700795 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700796 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700797 status_t res;
798 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
799
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700800 SharedParameters::Lock l(mParameters);
801 switch (l.mParameters.state) {
802 case Parameters::RECORD:
803 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700804 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700805 __FUNCTION__, mCameraId,
806 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700807 return INVALID_OPERATION;
808 default:
809 // OK
810 break;
811 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700812
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700813 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700814
815 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700816}
817
818status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700819 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700820 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700821 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700822 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700823 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700824 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700825
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700826 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700827}
828
829status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
830 status_t res;
831 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700832 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700833 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700834 if (res != OK) return res;
835 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700836 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700837 // Ready to go
838 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700839 case Parameters::RECORD:
840 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700841 // OK to call this when recording is already on, just skip unless
842 // we're looking to restart
843 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700844 break;
845 default:
846 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700847 __FUNCTION__, mCameraId,
848 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700849 return INVALID_OPERATION;
850 };
851
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700852 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700853 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
854 "non-metadata recording mode requested!", __FUNCTION__,
855 mCameraId);
856 return INVALID_OPERATION;
857 }
858
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700859 mCameraService->playSound(CameraService::SOUND_RECORDING);
860
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700861 res = updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700862 if (res != OK) {
863 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
864 __FUNCTION__, mCameraId, strerror(-res), res);
865 return res;
866 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700867 bool callbacksEnabled = params.previewCallbackFlags &
868 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
869 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700870 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700871 if (res != OK) {
872 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
873 __FUNCTION__, mCameraId, strerror(-res), res);
874 return res;
875 }
876 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700877
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700878 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700879 res = updateRecordingRequest(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700880 if (res != OK) {
881 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
882 __FUNCTION__, mCameraId, strerror(-res), res);
883 return res;
884 }
885 }
886
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700887 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700888 uint8_t outputStreams[3] ={
889 getPreviewStreamId(),
890 getRecordingStreamId(),
891 getCallbackStreamId()
892 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700893 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700894 ANDROID_REQUEST_OUTPUT_STREAMS,
895 outputStreams, 3);
896 } else {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700897 uint8_t outputStreams[2] = {
898 getPreviewStreamId(),
899 getRecordingStreamId()
900 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700901 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700902 ANDROID_REQUEST_OUTPUT_STREAMS,
903 outputStreams, 2);
904 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700905 if (res != OK) {
906 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
907 __FUNCTION__, mCameraId, strerror(-res), res);
908 return res;
909 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700910 res = mRecordingRequest.sort();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700911 if (res != OK) {
912 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
913 __FUNCTION__, mCameraId, strerror(-res), res);
914 return res;
915 }
916
917 res = mDevice->setStreamingRequest(mRecordingRequest);
918 if (res != OK) {
919 ALOGE("%s: Camera %d: Unable to set recording request to start "
920 "recording: %s (%d)", __FUNCTION__, mCameraId,
921 strerror(-res), res);
922 return res;
923 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700924 if (params.state < Parameters::RECORD) {
925 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700926 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700927
928 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700929}
930
931void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700932 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700933 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700934 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700935 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700936
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700937 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700938 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
939
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700940 switch (l.mParameters.state) {
941 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700942 // OK to stop
943 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700944 case Parameters::STOPPED:
945 case Parameters::PREVIEW:
946 case Parameters::STILL_CAPTURE:
947 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700948 default:
949 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700950 __FUNCTION__, mCameraId,
951 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700952 return;
953 };
954
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700955 mCameraService->playSound(CameraService::SOUND_RECORDING);
956
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700957 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700958 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700959 ALOGE("%s: Camera %d: Unable to return to preview",
960 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700961 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700962}
963
964bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700965 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700966 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700967
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700968 if ( checkPid(__FUNCTION__) != OK) return false;
969
James Dong8da4cd72012-08-04 19:58:07 -0700970 return recordingEnabledL();
971}
972
973bool Camera2Client::recordingEnabledL() {
974 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700975 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700976
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700977 return (l.mParameters.state == Parameters::RECORD
978 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700979}
980
981void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700982 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700983 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700984 status_t res;
985 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700986
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700987 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700988
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700989 // Make sure this is for the current heap
990 ssize_t offset;
991 size_t size;
992 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
993 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
994 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
995 "(got %x, expected %x)", __FUNCTION__, mCameraId,
996 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
997 return;
998 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700999 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1000 uint32_t type = *(uint32_t*)data;
1001 if (type != kMetadataBufferTypeGrallocSource) {
1002 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
1003 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
1004 return;
1005 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001006
1007 // Release the buffer back to the recording queue
1008
1009 buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
1010
1011 size_t itemIndex;
1012 for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
1013 const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
1014 if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
1015 item.mGraphicBuffer->handle == imgHandle) {
1016 break;
1017 }
1018 }
1019 if (itemIndex == mRecordingBuffers.size()) {
1020 ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
1021 "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
1022 return;
1023 }
1024
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001025 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001026 imgHandle);
1027
1028 res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001029 if (res != OK) {
1030 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
1031 "%s (%d)",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001032 __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001033 return;
1034 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001035 mRecordingBuffers.replaceAt(itemIndex);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001036
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001037 mRecordingHeapFree++;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001038}
1039
1040status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001041 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001042 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001043 status_t res;
1044 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1045
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001046 int triggerId;
1047 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001048 SharedParameters::Lock l(mParameters);
1049 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1050 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001051 }
1052
1053 mDevice->triggerAutofocus(triggerId);
1054
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001055 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001056}
1057
1058status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001059 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001060 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001061 status_t res;
1062 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1063
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001064 int triggerId;
1065 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001066 SharedParameters::Lock l(mParameters);
1067 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001068 }
1069
1070 mDevice->triggerCancelAutofocus(triggerId);
1071
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001072 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001073}
1074
1075status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001076 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001077 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001078 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001079 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001080
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001081 SharedParameters::Lock l(mParameters);
1082 switch (l.mParameters.state) {
1083 case Parameters::DISCONNECTED:
1084 case Parameters::STOPPED:
1085 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001086 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1087 __FUNCTION__, mCameraId);
1088 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001089 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001090 // Good to go for takePicture
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001091 res = commandStopFaceDetectionL(l.mParameters);
1092 if (res != OK) {
1093 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1094 __FUNCTION__, mCameraId);
1095 return res;
1096 }
1097 l.mParameters.state = Parameters::STILL_CAPTURE;
1098 break;
1099 case Parameters::RECORD:
1100 // Good to go for video snapshot
1101 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001102 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001103 case Parameters::STILL_CAPTURE:
1104 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001105 ALOGE("%s: Camera %d: Already taking a picture",
1106 __FUNCTION__, mCameraId);
1107 return INVALID_OPERATION;
1108 }
1109
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001110 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001111
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001112 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001113 if (res != OK) {
1114 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1115 __FUNCTION__, mCameraId, strerror(-res), res);
1116 return res;
1117 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001118
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001119 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001120 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001121 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001122 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001123 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001124
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001125 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001126}
1127
1128status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001129 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001130 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001131 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001132 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001133 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1134
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001135 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001136
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001137 res = l.mParameters.set(params);
1138 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001139
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001140 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001141
1142 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001143}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001144
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001145String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001146 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001147 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001148 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001149
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001150 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001151
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001152 // TODO: Deal with focus distances
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001153 return l.mParameters.paramsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001154}
1155
1156status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001157 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001158 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001159 status_t res;
1160 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001161
1162 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1163 cmd, arg1, arg2);
1164
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001165 switch (cmd) {
1166 case CAMERA_CMD_START_SMOOTH_ZOOM:
1167 return commandStartSmoothZoomL();
1168 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1169 return commandStopSmoothZoomL();
1170 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1171 return commandSetDisplayOrientationL(arg1);
1172 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1173 return commandEnableShutterSoundL(arg1 == 1);
1174 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1175 return commandPlayRecordingSoundL();
1176 case CAMERA_CMD_START_FACE_DETECTION:
1177 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001178 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001179 SharedParameters::Lock l(mParameters);
1180 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001181 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001182 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1183 return commandEnableFocusMoveMsgL(arg1 == 1);
1184 case CAMERA_CMD_PING:
1185 return commandPingL();
1186 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1187 return commandSetVideoBufferCountL(arg1);
1188 default:
1189 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1190 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001191 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001192 }
1193}
James Dong983cf232012-08-01 16:39:55 -07001194
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001195status_t Camera2Client::commandStartSmoothZoomL() {
1196 ALOGE("%s: Unimplemented!", __FUNCTION__);
1197 return OK;
1198}
James Dong983cf232012-08-01 16:39:55 -07001199
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001200status_t Camera2Client::commandStopSmoothZoomL() {
1201 ALOGE("%s: Unimplemented!", __FUNCTION__);
1202 return OK;
1203}
James Dong983cf232012-08-01 16:39:55 -07001204
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001205status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001206 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001207 mCameraFacing == CAMERA_FACING_FRONT);
1208 if (transform == -1) {
1209 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1210 __FUNCTION__, mCameraId, degrees);
1211 return BAD_VALUE;
1212 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001213 SharedParameters::Lock l(mParameters);
1214 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001215 mPreviewStreamId != NO_STREAM) {
1216 mDevice->setStreamTransform(mPreviewStreamId, transform);
1217 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001218 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001219 return OK;
1220}
1221
1222status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001223 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001224 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001225 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001226 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001227 }
1228
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001229 // Disabling shutter sound may not be allowed. In that case only
1230 // allow the mediaserver process to disable the sound.
1231 char value[PROPERTY_VALUE_MAX];
1232 property_get("ro.camera.sound.forced", value, "0");
1233 if (strncmp(value, "0", 2) != 0) {
1234 // Disabling shutter sound is not allowed. Deny if the current
1235 // process is not mediaserver.
1236 if (getCallingPid() != getpid()) {
1237 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1238 getCallingPid());
1239 return PERMISSION_DENIED;
1240 }
1241 }
1242
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001243 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001244 return OK;
1245}
1246
1247status_t Camera2Client::commandPlayRecordingSoundL() {
1248 mCameraService->playSound(CameraService::SOUND_RECORDING);
1249 return OK;
1250}
1251
1252status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001253 ALOGV("%s: Camera %d: Starting face detection",
1254 __FUNCTION__, mCameraId);
1255 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001256 SharedParameters::Lock l(mParameters);
1257 switch (l.mParameters.state) {
1258 case Parameters::DISCONNECTED:
1259 case Parameters::STOPPED:
1260 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1261 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001262 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1263 __FUNCTION__, mCameraId);
1264 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001265 case Parameters::PREVIEW:
1266 case Parameters::RECORD:
1267 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001268 // Good to go for starting face detect
1269 break;
1270 }
1271 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001272 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1273 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001274 ALOGE("%s: Camera %d: Face detection not supported",
1275 __FUNCTION__, mCameraId);
1276 return INVALID_OPERATION;
1277 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001278 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001279
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001280 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001281
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001282 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001283
1284 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001285}
1286
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001287status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001288 status_t res = OK;
1289 ALOGV("%s: Camera %d: Stopping face detection",
1290 __FUNCTION__, mCameraId);
1291
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001292 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001293
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001294 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001295
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001296 if (params.state == Parameters::PREVIEW
1297 || params.state == Parameters::RECORD
1298 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001299 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001300 }
1301
1302 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001303}
1304
1305status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001306 SharedParameters::Lock l(mParameters);
1307 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001308
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001309 return OK;
1310}
1311
1312status_t Camera2Client::commandPingL() {
1313 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001314 SharedParameters::Lock l(mParameters);
1315 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001316 return OK;
1317 } else {
1318 return NO_INIT;
1319 }
1320}
1321
1322status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001323 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001324 ALOGE("%s: Camera %d: Error setting video buffer count after "
1325 "recording was started", __FUNCTION__, mCameraId);
1326 return INVALID_OPERATION;
1327 }
1328
1329 // 32 is the current upper limit on the video buffer count for BufferQueue
1330 if (count > 32) {
1331 ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1332 __FUNCTION__, mCameraId, count);
1333 return BAD_VALUE;
1334 }
1335
1336 // Need to reallocate memory for heap
1337 if (mRecordingHeapCount != count) {
1338 if (mRecordingHeap != 0) {
1339 mRecordingHeap.clear();
1340 mRecordingHeap = NULL;
1341 }
1342 mRecordingHeapCount = count;
1343 }
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001344
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001345 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001346}
1347
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001348/** Device-related methods */
1349
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001350void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1351 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1352}
1353
1354void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1355 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1356 frameNumber, timestamp);
1357}
1358
1359void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1360 ALOGV("%s: Autofocus state now %d, last trigger %d",
1361 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001362 bool sendCompletedMessage = false;
1363 bool sendMovingMessage = false;
1364
1365 bool success = false;
1366 bool afInMotion = false;
1367 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001368 SharedParameters::Lock l(mParameters);
1369 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001370 case Parameters::FOCUS_MODE_AUTO:
1371 case Parameters::FOCUS_MODE_MACRO:
1372 // Don't send notifications upstream if they're not for the current AF
1373 // trigger. For example, if cancel was called in between, or if we
1374 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001375 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001376 switch (newState) {
1377 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1378 success = true;
1379 // no break
1380 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1381 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001382 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001383 break;
1384 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1385 // Just starting focusing, ignore
1386 break;
1387 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1388 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1389 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1390 default:
1391 // Unexpected in AUTO/MACRO mode
1392 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1393 __FUNCTION__, newState);
1394 break;
1395 }
1396 break;
1397 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1398 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1399 switch (newState) {
1400 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1401 success = true;
1402 // no break
1403 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1404 // Don't send notifications upstream if they're not for
1405 // the current AF trigger. For example, if cancel was
1406 // called in between, or if we already sent a
1407 // notification about this AF call.
1408 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001409 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001410 sendCompletedMessage = true;
1411 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001412 if (l.mParameters.enableFocusMoveMessages &&
1413 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001414 sendMovingMessage = true;
1415 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001416 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001417 break;
1418 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1419 // Cancel was called, or we switched state; care if
1420 // currently moving
1421 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001422 if (l.mParameters.enableFocusMoveMessages &&
1423 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001424 sendMovingMessage = true;
1425 }
1426 break;
1427 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1428 // Start passive scan, inform upstream
1429 afInMotion = true;
1430 // no break
1431 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1432 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001433 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001434 sendMovingMessage = true;
1435 }
1436 break;
1437 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001438 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001439 break;
1440 case Parameters::FOCUS_MODE_EDOF:
1441 case Parameters::FOCUS_MODE_INFINITY:
1442 case Parameters::FOCUS_MODE_FIXED:
1443 default:
1444 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001445 ALOGE("%s: Unexpected AF state change %d "
1446 "(ID %d) in focus mode %d",
1447 __FUNCTION__, newState, triggerId,
1448 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001449 }
1450 }
1451 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001452 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001453 SharedCameraClient::Lock l(mSharedCameraClient);
1454 if (l.mCameraClient != 0) {
1455 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001456 afInMotion ? 1 : 0, 0);
1457 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001458 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001459 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001460 SharedCameraClient::Lock l(mSharedCameraClient);
1461 if (l.mCameraClient != 0) {
1462 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1463 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001464 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001465 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001466}
1467
1468void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1469 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1470 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001471 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001472}
1473
1474void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1475 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1476 __FUNCTION__, newState, triggerId);
1477}
1478
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001479int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001480 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001481}
1482
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001483const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1484 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001485}
1486
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001487const sp<CameraService>& Camera2Client::getCameraService() {
1488 return mCameraService;
1489}
1490
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001491camera2::SharedParameters& Camera2Client::getParameters() {
1492 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001493}
1494
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001495int Camera2Client::getPreviewStreamId() const {
1496 return mPreviewStreamId;
1497}
1498
1499int Camera2Client::getCaptureStreamId() const {
1500 return mJpegProcessor->getStreamId();
1501}
1502
1503int Camera2Client::getCallbackStreamId() const {
1504 return mCallbackProcessor->getStreamId();
1505}
1506
1507int Camera2Client::getRecordingStreamId() const {
1508 return mRecordingStreamId;
1509}
1510
1511int Camera2Client::getZslStreamId() const {
1512 return mZslProcessor->getStreamId();
1513}
1514
1515status_t Camera2Client::registerFrameListener(int32_t id,
1516 wp<camera2::FrameProcessor::FilteredListener> listener) {
1517 return mFrameProcessor->registerListener(id, listener);
1518}
1519
1520status_t Camera2Client::removeFrameListener(int32_t id) {
1521 return mFrameProcessor->removeListener(id);
1522}
1523
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001524Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1525 mCameraClient(client.mCameraClient),
1526 mSharedClient(client) {
1527 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001528}
1529
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001530Camera2Client::SharedCameraClient::Lock::~Lock() {
1531 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001532}
1533
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001534Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1535 mCameraClient(client) {
1536}
1537
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001538Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1539 const sp<ICameraClient>&client) {
1540 Mutex::Autolock l(mCameraClientLock);
1541 mCameraClient = client;
1542 return *this;
1543}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001544
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001545void Camera2Client::SharedCameraClient::clear() {
1546 Mutex::Autolock l(mCameraClientLock);
1547 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001548}
1549
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001550const int32_t Camera2Client::kPreviewRequestId;
1551const int32_t Camera2Client::kRecordRequestId;
1552const int32_t Camera2Client::kFirstCaptureRequestId;
1553
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001554void Camera2Client::onRecordingFrameAvailable() {
1555 ATRACE_CALL();
1556 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001557 sp<Camera2Heap> recordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001558 size_t heapIdx = 0;
1559 nsecs_t timestamp;
1560 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001561 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001562
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001563 BufferItemConsumer::BufferItem imgBuffer;
1564 res = mRecordingConsumer->acquireBuffer(&imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001565 if (res != OK) {
1566 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1567 __FUNCTION__, mCameraId, strerror(-res), res);
1568 return;
1569 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001570 timestamp = imgBuffer.mTimestamp;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001571
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001572 mRecordingFrameCount++;
1573 ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1574
1575 // TODO: Signal errors here upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001576 if (l.mParameters.state != Parameters::RECORD &&
1577 l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001578 ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1579 "recording done",
1580 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001581 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001582 return;
1583 }
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -07001584
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001585 if (mRecordingHeap == 0) {
1586 const size_t bufferSize = 4 + sizeof(buffer_handle_t);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001587 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1588 "size %d bytes", __FUNCTION__, mCameraId,
James Dong983cf232012-08-01 16:39:55 -07001589 mRecordingHeapCount, bufferSize);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001590
James Dong983cf232012-08-01 16:39:55 -07001591 mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001592 "Camera2Client::RecordingHeap");
1593 if (mRecordingHeap->mHeap->getSize() == 0) {
1594 ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1595 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001596 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001597 return;
1598 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001599 for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
1600 if (mRecordingBuffers[i].mBuf !=
1601 BufferItemConsumer::INVALID_BUFFER_SLOT) {
1602 ALOGE("%s: Camera %d: Non-empty recording buffers list!",
1603 __FUNCTION__, mCameraId);
1604 }
1605 }
1606 mRecordingBuffers.clear();
1607 mRecordingBuffers.setCapacity(mRecordingHeapCount);
1608 mRecordingBuffers.insertAt(0, mRecordingHeapCount);
1609
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001610 mRecordingHeapHead = 0;
James Dong983cf232012-08-01 16:39:55 -07001611 mRecordingHeapFree = mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001612 }
1613
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001614 if ( mRecordingHeapFree == 0) {
1615 ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1616 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001617 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001618 return;
1619 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001620
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001621 heapIdx = mRecordingHeapHead;
James Dong983cf232012-08-01 16:39:55 -07001622 mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001623 mRecordingHeapFree--;
1624
1625 ALOGV("%s: Camera %d: Timestamp %lld",
1626 __FUNCTION__, mCameraId, timestamp);
1627
1628 ssize_t offset;
1629 size_t size;
1630 sp<IMemoryHeap> heap =
1631 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1632 &size);
1633
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001634 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1635 uint32_t type = kMetadataBufferTypeGrallocSource;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001636 *((uint32_t*)data) = type;
1637 *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001638 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001639 __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
1640 mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001641 recordingHeap = mRecordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001642 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001643
1644 // Call outside locked parameters to allow re-entrancy from notification
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001645 SharedCameraClient::Lock l(mSharedCameraClient);
1646 if (l.mCameraClient != 0) {
1647 l.mCameraClient->dataCallbackTimestamp(timestamp,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001648 CAMERA_MSG_VIDEO_FRAME,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001649 recordingHeap->mBuffers[heapIdx]);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001650 }
1651}
1652
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001653/** Utility methods */
1654
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001655status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001656 status_t res;
1657
1658 res = updatePreviewRequest(params);
1659 if (res != OK) {
1660 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1661 __FUNCTION__, mCameraId, strerror(-res), res);
1662 return res;
1663 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001664 res = updateRecordingRequest(params);
1665 if (res != OK) {
1666 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1667 __FUNCTION__, mCameraId, strerror(-res), res);
1668 return res;
1669 }
1670
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001671 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001672 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001673 if (res != OK) {
1674 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1675 __FUNCTION__, mCameraId, strerror(-res), res);
1676 return res;
1677 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001678 } else if (params.state == Parameters::RECORD ||
1679 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001680 res = mDevice->setStreamingRequest(mRecordingRequest);
1681 if (res != OK) {
1682 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1683 __FUNCTION__, mCameraId, strerror(-res), res);
1684 return res;
1685 }
1686 }
1687 return res;
1688}
1689
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001690status_t Camera2Client::updatePreviewStream(const Parameters &params) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001691 ATRACE_CALL();
1692 status_t res;
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001693
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001694 if (mPreviewStreamId != NO_STREAM) {
1695 // Check if stream parameters have to change
1696 uint32_t currentWidth, currentHeight;
1697 res = mDevice->getStreamInfo(mPreviewStreamId,
1698 &currentWidth, &currentHeight, 0);
1699 if (res != OK) {
1700 ALOGE("%s: Camera %d: Error querying preview stream info: "
1701 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1702 return res;
1703 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001704 if (currentWidth != (uint32_t)params.previewWidth ||
1705 currentHeight != (uint32_t)params.previewHeight) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001706 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
1707 __FUNCTION__, mCameraId, currentWidth, currentHeight,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001708 params.previewWidth, params.previewHeight);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001709 res = mDevice->waitUntilDrained();
1710 if (res != OK) {
1711 ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1712 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1713 return res;
1714 }
1715 res = mDevice->deleteStream(mPreviewStreamId);
1716 if (res != OK) {
1717 ALOGE("%s: Camera %d: Unable to delete old output stream "
1718 "for preview: %s (%d)", __FUNCTION__, mCameraId,
1719 strerror(-res), res);
1720 return res;
1721 }
1722 mPreviewStreamId = NO_STREAM;
1723 }
1724 }
1725
1726 if (mPreviewStreamId == NO_STREAM) {
1727 res = mDevice->createStream(mPreviewWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001728 params.previewWidth, params.previewHeight,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001729 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1730 &mPreviewStreamId);
1731 if (res != OK) {
1732 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1733 __FUNCTION__, mCameraId, strerror(-res), res);
1734 return res;
1735 }
1736 }
1737
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001738 res = mDevice->setStreamTransform(mPreviewStreamId,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001739 params.previewTransform);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001740 if (res != OK) {
1741 ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1742 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1743 return res;
1744 }
1745
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001746 return OK;
1747}
1748
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001749status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001750 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001751 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001752 if (mPreviewRequest.entryCount() == 0) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001753 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1754 &mPreviewRequest);
1755 if (res != OK) {
1756 ALOGE("%s: Camera %d: Unable to create default preview request: "
1757 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1758 return res;
1759 }
1760 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001761
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001762 res = params.updateRequest(&mPreviewRequest);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001763 if (res != OK) {
1764 ALOGE("%s: Camera %d: Unable to update common entries of preview "
1765 "request: %s (%d)", __FUNCTION__, mCameraId,
1766 strerror(-res), res);
1767 return res;
1768 }
1769
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001770 res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1771 &kPreviewRequestId, 1);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001772
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001773 return OK;
1774}
1775
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001776status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001777 ATRACE_CALL();
1778 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001779 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001780 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
1781 &mRecordingRequest);
1782 if (res != OK) {
1783 ALOGE("%s: Camera %d: Unable to create default recording request:"
1784 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1785 return res;
1786 }
1787 }
1788
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001789 res = params.updateRequest(&mRecordingRequest);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001790 if (res != OK) {
1791 ALOGE("%s: Camera %d: Unable to update common entries of recording "
1792 "request: %s (%d)", __FUNCTION__, mCameraId,
1793 strerror(-res), res);
1794 return res;
1795 }
1796
1797 return OK;
1798}
1799
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001800status_t Camera2Client::updateRecordingStream(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001801 status_t res;
1802
1803 if (mRecordingConsumer == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001804 // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1805 // always acquire and free a buffer when the heap is full; otherwise the consumer
1806 // will have buffers in flight we'll never clear out.
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001807 mRecordingConsumer = new BufferItemConsumer(
1808 GRALLOC_USAGE_HW_VIDEO_ENCODER,
1809 mRecordingHeapCount + 1,
1810 true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001811 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
1812 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
1813 mRecordingWindow = new SurfaceTextureClient(
1814 mRecordingConsumer->getProducerInterface());
1815 // Allocate memory later, since we don't know buffer size until receipt
1816 }
1817
1818 if (mRecordingStreamId != NO_STREAM) {
1819 // Check if stream parameters have to change
1820 uint32_t currentWidth, currentHeight;
1821 res = mDevice->getStreamInfo(mRecordingStreamId,
1822 &currentWidth, &currentHeight, 0);
1823 if (res != OK) {
1824 ALOGE("%s: Camera %d: Error querying recording output stream info: "
1825 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1826 return res;
1827 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001828 if (currentWidth != (uint32_t)params.videoWidth ||
1829 currentHeight != (uint32_t)params.videoHeight) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001830 // TODO: Should wait to be sure previous recording has finished
1831 res = mDevice->deleteStream(mRecordingStreamId);
1832 if (res != OK) {
1833 ALOGE("%s: Camera %d: Unable to delete old output stream "
1834 "for recording: %s (%d)", __FUNCTION__, mCameraId,
1835 strerror(-res), res);
1836 return res;
1837 }
1838 mRecordingStreamId = NO_STREAM;
1839 }
1840 }
1841
1842 if (mRecordingStreamId == NO_STREAM) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001843 mRecordingFrameCount = 0;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001844 res = mDevice->createStream(mRecordingWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001845 params.videoWidth, params.videoHeight,
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001846 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001847 if (res != OK) {
1848 ALOGE("%s: Camera %d: Can't create output stream for recording: "
1849 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1850 return res;
1851 }
1852 }
1853
1854 return OK;
1855}
1856
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001857size_t Camera2Client::calculateBufferSize(int width, int height,
1858 int format, int stride) {
1859 switch (format) {
1860 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1861 return width * height * 2;
1862 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1863 return width * height * 3 / 2;
1864 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1865 return width * height * 2;
1866 case HAL_PIXEL_FORMAT_YV12: { // YV12
1867 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001868 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001869 size_t uvSize = uvStride * height / 2;
1870 return ySize + uvSize * 2;
1871 }
1872 case HAL_PIXEL_FORMAT_RGB_565:
1873 return width * height * 2;
1874 case HAL_PIXEL_FORMAT_RGBA_8888:
1875 return width * height * 4;
1876 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1877 return width * height * 2;
1878 default:
1879 ALOGE("%s: Unknown preview format: %x",
1880 __FUNCTION__, format);
1881 return 0;
1882 }
1883}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001884
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001885} // namespace android