blob: d315abbd98eb725861f78ebc08b224efb62b4792 [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Eino-Ville Talvala852c3812012-09-24 09:46:53 -070017#define LOG_TAG "Camera2"
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070018#define ATRACE_TAG ATRACE_TAG_CAMERA
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070019//#define LOG_NDEBUG 0
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070020
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070021#include <utils/Log.h>
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070022#include <utils/Trace.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070023
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
Eino-Ville Talvala78822d72012-07-18 17:52:18 -070027#include <media/hardware/MetadataBufferType.h>
James Painterc3dbf1a2012-09-05 18:02:32 -070028#include "camera2/Parameters.h"
James Painterfe140e82012-09-07 16:36:50 -070029#include "Camera2Client.h"
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030
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 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070035using namespace camera2;
36
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070037static int getCallingPid() {
38 return IPCThreadState::self()->getCallingPid();
39}
40
41static int getCallingUid() {
42 return IPCThreadState::self()->getCallingUid();
43}
44
45// Interface used by CameraService
46
47Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
48 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070049 int cameraId,
50 int cameraFacing,
51 int clientPid):
52 Client(cameraService, cameraClient,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070053 cameraId, cameraFacing, clientPid),
Eino-Ville Talvala177bd342012-08-28 01:25:43 -070054 mSharedCameraClient(cameraClient),
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070055 mParameters(cameraId, cameraFacing),
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -070056 mPreviewStreamId(NO_STREAM),
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -070057 mRecordingStreamId(NO_STREAM),
James Dong983cf232012-08-01 16:39:55 -070058 mRecordingHeapCount(kDefaultRecordingHeapCount)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070059{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070060 ATRACE_CALL();
Eino-Ville Talvala69230df2012-08-29 17:37:16 -070061 ALOGI("Camera %d: Opened", cameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070062
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070063 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -070064
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070065 SharedParameters::Lock l(mParameters);
66 l.mParameters.state = Parameters::DISCONNECTED;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070067}
68
Eino-Ville Talvala3a609142012-07-31 14:36:26 -070069status_t Camera2Client::checkPid(const char* checkLocation) const {
70 int callingPid = getCallingPid();
71 if (callingPid == mClientPid) return NO_ERROR;
72
73 ALOGE("%s: attempt to use a locked camera from a different process"
74 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
75 return PERMISSION_DENIED;
76}
77
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070078status_t Camera2Client::initialize(camera_module_t *module)
79{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070080 ATRACE_CALL();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070081 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070082 status_t res;
83
84 res = mDevice->initialize(module);
85 if (res != OK) {
86 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
87 __FUNCTION__, mCameraId, strerror(-res), res);
88 return NO_INIT;
89 }
90
Eino-Ville Talvala174181e2012-08-03 13:53:39 -070091 res = mDevice->setNotifyCallback(this);
92
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -070093 SharedParameters::Lock l(mParameters);
94
95 res = l.mParameters.initialize(&(mDevice->info()));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070096 if (res != OK) {
97 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
98 __FUNCTION__, mCameraId, strerror(-res), res);
99 return NO_INIT;
100 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700101
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700102 String8 threadName;
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700103
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700104 mFrameProcessor = new FrameProcessor(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700105 threadName = String8::format("C2-%d-FrameProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700106 mCameraId);
107 mFrameProcessor->run(threadName.string());
108
109 mCaptureSequencer = new CaptureSequencer(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700110 threadName = String8::format("C2-%d-CaptureSeq",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700111 mCameraId);
112 mCaptureSequencer->run(threadName.string());
113
114 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700115 threadName = String8::format("C2-%d-JpegProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700116 mCameraId);
117 mJpegProcessor->run(threadName.string());
118
119 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700120 threadName = String8::format("C2-%d-ZslProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700121 mCameraId);
122 mZslProcessor->run(threadName.string());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700123
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700124 mCallbackProcessor = new CallbackProcessor(this);
Eino-Ville Talvala852c3812012-09-24 09:46:53 -0700125 threadName = String8::format("C2-%d-CallbkProc",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700126 mCameraId);
127 mCallbackProcessor->run(threadName.string());
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700128
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700129 if (gLogLevel >= 1) {
130 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
131 mCameraId);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700132 ALOGD("%s", l.mParameters.paramsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700133 }
134
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700135 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700136}
137
138Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700139 ATRACE_CALL();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700140
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700141 mDestructionStarted = true;
142
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700143 // Rewrite mClientPid to allow shutdown by CameraService
144 mClientPid = getCallingPid();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700145 disconnect();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700146
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700147 ALOGI("Camera %d: Closed", mCameraId);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700148}
149
150status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700151 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700152 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700153 mCameraId,
154 getCameraClient()->asBinder().get(),
155 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700156 result.append(" State: ");
157#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
158
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700159 const Parameters& p = mParameters.unsafeAccess();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700160
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700161 result.append(Parameters::getStateName(p.state));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700162
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700163 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700164 result.appendFormat(" Preview size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700165 p.previewWidth, p.previewHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700166 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700167 p.previewFpsRange[0], p.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700168 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700169 p.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700170 result.appendFormat(" Preview transform: %x\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700171 p.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700172 result.appendFormat(" Picture size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700173 p.pictureWidth, p.pictureHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700174 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700175 p.jpegThumbSize[0], p.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700176 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700177 p.jpegQuality, p.jpegThumbQuality);
178 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700179 result.appendFormat(" GPS tags %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700180 p.gpsEnabled ? "enabled" : "disabled");
181 if (p.gpsEnabled) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700182 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700183 p.gpsCoordinates[0], p.gpsCoordinates[1],
184 p.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700185 result.appendFormat(" GPS timestamp: %lld\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700186 p.gpsTimestamp);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700187 result.appendFormat(" GPS processing method: %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700188 p.gpsProcessingMethod.string());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700189 }
190
191 result.append(" White balance mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700192 switch (p.wbMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700193 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
194 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
195 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
196 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
197 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
198 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
199 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
200 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
201 default: result.append("UNKNOWN\n");
202 }
203
204 result.append(" Effect mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700205 switch (p.effectMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700206 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
207 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
208 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
209 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
210 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
211 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
212 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
213 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
214 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
215 default: result.append("UNKNOWN\n");
216 }
217
218 result.append(" Antibanding mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700219 switch (p.antibandingMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700220 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
221 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
222 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
223 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
224 default: result.append("UNKNOWN\n");
225 }
226
227 result.append(" Scene mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700228 switch (p.sceneMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700229 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
230 result.append("AUTO\n"); break;
231 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
232 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
233 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
234 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
235 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
236 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
237 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
238 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
239 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
240 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
241 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
242 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
243 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
244 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
245 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
246 default: result.append("UNKNOWN\n");
247 }
248
249 result.append(" Flash mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700250 switch (p.flashMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700251 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
252 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
253 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
254 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
255 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
256 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
257 default: result.append("UNKNOWN\n");
258 }
259
260 result.append(" Focus mode: ");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700261 switch (p.focusMode) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700262 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
263 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
264 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
265 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
266 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
267 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
268 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
269 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
270 default: result.append("UNKNOWN\n");
271 }
272
273 result.append(" Focusing areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700274 for (size_t i = 0; i < p.focusingAreas.size(); i++) {
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700275 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700276 p.focusingAreas[i].left,
277 p.focusingAreas[i].top,
278 p.focusingAreas[i].right,
279 p.focusingAreas[i].bottom,
280 p.focusingAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700281 }
282
283 result.appendFormat(" Exposure compensation index: %d\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700284 p.exposureCompensation);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700285
286 result.appendFormat(" AE lock %s, AWB lock %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700287 p.autoExposureLock ? "enabled" : "disabled",
288 p.autoWhiteBalanceLock ? "enabled" : "disabled" );
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700289
290 result.appendFormat(" Metering areas:\n");
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700291 for (size_t i = 0; i < p.meteringAreas.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.meteringAreas[i].left,
294 p.meteringAreas[i].top,
295 p.meteringAreas[i].right,
296 p.meteringAreas[i].bottom,
297 p.meteringAreas[i].weight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700298 }
299
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700300 result.appendFormat(" Zoom index: %d\n", p.zoom);
301 result.appendFormat(" Video size: %d x %d\n", p.videoWidth,
302 p.videoHeight);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700303
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700304 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700305 p.recordingHint ? "set" : "not set");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700306
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700307 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700308 p.videoStabilization ? "enabled" : "disabled");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700309
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700310 result.append(" Current streams:\n");
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700311 result.appendFormat(" Preview stream ID: %d\n",
312 getPreviewStreamId());
Eino-Ville Talvala177bd342012-08-28 01:25:43 -0700313 result.appendFormat(" Capture stream ID: %d\n",
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700314 getCaptureStreamId());
315 result.appendFormat(" Recording stream ID: %d\n",
316 getRecordingStreamId());
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700317
318 result.append(" Current requests:\n");
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700319 if (mPreviewRequest.entryCount() != 0) {
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700320 result.append(" Preview request:\n");
321 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700322 mPreviewRequest.dump(fd, 2, 6);
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700323 } else {
324 result.append(" Preview request: undefined\n");
325 write(fd, result.string(), result.size());
326 }
327
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700328 if (mRecordingRequest.entryCount() != 0) {
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700329 result = " Recording request:\n";
330 write(fd, result.string(), result.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700331 mRecordingRequest.dump(fd, 2, 6);
Eino-Ville Talvala428b77a2012-07-30 09:55:30 -0700332 } else {
333 result = " Recording request: undefined\n";
334 write(fd, result.string(), result.size());
335 }
336
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700337 mCaptureSequencer->dump(fd, args);
338
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -0700339 mFrameProcessor->dump(fd, args);
340
Eino-Ville Talvala22745492012-09-17 17:55:07 -0700341 mZslProcessor->dump(fd, args);
342
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700343 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700344 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700345
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700346 status_t res = mDevice->dump(fd, args);
347 if (res != OK) {
348 result = String8::format(" Error dumping device: %s (%d)",
349 strerror(-res), res);
350 write(fd, result.string(), result.size());
351 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700352
353#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700354 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700355}
356
357// ICamera interface
358
359void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700360 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700361 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700362 status_t res;
363 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700364
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700365 if (mDevice == 0) return;
366
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700367 ALOGV("Camera %d: Shutting down", mCameraId);
368
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700369 stopPreviewL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700370
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700371 {
372 SharedParameters::Lock l(mParameters);
373 l.mParameters.state = Parameters::DISCONNECTED;
374 }
375
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700376 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700377 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700378 mPreviewStreamId = NO_STREAM;
379 }
380
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700381 mJpegProcessor->deleteStream();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700382
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -0700383 if (mRecordingStreamId != NO_STREAM) {
384 mDevice->deleteStream(mRecordingStreamId);
385 mRecordingStreamId = NO_STREAM;
386 }
387
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700388 mCallbackProcessor->deleteStream();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700389
Eino-Ville Talvala7d8b92b2012-09-05 19:02:43 -0700390 mZslProcessor->deleteStream();
391
Eino-Ville Talvala7adb52f2012-09-20 14:44:20 -0700392 mFrameProcessor->requestExit();
393 mCaptureSequencer->requestExit();
394 mJpegProcessor->requestExit();
395 mZslProcessor->requestExit();
396 mCallbackProcessor->requestExit();
397
398 ALOGV("Camera %d: Waiting for threads", mCameraId);
399
400 mFrameProcessor->join();
401 mCaptureSequencer->join();
402 mJpegProcessor->join();
403 mZslProcessor->join();
404 mCallbackProcessor->join();
405
406 ALOGV("Camera %d: Disconnecting device", mCameraId);
407
408 mDevice->disconnect();
409
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700410 mDevice.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700411
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700412 CameraService::Client::disconnect();
413}
414
415status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700416 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700417 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700418 Mutex::Autolock icl(mICameraLock);
419
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700420 if (mClientPid != 0 && getCallingPid() != mClientPid) {
421 ALOGE("%s: Camera %d: Connection attempt from pid %d; "
422 "current locked to pid %d", __FUNCTION__,
423 mCameraId, getCallingPid(), mClientPid);
424 return BAD_VALUE;
425 }
426
427 mClientPid = getCallingPid();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700428
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700429 mCameraClient = client;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700430 mSharedCameraClient = client;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700431
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700432 SharedParameters::Lock l(mParameters);
433 l.mParameters.state = Parameters::STOPPED;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700434
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700435 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700436}
437
438status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700439 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700440 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700441 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700442 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
443 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700444
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700445 if (mClientPid == 0) {
446 mClientPid = getCallingPid();
447 return OK;
448 }
449
450 if (mClientPid != getCallingPid()) {
451 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
452 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
453 return EBUSY;
454 }
455
456 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700457}
458
459status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700460 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700461 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700462 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700463 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
464 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700465
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700466 // TODO: Check for uninterruptable conditions
467
468 if (mClientPid == getCallingPid()) {
469 mClientPid = 0;
470 mCameraClient.clear();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700471 mSharedCameraClient.clear();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700472 return OK;
473 }
474
475 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
476 __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
477 return EBUSY;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700478}
479
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700480status_t Camera2Client::setPreviewDisplay(
481 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700482 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700483 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700484 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700485 status_t res;
486 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700487
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700488 sp<IBinder> binder;
489 sp<ANativeWindow> window;
490 if (surface != 0) {
491 binder = surface->asBinder();
492 window = surface;
493 }
494
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700495 return setPreviewWindowL(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700496}
497
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700498status_t Camera2Client::setPreviewTexture(
499 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700500 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700501 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700502 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700503 status_t res;
504 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700505
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700506 sp<IBinder> binder;
507 sp<ANativeWindow> window;
508 if (surfaceTexture != 0) {
509 binder = surfaceTexture->asBinder();
510 window = new SurfaceTextureClient(surfaceTexture);
511 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700512 return setPreviewWindowL(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700513}
514
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700515status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700516 sp<ANativeWindow> window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700517 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700518 status_t res;
519
520 if (binder == mPreviewSurface) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700521 ALOGV("%s: Camera %d: New window is same as old window",
522 __FUNCTION__, mCameraId);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700523 return NO_ERROR;
524 }
525
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700526 SharedParameters::Lock l(mParameters);
527 switch (l.mParameters.state) {
528 case Parameters::DISCONNECTED:
529 case Parameters::RECORD:
530 case Parameters::STILL_CAPTURE:
531 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700532 ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700533 __FUNCTION__, mCameraId,
534 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700535 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700536 case Parameters::STOPPED:
537 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700538 // OK
539 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700540 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700541 // Already running preview - need to stop and create a new stream
542 // TODO: Optimize this so that we don't wait for old stream to drain
543 // before spinning up new stream
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700544 mDevice->clearStreamingRequest();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700545 l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700546 break;
547 }
548
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700549 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700550 res = mDevice->waitUntilDrained();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700551 if (res != OK) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700552 ALOGE("%s: Error waiting for preview to drain: %s (%d)",
553 __FUNCTION__, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700554 return res;
555 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700556 res = mDevice->deleteStream(mPreviewStreamId);
557 if (res != OK) {
558 ALOGE("%s: Unable to delete old preview stream: %s (%d)",
559 __FUNCTION__, strerror(-res), res);
560 return res;
561 }
562 mPreviewStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700563 }
564
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700565 mPreviewSurface = binder;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700566 mPreviewWindow = window;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700567
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700568 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
569 return startPreviewL(l.mParameters, false);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700570 }
571
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700572 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700573}
574
575void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700576 ATRACE_CALL();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700577 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700578 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700579 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700580 if ( checkPid(__FUNCTION__) != OK) return;
581
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700582 SharedParameters::Lock l(mParameters);
583 setPreviewCallbackFlagL(l.mParameters, flag);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700584}
585
586void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
587 status_t res = OK;
588 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
589 ALOGV("%s: setting oneshot", __FUNCTION__);
590 params.previewCallbackOneShot = true;
591 }
592 if (params.previewCallbackFlags != (uint32_t)flag) {
593 params.previewCallbackFlags = flag;
594 switch(params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700595 case Parameters::PREVIEW:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700596 res = startPreviewL(params, true);
597 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700598 case Parameters::RECORD:
599 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700600 res = startRecordingL(params, true);
601 break;
602 default:
603 break;
604 }
605 if (res != OK) {
606 ALOGE("%s: Camera %d: Unable to refresh request in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700607 __FUNCTION__, mCameraId,
608 Parameters::getStateName(params.state));
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700609 }
610 }
611
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700612}
613
614status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700615 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700616 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700617 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700618 status_t res;
619 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700620 SharedParameters::Lock l(mParameters);
621 return startPreviewL(l.mParameters, false);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700622}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700623
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700624status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700625 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700626 status_t res;
Alex Ray71d64542012-09-26 15:52:50 -0700627 if (params.state == Parameters::PREVIEW && !restart) {
628 // Succeed attempt to re-enter preview state
629 ALOGI("%s: Not starting preview; already in preview state.",
630 __FUNCTION__);
631 return OK;
632 }
633 if (params.state > Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700634 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700635 __FUNCTION__,
636 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700637 return INVALID_OPERATION;
638 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700639
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700640 if (mPreviewWindow == 0) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700641 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700642 return OK;
643 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700644 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700645
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700646 res = updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700647 if (res != OK) {
648 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
649 __FUNCTION__, mCameraId, strerror(-res), res);
650 return res;
651 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700652 bool callbacksEnabled = params.previewCallbackFlags &
653 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
654 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700655 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700656 if (res != OK) {
657 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
658 __FUNCTION__, mCameraId, strerror(-res), res);
659 return res;
660 }
661 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700662 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700663 res = mZslProcessor->updateStream(params);
664 if (res != OK) {
665 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
666 __FUNCTION__, mCameraId, strerror(-res), res);
667 return res;
668 }
669 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700670
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700671 CameraMetadata *request;
672 if (!params.recordingHint) {
673 if (mPreviewRequest.entryCount() == 0) {
674 res = updatePreviewRequest(params);
675 if (res != OK) {
676 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
677 __FUNCTION__, mCameraId, strerror(-res), res);
678 return res;
679 }
680 }
681 request = &mPreviewRequest;
682 } else {
683 // With recording hint set, we're going to be operating under the
684 // assumption that the user will record video. To optimize recording
685 // startup time, create the necessary output streams for recording and
686 // video snapshot now if they don't already exist.
687 if (mRecordingRequest.entryCount() == 0) {
688 res = updateRecordingRequest(params);
689 if (res != OK) {
690 ALOGE("%s: Camera %d: Unable to create recording preview "
691 "request: %s (%d)",
692 __FUNCTION__, mCameraId, strerror(-res), res);
693 return res;
694 }
695 }
696 request = &mRecordingRequest;
697
Eino-Ville Talvala587879f2012-09-10 16:07:03 -0700698 // TODO: Re-enable recording stream creation/update here once issues are
699 // resolved
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700700
701 res = mJpegProcessor->updateStream(params);
702 if (res != OK) {
703 ALOGE("%s: Camera %d: Can't pre-configure still image "
704 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700705 __FUNCTION__, mCameraId, strerror(-res), res);
706 return res;
707 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700708 }
709
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700710 Vector<uint8_t> outputStreams;
711 outputStreams.push(getPreviewStreamId());
712
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700713 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700714 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700715 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700716 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700717 outputStreams.push(getZslStreamId());
718 }
719
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700720 res = request->update(
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700721 ANDROID_REQUEST_OUTPUT_STREAMS,
722 outputStreams);
723
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700724 if (res != OK) {
725 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
726 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700727 return res;
728 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700729 res = request->sort();
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700730 if (res != OK) {
731 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
732 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700733 return res;
734 }
735
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700736 res = mDevice->setStreamingRequest(*request);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700737 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700738 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
739 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700740 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700741 return res;
742 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700743 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700744
745 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700746}
747
748void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700749 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700750 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700751 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700752 status_t res;
753 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700754 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700755}
756
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700757void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700758 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700759 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700760 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700761 SharedParameters::Lock l(mParameters);
762 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700763 }
764
765 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700766 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700767 ALOGE("%s: Camera %d: Call before initialized",
768 __FUNCTION__, mCameraId);
769 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700770 case Parameters::STOPPED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700771 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700772 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700773 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
774 __FUNCTION__, mCameraId);
775 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700776 case Parameters::RECORD:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700777 // no break - identical to preview
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700778 case Parameters::PREVIEW:
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700779 mDevice->clearStreamingRequest();
Eino-Ville Talvala22671062012-07-20 18:30:37 -0700780 mDevice->waitUntilDrained();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700781 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700782 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
783 SharedParameters::Lock l(mParameters);
784 l.mParameters.state = Parameters::STOPPED;
785 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700786 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700787 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700788 default:
789 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700790 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700791 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700792}
793
794bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700795 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700796 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700797 status_t res;
798 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
799
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700800 SharedParameters::Lock l(mParameters);
801 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700802}
803
804status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700805 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700806 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700807 status_t res;
808 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
809
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700810 SharedParameters::Lock l(mParameters);
811 switch (l.mParameters.state) {
812 case Parameters::RECORD:
813 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700814 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700815 __FUNCTION__, mCameraId,
816 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700817 return INVALID_OPERATION;
818 default:
819 // OK
820 break;
821 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700822
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700823 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700824
825 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700826}
827
828status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700829 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700830 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700831 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700832 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700833 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700834 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700835
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700836 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700837}
838
839status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
840 status_t res;
841 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700842 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700843 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700844 if (res != OK) return res;
845 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700846 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700847 // Ready to go
848 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700849 case Parameters::RECORD:
850 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700851 // OK to call this when recording is already on, just skip unless
852 // we're looking to restart
853 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700854 break;
855 default:
856 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700857 __FUNCTION__, mCameraId,
858 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700859 return INVALID_OPERATION;
860 };
861
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700862 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700863 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
864 "non-metadata recording mode requested!", __FUNCTION__,
865 mCameraId);
866 return INVALID_OPERATION;
867 }
868
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700869 mCameraService->playSound(CameraService::SOUND_RECORDING);
870
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700871 res = updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700872 if (res != OK) {
873 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
874 __FUNCTION__, mCameraId, strerror(-res), res);
875 return res;
876 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700877 bool callbacksEnabled = params.previewCallbackFlags &
878 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
879 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700880 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700881 if (res != OK) {
882 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
883 __FUNCTION__, mCameraId, strerror(-res), res);
884 return res;
885 }
886 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700887
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700888 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700889 res = updateRecordingRequest(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700890 if (res != OK) {
891 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
892 __FUNCTION__, mCameraId, strerror(-res), res);
893 return res;
894 }
895 }
896
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700897 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700898 uint8_t outputStreams[3] ={
899 getPreviewStreamId(),
900 getRecordingStreamId(),
901 getCallbackStreamId()
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, 3);
906 } else {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700907 uint8_t outputStreams[2] = {
908 getPreviewStreamId(),
909 getRecordingStreamId()
910 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700911 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700912 ANDROID_REQUEST_OUTPUT_STREAMS,
913 outputStreams, 2);
914 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700915 if (res != OK) {
916 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
917 __FUNCTION__, mCameraId, strerror(-res), res);
918 return res;
919 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700920 res = mRecordingRequest.sort();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700921 if (res != OK) {
922 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
923 __FUNCTION__, mCameraId, strerror(-res), res);
924 return res;
925 }
926
927 res = mDevice->setStreamingRequest(mRecordingRequest);
928 if (res != OK) {
929 ALOGE("%s: Camera %d: Unable to set recording request to start "
930 "recording: %s (%d)", __FUNCTION__, mCameraId,
931 strerror(-res), res);
932 return res;
933 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700934 if (params.state < Parameters::RECORD) {
935 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700936 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700937
938 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700939}
940
941void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700942 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700943 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700944 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700945 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700946
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700947 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700948 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
949
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700950 switch (l.mParameters.state) {
951 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700952 // OK to stop
953 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700954 case Parameters::STOPPED:
955 case Parameters::PREVIEW:
956 case Parameters::STILL_CAPTURE:
957 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700958 default:
959 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700960 __FUNCTION__, mCameraId,
961 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700962 return;
963 };
964
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700965 mCameraService->playSound(CameraService::SOUND_RECORDING);
966
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700967 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700968 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700969 ALOGE("%s: Camera %d: Unable to return to preview",
970 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700971 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700972}
973
974bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700975 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700976 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700977
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700978 if ( checkPid(__FUNCTION__) != OK) return false;
979
James Dong8da4cd72012-08-04 19:58:07 -0700980 return recordingEnabledL();
981}
982
983bool Camera2Client::recordingEnabledL() {
984 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700985 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700986
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700987 return (l.mParameters.state == Parameters::RECORD
988 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700989}
990
991void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700992 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700993 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700994 status_t res;
995 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700996
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700997 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700998
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700999 // Make sure this is for the current heap
1000 ssize_t offset;
1001 size_t size;
1002 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
1003 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
1004 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
1005 "(got %x, expected %x)", __FUNCTION__, mCameraId,
1006 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
1007 return;
1008 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001009 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1010 uint32_t type = *(uint32_t*)data;
1011 if (type != kMetadataBufferTypeGrallocSource) {
1012 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
1013 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
1014 return;
1015 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001016
1017 // Release the buffer back to the recording queue
1018
1019 buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
1020
1021 size_t itemIndex;
1022 for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
1023 const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
1024 if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
1025 item.mGraphicBuffer->handle == imgHandle) {
1026 break;
1027 }
1028 }
1029 if (itemIndex == mRecordingBuffers.size()) {
1030 ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
1031 "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
1032 return;
1033 }
1034
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001035 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001036 imgHandle);
1037
1038 res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001039 if (res != OK) {
1040 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
1041 "%s (%d)",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001042 __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001043 return;
1044 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001045 mRecordingBuffers.replaceAt(itemIndex);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001046
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001047 mRecordingHeapFree++;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001048}
1049
1050status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001051 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001052 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001053 status_t res;
1054 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1055
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001056 int triggerId;
1057 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001058 SharedParameters::Lock l(mParameters);
1059 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1060 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001061 }
1062
1063 mDevice->triggerAutofocus(triggerId);
1064
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001065 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001066}
1067
1068status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001069 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001070 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001071 status_t res;
1072 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1073
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001074 int triggerId;
1075 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001076 SharedParameters::Lock l(mParameters);
1077 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001078 }
1079
1080 mDevice->triggerCancelAutofocus(triggerId);
1081
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001082 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001083}
1084
1085status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001086 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001087 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001088 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001089 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001090
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001091 SharedParameters::Lock l(mParameters);
1092 switch (l.mParameters.state) {
1093 case Parameters::DISCONNECTED:
1094 case Parameters::STOPPED:
1095 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001096 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1097 __FUNCTION__, mCameraId);
1098 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001099 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001100 // Good to go for takePicture
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001101 res = commandStopFaceDetectionL(l.mParameters);
1102 if (res != OK) {
1103 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1104 __FUNCTION__, mCameraId);
1105 return res;
1106 }
1107 l.mParameters.state = Parameters::STILL_CAPTURE;
1108 break;
1109 case Parameters::RECORD:
1110 // Good to go for video snapshot
1111 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001112 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001113 case Parameters::STILL_CAPTURE:
1114 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001115 ALOGE("%s: Camera %d: Already taking a picture",
1116 __FUNCTION__, mCameraId);
1117 return INVALID_OPERATION;
1118 }
1119
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001120 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001121
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001122 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001123 if (res != OK) {
1124 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1125 __FUNCTION__, mCameraId, strerror(-res), res);
1126 return res;
1127 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001128
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001129 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001130 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001131 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001132 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001133 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001134
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001135 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001136}
1137
1138status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001139 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001140 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001141 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001142 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001143 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1144
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001145 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001146
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001147 res = l.mParameters.set(params);
1148 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001149
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001150 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001151
1152 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001153}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001154
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001155String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001156 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001157 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001158 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001159
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001160 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001161
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001162 // TODO: Deal with focus distances
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001163 return l.mParameters.paramsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001164}
1165
1166status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001167 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001168 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001169 status_t res;
1170 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001171
1172 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1173 cmd, arg1, arg2);
1174
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001175 switch (cmd) {
1176 case CAMERA_CMD_START_SMOOTH_ZOOM:
1177 return commandStartSmoothZoomL();
1178 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1179 return commandStopSmoothZoomL();
1180 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1181 return commandSetDisplayOrientationL(arg1);
1182 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1183 return commandEnableShutterSoundL(arg1 == 1);
1184 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1185 return commandPlayRecordingSoundL();
1186 case CAMERA_CMD_START_FACE_DETECTION:
1187 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001188 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001189 SharedParameters::Lock l(mParameters);
1190 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001191 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001192 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1193 return commandEnableFocusMoveMsgL(arg1 == 1);
1194 case CAMERA_CMD_PING:
1195 return commandPingL();
1196 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1197 return commandSetVideoBufferCountL(arg1);
1198 default:
1199 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1200 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001201 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001202 }
1203}
James Dong983cf232012-08-01 16:39:55 -07001204
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001205status_t Camera2Client::commandStartSmoothZoomL() {
1206 ALOGE("%s: Unimplemented!", __FUNCTION__);
1207 return OK;
1208}
James Dong983cf232012-08-01 16:39:55 -07001209
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001210status_t Camera2Client::commandStopSmoothZoomL() {
1211 ALOGE("%s: Unimplemented!", __FUNCTION__);
1212 return OK;
1213}
James Dong983cf232012-08-01 16:39:55 -07001214
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001215status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001216 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001217 mCameraFacing == CAMERA_FACING_FRONT);
1218 if (transform == -1) {
1219 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1220 __FUNCTION__, mCameraId, degrees);
1221 return BAD_VALUE;
1222 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001223 SharedParameters::Lock l(mParameters);
1224 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001225 mPreviewStreamId != NO_STREAM) {
1226 mDevice->setStreamTransform(mPreviewStreamId, transform);
1227 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001228 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001229 return OK;
1230}
1231
1232status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001233 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001234 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001235 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001236 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001237 }
1238
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001239 // Disabling shutter sound may not be allowed. In that case only
1240 // allow the mediaserver process to disable the sound.
1241 char value[PROPERTY_VALUE_MAX];
1242 property_get("ro.camera.sound.forced", value, "0");
1243 if (strncmp(value, "0", 2) != 0) {
1244 // Disabling shutter sound is not allowed. Deny if the current
1245 // process is not mediaserver.
1246 if (getCallingPid() != getpid()) {
1247 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1248 getCallingPid());
1249 return PERMISSION_DENIED;
1250 }
1251 }
1252
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001253 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001254 return OK;
1255}
1256
1257status_t Camera2Client::commandPlayRecordingSoundL() {
1258 mCameraService->playSound(CameraService::SOUND_RECORDING);
1259 return OK;
1260}
1261
1262status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001263 ALOGV("%s: Camera %d: Starting face detection",
1264 __FUNCTION__, mCameraId);
1265 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001266 SharedParameters::Lock l(mParameters);
1267 switch (l.mParameters.state) {
1268 case Parameters::DISCONNECTED:
1269 case Parameters::STOPPED:
1270 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1271 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001272 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1273 __FUNCTION__, mCameraId);
1274 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001275 case Parameters::PREVIEW:
1276 case Parameters::RECORD:
1277 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001278 // Good to go for starting face detect
1279 break;
1280 }
1281 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001282 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1283 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001284 ALOGE("%s: Camera %d: Face detection not supported",
1285 __FUNCTION__, mCameraId);
1286 return INVALID_OPERATION;
1287 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001288 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001289
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001290 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001291
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001292 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001293
1294 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001295}
1296
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001297status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001298 status_t res = OK;
1299 ALOGV("%s: Camera %d: Stopping face detection",
1300 __FUNCTION__, mCameraId);
1301
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001302 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001303
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001304 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001305
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001306 if (params.state == Parameters::PREVIEW
1307 || params.state == Parameters::RECORD
1308 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001309 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001310 }
1311
1312 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001313}
1314
1315status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001316 SharedParameters::Lock l(mParameters);
1317 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001318
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001319 return OK;
1320}
1321
1322status_t Camera2Client::commandPingL() {
1323 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001324 SharedParameters::Lock l(mParameters);
1325 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001326 return OK;
1327 } else {
1328 return NO_INIT;
1329 }
1330}
1331
1332status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001333 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001334 ALOGE("%s: Camera %d: Error setting video buffer count after "
1335 "recording was started", __FUNCTION__, mCameraId);
1336 return INVALID_OPERATION;
1337 }
1338
1339 // 32 is the current upper limit on the video buffer count for BufferQueue
1340 if (count > 32) {
1341 ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1342 __FUNCTION__, mCameraId, count);
1343 return BAD_VALUE;
1344 }
1345
1346 // Need to reallocate memory for heap
1347 if (mRecordingHeapCount != count) {
1348 if (mRecordingHeap != 0) {
1349 mRecordingHeap.clear();
1350 mRecordingHeap = NULL;
1351 }
1352 mRecordingHeapCount = count;
1353 }
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001354
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001355 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001356}
1357
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001358/** Device-related methods */
1359
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001360void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1361 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1362}
1363
1364void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1365 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1366 frameNumber, timestamp);
1367}
1368
1369void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1370 ALOGV("%s: Autofocus state now %d, last trigger %d",
1371 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001372 bool sendCompletedMessage = false;
1373 bool sendMovingMessage = false;
1374
1375 bool success = false;
1376 bool afInMotion = false;
1377 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001378 SharedParameters::Lock l(mParameters);
1379 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001380 case Parameters::FOCUS_MODE_AUTO:
1381 case Parameters::FOCUS_MODE_MACRO:
1382 // Don't send notifications upstream if they're not for the current AF
1383 // trigger. For example, if cancel was called in between, or if we
1384 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001385 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001386 switch (newState) {
1387 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1388 success = true;
1389 // no break
1390 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1391 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001392 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001393 break;
1394 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1395 // Just starting focusing, ignore
1396 break;
1397 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1398 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1399 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1400 default:
1401 // Unexpected in AUTO/MACRO mode
1402 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1403 __FUNCTION__, newState);
1404 break;
1405 }
1406 break;
1407 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1408 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1409 switch (newState) {
1410 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1411 success = true;
1412 // no break
1413 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1414 // Don't send notifications upstream if they're not for
1415 // the current AF trigger. For example, if cancel was
1416 // called in between, or if we already sent a
1417 // notification about this AF call.
1418 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001419 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001420 sendCompletedMessage = true;
1421 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001422 if (l.mParameters.enableFocusMoveMessages &&
1423 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001424 sendMovingMessage = true;
1425 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001426 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001427 break;
1428 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1429 // Cancel was called, or we switched state; care if
1430 // currently moving
1431 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001432 if (l.mParameters.enableFocusMoveMessages &&
1433 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001434 sendMovingMessage = true;
1435 }
1436 break;
1437 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1438 // Start passive scan, inform upstream
1439 afInMotion = true;
1440 // no break
1441 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1442 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001443 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001444 sendMovingMessage = true;
1445 }
1446 break;
1447 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001448 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001449 break;
1450 case Parameters::FOCUS_MODE_EDOF:
1451 case Parameters::FOCUS_MODE_INFINITY:
1452 case Parameters::FOCUS_MODE_FIXED:
1453 default:
1454 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001455 ALOGE("%s: Unexpected AF state change %d "
1456 "(ID %d) in focus mode %d",
1457 __FUNCTION__, newState, triggerId,
1458 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001459 }
1460 }
1461 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001462 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001463 SharedCameraClient::Lock l(mSharedCameraClient);
1464 if (l.mCameraClient != 0) {
1465 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001466 afInMotion ? 1 : 0, 0);
1467 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001468 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001469 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001470 SharedCameraClient::Lock l(mSharedCameraClient);
1471 if (l.mCameraClient != 0) {
1472 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1473 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001474 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001475 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001476}
1477
1478void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1479 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1480 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001481 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001482}
1483
1484void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1485 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1486 __FUNCTION__, newState, triggerId);
1487}
1488
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001489int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001490 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001491}
1492
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001493const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1494 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001495}
1496
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001497const sp<CameraService>& Camera2Client::getCameraService() {
1498 return mCameraService;
1499}
1500
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001501camera2::SharedParameters& Camera2Client::getParameters() {
1502 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001503}
1504
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001505int Camera2Client::getPreviewStreamId() const {
1506 return mPreviewStreamId;
1507}
1508
1509int Camera2Client::getCaptureStreamId() const {
1510 return mJpegProcessor->getStreamId();
1511}
1512
1513int Camera2Client::getCallbackStreamId() const {
1514 return mCallbackProcessor->getStreamId();
1515}
1516
1517int Camera2Client::getRecordingStreamId() const {
1518 return mRecordingStreamId;
1519}
1520
1521int Camera2Client::getZslStreamId() const {
1522 return mZslProcessor->getStreamId();
1523}
1524
1525status_t Camera2Client::registerFrameListener(int32_t id,
1526 wp<camera2::FrameProcessor::FilteredListener> listener) {
1527 return mFrameProcessor->registerListener(id, listener);
1528}
1529
1530status_t Camera2Client::removeFrameListener(int32_t id) {
1531 return mFrameProcessor->removeListener(id);
1532}
1533
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001534Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1535 mCameraClient(client.mCameraClient),
1536 mSharedClient(client) {
1537 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001538}
1539
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001540Camera2Client::SharedCameraClient::Lock::~Lock() {
1541 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001542}
1543
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001544Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1545 mCameraClient(client) {
1546}
1547
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001548Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1549 const sp<ICameraClient>&client) {
1550 Mutex::Autolock l(mCameraClientLock);
1551 mCameraClient = client;
1552 return *this;
1553}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001554
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001555void Camera2Client::SharedCameraClient::clear() {
1556 Mutex::Autolock l(mCameraClientLock);
1557 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001558}
1559
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001560const int32_t Camera2Client::kPreviewRequestId;
1561const int32_t Camera2Client::kRecordRequestId;
1562const int32_t Camera2Client::kFirstCaptureRequestId;
1563
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001564void Camera2Client::onRecordingFrameAvailable() {
1565 ATRACE_CALL();
1566 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001567 sp<Camera2Heap> recordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001568 size_t heapIdx = 0;
1569 nsecs_t timestamp;
1570 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001571 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001572
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001573 BufferItemConsumer::BufferItem imgBuffer;
1574 res = mRecordingConsumer->acquireBuffer(&imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001575 if (res != OK) {
1576 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1577 __FUNCTION__, mCameraId, strerror(-res), res);
1578 return;
1579 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001580 timestamp = imgBuffer.mTimestamp;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001581
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001582 mRecordingFrameCount++;
1583 ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1584
1585 // TODO: Signal errors here upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001586 if (l.mParameters.state != Parameters::RECORD &&
1587 l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001588 ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1589 "recording done",
1590 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001591 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001592 return;
1593 }
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -07001594
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001595 if (mRecordingHeap == 0) {
1596 const size_t bufferSize = 4 + sizeof(buffer_handle_t);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001597 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1598 "size %d bytes", __FUNCTION__, mCameraId,
James Dong983cf232012-08-01 16:39:55 -07001599 mRecordingHeapCount, bufferSize);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001600
James Dong983cf232012-08-01 16:39:55 -07001601 mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001602 "Camera2Client::RecordingHeap");
1603 if (mRecordingHeap->mHeap->getSize() == 0) {
1604 ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1605 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001606 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001607 return;
1608 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001609 for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
1610 if (mRecordingBuffers[i].mBuf !=
1611 BufferItemConsumer::INVALID_BUFFER_SLOT) {
1612 ALOGE("%s: Camera %d: Non-empty recording buffers list!",
1613 __FUNCTION__, mCameraId);
1614 }
1615 }
1616 mRecordingBuffers.clear();
1617 mRecordingBuffers.setCapacity(mRecordingHeapCount);
1618 mRecordingBuffers.insertAt(0, mRecordingHeapCount);
1619
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001620 mRecordingHeapHead = 0;
James Dong983cf232012-08-01 16:39:55 -07001621 mRecordingHeapFree = mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001622 }
1623
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001624 if ( mRecordingHeapFree == 0) {
1625 ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1626 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001627 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001628 return;
1629 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001630
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001631 heapIdx = mRecordingHeapHead;
James Dong983cf232012-08-01 16:39:55 -07001632 mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001633 mRecordingHeapFree--;
1634
1635 ALOGV("%s: Camera %d: Timestamp %lld",
1636 __FUNCTION__, mCameraId, timestamp);
1637
1638 ssize_t offset;
1639 size_t size;
1640 sp<IMemoryHeap> heap =
1641 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1642 &size);
1643
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001644 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1645 uint32_t type = kMetadataBufferTypeGrallocSource;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001646 *((uint32_t*)data) = type;
1647 *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001648 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001649 __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
1650 mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001651 recordingHeap = mRecordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001652 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001653
1654 // Call outside locked parameters to allow re-entrancy from notification
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001655 SharedCameraClient::Lock l(mSharedCameraClient);
1656 if (l.mCameraClient != 0) {
1657 l.mCameraClient->dataCallbackTimestamp(timestamp,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001658 CAMERA_MSG_VIDEO_FRAME,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001659 recordingHeap->mBuffers[heapIdx]);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001660 }
1661}
1662
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001663/** Utility methods */
1664
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001665status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001666 status_t res;
1667
1668 res = updatePreviewRequest(params);
1669 if (res != OK) {
1670 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1671 __FUNCTION__, mCameraId, strerror(-res), res);
1672 return res;
1673 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001674 res = updateRecordingRequest(params);
1675 if (res != OK) {
1676 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1677 __FUNCTION__, mCameraId, strerror(-res), res);
1678 return res;
1679 }
1680
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001681 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001682 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001683 if (res != OK) {
1684 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1685 __FUNCTION__, mCameraId, strerror(-res), res);
1686 return res;
1687 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001688 } else if (params.state == Parameters::RECORD ||
1689 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001690 res = mDevice->setStreamingRequest(mRecordingRequest);
1691 if (res != OK) {
1692 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1693 __FUNCTION__, mCameraId, strerror(-res), res);
1694 return res;
1695 }
1696 }
1697 return res;
1698}
1699
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001700status_t Camera2Client::updatePreviewStream(const Parameters &params) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001701 ATRACE_CALL();
1702 status_t res;
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001703
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001704 if (mPreviewStreamId != NO_STREAM) {
1705 // Check if stream parameters have to change
1706 uint32_t currentWidth, currentHeight;
1707 res = mDevice->getStreamInfo(mPreviewStreamId,
1708 &currentWidth, &currentHeight, 0);
1709 if (res != OK) {
1710 ALOGE("%s: Camera %d: Error querying preview stream info: "
1711 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1712 return res;
1713 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001714 if (currentWidth != (uint32_t)params.previewWidth ||
1715 currentHeight != (uint32_t)params.previewHeight) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001716 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
1717 __FUNCTION__, mCameraId, currentWidth, currentHeight,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001718 params.previewWidth, params.previewHeight);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001719 res = mDevice->waitUntilDrained();
1720 if (res != OK) {
1721 ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1722 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1723 return res;
1724 }
1725 res = mDevice->deleteStream(mPreviewStreamId);
1726 if (res != OK) {
1727 ALOGE("%s: Camera %d: Unable to delete old output stream "
1728 "for preview: %s (%d)", __FUNCTION__, mCameraId,
1729 strerror(-res), res);
1730 return res;
1731 }
1732 mPreviewStreamId = NO_STREAM;
1733 }
1734 }
1735
1736 if (mPreviewStreamId == NO_STREAM) {
1737 res = mDevice->createStream(mPreviewWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001738 params.previewWidth, params.previewHeight,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001739 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1740 &mPreviewStreamId);
1741 if (res != OK) {
1742 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1743 __FUNCTION__, mCameraId, strerror(-res), res);
1744 return res;
1745 }
1746 }
1747
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001748 res = mDevice->setStreamTransform(mPreviewStreamId,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001749 params.previewTransform);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001750 if (res != OK) {
1751 ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1752 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1753 return res;
1754 }
1755
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001756 return OK;
1757}
1758
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001759status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001760 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001761 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001762 if (mPreviewRequest.entryCount() == 0) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001763 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1764 &mPreviewRequest);
1765 if (res != OK) {
1766 ALOGE("%s: Camera %d: Unable to create default preview request: "
1767 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1768 return res;
1769 }
1770 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001771
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001772 res = params.updateRequest(&mPreviewRequest);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001773 if (res != OK) {
1774 ALOGE("%s: Camera %d: Unable to update common entries of preview "
1775 "request: %s (%d)", __FUNCTION__, mCameraId,
1776 strerror(-res), res);
1777 return res;
1778 }
1779
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001780 res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1781 &kPreviewRequestId, 1);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001782
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001783 return OK;
1784}
1785
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001786status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001787 ATRACE_CALL();
1788 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001789 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001790 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
1791 &mRecordingRequest);
1792 if (res != OK) {
1793 ALOGE("%s: Camera %d: Unable to create default recording request:"
1794 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1795 return res;
1796 }
1797 }
1798
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001799 res = params.updateRequest(&mRecordingRequest);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001800 if (res != OK) {
1801 ALOGE("%s: Camera %d: Unable to update common entries of recording "
1802 "request: %s (%d)", __FUNCTION__, mCameraId,
1803 strerror(-res), res);
1804 return res;
1805 }
1806
1807 return OK;
1808}
1809
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001810status_t Camera2Client::updateRecordingStream(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001811 status_t res;
1812
1813 if (mRecordingConsumer == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001814 // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1815 // always acquire and free a buffer when the heap is full; otherwise the consumer
1816 // will have buffers in flight we'll never clear out.
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001817 mRecordingConsumer = new BufferItemConsumer(
1818 GRALLOC_USAGE_HW_VIDEO_ENCODER,
1819 mRecordingHeapCount + 1,
1820 true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001821 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
1822 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
1823 mRecordingWindow = new SurfaceTextureClient(
1824 mRecordingConsumer->getProducerInterface());
1825 // Allocate memory later, since we don't know buffer size until receipt
1826 }
1827
1828 if (mRecordingStreamId != NO_STREAM) {
1829 // Check if stream parameters have to change
1830 uint32_t currentWidth, currentHeight;
1831 res = mDevice->getStreamInfo(mRecordingStreamId,
1832 &currentWidth, &currentHeight, 0);
1833 if (res != OK) {
1834 ALOGE("%s: Camera %d: Error querying recording output stream info: "
1835 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1836 return res;
1837 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001838 if (currentWidth != (uint32_t)params.videoWidth ||
1839 currentHeight != (uint32_t)params.videoHeight) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001840 // TODO: Should wait to be sure previous recording has finished
1841 res = mDevice->deleteStream(mRecordingStreamId);
1842 if (res != OK) {
1843 ALOGE("%s: Camera %d: Unable to delete old output stream "
1844 "for recording: %s (%d)", __FUNCTION__, mCameraId,
1845 strerror(-res), res);
1846 return res;
1847 }
1848 mRecordingStreamId = NO_STREAM;
1849 }
1850 }
1851
1852 if (mRecordingStreamId == NO_STREAM) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001853 mRecordingFrameCount = 0;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001854 res = mDevice->createStream(mRecordingWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001855 params.videoWidth, params.videoHeight,
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001856 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001857 if (res != OK) {
1858 ALOGE("%s: Camera %d: Can't create output stream for recording: "
1859 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1860 return res;
1861 }
1862 }
1863
1864 return OK;
1865}
1866
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001867size_t Camera2Client::calculateBufferSize(int width, int height,
1868 int format, int stride) {
1869 switch (format) {
1870 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1871 return width * height * 2;
1872 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1873 return width * height * 3 / 2;
1874 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1875 return width * height * 2;
1876 case HAL_PIXEL_FORMAT_YV12: { // YV12
1877 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001878 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001879 size_t uvSize = uvStride * height / 2;
1880 return ySize + uvSize * 2;
1881 }
1882 case HAL_PIXEL_FORMAT_RGB_565:
1883 return width * height * 2;
1884 case HAL_PIXEL_FORMAT_RGBA_8888:
1885 return width * height * 4;
1886 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1887 return width * height * 2;
1888 default:
1889 ALOGE("%s: Unknown preview format: %x",
1890 __FUNCTION__, format);
1891 return 0;
1892 }
1893}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001894
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001895} // namespace android