blob: 2c8a6a216a249c67fd4ad1d93016d790cba44af1 [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>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070028
29#include "Camera2Client.h"
30
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070031#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
32#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
33
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070034namespace android {
35
36using namespace camera2;
37
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070038static int getCallingPid() {
39 return IPCThreadState::self()->getCallingPid();
40}
41
42static int getCallingUid() {
43 return IPCThreadState::self()->getCallingUid();
44}
45
46// Interface used by CameraService
47
48Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
49 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070050 int cameraId,
51 int cameraFacing,
52 int clientPid):
53 Client(cameraService, cameraClient,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070054 cameraId, cameraFacing, clientPid),
Eino-Ville Talvala177bd342012-08-28 01:25:43 -070055 mSharedCameraClient(cameraClient),
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070056 mParameters(cameraId, cameraFacing),
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -070057 mPreviewStreamId(NO_STREAM),
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -070058 mRecordingStreamId(NO_STREAM),
James Dong983cf232012-08-01 16:39:55 -070059 mRecordingHeapCount(kDefaultRecordingHeapCount)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070060{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070061 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070062 ALOGI("Camera %d: Opened", cameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070063
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070064 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -070065
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070066 SharedParameters::Lock l(mParameters);
67 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070068
69 char value[PROPERTY_VALUE_MAX];
70 property_get("camera.zsl_mode", value, "0");
71 if (!strcmp(value,"1")) {
72 ALOGI("Camera %d: Enabling ZSL mode", cameraId);
73 l.mParameters.zslMode = true;
74 } else {
75 l.mParameters.zslMode = false;
76 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070077}
78
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070079status_t Camera2Client::checkPid(const char* checkLocation) const {
80 int callingPid = getCallingPid();
81 if (callingPid == mClientPid) return NO_ERROR;
82
83 ALOGE("%s: attempt to use a locked camera from a different process"
84 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
85 return PERMISSION_DENIED;
86}
87
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070088status_t Camera2Client::initialize(camera_module_t *module)
89{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070090 ATRACE_CALL();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070091 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070092 status_t res;
93
94 res = mDevice->initialize(module);
95 if (res != OK) {
96 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
97 __FUNCTION__, mCameraId, strerror(-res), res);
98 return NO_INIT;
99 }
100
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700101 res = mDevice->setNotifyCallback(this);
102
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700103 SharedParameters::Lock l(mParameters);
104
105 res = l.mParameters.initialize(&(mDevice->info()));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700106 if (res != OK) {
107 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
108 __FUNCTION__, mCameraId, strerror(-res), res);
109 return NO_INIT;
110 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700111
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700112 String8 threadName;
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700113
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700114 mFrameProcessor = new FrameProcessor(this);
115 threadName = String8::format("Camera2Client[%d]::FrameProcessor",
116 mCameraId);
117 mFrameProcessor->run(threadName.string());
118
119 mCaptureSequencer = new CaptureSequencer(this);
120 threadName = String8::format("Camera2Client[%d]::CaptureSequencer",
121 mCameraId);
122 mCaptureSequencer->run(threadName.string());
123
124 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
125 threadName = String8::format("Camera2Client[%d]::JpegProcessor",
126 mCameraId);
127 mJpegProcessor->run(threadName.string());
128
129 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
130 threadName = String8::format("Camera2Client[%d]::ZslProcessor",
131 mCameraId);
132 mZslProcessor->run(threadName.string());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700133
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700134 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700135 threadName = String8::format("Camera2Client[%d]::CallbackProcessor",
136 mCameraId);
137 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700138
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700139 if (gLogLevel >= 1) {
140 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
141 mCameraId);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700142 ALOGD("%s", l.mParameters.paramsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700143 }
144
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700145 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700146}
147
148Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700149 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700150 ALOGV("Camera %d: Shutting down", mCameraId);
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700151
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700152 mDestructionStarted = true;
153
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700154 // Rewrite mClientPid to allow shutdown by CameraService
155 mClientPid = getCallingPid();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700156 disconnect();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700157
158 mFrameProcessor->requestExit();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700159 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700160}
161
162status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700163 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700164 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700165 mCameraId,
166 getCameraClient()->asBinder().get(),
167 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700168 result.append(" State: ");
169#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
170
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700171 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700172
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700173 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700174
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700175 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700176 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700177 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700178 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700179 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700180 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700181 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700182 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700183 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700184 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700185 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700186 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700187 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700188 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700189 p.jpegQuality, p.jpegThumbQuality);
190 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700191 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700192 p.gpsEnabled ? "enabled" : "disabled");
193 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700194 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700195 p.gpsCoordinates[0], p.gpsCoordinates[1],
196 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700197 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700198 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700199 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700200 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700201 }
202
203 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700204 switch (p.wbMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700205 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
206 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
207 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
208 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
209 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
210 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
211 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
212 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
213 default: result.append("UNKNOWN\n");
214 }
215
216 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700217 switch (p.effectMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700218 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
219 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
220 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
221 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
222 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
223 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
224 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
225 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
226 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
227 default: result.append("UNKNOWN\n");
228 }
229
230 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700231 switch (p.antibandingMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700232 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
233 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
234 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
235 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
236 default: result.append("UNKNOWN\n");
237 }
238
239 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700240 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700241 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
242 result.append("AUTO\n"); break;
243 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
244 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
245 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
246 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
247 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
248 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
249 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
250 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
251 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
252 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
253 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
254 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
255 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
256 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
257 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
258 default: result.append("UNKNOWN\n");
259 }
260
261 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700262 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700263 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
264 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
265 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
266 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
267 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
268 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
269 default: result.append("UNKNOWN\n");
270 }
271
272 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700273 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700274 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
275 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
276 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
277 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
278 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
279 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
280 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
281 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
282 default: result.append("UNKNOWN\n");
283 }
284
285 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700286 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700287 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700288 p.focusingAreas[i].left,
289 p.focusingAreas[i].top,
290 p.focusingAreas[i].right,
291 p.focusingAreas[i].bottom,
292 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700293 }
294
295 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700296 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700297
298 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700299 p.autoExposureLock ? "enabled" : "disabled",
300 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700301
302 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700303 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700304 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700305 p.meteringAreas[i].left,
306 p.meteringAreas[i].top,
307 p.meteringAreas[i].right,
308 p.meteringAreas[i].bottom,
309 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700310 }
311
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700312 result.appendFormat(" Zoom index: %d\n", p.zoom);
313 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
314 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700315
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700316 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700317 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700318
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700319 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700320 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700321
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700322 result.append(" Current streams:\n");
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700323 result.appendFormat(" Preview stream ID: %d\n",
324 getPreviewStreamId());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700325 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700326 getCaptureStreamId());
327 result.appendFormat(" Recording stream ID: %d\n",
328 getRecordingStreamId());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700329
330 result.append(" Current requests:\n");
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700331 if (mPreviewRequest.entryCount() != 0) {
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700332 result.append(" Preview request:\n");
333 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700334 mPreviewRequest.dump(fd, 2, 6);
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700335 } else {
336 result.append(" Preview request: undefined\n");
337 write(fd, result.string(), result.size());
338 }
339
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700340 if (mRecordingRequest.entryCount() != 0) {
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700341 result = " Recording request:\n";
342 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700343 mRecordingRequest.dump(fd, 2, 6);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700344 } else {
345 result = " Recording request: undefined\n";
346 write(fd, result.string(), result.size());
347 }
348
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700349 mCaptureSequencer->dump(fd, args);
350
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700351 mFrameProcessor->dump(fd, args);
352
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700353 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700354 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700355
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700356 status_t res = mDevice->dump(fd, args);
357 if (res != OK) {
358 result = String8::format(" Error dumping device: %s (%d)",
359 strerror(-res), res);
360 write(fd, result.string(), result.size());
361 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700362
363#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700364 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700365}
366
367// ICamera interface
368
369void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700370 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700371 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700372 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700373 status_t res;
374 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700375
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700376 if (mDevice == 0) return;
377
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700378 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700379
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700380 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700381 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700382 mPreviewStreamId = NO_STREAM;
383 }
384
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700385 mJpegProcessor->deleteStream();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700386
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -0700387 if (mRecordingStreamId != NO_STREAM) {
388 mDevice->deleteStream(mRecordingStreamId);
389 mRecordingStreamId = NO_STREAM;
390 }
391
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700392 mCallbackProcessor->deleteStream();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700393
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700394 mDevice.clear();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700395 SharedParameters::Lock l(mParameters);
396 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700397
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700398 CameraService::Client::disconnect();
399}
400
401status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700402 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700403 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700404 Mutex::Autolock icl(mICameraLock);
405
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700406 if (mClientPid != 0 && getCallingPid() != mClientPid) {
407 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
408 "current locked to pid %d", __FUNCTION__,
409 mCameraId, getCallingPid(), mClientPid);
410 return BAD_VALUE;
411 }
412
413 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700414
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700415 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700416 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700417
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700418 SharedParameters::Lock l(mParameters);
419 l.mParameters.state = Parameters::STOPPED;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700420
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700421 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700422}
423
424status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700425 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700426 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700427 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700428 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
429 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700430
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700431 if (mClientPid == 0) {
432 mClientPid = getCallingPid();
433 return OK;
434 }
435
436 if (mClientPid != getCallingPid()) {
437 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
438 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
439 return EBUSY;
440 }
441
442 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700443}
444
445status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700446 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700447 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700448 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700449 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
450 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700451
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700452 // TODO: Check for uninterruptable conditions
453
454 if (mClientPid == getCallingPid()) {
455 mClientPid = 0;
456 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700457 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700458 return OK;
459 }
460
461 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
462 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
463 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700464}
465
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700466status_t Camera2Client::setPreviewDisplay(
467 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700468 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700469 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700470 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700471 status_t res;
472 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700473
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700474 sp<IBinder> binder;
475 sp<ANativeWindow> window;
476 if (surface != 0) {
477 binder = surface->asBinder();
478 window = surface;
479 }
480
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700481 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700482}
483
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700484status_t Camera2Client::setPreviewTexture(
485 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700486 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700487 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700488 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700489 status_t res;
490 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700491
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700492 sp<IBinder> binder;
493 sp<ANativeWindow> window;
494 if (surfaceTexture != 0) {
495 binder = surfaceTexture->asBinder();
496 window = new SurfaceTextureClient(surfaceTexture);
497 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700498 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700499}
500
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700501status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700502 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700503 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700504 status_t res;
505
506 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700507 ALOGV("%s: Camera %d: New window is same as old window",
508 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700509 return NO_ERROR;
510 }
511
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700512 SharedParameters::Lock l(mParameters);
513 switch (l.mParameters.state) {
514 case Parameters::DISCONNECTED:
515 case Parameters::RECORD:
516 case Parameters::STILL_CAPTURE:
517 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700518 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700519 __FUNCTION__, mCameraId,
520 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700521 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700522 case Parameters::STOPPED:
523 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700524 // OK
525 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700526 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700527 // Already running preview - need to stop and create a new stream
528 // TODO: Optimize this so that we don't wait for old stream to drain
529 // before spinning up new stream
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700530 mDevice->clearStreamingRequest();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700531 l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700532 break;
533 }
534
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700535 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700536 res = mDevice->waitUntilDrained();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700537 if (res != OK) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700538 ALOGE("%s: Error waiting for preview to drain: %s (%d)",
539 __FUNCTION__, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700540 return res;
541 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700542 res = mDevice->deleteStream(mPreviewStreamId);
543 if (res != OK) {
544 ALOGE("%s: Unable to delete old preview stream: %s (%d)",
545 __FUNCTION__, strerror(-res), res);
546 return res;
547 }
548 mPreviewStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700549 }
550
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700551 mPreviewSurface = binder;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700552 mPreviewWindow = window;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700553
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700554 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
555 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700556 }
557
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700558 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700559}
560
561void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700562 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700563 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700564 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700565 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700566 if ( checkPid(__FUNCTION__) != OK) return;
567
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700568 SharedParameters::Lock l(mParameters);
569 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700570}
571
572void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
573 status_t res = OK;
574 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
575 ALOGV("%s: setting oneshot", __FUNCTION__);
576 params.previewCallbackOneShot = true;
577 }
578 if (params.previewCallbackFlags != (uint32_t)flag) {
579 params.previewCallbackFlags = flag;
580 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700581 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700582 res = startPreviewL(params, true);
583 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700584 case Parameters::RECORD:
585 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700586 res = startRecordingL(params, true);
587 break;
588 default:
589 break;
590 }
591 if (res != OK) {
592 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700593 __FUNCTION__, mCameraId,
594 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700595 }
596 }
597
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700598}
599
600status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700601 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700602 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700603 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700604 status_t res;
605 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700606 SharedParameters::Lock l(mParameters);
607 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700608}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700609
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700610status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700611 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700612 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700613 if (params.state >= Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700614 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700615 __FUNCTION__,
616 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700617 return INVALID_OPERATION;
618 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700619
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700620 if (mPreviewWindow == 0) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700621 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700622 return OK;
623 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700624 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700625
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700626 res = updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700627 if (res != OK) {
628 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
629 __FUNCTION__, mCameraId, strerror(-res), res);
630 return res;
631 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700632 bool callbacksEnabled = params.previewCallbackFlags &
633 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
634 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700635 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700636 if (res != OK) {
637 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
638 __FUNCTION__, mCameraId, strerror(-res), res);
639 return res;
640 }
641 }
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700642 if (params.zslMode) {
643 res = mZslProcessor->updateStream(params);
644 if (res != OK) {
645 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
646 __FUNCTION__, mCameraId, strerror(-res), res);
647 return res;
648 }
649 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700650
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700651 if (mPreviewRequest.entryCount() == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700652 res = updatePreviewRequest(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700653 if (res != OK) {
654 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
655 __FUNCTION__, mCameraId, strerror(-res), res);
656 return res;
657 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700658 }
659
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700660 Vector<uint8_t> outputStreams;
661 outputStreams.push(getPreviewStreamId());
662
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700663 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700664 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700665 }
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700666 if (params.zslMode) {
667 outputStreams.push(getZslStreamId());
668 }
669
670 res = mPreviewRequest.update(
671 ANDROID_REQUEST_OUTPUT_STREAMS,
672 outputStreams);
673
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700674 if (res != OK) {
675 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
676 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700677 return res;
678 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700679 res = mPreviewRequest.sort();
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700680 if (res != OK) {
681 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
682 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700683 return res;
684 }
685
686 res = mDevice->setStreamingRequest(mPreviewRequest);
687 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700688 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
689 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700690 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700691 return res;
692 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700693 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700694
695 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700696}
697
698void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700699 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700700 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700701 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700702 status_t res;
703 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700704 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700705}
706
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700707void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700708 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700709 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700710 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700711 SharedParameters::Lock l(mParameters);
712 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700713 }
714
715 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700716 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700717 ALOGE("%s: Camera %d: Call before initialized",
718 __FUNCTION__, mCameraId);
719 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700720 case Parameters::STOPPED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700721 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700722 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700723 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
724 __FUNCTION__, mCameraId);
725 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700726 case Parameters::RECORD:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700727 // no break - identical to preview
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700728 case Parameters::PREVIEW:
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700729 mDevice->clearStreamingRequest();
Eino-Ville Talvala22671062012-07-20 18:30:37 -0700730 mDevice->waitUntilDrained();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700731 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700732 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
733 SharedParameters::Lock l(mParameters);
734 l.mParameters.state = Parameters::STOPPED;
735 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700736 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700737 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700738 default:
739 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700740 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700741 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700742}
743
744bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700745 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700746 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700747 status_t res;
748 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
749
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700750 SharedParameters::Lock l(mParameters);
751 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700752}
753
754status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700755 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700756 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700757 status_t res;
758 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
759
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700760 SharedParameters::Lock l(mParameters);
761 switch (l.mParameters.state) {
762 case Parameters::RECORD:
763 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700764 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700765 __FUNCTION__, mCameraId,
766 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700767 return INVALID_OPERATION;
768 default:
769 // OK
770 break;
771 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700772
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700773 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700774
775 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700776}
777
778status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700779 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700780 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700781 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700782 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700783 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700784 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700785
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700786 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700787}
788
789status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
790 status_t res;
791 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700792 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700793 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700794 if (res != OK) return res;
795 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700796 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700797 // Ready to go
798 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700799 case Parameters::RECORD:
800 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700801 // OK to call this when recording is already on, just skip unless
802 // we're looking to restart
803 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700804 break;
805 default:
806 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700807 __FUNCTION__, mCameraId,
808 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700809 return INVALID_OPERATION;
810 };
811
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700812 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700813 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
814 "non-metadata recording mode requested!", __FUNCTION__,
815 mCameraId);
816 return INVALID_OPERATION;
817 }
818
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700819 mCameraService->playSound(CameraService::SOUND_RECORDING);
820
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700821 res = updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700822 if (res != OK) {
823 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
824 __FUNCTION__, mCameraId, strerror(-res), res);
825 return res;
826 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700827 bool callbacksEnabled = params.previewCallbackFlags &
828 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
829 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700830 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700831 if (res != OK) {
832 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
833 __FUNCTION__, mCameraId, strerror(-res), res);
834 return res;
835 }
836 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700837
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700838 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700839 res = updateRecordingRequest(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700840 if (res != OK) {
841 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
842 __FUNCTION__, mCameraId, strerror(-res), res);
843 return res;
844 }
845 }
846
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700847 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700848 uint8_t outputStreams[3] ={
849 getPreviewStreamId(),
850 getRecordingStreamId(),
851 getCallbackStreamId()
852 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700853 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700854 ANDROID_REQUEST_OUTPUT_STREAMS,
855 outputStreams, 3);
856 } else {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700857 uint8_t outputStreams[2] = {
858 getPreviewStreamId(),
859 getRecordingStreamId()
860 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700861 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700862 ANDROID_REQUEST_OUTPUT_STREAMS,
863 outputStreams, 2);
864 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700865 if (res != OK) {
866 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
867 __FUNCTION__, mCameraId, strerror(-res), res);
868 return res;
869 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700870 res = mRecordingRequest.sort();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700871 if (res != OK) {
872 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
873 __FUNCTION__, mCameraId, strerror(-res), res);
874 return res;
875 }
876
877 res = mDevice->setStreamingRequest(mRecordingRequest);
878 if (res != OK) {
879 ALOGE("%s: Camera %d: Unable to set recording request to start "
880 "recording: %s (%d)", __FUNCTION__, mCameraId,
881 strerror(-res), res);
882 return res;
883 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700884 if (params.state < Parameters::RECORD) {
885 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700886 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700887
888 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700889}
890
891void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700892 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700893 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700894 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700895 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700896
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700897 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700898 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
899
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700900 switch (l.mParameters.state) {
901 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700902 // OK to stop
903 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700904 case Parameters::STOPPED:
905 case Parameters::PREVIEW:
906 case Parameters::STILL_CAPTURE:
907 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700908 default:
909 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700910 __FUNCTION__, mCameraId,
911 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700912 return;
913 };
914
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700915 mCameraService->playSound(CameraService::SOUND_RECORDING);
916
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700917 // Back to preview. Since record can only be reached through preview,
918 // all preview stream setup should be up to date.
919 res = mDevice->setStreamingRequest(mPreviewRequest);
920 if (res != OK) {
921 ALOGE("%s: Camera %d: Unable to switch back to preview request: "
922 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
923 return;
924 }
925
926 // TODO: Should recording heap be freed? Can't do it yet since requests
927 // could still be in flight.
928
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700929 l.mParameters.state = Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700930}
931
932bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700933 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700934 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700935
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700936 if ( checkPid(__FUNCTION__) != OK) return false;
937
James Dong8da4cd72012-08-04 19:58:07 -0700938 return recordingEnabledL();
939}
940
941bool Camera2Client::recordingEnabledL() {
942 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700943 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700944
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700945 return (l.mParameters.state == Parameters::RECORD
946 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700947}
948
949void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700950 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700951 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700952 status_t res;
953 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700954
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700955 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700956
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700957 // Make sure this is for the current heap
958 ssize_t offset;
959 size_t size;
960 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
961 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
962 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
963 "(got %x, expected %x)", __FUNCTION__, mCameraId,
964 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
965 return;
966 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700967 uint8_t *data = (uint8_t*)heap->getBase() + offset;
968 uint32_t type = *(uint32_t*)data;
969 if (type != kMetadataBufferTypeGrallocSource) {
970 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
971 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
972 return;
973 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700974
975 // Release the buffer back to the recording queue
976
977 buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
978
979 size_t itemIndex;
980 for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
981 const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
982 if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
983 item.mGraphicBuffer->handle == imgHandle) {
984 break;
985 }
986 }
987 if (itemIndex == mRecordingBuffers.size()) {
988 ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
989 "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
990 return;
991 }
992
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700993 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700994 imgHandle);
995
996 res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700997 if (res != OK) {
998 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
999 "%s (%d)",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001000 __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001001 return;
1002 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001003 mRecordingBuffers.replaceAt(itemIndex);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001004
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001005 mRecordingHeapFree++;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001006}
1007
1008status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001009 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001010 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001011 status_t res;
1012 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1013
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001014 int triggerId;
1015 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001016 SharedParameters::Lock l(mParameters);
1017 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1018 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001019 }
1020
1021 mDevice->triggerAutofocus(triggerId);
1022
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001023 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001024}
1025
1026status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001027 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001028 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001029 status_t res;
1030 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1031
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001032 int triggerId;
1033 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001034 SharedParameters::Lock l(mParameters);
1035 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001036 }
1037
1038 mDevice->triggerCancelAutofocus(triggerId);
1039
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001040 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001041}
1042
1043status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001044 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001045 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001046 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001047 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001048
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001049 SharedParameters::Lock l(mParameters);
1050 switch (l.mParameters.state) {
1051 case Parameters::DISCONNECTED:
1052 case Parameters::STOPPED:
1053 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001054 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1055 __FUNCTION__, mCameraId);
1056 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001057 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001058 // Good to go for takePicture
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001059 res = commandStopFaceDetectionL(l.mParameters);
1060 if (res != OK) {
1061 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1062 __FUNCTION__, mCameraId);
1063 return res;
1064 }
1065 l.mParameters.state = Parameters::STILL_CAPTURE;
1066 break;
1067 case Parameters::RECORD:
1068 // Good to go for video snapshot
1069 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001070 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001071 case Parameters::STILL_CAPTURE:
1072 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001073 ALOGE("%s: Camera %d: Already taking a picture",
1074 __FUNCTION__, mCameraId);
1075 return INVALID_OPERATION;
1076 }
1077
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001078 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001079
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001080 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001081 if (res != OK) {
1082 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1083 __FUNCTION__, mCameraId, strerror(-res), res);
1084 return res;
1085 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001086
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001087 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001088 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001089 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001090 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001091 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001092
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001093 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001094}
1095
1096status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001097 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001098 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001099 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001100 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001101 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1102
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001103 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001104
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001105 res = l.mParameters.set(params);
1106 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001107
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001108 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001109
1110 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001111}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001112
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001113String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001114 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001115 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001116 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001117
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001118 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001119
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001120 // TODO: Deal with focus distances
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001121 return l.mParameters.paramsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001122}
1123
1124status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001125 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001126 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001127 status_t res;
1128 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001129
1130 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1131 cmd, arg1, arg2);
1132
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001133 switch (cmd) {
1134 case CAMERA_CMD_START_SMOOTH_ZOOM:
1135 return commandStartSmoothZoomL();
1136 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1137 return commandStopSmoothZoomL();
1138 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1139 return commandSetDisplayOrientationL(arg1);
1140 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1141 return commandEnableShutterSoundL(arg1 == 1);
1142 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1143 return commandPlayRecordingSoundL();
1144 case CAMERA_CMD_START_FACE_DETECTION:
1145 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001146 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001147 SharedParameters::Lock l(mParameters);
1148 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001149 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001150 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1151 return commandEnableFocusMoveMsgL(arg1 == 1);
1152 case CAMERA_CMD_PING:
1153 return commandPingL();
1154 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1155 return commandSetVideoBufferCountL(arg1);
1156 default:
1157 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1158 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001159 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001160 }
1161}
James Dong983cf232012-08-01 16:39:55 -07001162
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001163status_t Camera2Client::commandStartSmoothZoomL() {
1164 ALOGE("%s: Unimplemented!", __FUNCTION__);
1165 return OK;
1166}
James Dong983cf232012-08-01 16:39:55 -07001167
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001168status_t Camera2Client::commandStopSmoothZoomL() {
1169 ALOGE("%s: Unimplemented!", __FUNCTION__);
1170 return OK;
1171}
James Dong983cf232012-08-01 16:39:55 -07001172
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001173status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001174 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001175 mCameraFacing == CAMERA_FACING_FRONT);
1176 if (transform == -1) {
1177 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1178 __FUNCTION__, mCameraId, degrees);
1179 return BAD_VALUE;
1180 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001181 SharedParameters::Lock l(mParameters);
1182 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001183 mPreviewStreamId != NO_STREAM) {
1184 mDevice->setStreamTransform(mPreviewStreamId, transform);
1185 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001186 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001187 return OK;
1188}
1189
1190status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001191 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001192 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001193 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001194 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001195 }
1196
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001197 // Disabling shutter sound may not be allowed. In that case only
1198 // allow the mediaserver process to disable the sound.
1199 char value[PROPERTY_VALUE_MAX];
1200 property_get("ro.camera.sound.forced", value, "0");
1201 if (strncmp(value, "0", 2) != 0) {
1202 // Disabling shutter sound is not allowed. Deny if the current
1203 // process is not mediaserver.
1204 if (getCallingPid() != getpid()) {
1205 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1206 getCallingPid());
1207 return PERMISSION_DENIED;
1208 }
1209 }
1210
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001211 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001212 return OK;
1213}
1214
1215status_t Camera2Client::commandPlayRecordingSoundL() {
1216 mCameraService->playSound(CameraService::SOUND_RECORDING);
1217 return OK;
1218}
1219
1220status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001221 ALOGV("%s: Camera %d: Starting face detection",
1222 __FUNCTION__, mCameraId);
1223 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001224 SharedParameters::Lock l(mParameters);
1225 switch (l.mParameters.state) {
1226 case Parameters::DISCONNECTED:
1227 case Parameters::STOPPED:
1228 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1229 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001230 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1231 __FUNCTION__, mCameraId);
1232 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001233 case Parameters::PREVIEW:
1234 case Parameters::RECORD:
1235 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001236 // Good to go for starting face detect
1237 break;
1238 }
1239 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001240 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1241 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001242 ALOGE("%s: Camera %d: Face detection not supported",
1243 __FUNCTION__, mCameraId);
1244 return INVALID_OPERATION;
1245 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001246 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001247
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001248 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001249
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001250 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001251
1252 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001253}
1254
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001255status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001256 status_t res = OK;
1257 ALOGV("%s: Camera %d: Stopping face detection",
1258 __FUNCTION__, mCameraId);
1259
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001260 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001261
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001262 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001263
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001264 if (params.state == Parameters::PREVIEW
1265 || params.state == Parameters::RECORD
1266 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001267 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001268 }
1269
1270 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001271}
1272
1273status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001274 SharedParameters::Lock l(mParameters);
1275 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001276
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001277 return OK;
1278}
1279
1280status_t Camera2Client::commandPingL() {
1281 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001282 SharedParameters::Lock l(mParameters);
1283 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001284 return OK;
1285 } else {
1286 return NO_INIT;
1287 }
1288}
1289
1290status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001291 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001292 ALOGE("%s: Camera %d: Error setting video buffer count after "
1293 "recording was started", __FUNCTION__, mCameraId);
1294 return INVALID_OPERATION;
1295 }
1296
1297 // 32 is the current upper limit on the video buffer count for BufferQueue
1298 if (count > 32) {
1299 ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1300 __FUNCTION__, mCameraId, count);
1301 return BAD_VALUE;
1302 }
1303
1304 // Need to reallocate memory for heap
1305 if (mRecordingHeapCount != count) {
1306 if (mRecordingHeap != 0) {
1307 mRecordingHeap.clear();
1308 mRecordingHeap = NULL;
1309 }
1310 mRecordingHeapCount = count;
1311 }
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001312
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001313 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001314}
1315
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001316/** Device-related methods */
1317
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001318void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1319 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1320}
1321
1322void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1323 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1324 frameNumber, timestamp);
1325}
1326
1327void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1328 ALOGV("%s: Autofocus state now %d, last trigger %d",
1329 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001330 bool sendCompletedMessage = false;
1331 bool sendMovingMessage = false;
1332
1333 bool success = false;
1334 bool afInMotion = false;
1335 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001336 SharedParameters::Lock l(mParameters);
1337 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001338 case Parameters::FOCUS_MODE_AUTO:
1339 case Parameters::FOCUS_MODE_MACRO:
1340 // Don't send notifications upstream if they're not for the current AF
1341 // trigger. For example, if cancel was called in between, or if we
1342 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001343 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001344 switch (newState) {
1345 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1346 success = true;
1347 // no break
1348 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1349 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001350 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001351 break;
1352 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1353 // Just starting focusing, ignore
1354 break;
1355 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1356 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1357 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1358 default:
1359 // Unexpected in AUTO/MACRO mode
1360 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1361 __FUNCTION__, newState);
1362 break;
1363 }
1364 break;
1365 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1366 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1367 switch (newState) {
1368 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1369 success = true;
1370 // no break
1371 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1372 // Don't send notifications upstream if they're not for
1373 // the current AF trigger. For example, if cancel was
1374 // called in between, or if we already sent a
1375 // notification about this AF call.
1376 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001377 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001378 sendCompletedMessage = true;
1379 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001380 if (l.mParameters.enableFocusMoveMessages &&
1381 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001382 sendMovingMessage = true;
1383 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001384 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001385 break;
1386 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1387 // Cancel was called, or we switched state; care if
1388 // currently moving
1389 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001390 if (l.mParameters.enableFocusMoveMessages &&
1391 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001392 sendMovingMessage = true;
1393 }
1394 break;
1395 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1396 // Start passive scan, inform upstream
1397 afInMotion = true;
1398 // no break
1399 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1400 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001401 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001402 sendMovingMessage = true;
1403 }
1404 break;
1405 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001406 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001407 break;
1408 case Parameters::FOCUS_MODE_EDOF:
1409 case Parameters::FOCUS_MODE_INFINITY:
1410 case Parameters::FOCUS_MODE_FIXED:
1411 default:
1412 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001413 ALOGE("%s: Unexpected AF state change %d "
1414 "(ID %d) in focus mode %d",
1415 __FUNCTION__, newState, triggerId,
1416 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001417 }
1418 }
1419 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001420 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001421 SharedCameraClient::Lock l(mSharedCameraClient);
1422 if (l.mCameraClient != 0) {
1423 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001424 afInMotion ? 1 : 0, 0);
1425 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001426 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001427 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001428 SharedCameraClient::Lock l(mSharedCameraClient);
1429 if (l.mCameraClient != 0) {
1430 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1431 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001432 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001433 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001434}
1435
1436void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1437 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1438 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001439 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001440}
1441
1442void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1443 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1444 __FUNCTION__, newState, triggerId);
1445}
1446
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001447int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001448 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001449}
1450
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001451const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1452 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001453}
1454
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001455const sp<CameraService>& Camera2Client::getCameraService() {
1456 return mCameraService;
1457}
1458
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001459camera2::SharedParameters& Camera2Client::getParameters() {
1460 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001461}
1462
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001463int Camera2Client::getPreviewStreamId() const {
1464 return mPreviewStreamId;
1465}
1466
1467int Camera2Client::getCaptureStreamId() const {
1468 return mJpegProcessor->getStreamId();
1469}
1470
1471int Camera2Client::getCallbackStreamId() const {
1472 return mCallbackProcessor->getStreamId();
1473}
1474
1475int Camera2Client::getRecordingStreamId() const {
1476 return mRecordingStreamId;
1477}
1478
1479int Camera2Client::getZslStreamId() const {
1480 return mZslProcessor->getStreamId();
1481}
1482
1483status_t Camera2Client::registerFrameListener(int32_t id,
1484 wp<camera2::FrameProcessor::FilteredListener> listener) {
1485 return mFrameProcessor->registerListener(id, listener);
1486}
1487
1488status_t Camera2Client::removeFrameListener(int32_t id) {
1489 return mFrameProcessor->removeListener(id);
1490}
1491
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001492Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1493 mCameraClient(client.mCameraClient),
1494 mSharedClient(client) {
1495 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001496}
1497
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001498Camera2Client::SharedCameraClient::Lock::~Lock() {
1499 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001500}
1501
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001502Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1503 mCameraClient(client) {
1504}
1505
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001506Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1507 const sp<ICameraClient>&client) {
1508 Mutex::Autolock l(mCameraClientLock);
1509 mCameraClient = client;
1510 return *this;
1511}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001512
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001513void Camera2Client::SharedCameraClient::clear() {
1514 Mutex::Autolock l(mCameraClientLock);
1515 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001516}
1517
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001518const int32_t Camera2Client::kPreviewRequestId;
1519const int32_t Camera2Client::kRecordRequestId;
1520const int32_t Camera2Client::kFirstCaptureRequestId;
1521
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001522void Camera2Client::onRecordingFrameAvailable() {
1523 ATRACE_CALL();
1524 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001525 sp<Camera2Heap> recordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001526 size_t heapIdx = 0;
1527 nsecs_t timestamp;
1528 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001529 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001530
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001531 BufferItemConsumer::BufferItem imgBuffer;
1532 res = mRecordingConsumer->acquireBuffer(&imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001533 if (res != OK) {
1534 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1535 __FUNCTION__, mCameraId, strerror(-res), res);
1536 return;
1537 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001538 timestamp = imgBuffer.mTimestamp;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001539
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001540 mRecordingFrameCount++;
1541 ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1542
1543 // TODO: Signal errors here upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001544 if (l.mParameters.state != Parameters::RECORD &&
1545 l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001546 ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1547 "recording done",
1548 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001549 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001550 return;
1551 }
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -07001552
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001553 if (mRecordingHeap == 0) {
1554 const size_t bufferSize = 4 + sizeof(buffer_handle_t);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001555 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1556 "size %d bytes", __FUNCTION__, mCameraId,
James Dong983cf232012-08-01 16:39:55 -07001557 mRecordingHeapCount, bufferSize);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001558
James Dong983cf232012-08-01 16:39:55 -07001559 mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001560 "Camera2Client::RecordingHeap");
1561 if (mRecordingHeap->mHeap->getSize() == 0) {
1562 ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1563 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001564 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001565 return;
1566 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001567 for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
1568 if (mRecordingBuffers[i].mBuf !=
1569 BufferItemConsumer::INVALID_BUFFER_SLOT) {
1570 ALOGE("%s: Camera %d: Non-empty recording buffers list!",
1571 __FUNCTION__, mCameraId);
1572 }
1573 }
1574 mRecordingBuffers.clear();
1575 mRecordingBuffers.setCapacity(mRecordingHeapCount);
1576 mRecordingBuffers.insertAt(0, mRecordingHeapCount);
1577
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001578 mRecordingHeapHead = 0;
James Dong983cf232012-08-01 16:39:55 -07001579 mRecordingHeapFree = mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001580 }
1581
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001582 if ( mRecordingHeapFree == 0) {
1583 ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1584 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001585 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001586 return;
1587 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001588
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001589 heapIdx = mRecordingHeapHead;
James Dong983cf232012-08-01 16:39:55 -07001590 mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001591 mRecordingHeapFree--;
1592
1593 ALOGV("%s: Camera %d: Timestamp %lld",
1594 __FUNCTION__, mCameraId, timestamp);
1595
1596 ssize_t offset;
1597 size_t size;
1598 sp<IMemoryHeap> heap =
1599 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1600 &size);
1601
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001602 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1603 uint32_t type = kMetadataBufferTypeGrallocSource;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001604 *((uint32_t*)data) = type;
1605 *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001606 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001607 __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
1608 mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001609 recordingHeap = mRecordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001610 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001611
1612 // Call outside locked parameters to allow re-entrancy from notification
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001613 SharedCameraClient::Lock l(mSharedCameraClient);
1614 if (l.mCameraClient != 0) {
1615 l.mCameraClient->dataCallbackTimestamp(timestamp,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001616 CAMERA_MSG_VIDEO_FRAME,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001617 recordingHeap->mBuffers[heapIdx]);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001618 }
1619}
1620
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001621/** Utility methods */
1622
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001623status_t Camera2Client::updateRequests(const Parameters &params) {
1624 status_t res;
1625
1626 res = updatePreviewRequest(params);
1627 if (res != OK) {
1628 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1629 __FUNCTION__, mCameraId, strerror(-res), res);
1630 return res;
1631 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001632 res = updateRecordingRequest(params);
1633 if (res != OK) {
1634 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1635 __FUNCTION__, mCameraId, strerror(-res), res);
1636 return res;
1637 }
1638
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001639 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001640 res = mDevice->setStreamingRequest(mPreviewRequest);
1641 if (res != OK) {
1642 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1643 __FUNCTION__, mCameraId, strerror(-res), res);
1644 return res;
1645 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001646 } else if (params.state == Parameters::RECORD ||
1647 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001648 res = mDevice->setStreamingRequest(mRecordingRequest);
1649 if (res != OK) {
1650 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1651 __FUNCTION__, mCameraId, strerror(-res), res);
1652 return res;
1653 }
1654 }
1655 return res;
1656}
1657
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001658status_t Camera2Client::updatePreviewStream(const Parameters &params) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001659 ATRACE_CALL();
1660 status_t res;
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001661
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001662 if (mPreviewStreamId != NO_STREAM) {
1663 // Check if stream parameters have to change
1664 uint32_t currentWidth, currentHeight;
1665 res = mDevice->getStreamInfo(mPreviewStreamId,
1666 &currentWidth, &currentHeight, 0);
1667 if (res != OK) {
1668 ALOGE("%s: Camera %d: Error querying preview stream info: "
1669 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1670 return res;
1671 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001672 if (currentWidth != (uint32_t)params.previewWidth ||
1673 currentHeight != (uint32_t)params.previewHeight) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001674 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
1675 __FUNCTION__, mCameraId, currentWidth, currentHeight,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001676 params.previewWidth, params.previewHeight);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001677 res = mDevice->waitUntilDrained();
1678 if (res != OK) {
1679 ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1680 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1681 return res;
1682 }
1683 res = mDevice->deleteStream(mPreviewStreamId);
1684 if (res != OK) {
1685 ALOGE("%s: Camera %d: Unable to delete old output stream "
1686 "for preview: %s (%d)", __FUNCTION__, mCameraId,
1687 strerror(-res), res);
1688 return res;
1689 }
1690 mPreviewStreamId = NO_STREAM;
1691 }
1692 }
1693
1694 if (mPreviewStreamId == NO_STREAM) {
1695 res = mDevice->createStream(mPreviewWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001696 params.previewWidth, params.previewHeight,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001697 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1698 &mPreviewStreamId);
1699 if (res != OK) {
1700 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1701 __FUNCTION__, mCameraId, strerror(-res), res);
1702 return res;
1703 }
1704 }
1705
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001706 res = mDevice->setStreamTransform(mPreviewStreamId,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001707 params.previewTransform);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001708 if (res != OK) {
1709 ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1710 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1711 return res;
1712 }
1713
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001714 return OK;
1715}
1716
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001717status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001718 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001719 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001720 if (mPreviewRequest.entryCount() == 0) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001721 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1722 &mPreviewRequest);
1723 if (res != OK) {
1724 ALOGE("%s: Camera %d: Unable to create default preview request: "
1725 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1726 return res;
1727 }
1728 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001729
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001730 res = params.updateRequest(&mPreviewRequest);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001731 if (res != OK) {
1732 ALOGE("%s: Camera %d: Unable to update common entries of preview "
1733 "request: %s (%d)", __FUNCTION__, mCameraId,
1734 strerror(-res), res);
1735 return res;
1736 }
1737
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001738 res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1739 &kPreviewRequestId, 1);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001740
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001741 return OK;
1742}
1743
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001744status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001745 ATRACE_CALL();
1746 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001747 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001748 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
1749 &mRecordingRequest);
1750 if (res != OK) {
1751 ALOGE("%s: Camera %d: Unable to create default recording request:"
1752 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1753 return res;
1754 }
1755 }
1756
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001757 res = params.updateRequest(&mRecordingRequest);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001758 if (res != OK) {
1759 ALOGE("%s: Camera %d: Unable to update common entries of recording "
1760 "request: %s (%d)", __FUNCTION__, mCameraId,
1761 strerror(-res), res);
1762 return res;
1763 }
1764
1765 return OK;
1766}
1767
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001768status_t Camera2Client::updateRecordingStream(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001769 status_t res;
1770
1771 if (mRecordingConsumer == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001772 // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1773 // always acquire and free a buffer when the heap is full; otherwise the consumer
1774 // will have buffers in flight we'll never clear out.
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001775 mRecordingConsumer = new BufferItemConsumer(
1776 GRALLOC_USAGE_HW_VIDEO_ENCODER,
1777 mRecordingHeapCount + 1,
1778 true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001779 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
1780 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
1781 mRecordingWindow = new SurfaceTextureClient(
1782 mRecordingConsumer->getProducerInterface());
1783 // Allocate memory later, since we don't know buffer size until receipt
1784 }
1785
1786 if (mRecordingStreamId != NO_STREAM) {
1787 // Check if stream parameters have to change
1788 uint32_t currentWidth, currentHeight;
1789 res = mDevice->getStreamInfo(mRecordingStreamId,
1790 &currentWidth, &currentHeight, 0);
1791 if (res != OK) {
1792 ALOGE("%s: Camera %d: Error querying recording output stream info: "
1793 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1794 return res;
1795 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001796 if (currentWidth != (uint32_t)params.videoWidth ||
1797 currentHeight != (uint32_t)params.videoHeight) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001798 // TODO: Should wait to be sure previous recording has finished
1799 res = mDevice->deleteStream(mRecordingStreamId);
1800 if (res != OK) {
1801 ALOGE("%s: Camera %d: Unable to delete old output stream "
1802 "for recording: %s (%d)", __FUNCTION__, mCameraId,
1803 strerror(-res), res);
1804 return res;
1805 }
1806 mRecordingStreamId = NO_STREAM;
1807 }
1808 }
1809
1810 if (mRecordingStreamId == NO_STREAM) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001811 mRecordingFrameCount = 0;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001812 res = mDevice->createStream(mRecordingWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001813 params.videoWidth, params.videoHeight,
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001814 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001815 if (res != OK) {
1816 ALOGE("%s: Camera %d: Can't create output stream for recording: "
1817 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1818 return res;
1819 }
1820 }
1821
1822 return OK;
1823}
1824
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001825size_t Camera2Client::calculateBufferSize(int width, int height,
1826 int format, int stride) {
1827 switch (format) {
1828 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1829 return width * height * 2;
1830 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1831 return width * height * 3 / 2;
1832 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1833 return width * height * 2;
1834 case HAL_PIXEL_FORMAT_YV12: { // YV12
1835 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001836 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001837 size_t uvSize = uvStride * height / 2;
1838 return ySize + uvSize * 2;
1839 }
1840 case HAL_PIXEL_FORMAT_RGB_565:
1841 return width * height * 2;
1842 case HAL_PIXEL_FORMAT_RGBA_8888:
1843 return width * height * 4;
1844 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1845 return width * height * 2;
1846 default:
1847 ALOGE("%s: Unknown preview format: %x",
1848 __FUNCTION__, format);
1849 return 0;
1850 }
1851}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001852
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001853} // namespace android