blob: 495fedad6deb18e12f954c170fcae70f76e55137 [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Camera2Client"
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070018#define ATRACE_TAG ATRACE_TAG_CAMERA
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070019//#define LOG_NDEBUG 0
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070020
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070021#include <utils/Log.h>
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070022#include <utils/Trace.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070023
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
Eino-Ville Talvala78822d72012-07-18 17:52:18 -070027#include <media/hardware/MetadataBufferType.h>
James Painterc3dbf1a2012-09-05 18:02:32 -070028#include "camera2/Parameters.h"
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);
105 threadName = String8::format("Camera2Client[%d]::FrameProcessor",
106 mCameraId);
107 mFrameProcessor->run(threadName.string());
108
109 mCaptureSequencer = new CaptureSequencer(this);
110 threadName = String8::format("Camera2Client[%d]::CaptureSequencer",
111 mCameraId);
112 mCaptureSequencer->run(threadName.string());
113
114 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
115 threadName = String8::format("Camera2Client[%d]::JpegProcessor",
116 mCameraId);
117 mJpegProcessor->run(threadName.string());
118
119 mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
120 threadName = String8::format("Camera2Client[%d]::ZslProcessor",
121 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 Talvala69230df2012-08-29 17:37:16 -0700125 threadName = String8::format("Camera2Client[%d]::CallbackProcessor",
126 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;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700627 if (params.state >= Parameters::PREVIEW && !restart) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700628 ALOGE("%s: Can't start preview in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700629 __FUNCTION__,
630 Parameters::getStateName(params.state));
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700631 return INVALID_OPERATION;
632 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700633
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700634 if (mPreviewWindow == 0) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700635 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700636 return OK;
637 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700638 params.state = Parameters::STOPPED;
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700639
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700640 res = updatePreviewStream(params);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700641 if (res != OK) {
642 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
643 __FUNCTION__, mCameraId, strerror(-res), res);
644 return res;
645 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700646 bool callbacksEnabled = params.previewCallbackFlags &
647 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
648 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700649 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700650 if (res != OK) {
651 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
652 __FUNCTION__, mCameraId, strerror(-res), res);
653 return res;
654 }
655 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700656 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700657 res = mZslProcessor->updateStream(params);
658 if (res != OK) {
659 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
660 __FUNCTION__, mCameraId, strerror(-res), res);
661 return res;
662 }
663 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700664
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700665 CameraMetadata *request;
666 if (!params.recordingHint) {
667 if (mPreviewRequest.entryCount() == 0) {
668 res = updatePreviewRequest(params);
669 if (res != OK) {
670 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
671 __FUNCTION__, mCameraId, strerror(-res), res);
672 return res;
673 }
674 }
675 request = &mPreviewRequest;
676 } else {
677 // With recording hint set, we're going to be operating under the
678 // assumption that the user will record video. To optimize recording
679 // startup time, create the necessary output streams for recording and
680 // video snapshot now if they don't already exist.
681 if (mRecordingRequest.entryCount() == 0) {
682 res = updateRecordingRequest(params);
683 if (res != OK) {
684 ALOGE("%s: Camera %d: Unable to create recording preview "
685 "request: %s (%d)",
686 __FUNCTION__, mCameraId, strerror(-res), res);
687 return res;
688 }
689 }
690 request = &mRecordingRequest;
691
Eino-Ville Talvala587879f2012-09-10 16:07:03 -0700692 // TODO: Re-enable recording stream creation/update here once issues are
693 // resolved
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700694
695 res = mJpegProcessor->updateStream(params);
696 if (res != OK) {
697 ALOGE("%s: Camera %d: Can't pre-configure still image "
698 "stream: %s (%d)",
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700699 __FUNCTION__, mCameraId, strerror(-res), res);
700 return res;
701 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700702 }
703
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700704 Vector<uint8_t> outputStreams;
705 outputStreams.push(getPreviewStreamId());
706
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700707 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700708 outputStreams.push(getCallbackStreamId());
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700709 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700710 if (params.zslMode && !params.recordingHint) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700711 outputStreams.push(getZslStreamId());
712 }
713
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700714 res = request->update(
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700715 ANDROID_REQUEST_OUTPUT_STREAMS,
716 outputStreams);
717
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700718 if (res != OK) {
719 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
720 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700721 return res;
722 }
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700723 res = request->sort();
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700724 if (res != OK) {
725 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
726 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700727 return res;
728 }
729
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700730 res = mDevice->setStreamingRequest(*request);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700731 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700732 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
733 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700734 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700735 return res;
736 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700737 params.state = Parameters::PREVIEW;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700738
739 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700740}
741
742void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700743 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700744 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700745 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700746 status_t res;
747 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700748 stopPreviewL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700749}
750
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700751void Camera2Client::stopPreviewL() {
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700752 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700753 Parameters::State state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700754 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700755 SharedParameters::Lock l(mParameters);
756 state = l.mParameters.state;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700757 }
758
759 switch (state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700760 case Parameters::DISCONNECTED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700761 ALOGE("%s: Camera %d: Call before initialized",
762 __FUNCTION__, mCameraId);
763 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700764 case Parameters::STOPPED:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700765 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700766 case Parameters::STILL_CAPTURE:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700767 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
768 __FUNCTION__, mCameraId);
769 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700770 case Parameters::RECORD:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700771 // no break - identical to preview
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700772 case Parameters::PREVIEW:
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700773 mDevice->clearStreamingRequest();
Eino-Ville Talvala22671062012-07-20 18:30:37 -0700774 mDevice->waitUntilDrained();
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700775 // no break
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700776 case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
777 SharedParameters::Lock l(mParameters);
778 l.mParameters.state = Parameters::STOPPED;
779 commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700780 break;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700781 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700782 default:
783 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700784 state);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700785 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700786}
787
788bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700789 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700790 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700791 status_t res;
792 if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
793
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700794 SharedParameters::Lock l(mParameters);
795 return l.mParameters.state == Parameters::PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700796}
797
798status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700799 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700800 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700801 status_t res;
802 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
803
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700804 SharedParameters::Lock l(mParameters);
805 switch (l.mParameters.state) {
806 case Parameters::RECORD:
807 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700808 ALOGE("%s: Camera %d: Can't be called in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700809 __FUNCTION__, mCameraId,
810 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700811 return INVALID_OPERATION;
812 default:
813 // OK
814 break;
815 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700816
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700817 l.mParameters.storeMetadataInBuffers = enabled;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700818
819 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700820}
821
822status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700823 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700824 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700825 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700826 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700827 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700828 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700829
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700830 return startRecordingL(l.mParameters, false);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700831}
832
833status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
834 status_t res;
835 switch (params.state) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700836 case Parameters::STOPPED:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700837 res = startPreviewL(params, false);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700838 if (res != OK) return res;
839 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700840 case Parameters::PREVIEW:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700841 // Ready to go
842 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700843 case Parameters::RECORD:
844 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700845 // OK to call this when recording is already on, just skip unless
846 // we're looking to restart
847 if (!restart) return OK;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700848 break;
849 default:
850 ALOGE("%s: Camera %d: Can't start recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700851 __FUNCTION__, mCameraId,
852 Parameters::getStateName(params.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700853 return INVALID_OPERATION;
854 };
855
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700856 if (!params.storeMetadataInBuffers) {
Eino-Ville Talvala78822d72012-07-18 17:52:18 -0700857 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
858 "non-metadata recording mode requested!", __FUNCTION__,
859 mCameraId);
860 return INVALID_OPERATION;
861 }
862
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700863 mCameraService->playSound(CameraService::SOUND_RECORDING);
864
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700865 res = updateRecordingStream(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700866 if (res != OK) {
867 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
868 __FUNCTION__, mCameraId, strerror(-res), res);
869 return res;
870 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700871 bool callbacksEnabled = params.previewCallbackFlags &
872 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
873 if (callbacksEnabled) {
Eino-Ville Talvala28639182012-08-28 11:34:14 -0700874 res = mCallbackProcessor->updateStream(params);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700875 if (res != OK) {
876 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
877 __FUNCTION__, mCameraId, strerror(-res), res);
878 return res;
879 }
880 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700881
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700882 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700883 res = updateRecordingRequest(params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700884 if (res != OK) {
885 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
886 __FUNCTION__, mCameraId, strerror(-res), res);
887 return res;
888 }
889 }
890
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700891 if (callbacksEnabled) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700892 uint8_t outputStreams[3] ={
893 getPreviewStreamId(),
894 getRecordingStreamId(),
895 getCallbackStreamId()
896 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700897 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700898 ANDROID_REQUEST_OUTPUT_STREAMS,
899 outputStreams, 3);
900 } else {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -0700901 uint8_t outputStreams[2] = {
902 getPreviewStreamId(),
903 getRecordingStreamId()
904 };
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700905 res = mRecordingRequest.update(
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700906 ANDROID_REQUEST_OUTPUT_STREAMS,
907 outputStreams, 2);
908 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700909 if (res != OK) {
910 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
911 __FUNCTION__, mCameraId, strerror(-res), res);
912 return res;
913 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700914 res = mRecordingRequest.sort();
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700915 if (res != OK) {
916 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
917 __FUNCTION__, mCameraId, strerror(-res), res);
918 return res;
919 }
920
921 res = mDevice->setStreamingRequest(mRecordingRequest);
922 if (res != OK) {
923 ALOGE("%s: Camera %d: Unable to set recording request to start "
924 "recording: %s (%d)", __FUNCTION__, mCameraId,
925 strerror(-res), res);
926 return res;
927 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700928 if (params.state < Parameters::RECORD) {
929 params.state = Parameters::RECORD;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700930 }
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700931
932 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700933}
934
935void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700936 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -0700937 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700938 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700939 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700940
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700941 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700942 if ( (res = checkPid(__FUNCTION__) ) != OK) return;
943
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700944 switch (l.mParameters.state) {
945 case Parameters::RECORD:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700946 // OK to stop
947 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700948 case Parameters::STOPPED:
949 case Parameters::PREVIEW:
950 case Parameters::STILL_CAPTURE:
951 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700952 default:
953 ALOGE("%s: Camera %d: Can't stop recording in state %s",
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700954 __FUNCTION__, mCameraId,
955 Parameters::getStateName(l.mParameters.state));
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700956 return;
957 };
958
Eino-Ville Talvala33578832012-09-06 18:26:58 -0700959 mCameraService->playSound(CameraService::SOUND_RECORDING);
960
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700961 res = startPreviewL(l.mParameters, true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700962 if (res != OK) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -0700963 ALOGE("%s: Camera %d: Unable to return to preview",
964 __FUNCTION__, mCameraId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700965 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700966}
967
968bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700969 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700970 Mutex::Autolock icl(mICameraLock);
James Dong8da4cd72012-08-04 19:58:07 -0700971
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700972 if ( checkPid(__FUNCTION__) != OK) return false;
973
James Dong8da4cd72012-08-04 19:58:07 -0700974 return recordingEnabledL();
975}
976
977bool Camera2Client::recordingEnabledL() {
978 ATRACE_CALL();
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700979 SharedParameters::Lock l(mParameters);
James Dong8da4cd72012-08-04 19:58:07 -0700980
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700981 return (l.mParameters.state == Parameters::RECORD
982 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700983}
984
985void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700986 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700987 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700988 status_t res;
989 if ( checkPid(__FUNCTION__) != OK) return;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700990
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700991 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700992
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700993 // Make sure this is for the current heap
994 ssize_t offset;
995 size_t size;
996 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
997 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
998 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
999 "(got %x, expected %x)", __FUNCTION__, mCameraId,
1000 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
1001 return;
1002 }
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001003 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1004 uint32_t type = *(uint32_t*)data;
1005 if (type != kMetadataBufferTypeGrallocSource) {
1006 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
1007 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
1008 return;
1009 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001010
1011 // Release the buffer back to the recording queue
1012
1013 buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
1014
1015 size_t itemIndex;
1016 for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
1017 const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
1018 if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
1019 item.mGraphicBuffer->handle == imgHandle) {
1020 break;
1021 }
1022 }
1023 if (itemIndex == mRecordingBuffers.size()) {
1024 ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
1025 "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
1026 return;
1027 }
1028
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001029 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001030 imgHandle);
1031
1032 res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001033 if (res != OK) {
1034 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
1035 "%s (%d)",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001036 __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001037 return;
1038 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001039 mRecordingBuffers.replaceAt(itemIndex);
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001040
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001041 mRecordingHeapFree++;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001042}
1043
1044status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001045 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001046 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001047 status_t res;
1048 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1049
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001050 int triggerId;
1051 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001052 SharedParameters::Lock l(mParameters);
1053 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1054 triggerId = l.mParameters.currentAfTriggerId;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001055 }
1056
1057 mDevice->triggerAutofocus(triggerId);
1058
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001059 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001060}
1061
1062status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001063 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001064 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001065 status_t res;
1066 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1067
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001068 int triggerId;
1069 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001070 SharedParameters::Lock l(mParameters);
1071 triggerId = ++l.mParameters.afTriggerCounter;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001072 }
1073
1074 mDevice->triggerCancelAutofocus(triggerId);
1075
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001076 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001077}
1078
1079status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001080 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001081 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001082 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001083 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001084
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001085 SharedParameters::Lock l(mParameters);
1086 switch (l.mParameters.state) {
1087 case Parameters::DISCONNECTED:
1088 case Parameters::STOPPED:
1089 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001090 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1091 __FUNCTION__, mCameraId);
1092 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001093 case Parameters::PREVIEW:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001094 // Good to go for takePicture
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001095 res = commandStopFaceDetectionL(l.mParameters);
1096 if (res != OK) {
1097 ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1098 __FUNCTION__, mCameraId);
1099 return res;
1100 }
1101 l.mParameters.state = Parameters::STILL_CAPTURE;
1102 break;
1103 case Parameters::RECORD:
1104 // Good to go for video snapshot
1105 l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001106 break;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001107 case Parameters::STILL_CAPTURE:
1108 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001109 ALOGE("%s: Camera %d: Already taking a picture",
1110 __FUNCTION__, mCameraId);
1111 return INVALID_OPERATION;
1112 }
1113
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001114 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001115
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001116 res = mJpegProcessor->updateStream(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001117 if (res != OK) {
1118 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1119 __FUNCTION__, mCameraId, strerror(-res), res);
1120 return res;
1121 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001122
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001123 res = mCaptureSequencer->startCapture();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001124 if (res != OK) {
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001125 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001126 __FUNCTION__, mCameraId, strerror(-res), res);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001127 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001128
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001129 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001130}
1131
1132status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001133 ATRACE_CALL();
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001134 ALOGV("%s: E", __FUNCTION__);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001135 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001136 status_t res;
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001137 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1138
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001139 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001140
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001141 res = l.mParameters.set(params);
1142 if (res != OK) return res;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001143
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001144 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001145
1146 return res;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001147}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001148
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001149String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001150 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001151 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001152 if ( checkPid(__FUNCTION__) != OK) return String8();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001153
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001154 SharedParameters::ReadLock l(mParameters);
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001155
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001156 // TODO: Deal with focus distances
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001157 return l.mParameters.paramsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001158}
1159
1160status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001161 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001162 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala3a609142012-07-31 14:36:26 -07001163 status_t res;
1164 if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001165
1166 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1167 cmd, arg1, arg2);
1168
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001169 switch (cmd) {
1170 case CAMERA_CMD_START_SMOOTH_ZOOM:
1171 return commandStartSmoothZoomL();
1172 case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1173 return commandStopSmoothZoomL();
1174 case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1175 return commandSetDisplayOrientationL(arg1);
1176 case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1177 return commandEnableShutterSoundL(arg1 == 1);
1178 case CAMERA_CMD_PLAY_RECORDING_SOUND:
1179 return commandPlayRecordingSoundL();
1180 case CAMERA_CMD_START_FACE_DETECTION:
1181 return commandStartFaceDetectionL(arg1);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001182 case CAMERA_CMD_STOP_FACE_DETECTION: {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001183 SharedParameters::Lock l(mParameters);
1184 return commandStopFaceDetectionL(l.mParameters);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001185 }
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001186 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1187 return commandEnableFocusMoveMsgL(arg1 == 1);
1188 case CAMERA_CMD_PING:
1189 return commandPingL();
1190 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1191 return commandSetVideoBufferCountL(arg1);
1192 default:
1193 ALOGE("%s: Unknown command %d (arguments %d, %d)",
1194 __FUNCTION__, cmd, arg1, arg2);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001195 return BAD_VALUE;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001196 }
1197}
James Dong983cf232012-08-01 16:39:55 -07001198
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001199status_t Camera2Client::commandStartSmoothZoomL() {
1200 ALOGE("%s: Unimplemented!", __FUNCTION__);
1201 return OK;
1202}
James Dong983cf232012-08-01 16:39:55 -07001203
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001204status_t Camera2Client::commandStopSmoothZoomL() {
1205 ALOGE("%s: Unimplemented!", __FUNCTION__);
1206 return OK;
1207}
James Dong983cf232012-08-01 16:39:55 -07001208
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001209status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001210 int transform = Parameters::degToTransform(degrees,
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001211 mCameraFacing == CAMERA_FACING_FRONT);
1212 if (transform == -1) {
1213 ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1214 __FUNCTION__, mCameraId, degrees);
1215 return BAD_VALUE;
1216 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001217 SharedParameters::Lock l(mParameters);
1218 if (transform != l.mParameters.previewTransform &&
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001219 mPreviewStreamId != NO_STREAM) {
1220 mDevice->setStreamTransform(mPreviewStreamId, transform);
1221 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001222 l.mParameters.previewTransform = transform;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001223 return OK;
1224}
1225
1226status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001227 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001228 if (enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001229 l.mParameters.playShutterSound = true;
James Dong983cf232012-08-01 16:39:55 -07001230 return OK;
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001231 }
1232
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001233 // Disabling shutter sound may not be allowed. In that case only
1234 // allow the mediaserver process to disable the sound.
1235 char value[PROPERTY_VALUE_MAX];
1236 property_get("ro.camera.sound.forced", value, "0");
1237 if (strncmp(value, "0", 2) != 0) {
1238 // Disabling shutter sound is not allowed. Deny if the current
1239 // process is not mediaserver.
1240 if (getCallingPid() != getpid()) {
1241 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1242 getCallingPid());
1243 return PERMISSION_DENIED;
1244 }
1245 }
1246
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001247 l.mParameters.playShutterSound = false;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001248 return OK;
1249}
1250
1251status_t Camera2Client::commandPlayRecordingSoundL() {
1252 mCameraService->playSound(CameraService::SOUND_RECORDING);
1253 return OK;
1254}
1255
1256status_t Camera2Client::commandStartFaceDetectionL(int type) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001257 ALOGV("%s: Camera %d: Starting face detection",
1258 __FUNCTION__, mCameraId);
1259 status_t res;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001260 SharedParameters::Lock l(mParameters);
1261 switch (l.mParameters.state) {
1262 case Parameters::DISCONNECTED:
1263 case Parameters::STOPPED:
1264 case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1265 case Parameters::STILL_CAPTURE:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001266 ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1267 __FUNCTION__, mCameraId);
1268 return INVALID_OPERATION;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001269 case Parameters::PREVIEW:
1270 case Parameters::RECORD:
1271 case Parameters::VIDEO_SNAPSHOT:
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001272 // Good to go for starting face detect
1273 break;
1274 }
1275 // Ignoring type
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001276 if (l.mParameters.fastInfo.bestFaceDetectMode ==
1277 ANDROID_STATS_FACE_DETECTION_OFF) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001278 ALOGE("%s: Camera %d: Face detection not supported",
1279 __FUNCTION__, mCameraId);
1280 return INVALID_OPERATION;
1281 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001282 if (l.mParameters.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001283
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001284 l.mParameters.enableFaceDetect = true;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001285
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001286 res = updateRequests(l.mParameters);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001287
1288 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001289}
1290
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001291status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001292 status_t res = OK;
1293 ALOGV("%s: Camera %d: Stopping face detection",
1294 __FUNCTION__, mCameraId);
1295
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001296 if (!params.enableFaceDetect) return OK;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001297
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001298 params.enableFaceDetect = false;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001299
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001300 if (params.state == Parameters::PREVIEW
1301 || params.state == Parameters::RECORD
1302 || params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001303 res = updateRequests(params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001304 }
1305
1306 return res;
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001307}
1308
1309status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001310 SharedParameters::Lock l(mParameters);
1311 l.mParameters.enableFocusMoveMessages = enable;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001312
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001313 return OK;
1314}
1315
1316status_t Camera2Client::commandPingL() {
1317 // Always ping back if access is proper and device is alive
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001318 SharedParameters::Lock l(mParameters);
1319 if (l.mParameters.state != Parameters::DISCONNECTED) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001320 return OK;
1321 } else {
1322 return NO_INIT;
1323 }
1324}
1325
1326status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
James Dong8da4cd72012-08-04 19:58:07 -07001327 if (recordingEnabledL()) {
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -07001328 ALOGE("%s: Camera %d: Error setting video buffer count after "
1329 "recording was started", __FUNCTION__, mCameraId);
1330 return INVALID_OPERATION;
1331 }
1332
1333 // 32 is the current upper limit on the video buffer count for BufferQueue
1334 if (count > 32) {
1335 ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1336 __FUNCTION__, mCameraId, count);
1337 return BAD_VALUE;
1338 }
1339
1340 // Need to reallocate memory for heap
1341 if (mRecordingHeapCount != count) {
1342 if (mRecordingHeap != 0) {
1343 mRecordingHeap.clear();
1344 mRecordingHeap = NULL;
1345 }
1346 mRecordingHeapCount = count;
1347 }
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001348
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001349 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001350}
1351
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001352/** Device-related methods */
1353
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001354void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1355 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1356}
1357
1358void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1359 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1360 frameNumber, timestamp);
1361}
1362
1363void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1364 ALOGV("%s: Autofocus state now %d, last trigger %d",
1365 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001366 bool sendCompletedMessage = false;
1367 bool sendMovingMessage = false;
1368
1369 bool success = false;
1370 bool afInMotion = false;
1371 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001372 SharedParameters::Lock l(mParameters);
1373 switch (l.mParameters.focusMode) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001374 case Parameters::FOCUS_MODE_AUTO:
1375 case Parameters::FOCUS_MODE_MACRO:
1376 // Don't send notifications upstream if they're not for the current AF
1377 // trigger. For example, if cancel was called in between, or if we
1378 // already sent a notification about this AF call.
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001379 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001380 switch (newState) {
1381 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1382 success = true;
1383 // no break
1384 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1385 sendCompletedMessage = true;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001386 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001387 break;
1388 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1389 // Just starting focusing, ignore
1390 break;
1391 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1392 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1393 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1394 default:
1395 // Unexpected in AUTO/MACRO mode
1396 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1397 __FUNCTION__, newState);
1398 break;
1399 }
1400 break;
1401 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1402 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1403 switch (newState) {
1404 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1405 success = true;
1406 // no break
1407 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1408 // Don't send notifications upstream if they're not for
1409 // the current AF trigger. For example, if cancel was
1410 // called in between, or if we already sent a
1411 // notification about this AF call.
1412 // Send both a 'AF done' callback and a 'AF move' callback
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001413 if (triggerId != l.mParameters.currentAfTriggerId) break;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001414 sendCompletedMessage = true;
1415 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001416 if (l.mParameters.enableFocusMoveMessages &&
1417 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001418 sendMovingMessage = true;
1419 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001420 l.mParameters.currentAfTriggerId = -1;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001421 break;
1422 case ANDROID_CONTROL_AF_STATE_INACTIVE:
1423 // Cancel was called, or we switched state; care if
1424 // currently moving
1425 afInMotion = false;
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001426 if (l.mParameters.enableFocusMoveMessages &&
1427 l.mParameters.afInMotion) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001428 sendMovingMessage = true;
1429 }
1430 break;
1431 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1432 // Start passive scan, inform upstream
1433 afInMotion = true;
1434 // no break
1435 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1436 // Stop passive scan, inform upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001437 if (l.mParameters.enableFocusMoveMessages) {
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001438 sendMovingMessage = true;
1439 }
1440 break;
1441 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001442 l.mParameters.afInMotion = afInMotion;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001443 break;
1444 case Parameters::FOCUS_MODE_EDOF:
1445 case Parameters::FOCUS_MODE_INFINITY:
1446 case Parameters::FOCUS_MODE_FIXED:
1447 default:
1448 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001449 ALOGE("%s: Unexpected AF state change %d "
1450 "(ID %d) in focus mode %d",
1451 __FUNCTION__, newState, triggerId,
1452 l.mParameters.focusMode);
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001453 }
1454 }
1455 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001456 if (sendMovingMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001457 SharedCameraClient::Lock l(mSharedCameraClient);
1458 if (l.mCameraClient != 0) {
1459 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001460 afInMotion ? 1 : 0, 0);
1461 }
Eino-Ville Talvala174181e2012-08-03 13:53:39 -07001462 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001463 if (sendCompletedMessage) {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001464 SharedCameraClient::Lock l(mSharedCameraClient);
1465 if (l.mCameraClient != 0) {
1466 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1467 success ? 1 : 0, 0);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001468 }
Eino-Ville Talvala603b12e2012-08-08 09:25:58 -07001469 }
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001470}
1471
1472void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1473 ALOGV("%s: Autoexposure state now %d, last trigger %d",
1474 __FUNCTION__, newState, triggerId);
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001475 mCaptureSequencer->notifyAutoExposure(newState, triggerId);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -07001476}
1477
1478void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1479 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1480 __FUNCTION__, newState, triggerId);
1481}
1482
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001483int Camera2Client::getCameraId() const {
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001484 return mCameraId;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001485}
1486
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001487const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1488 return mDevice;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001489}
1490
Eino-Ville Talvala33578832012-09-06 18:26:58 -07001491const sp<CameraService>& Camera2Client::getCameraService() {
1492 return mCameraService;
1493}
1494
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001495camera2::SharedParameters& Camera2Client::getParameters() {
1496 return mParameters;
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001497}
1498
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001499int Camera2Client::getPreviewStreamId() const {
1500 return mPreviewStreamId;
1501}
1502
1503int Camera2Client::getCaptureStreamId() const {
1504 return mJpegProcessor->getStreamId();
1505}
1506
1507int Camera2Client::getCallbackStreamId() const {
1508 return mCallbackProcessor->getStreamId();
1509}
1510
1511int Camera2Client::getRecordingStreamId() const {
1512 return mRecordingStreamId;
1513}
1514
1515int Camera2Client::getZslStreamId() const {
1516 return mZslProcessor->getStreamId();
1517}
1518
1519status_t Camera2Client::registerFrameListener(int32_t id,
1520 wp<camera2::FrameProcessor::FilteredListener> listener) {
1521 return mFrameProcessor->registerListener(id, listener);
1522}
1523
1524status_t Camera2Client::removeFrameListener(int32_t id) {
1525 return mFrameProcessor->removeListener(id);
1526}
1527
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001528Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1529 mCameraClient(client.mCameraClient),
1530 mSharedClient(client) {
1531 mSharedClient.mCameraClientLock.lock();
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -07001532}
1533
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001534Camera2Client::SharedCameraClient::Lock::~Lock() {
1535 mSharedClient.mCameraClientLock.unlock();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001536}
1537
Eino-Ville Talvala177bd342012-08-28 01:25:43 -07001538Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1539 mCameraClient(client) {
1540}
1541
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001542Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1543 const sp<ICameraClient>&client) {
1544 Mutex::Autolock l(mCameraClientLock);
1545 mCameraClient = client;
1546 return *this;
1547}
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001548
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001549void Camera2Client::SharedCameraClient::clear() {
1550 Mutex::Autolock l(mCameraClientLock);
1551 mCameraClient.clear();
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001552}
1553
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001554const int32_t Camera2Client::kPreviewRequestId;
1555const int32_t Camera2Client::kRecordRequestId;
1556const int32_t Camera2Client::kFirstCaptureRequestId;
1557
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001558void Camera2Client::onRecordingFrameAvailable() {
1559 ATRACE_CALL();
1560 status_t res;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001561 sp<Camera2Heap> recordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001562 size_t heapIdx = 0;
1563 nsecs_t timestamp;
1564 {
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001565 SharedParameters::Lock l(mParameters);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001566
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001567 BufferItemConsumer::BufferItem imgBuffer;
1568 res = mRecordingConsumer->acquireBuffer(&imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001569 if (res != OK) {
1570 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1571 __FUNCTION__, mCameraId, strerror(-res), res);
1572 return;
1573 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001574 timestamp = imgBuffer.mTimestamp;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001575
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001576 mRecordingFrameCount++;
1577 ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1578
1579 // TODO: Signal errors here upstream
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001580 if (l.mParameters.state != Parameters::RECORD &&
1581 l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001582 ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1583 "recording done",
1584 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001585 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001586 return;
1587 }
Eino-Ville Talvala898a9a92012-07-20 11:05:20 -07001588
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001589 if (mRecordingHeap == 0) {
1590 const size_t bufferSize = 4 + sizeof(buffer_handle_t);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001591 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1592 "size %d bytes", __FUNCTION__, mCameraId,
James Dong983cf232012-08-01 16:39:55 -07001593 mRecordingHeapCount, bufferSize);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001594
James Dong983cf232012-08-01 16:39:55 -07001595 mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001596 "Camera2Client::RecordingHeap");
1597 if (mRecordingHeap->mHeap->getSize() == 0) {
1598 ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1599 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001600 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001601 return;
1602 }
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001603 for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
1604 if (mRecordingBuffers[i].mBuf !=
1605 BufferItemConsumer::INVALID_BUFFER_SLOT) {
1606 ALOGE("%s: Camera %d: Non-empty recording buffers list!",
1607 __FUNCTION__, mCameraId);
1608 }
1609 }
1610 mRecordingBuffers.clear();
1611 mRecordingBuffers.setCapacity(mRecordingHeapCount);
1612 mRecordingBuffers.insertAt(0, mRecordingHeapCount);
1613
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001614 mRecordingHeapHead = 0;
James Dong983cf232012-08-01 16:39:55 -07001615 mRecordingHeapFree = mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001616 }
1617
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001618 if ( mRecordingHeapFree == 0) {
1619 ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1620 __FUNCTION__, mCameraId);
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001621 mRecordingConsumer->releaseBuffer(imgBuffer);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001622 return;
1623 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001624
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001625 heapIdx = mRecordingHeapHead;
James Dong983cf232012-08-01 16:39:55 -07001626 mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001627 mRecordingHeapFree--;
1628
1629 ALOGV("%s: Camera %d: Timestamp %lld",
1630 __FUNCTION__, mCameraId, timestamp);
1631
1632 ssize_t offset;
1633 size_t size;
1634 sp<IMemoryHeap> heap =
1635 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1636 &size);
1637
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001638 uint8_t *data = (uint8_t*)heap->getBase() + offset;
1639 uint32_t type = kMetadataBufferTypeGrallocSource;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001640 *((uint32_t*)data) = type;
1641 *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001642 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001643 __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
1644 mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001645 recordingHeap = mRecordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001646 }
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001647
1648 // Call outside locked parameters to allow re-entrancy from notification
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -07001649 SharedCameraClient::Lock l(mSharedCameraClient);
1650 if (l.mCameraClient != 0) {
1651 l.mCameraClient->dataCallbackTimestamp(timestamp,
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001652 CAMERA_MSG_VIDEO_FRAME,
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001653 recordingHeap->mBuffers[heapIdx]);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001654 }
1655}
1656
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001657/** Utility methods */
1658
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001659status_t Camera2Client::updateRequests(Parameters &params) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001660 status_t res;
1661
1662 res = updatePreviewRequest(params);
1663 if (res != OK) {
1664 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1665 __FUNCTION__, mCameraId, strerror(-res), res);
1666 return res;
1667 }
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001668 res = updateRecordingRequest(params);
1669 if (res != OK) {
1670 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1671 __FUNCTION__, mCameraId, strerror(-res), res);
1672 return res;
1673 }
1674
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001675 if (params.state == Parameters::PREVIEW) {
Eino-Ville Talvalaf98cbbe2012-08-29 18:06:32 -07001676 res = startPreviewL(params, true);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001677 if (res != OK) {
1678 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1679 __FUNCTION__, mCameraId, strerror(-res), res);
1680 return res;
1681 }
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -07001682 } else if (params.state == Parameters::RECORD ||
1683 params.state == Parameters::VIDEO_SNAPSHOT) {
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001684 res = mDevice->setStreamingRequest(mRecordingRequest);
1685 if (res != OK) {
1686 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1687 __FUNCTION__, mCameraId, strerror(-res), res);
1688 return res;
1689 }
1690 }
1691 return res;
1692}
1693
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001694status_t Camera2Client::updatePreviewStream(const Parameters &params) {
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001695 ATRACE_CALL();
1696 status_t res;
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001697
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001698 if (mPreviewStreamId != NO_STREAM) {
1699 // Check if stream parameters have to change
1700 uint32_t currentWidth, currentHeight;
1701 res = mDevice->getStreamInfo(mPreviewStreamId,
1702 &currentWidth, &currentHeight, 0);
1703 if (res != OK) {
1704 ALOGE("%s: Camera %d: Error querying preview stream info: "
1705 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1706 return res;
1707 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001708 if (currentWidth != (uint32_t)params.previewWidth ||
1709 currentHeight != (uint32_t)params.previewHeight) {
Eino-Ville Talvala9e4c3db2012-07-20 11:07:52 -07001710 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
1711 __FUNCTION__, mCameraId, currentWidth, currentHeight,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001712 params.previewWidth, params.previewHeight);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001713 res = mDevice->waitUntilDrained();
1714 if (res != OK) {
1715 ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1716 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1717 return res;
1718 }
1719 res = mDevice->deleteStream(mPreviewStreamId);
1720 if (res != OK) {
1721 ALOGE("%s: Camera %d: Unable to delete old output stream "
1722 "for preview: %s (%d)", __FUNCTION__, mCameraId,
1723 strerror(-res), res);
1724 return res;
1725 }
1726 mPreviewStreamId = NO_STREAM;
1727 }
1728 }
1729
1730 if (mPreviewStreamId == NO_STREAM) {
1731 res = mDevice->createStream(mPreviewWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001732 params.previewWidth, params.previewHeight,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001733 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1734 &mPreviewStreamId);
1735 if (res != OK) {
1736 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1737 __FUNCTION__, mCameraId, strerror(-res), res);
1738 return res;
1739 }
1740 }
1741
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001742 res = mDevice->setStreamTransform(mPreviewStreamId,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001743 params.previewTransform);
Eino-Ville Talvalac94cd192012-06-15 12:47:42 -07001744 if (res != OK) {
1745 ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1746 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1747 return res;
1748 }
1749
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001750 return OK;
1751}
1752
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001753status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001754 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001755 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001756 if (mPreviewRequest.entryCount() == 0) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001757 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1758 &mPreviewRequest);
1759 if (res != OK) {
1760 ALOGE("%s: Camera %d: Unable to create default preview request: "
1761 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1762 return res;
1763 }
1764 }
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001765
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001766 res = params.updateRequest(&mPreviewRequest);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001767 if (res != OK) {
1768 ALOGE("%s: Camera %d: Unable to update common entries of preview "
1769 "request: %s (%d)", __FUNCTION__, mCameraId,
1770 strerror(-res), res);
1771 return res;
1772 }
1773
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001774 res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1775 &kPreviewRequestId, 1);
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -07001776
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001777 return OK;
1778}
1779
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001780status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001781 ATRACE_CALL();
1782 status_t res;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001783 if (mRecordingRequest.entryCount() == 0) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001784 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
1785 &mRecordingRequest);
1786 if (res != OK) {
1787 ALOGE("%s: Camera %d: Unable to create default recording request:"
1788 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1789 return res;
1790 }
1791 }
1792
Eino-Ville Talvala69230df2012-08-29 17:37:16 -07001793 res = params.updateRequest(&mRecordingRequest);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001794 if (res != OK) {
1795 ALOGE("%s: Camera %d: Unable to update common entries of recording "
1796 "request: %s (%d)", __FUNCTION__, mCameraId,
1797 strerror(-res), res);
1798 return res;
1799 }
1800
1801 return OK;
1802}
1803
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001804status_t Camera2Client::updateRecordingStream(const Parameters &params) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001805 status_t res;
1806
1807 if (mRecordingConsumer == 0) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001808 // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1809 // always acquire and free a buffer when the heap is full; otherwise the consumer
1810 // will have buffers in flight we'll never clear out.
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -07001811 mRecordingConsumer = new BufferItemConsumer(
1812 GRALLOC_USAGE_HW_VIDEO_ENCODER,
1813 mRecordingHeapCount + 1,
1814 true);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001815 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
1816 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
1817 mRecordingWindow = new SurfaceTextureClient(
1818 mRecordingConsumer->getProducerInterface());
1819 // Allocate memory later, since we don't know buffer size until receipt
1820 }
1821
1822 if (mRecordingStreamId != NO_STREAM) {
1823 // Check if stream parameters have to change
1824 uint32_t currentWidth, currentHeight;
1825 res = mDevice->getStreamInfo(mRecordingStreamId,
1826 &currentWidth, &currentHeight, 0);
1827 if (res != OK) {
1828 ALOGE("%s: Camera %d: Error querying recording output stream info: "
1829 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1830 return res;
1831 }
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001832 if (currentWidth != (uint32_t)params.videoWidth ||
1833 currentHeight != (uint32_t)params.videoHeight) {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001834 // TODO: Should wait to be sure previous recording has finished
1835 res = mDevice->deleteStream(mRecordingStreamId);
1836 if (res != OK) {
1837 ALOGE("%s: Camera %d: Unable to delete old output stream "
1838 "for recording: %s (%d)", __FUNCTION__, mCameraId,
1839 strerror(-res), res);
1840 return res;
1841 }
1842 mRecordingStreamId = NO_STREAM;
1843 }
1844 }
1845
1846 if (mRecordingStreamId == NO_STREAM) {
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001847 mRecordingFrameCount = 0;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001848 res = mDevice->createStream(mRecordingWindow,
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -07001849 params.videoWidth, params.videoHeight,
Eino-Ville Talvala78822d72012-07-18 17:52:18 -07001850 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -07001851 if (res != OK) {
1852 ALOGE("%s: Camera %d: Can't create output stream for recording: "
1853 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1854 return res;
1855 }
1856 }
1857
1858 return OK;
1859}
1860
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001861size_t Camera2Client::calculateBufferSize(int width, int height,
1862 int format, int stride) {
1863 switch (format) {
1864 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1865 return width * height * 2;
1866 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1867 return width * height * 3 / 2;
1868 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1869 return width * height * 2;
1870 case HAL_PIXEL_FORMAT_YV12: { // YV12
1871 size_t ySize = stride * height;
Eino-Ville Talvalaf17b6cf2012-08-25 17:12:18 -07001872 size_t uvStride = (stride / 2 + 0xF) & ~0xF;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -07001873 size_t uvSize = uvStride * height / 2;
1874 return ySize + uvSize * 2;
1875 }
1876 case HAL_PIXEL_FORMAT_RGB_565:
1877 return width * height * 2;
1878 case HAL_PIXEL_FORMAT_RGBA_8888:
1879 return width * height * 4;
1880 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1881 return width * height * 2;
1882 default:
1883 ALOGE("%s: Unknown preview format: %x",
1884 __FUNCTION__, format);
1885 return 0;
1886 }
1887}
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -07001888
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001889} // namespace android