blob: 7abb4055ea1e6fd153ced87b6c5316e9759b45b6 [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 Talvala7d8b92b2012-09-05 19:02:43 -0700159 mCaptureSequencer->requestExit();
160 mJpegProcessor->requestExit();
161 mZslProcessor->requestExit();
162 mCallbackProcessor->requestExit();
163
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700164 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700165}
166
167status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700168 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700169 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700170 mCameraId,
171 getCameraClient()->asBinder().get(),
172 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700173 result.append(" State: ");
174#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
175
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700176 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700177
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700178 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700179
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700180 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700181 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700182 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700183 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700184 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700185 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700186 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700187 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700188 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700189 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700190 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700191 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700192 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700193 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700194 p.jpegQuality, p.jpegThumbQuality);
195 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700196 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700197 p.gpsEnabled ? "enabled" : "disabled");
198 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700199 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700200 p.gpsCoordinates[0], p.gpsCoordinates[1],
201 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700202 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700203 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700204 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700205 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700206 }
207
208 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700209 switch (p.wbMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700210 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
211 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
212 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
213 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
214 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
215 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
216 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
217 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
218 default: result.append("UNKNOWN\n");
219 }
220
221 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700222 switch (p.effectMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700223 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
224 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
225 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
226 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
227 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
228 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
229 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
230 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
231 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
232 default: result.append("UNKNOWN\n");
233 }
234
235 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700236 switch (p.antibandingMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700237 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
238 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
239 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
240 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
241 default: result.append("UNKNOWN\n");
242 }
243
244 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700245 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700246 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
247 result.append("AUTO\n"); break;
248 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
249 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
250 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
251 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
252 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
253 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
254 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
255 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
256 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
257 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
258 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
259 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
260 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
261 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
262 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
263 default: result.append("UNKNOWN\n");
264 }
265
266 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700267 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700268 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
269 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
270 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
271 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
272 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
273 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
274 default: result.append("UNKNOWN\n");
275 }
276
277 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700278 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700279 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
280 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
281 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
282 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
283 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
284 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
285 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
286 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
287 default: result.append("UNKNOWN\n");
288 }
289
290 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700291 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700292 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700293 p.focusingAreas[i].left,
294 p.focusingAreas[i].top,
295 p.focusingAreas[i].right,
296 p.focusingAreas[i].bottom,
297 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700298 }
299
300 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700301 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700302
303 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700304 p.autoExposureLock ? "enabled" : "disabled",
305 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700306
307 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700308 for (size_t i = 0; i < p.meteringAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700309 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700310 p.meteringAreas[i].left,
311 p.meteringAreas[i].top,
312 p.meteringAreas[i].right,
313 p.meteringAreas[i].bottom,
314 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700315 }
316
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700317 result.appendFormat(" Zoom index: %d\n", p.zoom);
318 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
319 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700320
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700321 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700322 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700323
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700324 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700325 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700326
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700327 result.append(" Current streams:\n");
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700328 result.appendFormat(" Preview stream ID: %d\n",
329 getPreviewStreamId());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700330 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700331 getCaptureStreamId());
332 result.appendFormat(" Recording stream ID: %d\n",
333 getRecordingStreamId());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700334
335 result.append(" Current requests:\n");
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700336 if (mPreviewRequest.entryCount() != 0) {
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700337 result.append(" Preview request:\n");
338 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700339 mPreviewRequest.dump(fd, 2, 6);
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700340 } else {
341 result.append(" Preview request: undefined\n");
342 write(fd, result.string(), result.size());
343 }
344
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700345 if (mRecordingRequest.entryCount() != 0) {
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700346 result = " Recording request:\n";
347 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700348 mRecordingRequest.dump(fd, 2, 6);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700349 } else {
350 result = " Recording request: undefined\n";
351 write(fd, result.string(), result.size());
352 }
353
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700354 mCaptureSequencer->dump(fd, args);
355
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700356 mFrameProcessor->dump(fd, args);
357
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700358 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700359 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700360
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700361 status_t res = mDevice->dump(fd, args);
362 if (res != OK) {
363 result = String8::format(" Error dumping device: %s (%d)",
364 strerror(-res), res);
365 write(fd, result.string(), result.size());
366 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700367
368#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700369 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700370}
371
372// ICamera interface
373
374void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700375 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700376 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700377 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700378 status_t res;
379 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700380
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700381 if (mDevice == 0) return;
382
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700383 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700384
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700385 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700386 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700387 mPreviewStreamId = NO_STREAM;
388 }
389
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700390 mJpegProcessor->deleteStream();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700391
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -0700392 if (mRecordingStreamId != NO_STREAM) {
393 mDevice->deleteStream(mRecordingStreamId);
394 mRecordingStreamId = NO_STREAM;
395 }
396
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700397 mCallbackProcessor->deleteStream();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700398
Eino-Ville Talvala7d8b92b2012-09-05 19:02:43 -0700399 mZslProcessor->deleteStream();
400
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700401 mDevice.clear();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700402 SharedParameters::Lock l(mParameters);
403 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700404
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700405 CameraService::Client::disconnect();
406}
407
408status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700409 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700410 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700411 Mutex::Autolock icl(mICameraLock);
412
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700413 if (mClientPid != 0 && getCallingPid() != mClientPid) {
414 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
415 "current locked to pid %d", __FUNCTION__,
416 mCameraId, getCallingPid(), mClientPid);
417 return BAD_VALUE;
418 }
419
420 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700421
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700422 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700423 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700424
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700425 SharedParameters::Lock l(mParameters);
426 l.mParameters.state = Parameters::STOPPED;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700427
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700428 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700429}
430
431status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700432 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700433 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700434 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700435 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
436 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700437
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700438 if (mClientPid == 0) {
439 mClientPid = getCallingPid();
440 return OK;
441 }
442
443 if (mClientPid != getCallingPid()) {
444 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
445 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
446 return EBUSY;
447 }
448
449 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700450}
451
452status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700453 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700454 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700455 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700456 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
457 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700458
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700459 // TODO: Check for uninterruptable conditions
460
461 if (mClientPid == getCallingPid()) {
462 mClientPid = 0;
463 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700464 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700465 return OK;
466 }
467
468 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
469 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
470 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700471}
472
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700473status_t Camera2Client::setPreviewDisplay(
474 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700475 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700476 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700477 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700478 status_t res;
479 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700480
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700481 sp<IBinder> binder;
482 sp<ANativeWindow> window;
483 if (surface != 0) {
484 binder = surface->asBinder();
485 window = surface;
486 }
487
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700488 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700489}
490
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700491status_t Camera2Client::setPreviewTexture(
492 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700493 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700494 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700495 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700496 status_t res;
497 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700498
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700499 sp<IBinder> binder;
500 sp<ANativeWindow> window;
501 if (surfaceTexture != 0) {
502 binder = surfaceTexture->asBinder();
503 window = new SurfaceTextureClient(surfaceTexture);
504 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700505 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700506}
507
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700508status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700509 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700510 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700511 status_t res;
512
513 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700514 ALOGV("%s: Camera %d: New window is same as old window",
515 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700516 return NO_ERROR;
517 }
518
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700519 SharedParameters::Lock l(mParameters);
520 switch (l.mParameters.state) {
521 case Parameters::DISCONNECTED:
522 case Parameters::RECORD:
523 case Parameters::STILL_CAPTURE:
524 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700525 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700526 __FUNCTION__, mCameraId,
527 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700528 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700529 case Parameters::STOPPED:
530 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700531 // OK
532 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700533 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700534 // Already running preview - need to stop and create a new stream
535 // TODO: Optimize this so that we don't wait for old stream to drain
536 // before spinning up new stream
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700537 mDevice->clearStreamingRequest();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700538 l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700539 break;
540 }
541
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700542 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700543 res = mDevice->waitUntilDrained();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700544 if (res != OK) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700545 ALOGE("%s: Error waiting for preview to drain: %s (%d)",
546 __FUNCTION__, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700547 return res;
548 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700549 res = mDevice->deleteStream(mPreviewStreamId);
550 if (res != OK) {
551 ALOGE("%s: Unable to delete old preview stream: %s (%d)",
552 __FUNCTION__, strerror(-res), res);
553 return res;
554 }
555 mPreviewStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700556 }
557
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700558 mPreviewSurface = binder;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700559 mPreviewWindow = window;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700560
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700561 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
562 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700563 }
564
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700565 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700566}
567
568void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700569 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700570 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700571 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700572 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700573 if ( checkPid(__FUNCTION__) != OK) return;
574
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700575 SharedParameters::Lock l(mParameters);
576 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700577}
578
579void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
580 status_t res = OK;
581 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
582 ALOGV("%s: setting oneshot", __FUNCTION__);
583 params.previewCallbackOneShot = true;
584 }
585 if (params.previewCallbackFlags != (uint32_t)flag) {
586 params.previewCallbackFlags = flag;
587 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700588 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700589 res = startPreviewL(params, true);
590 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700591 case Parameters::RECORD:
592 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700593 res = startRecordingL(params, true);
594 break;
595 default:
596 break;
597 }
598 if (res != OK) {
599 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700600 __FUNCTION__, mCameraId,
601 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700602 }
603 }
604
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700605}
606
607status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700608 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700609 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700610 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700611 status_t res;
612 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700613 SharedParameters::Lock l(mParameters);
614 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700615}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700616
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700617status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700618 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700619 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700620 if (params.state >= Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700621 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700622 __FUNCTION__,
623 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700624 return INVALID_OPERATION;
625 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700626
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700627 if (mPreviewWindow == 0) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700628 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700629 return OK;
630 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700631 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700632
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700633 res = updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700634 if (res != OK) {
635 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
636 __FUNCTION__, mCameraId, strerror(-res), res);
637 return res;
638 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700639 bool callbacksEnabled = params.previewCallbackFlags &
640 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
641 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700642 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700643 if (res != OK) {
644 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
645 __FUNCTION__, mCameraId, strerror(-res), res);
646 return res;
647 }
648 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700649 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700650 res = mZslProcessor->updateStream(params);
651 if (res != OK) {
652 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
653 __FUNCTION__, mCameraId, strerror(-res), res);
654 return res;
655 }
656 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700657
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700658 CameraMetadata *request;
659 if (!params.recordingHint) {
660 if (mPreviewRequest.entryCount() == 0) {
661 res = updatePreviewRequest(params);
662 if (res != OK) {
663 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
664 __FUNCTION__, mCameraId, strerror(-res), res);
665 return res;
666 }
667 }
668 request = &mPreviewRequest;
669 } else {
670 // With recording hint set, we're going to be operating under the
671 // assumption that the user will record video. To optimize recording
672 // startup time, create the necessary output streams for recording and
673 // video snapshot now if they don't already exist.
674 if (mRecordingRequest.entryCount() == 0) {
675 res = updateRecordingRequest(params);
676 if (res != OK) {
677 ALOGE("%s: Camera %d: Unable to create recording preview "
678 "request: %s (%d)",
679 __FUNCTION__, mCameraId, strerror(-res), res);
680 return res;
681 }
682 }
683 request = &mRecordingRequest;
684
685 res = updateRecordingStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700686 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700687 ALOGE("%s: Camera %d: Unable to pre-configure recording "
688 "stream: %s (%d)",
689 __FUNCTION__, mCameraId, strerror(-res), res);
690 return res;
691 }
692
693 res = mJpegProcessor->updateStream(params);
694 if (res != OK) {
695 ALOGE("%s: Camera %d: Can't pre-configure still image "
696 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700697 __FUNCTION__, mCameraId, strerror(-res), res);
698 return res;
699 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700700 }
701
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700702 Vector<uint8_t> outputStreams;
703 outputStreams.push(getPreviewStreamId());
704
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700705 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700706 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700707 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700708 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700709 outputStreams.push(getZslStreamId());
710 }
711
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700712 res = request->update(
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700713 ANDROID_REQUEST_OUTPUT_STREAMS,
714 outputStreams);
715
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700716 if (res != OK) {
717 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
718 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700719 return res;
720 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700721 res = request->sort();
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700722 if (res != OK) {
723 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
724 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700725 return res;
726 }
727
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700728 res = mDevice->setStreamingRequest(*request);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700729 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700730 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
731 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700732 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700733 return res;
734 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700735 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700736
737 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700738}
739
740void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700741 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700742 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700743 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700744 status_t res;
745 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700746 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700747}
748
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700749void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700750 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700751 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700752 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700753 SharedParameters::Lock l(mParameters);
754 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700755 }
756
757 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700758 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700759 ALOGE("%s: Camera %d: Call before initialized",
760 __FUNCTION__, mCameraId);
761 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700762 case Parameters::STOPPED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700763 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700764 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700765 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
766 __FUNCTION__, mCameraId);
767 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700768 case Parameters::RECORD:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700769 // no break - identical to preview
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700770 case Parameters::PREVIEW:
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700771 mDevice->clearStreamingRequest();
Eino-Ville Talvala22671062012-07-20 18:30:37 -0700772 mDevice->waitUntilDrained();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700773 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700774 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
775 SharedParameters::Lock l(mParameters);
776 l.mParameters.state = Parameters::STOPPED;
777 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700778 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700779 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700780 default:
781 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700782 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700783 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700784}
785
786bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700787 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700788 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700789 status_t res;
790 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
791
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700792 SharedParameters::Lock l(mParameters);
793 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700794}
795
796status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700797 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700798 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700799 status_t res;
800 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
801
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700802 SharedParameters::Lock l(mParameters);
803 switch (l.mParameters.state) {
804 case Parameters::RECORD:
805 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700806 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700807 __FUNCTION__, mCameraId,
808 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700809 return INVALID_OPERATION;
810 default:
811 // OK
812 break;
813 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700814
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700815 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700816
817 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700818}
819
820status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700821 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700822 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700823 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700824 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700825 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700826 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700827
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700828 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700829}
830
831status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
832 status_t res;
833 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700834 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700835 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700836 if (res != OK) return res;
837 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700838 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700839 // Ready to go
840 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700841 case Parameters::RECORD:
842 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700843 // OK to call this when recording is already on, just skip unless
844 // we're looking to restart
845 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700846 break;
847 default:
848 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700849 __FUNCTION__, mCameraId,
850 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700851 return INVALID_OPERATION;
852 };
853
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700854 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700855 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
856 "non-metadata recording mode requested!", __FUNCTION__,
857 mCameraId);
858 return INVALID_OPERATION;
859 }
860
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700861 mCameraService->playSound(CameraService::SOUND_RECORDING);
862
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700863 res = updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700864 if (res != OK) {
865 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
866 __FUNCTION__, mCameraId, strerror(-res), res);
867 return res;
868 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700869 bool callbacksEnabled = params.previewCallbackFlags &
870 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
871 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700872 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700873 if (res != OK) {
874 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
875 __FUNCTION__, mCameraId, strerror(-res), res);
876 return res;
877 }
878 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700879
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700880 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700881 res = updateRecordingRequest(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700882 if (res != OK) {
883 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
884 __FUNCTION__, mCameraId, strerror(-res), res);
885 return res;
886 }
887 }
888
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700889 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700890 uint8_t outputStreams[3] ={
891 getPreviewStreamId(),
892 getRecordingStreamId(),
893 getCallbackStreamId()
894 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700895 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700896 ANDROID_REQUEST_OUTPUT_STREAMS,
897 outputStreams, 3);
898 } else {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700899 uint8_t outputStreams[2] = {
900 getPreviewStreamId(),
901 getRecordingStreamId()
902 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700903 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700904 ANDROID_REQUEST_OUTPUT_STREAMS,
905 outputStreams, 2);
906 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700907 if (res != OK) {
908 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
909 __FUNCTION__, mCameraId, strerror(-res), res);
910 return res;
911 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700912 res = mRecordingRequest.sort();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700913 if (res != OK) {
914 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
915 __FUNCTION__, mCameraId, strerror(-res), res);
916 return res;
917 }
918
919 res = mDevice->setStreamingRequest(mRecordingRequest);
920 if (res != OK) {
921 ALOGE("%s: Camera %d: Unable to set recording request to start "
922 "recording: %s (%d)", __FUNCTION__, mCameraId,
923 strerror(-res), res);
924 return res;
925 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700926 if (params.state < Parameters::RECORD) {
927 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700928 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700929
930 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700931}
932
933void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700934 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700935 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700936 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700937 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700938
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700939 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700940 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
941
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700942 switch (l.mParameters.state) {
943 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700944 // OK to stop
945 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700946 case Parameters::STOPPED:
947 case Parameters::PREVIEW:
948 case Parameters::STILL_CAPTURE:
949 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700950 default:
951 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700952 __FUNCTION__, mCameraId,
953 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700954 return;
955 };
956
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700957 mCameraService->playSound(CameraService::SOUND_RECORDING);
958
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700959 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700960 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700961 ALOGE("%s: Camera %d: Unable to return to preview",
962 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700963 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700964}
965
966bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700967 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700968 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700969
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700970 if ( checkPid(__FUNCTION__) != OK) return false;
971
James Dong8da4cd72012-08-04 19:58:07 -0700972 return recordingEnabledL();
973}
974
975bool Camera2Client::recordingEnabledL() {
976 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700977 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700978
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700979 return (l.mParameters.state == Parameters::RECORD
980 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700981}
982
983void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700984 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700985 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700986 status_t res;
987 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700988
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700989 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700990
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700991 // Make sure this is for the current heap
992 ssize_t offset;
993 size_t size;
994 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
995 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
996 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
997 "(got %x, expected %x)", __FUNCTION__, mCameraId,
998 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
999 return;
1000 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001001 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1002 uint32_t type = *(uint32_t*)data;
1003 if (type != kMetadataBufferTypeGrallocSource) {
1004 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
1005 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
1006 return;
1007 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001008
1009 // Release the buffer back to the recording queue
1010
1011 buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
1012
1013 size_t itemIndex;
1014 for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
1015 const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
1016 if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
1017 item.mGraphicBuffer->handle == imgHandle) {
1018 break;
1019 }
1020 }
1021 if (itemIndex == mRecordingBuffers.size()) {
1022 ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
1023 "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
1024 return;
1025 }
1026
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001027 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001028 imgHandle);
1029
1030 res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001031 if (res != OK) {
1032 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
1033 "%s (%d)",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001034 __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001035 return;
1036 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001037 mRecordingBuffers.replaceAt(itemIndex);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001038
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001039 mRecordingHeapFree++;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001040}
1041
1042status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001043 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001044 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001045 status_t res;
1046 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1047
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001048 int triggerId;
1049 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001050 SharedParameters::Lock l(mParameters);
1051 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1052 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001053 }
1054
1055 mDevice->triggerAutofocus(triggerId);
1056
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001057 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001058}
1059
1060status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001061 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001062 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001063 status_t res;
1064 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1065
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001066 int triggerId;
1067 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001068 SharedParameters::Lock l(mParameters);
1069 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001070 }
1071
1072 mDevice->triggerCancelAutofocus(triggerId);
1073
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001074 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001075}
1076
1077status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001078 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001079 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001080 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001081 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001082
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001083 SharedParameters::Lock l(mParameters);
1084 switch (l.mParameters.state) {
1085 case Parameters::DISCONNECTED:
1086 case Parameters::STOPPED:
1087 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001088 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1089 __FUNCTION__, mCameraId);
1090 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001091 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001092 // Good to go for takePicture
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001093 res = commandStopFaceDetectionL(l.mParameters);
1094 if (res != OK) {
1095 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1096 __FUNCTION__, mCameraId);
1097 return res;
1098 }
1099 l.mParameters.state = Parameters::STILL_CAPTURE;
1100 break;
1101 case Parameters::RECORD:
1102 // Good to go for video snapshot
1103 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001104 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001105 case Parameters::STILL_CAPTURE:
1106 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001107 ALOGE("%s: Camera %d: Already taking a picture",
1108 __FUNCTION__, mCameraId);
1109 return INVALID_OPERATION;
1110 }
1111
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001112 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001113
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001114 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001115 if (res != OK) {
1116 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1117 __FUNCTION__, mCameraId, strerror(-res), res);
1118 return res;
1119 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001120
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001121 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001122 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001123 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001124 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001125 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001126
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001127 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001128}
1129
1130status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001131 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001132 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001133 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001134 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001135 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1136
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001137 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001138
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001139 res = l.mParameters.set(params);
1140 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001141
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001142 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001143
1144 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001145}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001146
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001147String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001148 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001149 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001150 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001151
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001152 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001153
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001154 // TODO: Deal with focus distances
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001155 return l.mParameters.paramsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001156}
1157
1158status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001159 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001160 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001161 status_t res;
1162 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001163
1164 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1165 cmd, arg1, arg2);
1166
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001167 switch (cmd) {
1168 case CAMERA_CMD_START_SMOOTH_ZOOM:
1169 return commandStartSmoothZoomL();
1170 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1171 return commandStopSmoothZoomL();
1172 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1173 return commandSetDisplayOrientationL(arg1);
1174 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1175 return commandEnableShutterSoundL(arg1 == 1);
1176 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1177 return commandPlayRecordingSoundL();
1178 case CAMERA_CMD_START_FACE_DETECTION:
1179 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001180 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001181 SharedParameters::Lock l(mParameters);
1182 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001183 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001184 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1185 return commandEnableFocusMoveMsgL(arg1 == 1);
1186 case CAMERA_CMD_PING:
1187 return commandPingL();
1188 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1189 return commandSetVideoBufferCountL(arg1);
1190 default:
1191 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1192 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001193 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001194 }
1195}
James Dong983cf232012-08-01 16:39:55 -07001196
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001197status_t Camera2Client::commandStartSmoothZoomL() {
1198 ALOGE("%s: Unimplemented!", __FUNCTION__);
1199 return OK;
1200}
James Dong983cf232012-08-01 16:39:55 -07001201
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001202status_t Camera2Client::commandStopSmoothZoomL() {
1203 ALOGE("%s: Unimplemented!", __FUNCTION__);
1204 return OK;
1205}
James Dong983cf232012-08-01 16:39:55 -07001206
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001207status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001208 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001209 mCameraFacing == CAMERA_FACING_FRONT);
1210 if (transform == -1) {
1211 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1212 __FUNCTION__, mCameraId, degrees);
1213 return BAD_VALUE;
1214 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001215 SharedParameters::Lock l(mParameters);
1216 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001217 mPreviewStreamId != NO_STREAM) {
1218 mDevice->setStreamTransform(mPreviewStreamId, transform);
1219 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001220 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001221 return OK;
1222}
1223
1224status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001225 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001226 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001227 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001228 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001229 }
1230
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001231 // Disabling shutter sound may not be allowed. In that case only
1232 // allow the mediaserver process to disable the sound.
1233 char value[PROPERTY_VALUE_MAX];
1234 property_get("ro.camera.sound.forced", value, "0");
1235 if (strncmp(value, "0", 2) != 0) {
1236 // Disabling shutter sound is not allowed. Deny if the current
1237 // process is not mediaserver.
1238 if (getCallingPid() != getpid()) {
1239 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1240 getCallingPid());
1241 return PERMISSION_DENIED;
1242 }
1243 }
1244
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001245 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001246 return OK;
1247}
1248
1249status_t Camera2Client::commandPlayRecordingSoundL() {
1250 mCameraService->playSound(CameraService::SOUND_RECORDING);
1251 return OK;
1252}
1253
1254status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001255 ALOGV("%s: Camera %d: Starting face detection",
1256 __FUNCTION__, mCameraId);
1257 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001258 SharedParameters::Lock l(mParameters);
1259 switch (l.mParameters.state) {
1260 case Parameters::DISCONNECTED:
1261 case Parameters::STOPPED:
1262 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1263 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001264 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1265 __FUNCTION__, mCameraId);
1266 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001267 case Parameters::PREVIEW:
1268 case Parameters::RECORD:
1269 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001270 // Good to go for starting face detect
1271 break;
1272 }
1273 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001274 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1275 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001276 ALOGE("%s: Camera %d: Face detection not supported",
1277 __FUNCTION__, mCameraId);
1278 return INVALID_OPERATION;
1279 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001280 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001281
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001282 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001283
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001284 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001285
1286 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001287}
1288
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001289status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001290 status_t res = OK;
1291 ALOGV("%s: Camera %d: Stopping face detection",
1292 __FUNCTION__, mCameraId);
1293
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001294 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001295
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001296 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001297
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001298 if (params.state == Parameters::PREVIEW
1299 || params.state == Parameters::RECORD
1300 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001301 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001302 }
1303
1304 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001305}
1306
1307status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001308 SharedParameters::Lock l(mParameters);
1309 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001310
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001311 return OK;
1312}
1313
1314status_t Camera2Client::commandPingL() {
1315 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001316 SharedParameters::Lock l(mParameters);
1317 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001318 return OK;
1319 } else {
1320 return NO_INIT;
1321 }
1322}
1323
1324status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001325 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001326 ALOGE("%s: Camera %d: Error setting video buffer count after "
1327 "recording was started", __FUNCTION__, mCameraId);
1328 return INVALID_OPERATION;
1329 }
1330
1331 // 32 is the current upper limit on the video buffer count for BufferQueue
1332 if (count > 32) {
1333 ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1334 __FUNCTION__, mCameraId, count);
1335 return BAD_VALUE;
1336 }
1337
1338 // Need to reallocate memory for heap
1339 if (mRecordingHeapCount != count) {
1340 if (mRecordingHeap != 0) {
1341 mRecordingHeap.clear();
1342 mRecordingHeap = NULL;
1343 }
1344 mRecordingHeapCount = count;
1345 }
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001346
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001347 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001348}
1349
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001350/** Device-related methods */
1351
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001352void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1353 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1354}
1355
1356void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1357 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1358 frameNumber, timestamp);
1359}
1360
1361void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1362 ALOGV("%s: Autofocus state now %d, last trigger %d",
1363 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001364 bool sendCompletedMessage = false;
1365 bool sendMovingMessage = false;
1366
1367 bool success = false;
1368 bool afInMotion = false;
1369 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001370 SharedParameters::Lock l(mParameters);
1371 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001372 case Parameters::FOCUS_MODE_AUTO:
1373 case Parameters::FOCUS_MODE_MACRO:
1374 // Don't send notifications upstream if they're not for the current AF
1375 // trigger. For example, if cancel was called in between, or if we
1376 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001377 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001378 switch (newState) {
1379 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1380 success = true;
1381 // no break
1382 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1383 sendCompletedMessage = true;
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_ACTIVE_SCAN:
1387 // Just starting focusing, ignore
1388 break;
1389 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1390 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1391 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1392 default:
1393 // Unexpected in AUTO/MACRO mode
1394 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1395 __FUNCTION__, newState);
1396 break;
1397 }
1398 break;
1399 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1400 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1401 switch (newState) {
1402 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1403 success = true;
1404 // no break
1405 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1406 // Don't send notifications upstream if they're not for
1407 // the current AF trigger. For example, if cancel was
1408 // called in between, or if we already sent a
1409 // notification about this AF call.
1410 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001411 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001412 sendCompletedMessage = true;
1413 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001414 if (l.mParameters.enableFocusMoveMessages &&
1415 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001416 sendMovingMessage = true;
1417 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001418 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001419 break;
1420 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1421 // Cancel was called, or we switched state; care if
1422 // currently moving
1423 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001424 if (l.mParameters.enableFocusMoveMessages &&
1425 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001426 sendMovingMessage = true;
1427 }
1428 break;
1429 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1430 // Start passive scan, inform upstream
1431 afInMotion = true;
1432 // no break
1433 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1434 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001435 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001436 sendMovingMessage = true;
1437 }
1438 break;
1439 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001440 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001441 break;
1442 case Parameters::FOCUS_MODE_EDOF:
1443 case Parameters::FOCUS_MODE_INFINITY:
1444 case Parameters::FOCUS_MODE_FIXED:
1445 default:
1446 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001447 ALOGE("%s: Unexpected AF state change %d "
1448 "(ID %d) in focus mode %d",
1449 __FUNCTION__, newState, triggerId,
1450 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001451 }
1452 }
1453 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001454 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001455 SharedCameraClient::Lock l(mSharedCameraClient);
1456 if (l.mCameraClient != 0) {
1457 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001458 afInMotion ? 1 : 0, 0);
1459 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001460 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001461 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001462 SharedCameraClient::Lock l(mSharedCameraClient);
1463 if (l.mCameraClient != 0) {
1464 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1465 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001466 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001467 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001468}
1469
1470void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1471 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1472 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001473 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001474}
1475
1476void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1477 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1478 __FUNCTION__, newState, triggerId);
1479}
1480
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001481int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001482 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001483}
1484
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001485const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1486 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001487}
1488
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001489const sp<CameraService>& Camera2Client::getCameraService() {
1490 return mCameraService;
1491}
1492
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001493camera2::SharedParameters& Camera2Client::getParameters() {
1494 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001495}
1496
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001497int Camera2Client::getPreviewStreamId() const {
1498 return mPreviewStreamId;
1499}
1500
1501int Camera2Client::getCaptureStreamId() const {
1502 return mJpegProcessor->getStreamId();
1503}
1504
1505int Camera2Client::getCallbackStreamId() const {
1506 return mCallbackProcessor->getStreamId();
1507}
1508
1509int Camera2Client::getRecordingStreamId() const {
1510 return mRecordingStreamId;
1511}
1512
1513int Camera2Client::getZslStreamId() const {
1514 return mZslProcessor->getStreamId();
1515}
1516
1517status_t Camera2Client::registerFrameListener(int32_t id,
1518 wp<camera2::FrameProcessor::FilteredListener> listener) {
1519 return mFrameProcessor->registerListener(id, listener);
1520}
1521
1522status_t Camera2Client::removeFrameListener(int32_t id) {
1523 return mFrameProcessor->removeListener(id);
1524}
1525
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001526Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1527 mCameraClient(client.mCameraClient),
1528 mSharedClient(client) {
1529 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001530}
1531
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001532Camera2Client::SharedCameraClient::Lock::~Lock() {
1533 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001534}
1535
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001536Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1537 mCameraClient(client) {
1538}
1539
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001540Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1541 const sp<ICameraClient>&client) {
1542 Mutex::Autolock l(mCameraClientLock);
1543 mCameraClient = client;
1544 return *this;
1545}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001546
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001547void Camera2Client::SharedCameraClient::clear() {
1548 Mutex::Autolock l(mCameraClientLock);
1549 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001550}
1551
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001552const int32_t Camera2Client::kPreviewRequestId;
1553const int32_t Camera2Client::kRecordRequestId;
1554const int32_t Camera2Client::kFirstCaptureRequestId;
1555
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001556void Camera2Client::onRecordingFrameAvailable() {
1557 ATRACE_CALL();
1558 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001559 sp<Camera2Heap> recordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001560 size_t heapIdx = 0;
1561 nsecs_t timestamp;
1562 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001563 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001564
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001565 BufferItemConsumer::BufferItem imgBuffer;
1566 res = mRecordingConsumer->acquireBuffer(&imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001567 if (res != OK) {
1568 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1569 __FUNCTION__, mCameraId, strerror(-res), res);
1570 return;
1571 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001572 timestamp = imgBuffer.mTimestamp;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001573
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001574 mRecordingFrameCount++;
1575 ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1576
1577 // TODO: Signal errors here upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001578 if (l.mParameters.state != Parameters::RECORD &&
1579 l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001580 ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1581 "recording done",
1582 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001583 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001584 return;
1585 }
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -07001586
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001587 if (mRecordingHeap == 0) {
1588 const size_t bufferSize = 4 + sizeof(buffer_handle_t);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001589 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1590 "size %d bytes", __FUNCTION__, mCameraId,
James Dong983cf232012-08-01 16:39:55 -07001591 mRecordingHeapCount, bufferSize);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001592
James Dong983cf232012-08-01 16:39:55 -07001593 mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001594 "Camera2Client::RecordingHeap");
1595 if (mRecordingHeap->mHeap->getSize() == 0) {
1596 ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1597 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001598 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001599 return;
1600 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001601 for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
1602 if (mRecordingBuffers[i].mBuf !=
1603 BufferItemConsumer::INVALID_BUFFER_SLOT) {
1604 ALOGE("%s: Camera %d: Non-empty recording buffers list!",
1605 __FUNCTION__, mCameraId);
1606 }
1607 }
1608 mRecordingBuffers.clear();
1609 mRecordingBuffers.setCapacity(mRecordingHeapCount);
1610 mRecordingBuffers.insertAt(0, mRecordingHeapCount);
1611
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001612 mRecordingHeapHead = 0;
James Dong983cf232012-08-01 16:39:55 -07001613 mRecordingHeapFree = mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001614 }
1615
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001616 if ( mRecordingHeapFree == 0) {
1617 ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1618 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001619 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001620 return;
1621 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001622
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001623 heapIdx = mRecordingHeapHead;
James Dong983cf232012-08-01 16:39:55 -07001624 mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001625 mRecordingHeapFree--;
1626
1627 ALOGV("%s: Camera %d: Timestamp %lld",
1628 __FUNCTION__, mCameraId, timestamp);
1629
1630 ssize_t offset;
1631 size_t size;
1632 sp<IMemoryHeap> heap =
1633 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1634 &size);
1635
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001636 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1637 uint32_t type = kMetadataBufferTypeGrallocSource;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001638 *((uint32_t*)data) = type;
1639 *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001640 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001641 __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
1642 mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001643 recordingHeap = mRecordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001644 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001645
1646 // Call outside locked parameters to allow re-entrancy from notification
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001647 SharedCameraClient::Lock l(mSharedCameraClient);
1648 if (l.mCameraClient != 0) {
1649 l.mCameraClient->dataCallbackTimestamp(timestamp,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001650 CAMERA_MSG_VIDEO_FRAME,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001651 recordingHeap->mBuffers[heapIdx]);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001652 }
1653}
1654
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001655/** Utility methods */
1656
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001657status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001658 status_t res;
1659
1660 res = updatePreviewRequest(params);
1661 if (res != OK) {
1662 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1663 __FUNCTION__, mCameraId, strerror(-res), res);
1664 return res;
1665 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001666 res = updateRecordingRequest(params);
1667 if (res != OK) {
1668 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1669 __FUNCTION__, mCameraId, strerror(-res), res);
1670 return res;
1671 }
1672
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001673 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001674 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001675 if (res != OK) {
1676 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1677 __FUNCTION__, mCameraId, strerror(-res), res);
1678 return res;
1679 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001680 } else if (params.state == Parameters::RECORD ||
1681 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001682 res = mDevice->setStreamingRequest(mRecordingRequest);
1683 if (res != OK) {
1684 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1685 __FUNCTION__, mCameraId, strerror(-res), res);
1686 return res;
1687 }
1688 }
1689 return res;
1690}
1691
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001692status_t Camera2Client::updatePreviewStream(const Parameters &params) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001693 ATRACE_CALL();
1694 status_t res;
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001695
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001696 if (mPreviewStreamId != NO_STREAM) {
1697 // Check if stream parameters have to change
1698 uint32_t currentWidth, currentHeight;
1699 res = mDevice->getStreamInfo(mPreviewStreamId,
1700 &currentWidth, &currentHeight, 0);
1701 if (res != OK) {
1702 ALOGE("%s: Camera %d: Error querying preview stream info: "
1703 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1704 return res;
1705 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001706 if (currentWidth != (uint32_t)params.previewWidth ||
1707 currentHeight != (uint32_t)params.previewHeight) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001708 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
1709 __FUNCTION__, mCameraId, currentWidth, currentHeight,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001710 params.previewWidth, params.previewHeight);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001711 res = mDevice->waitUntilDrained();
1712 if (res != OK) {
1713 ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1714 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1715 return res;
1716 }
1717 res = mDevice->deleteStream(mPreviewStreamId);
1718 if (res != OK) {
1719 ALOGE("%s: Camera %d: Unable to delete old output stream "
1720 "for preview: %s (%d)", __FUNCTION__, mCameraId,
1721 strerror(-res), res);
1722 return res;
1723 }
1724 mPreviewStreamId = NO_STREAM;
1725 }
1726 }
1727
1728 if (mPreviewStreamId == NO_STREAM) {
1729 res = mDevice->createStream(mPreviewWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001730 params.previewWidth, params.previewHeight,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001731 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1732 &mPreviewStreamId);
1733 if (res != OK) {
1734 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1735 __FUNCTION__, mCameraId, strerror(-res), res);
1736 return res;
1737 }
1738 }
1739
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001740 res = mDevice->setStreamTransform(mPreviewStreamId,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001741 params.previewTransform);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001742 if (res != OK) {
1743 ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1744 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1745 return res;
1746 }
1747
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001748 return OK;
1749}
1750
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001751status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001752 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001753 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001754 if (mPreviewRequest.entryCount() == 0) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001755 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1756 &mPreviewRequest);
1757 if (res != OK) {
1758 ALOGE("%s: Camera %d: Unable to create default preview request: "
1759 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1760 return res;
1761 }
1762 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001763
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001764 res = params.updateRequest(&mPreviewRequest);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001765 if (res != OK) {
1766 ALOGE("%s: Camera %d: Unable to update common entries of preview "
1767 "request: %s (%d)", __FUNCTION__, mCameraId,
1768 strerror(-res), res);
1769 return res;
1770 }
1771
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001772 res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1773 &kPreviewRequestId, 1);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001774
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001775 return OK;
1776}
1777
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001778status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001779 ATRACE_CALL();
1780 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001781 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001782 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
1783 &mRecordingRequest);
1784 if (res != OK) {
1785 ALOGE("%s: Camera %d: Unable to create default recording request:"
1786 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1787 return res;
1788 }
1789 }
1790
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001791 res = params.updateRequest(&mRecordingRequest);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001792 if (res != OK) {
1793 ALOGE("%s: Camera %d: Unable to update common entries of recording "
1794 "request: %s (%d)", __FUNCTION__, mCameraId,
1795 strerror(-res), res);
1796 return res;
1797 }
1798
1799 return OK;
1800}
1801
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001802status_t Camera2Client::updateRecordingStream(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001803 status_t res;
1804
1805 if (mRecordingConsumer == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001806 // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1807 // always acquire and free a buffer when the heap is full; otherwise the consumer
1808 // will have buffers in flight we'll never clear out.
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001809 mRecordingConsumer = new BufferItemConsumer(
1810 GRALLOC_USAGE_HW_VIDEO_ENCODER,
1811 mRecordingHeapCount + 1,
1812 true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001813 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
1814 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
1815 mRecordingWindow = new SurfaceTextureClient(
1816 mRecordingConsumer->getProducerInterface());
1817 // Allocate memory later, since we don't know buffer size until receipt
1818 }
1819
1820 if (mRecordingStreamId != NO_STREAM) {
1821 // Check if stream parameters have to change
1822 uint32_t currentWidth, currentHeight;
1823 res = mDevice->getStreamInfo(mRecordingStreamId,
1824 &currentWidth, &currentHeight, 0);
1825 if (res != OK) {
1826 ALOGE("%s: Camera %d: Error querying recording output stream info: "
1827 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1828 return res;
1829 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001830 if (currentWidth != (uint32_t)params.videoWidth ||
1831 currentHeight != (uint32_t)params.videoHeight) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001832 // TODO: Should wait to be sure previous recording has finished
1833 res = mDevice->deleteStream(mRecordingStreamId);
1834 if (res != OK) {
1835 ALOGE("%s: Camera %d: Unable to delete old output stream "
1836 "for recording: %s (%d)", __FUNCTION__, mCameraId,
1837 strerror(-res), res);
1838 return res;
1839 }
1840 mRecordingStreamId = NO_STREAM;
1841 }
1842 }
1843
1844 if (mRecordingStreamId == NO_STREAM) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001845 mRecordingFrameCount = 0;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001846 res = mDevice->createStream(mRecordingWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001847 params.videoWidth, params.videoHeight,
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001848 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001849 if (res != OK) {
1850 ALOGE("%s: Camera %d: Can't create output stream for recording: "
1851 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1852 return res;
1853 }
1854 }
1855
1856 return OK;
1857}
1858
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001859size_t Camera2Client::calculateBufferSize(int width, int height,
1860 int format, int stride) {
1861 switch (format) {
1862 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1863 return width * height * 2;
1864 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1865 return width * height * 3 / 2;
1866 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1867 return width * height * 2;
1868 case HAL_PIXEL_FORMAT_YV12: { // YV12
1869 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001870 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001871 size_t uvSize = uvStride * height / 2;
1872 return ySize + uvSize * 2;
1873 }
1874 case HAL_PIXEL_FORMAT_RGB_565:
1875 return width * height * 2;
1876 case HAL_PIXEL_FORMAT_RGBA_8888:
1877 return width * height * 4;
1878 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1879 return width * height * 2;
1880 default:
1881 ALOGE("%s: Unknown preview format: %x",
1882 __FUNCTION__, format);
1883 return 0;
1884 }
1885}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001886
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001887} // namespace android