blob: f33a106ca4ab4c79734bcafee9ab6804cd74a14c [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>
27
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070028#include <math.h>
29
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030#include "Camera2Client.h"
31
32namespace android {
33
34#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
35#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
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 Talvala6db981c2012-05-21 18:54:30 -070054 mState(NOT_INITIALIZED),
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070055 mPreviewStreamId(NO_PREVIEW_STREAM),
56 mPreviewRequest(NULL)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070057{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070058 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070059
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070060 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070061}
62
63status_t Camera2Client::initialize(camera_module_t *module)
64{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070065 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070066 status_t res;
67
68 res = mDevice->initialize(module);
69 if (res != OK) {
70 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
71 __FUNCTION__, mCameraId, strerror(-res), res);
72 return NO_INIT;
73 }
74
75 res = buildDefaultParameters();
76 if (res != OK) {
77 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
78 __FUNCTION__, mCameraId, strerror(-res), res);
79 return NO_INIT;
80 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070081
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070082 if (gLogLevel >= 1) {
83 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
84 mCameraId);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070085 ALOGD("%s", mParamsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070086 }
87
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070088 mState = STOPPED;
89
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070090 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070091}
92
93Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070094 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070095 mDestructionStarted = true;
96
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070097 disconnect();
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070098
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070099}
100
101status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700102 String8 result;
103 result.appendFormat("Client2[%d] (%p) PID: %d:\n",
104 mCameraId,
105 getCameraClient()->asBinder().get(),
106 mClientPid);
107 write(fd, result.string(), result.size());
108 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700109}
110
111// ICamera interface
112
113void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700114 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700115 if (mDevice == 0) return;
116
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700117 stopPreview();
118
119 if (mPreviewStreamId != NO_PREVIEW_STREAM) {
120 mDevice->deleteStream(mPreviewStreamId);
121 mPreviewStreamId = NO_PREVIEW_STREAM;
122 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700123
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700124 CameraService::Client::disconnect();
125}
126
127status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700128 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700129 return BAD_VALUE;
130}
131
132status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700133 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700134 return BAD_VALUE;
135}
136
137status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700138 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700139 return BAD_VALUE;
140}
141
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700142status_t Camera2Client::setPreviewDisplay(
143 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700144 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700145 if (mState == PREVIEW) return INVALID_OPERATION;
146
147 sp<IBinder> binder;
148 sp<ANativeWindow> window;
149 if (surface != 0) {
150 binder = surface->asBinder();
151 window = surface;
152 }
153
154 return setPreviewWindow(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700155}
156
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700157status_t Camera2Client::setPreviewTexture(
158 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700159 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700160 if (mState == PREVIEW) return INVALID_OPERATION;
161
162 sp<IBinder> binder;
163 sp<ANativeWindow> window;
164 if (surfaceTexture != 0) {
165 binder = surfaceTexture->asBinder();
166 window = new SurfaceTextureClient(surfaceTexture);
167 }
168 return setPreviewWindow(binder, window);
169}
170
171status_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
172 const sp<ANativeWindow>& window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700173 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700174 status_t res;
175
176 if (binder == mPreviewSurface) {
177 return NO_ERROR;
178 }
179
180 if (mPreviewStreamId != NO_PREVIEW_STREAM) {
181 res = mDevice->deleteStream(mPreviewStreamId);
182 if (res != OK) {
183 return res;
184 }
185 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700186 res = mDevice->createStream(window,
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700187 mParameters.previewWidth, mParameters.previewHeight,
188 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700189 &mPreviewStreamId);
190 if (res != OK) {
191 return res;
192 }
193
194 if (mState == WAITING_FOR_PREVIEW_WINDOW) {
195 return startPreview();
196 }
197
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700198 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700199}
200
201void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700202 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700203}
204
205status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700206 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700207 status_t res;
208 if (mState == PREVIEW) return INVALID_OPERATION;
209
210 if (mPreviewStreamId == NO_PREVIEW_STREAM) {
211 mState = WAITING_FOR_PREVIEW_WINDOW;
212 return OK;
213 }
214
215 if (mPreviewRequest == NULL) {
216 updatePreviewRequest();
217 }
218
219 uint8_t outputStream = mPreviewStreamId;
220
221 camera_metadata_entry_t outputStreams;
222 res = find_camera_metadata_entry(mPreviewRequest,
223 ANDROID_REQUEST_OUTPUT_STREAMS,
224 &outputStreams);
225 if (res == NAME_NOT_FOUND) {
226 res = add_camera_metadata_entry(mPreviewRequest,
227 ANDROID_REQUEST_OUTPUT_STREAMS,
228 &outputStream, 1);
229 } else if (res == OK) {
230 res = update_camera_metadata_entry(mPreviewRequest,
231 outputStreams.index, &outputStream, 1, NULL);
232 }
233
234 if (res != OK) {
235 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
236 __FUNCTION__, mCameraId, strerror(-res), res);
237 mState = STOPPED;
238 return res;
239 }
240
241 res = mDevice->setStreamingRequest(mPreviewRequest);
242 if (res != OK) {
243 ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
244 __FUNCTION__, mCameraId, strerror(-res), res);
245 mState = STOPPED;
246 return res;
247 }
248 mState = PREVIEW;
249
250 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700251}
252
253void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700254 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700255 if (mState != PREVIEW) return;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700256
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700257 mDevice->setStreamingRequest(NULL);
258 mState = STOPPED;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700259}
260
261bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700262 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700263 return mState == PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700264}
265
266status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700267 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700268 return BAD_VALUE;
269}
270
271status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700272 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700273 return BAD_VALUE;
274}
275
276void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700277 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700278}
279
280bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700281 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700282 return BAD_VALUE;
283}
284
285void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700286 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700287}
288
289status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700290 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700291 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700292}
293
294status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700295 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700296 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700297}
298
299status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700300 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700301 return BAD_VALUE;
302}
303
304status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700305 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700306 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700307}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700308
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700309String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700310 ATRACE_CALL();
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700311 // TODO: Deal with focus distances
312 return mParamsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700313}
314
315status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700316 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700317 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700318}
319
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700320/** Device-related methods */
321
322camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
323 size_t minCount, size_t maxCount) {
324 status_t res;
325 camera_metadata_entry_t entry;
326 res = find_camera_metadata_entry(mDevice->info(),
327 tag,
328 &entry);
329 if (CC_UNLIKELY( res != OK )) {
330 const char* tagSection = get_camera_metadata_section_name(tag);
331 if (tagSection == NULL) tagSection = "<unknown>";
332 const char* tagName = get_camera_metadata_tag_name(tag);
333 if (tagName == NULL) tagName = "<unknown>";
334
335 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
336 tagSection, tagName, tag, strerror(-res), res);
337 entry.count = 0;
338 entry.data.u8 = NULL;
339 } else if (CC_UNLIKELY(
340 (minCount != 0 && entry.count < minCount) ||
341 (maxCount != 0 && entry.count > maxCount) ) ) {
342 const char* tagSection = get_camera_metadata_section_name(tag);
343 if (tagSection == NULL) tagSection = "<unknown>";
344 const char* tagName = get_camera_metadata_tag_name(tag);
345 if (tagName == NULL) tagName = "<unknown>";
346 ALOGE("Malformed static metadata entry '%s.%s' (%x):"
347 "Expected between %d and %d values, but got %d values",
348 tagSection, tagName, tag, minCount, maxCount, entry.count);
349 entry.count = 0;
350 entry.data.u8 = NULL;
351 }
352
353 return entry;
354}
355
356/** Utility methods */
357
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700358
359status_t Camera2Client::buildDefaultParameters() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700360 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700361 status_t res;
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700362 CameraParameters params;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700363
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700364 camera_metadata_entry_t availableProcessedSizes =
365 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
366 if (!availableProcessedSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700367
368 // TODO: Pick more intelligently
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700369 mParameters.previewWidth = availableProcessedSizes.data.i32[0];
370 mParameters.previewHeight = availableProcessedSizes.data.i32[1];
371 mParameters.videoWidth = mParameters.previewWidth;
372 mParameters.videoHeight = mParameters.previewHeight;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700373
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700374 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
375 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
376 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
377 String8::format("%dx%d",
378 mParameters.previewWidth, mParameters.previewHeight));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700379 {
380 String8 supportedPreviewSizes;
381 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
382 if (i != 0) supportedPreviewSizes += ",";
383 supportedPreviewSizes += String8::format("%dx%d",
384 availableProcessedSizes.data.i32[i],
385 availableProcessedSizes.data.i32[i+1]);
386 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700387 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700388 supportedPreviewSizes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700389 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700390 supportedPreviewSizes);
391 }
392
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700393 camera_metadata_entry_t availableFpsRanges =
394 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
395 if (!availableFpsRanges.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700396
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700397 mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
398 mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700399
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700400 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
401 String8::format("%d,%d",
402 mParameters.previewFpsRangeMin,
403 mParameters.previewFpsRangeMax));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700404
405 {
406 String8 supportedPreviewFpsRange;
407 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
408 if (i != 0) supportedPreviewFpsRange += ",";
409 supportedPreviewFpsRange += String8::format("(%d,%d)",
410 availableFpsRanges.data.i32[i],
411 availableFpsRanges.data.i32[i+1]);
412 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700413 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700414 supportedPreviewFpsRange);
415 }
416
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700417 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
418 params.set(CameraParameters::KEY_PREVIEW_FORMAT,
419 formatEnumToString(mParameters.previewFormat)); // NV21
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700420
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700421 camera_metadata_entry_t availableFormats =
422 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
423
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700424 {
425 String8 supportedPreviewFormats;
426 bool addComma = false;
427 for (size_t i=0; i < availableFormats.count; i++) {
428 if (addComma) supportedPreviewFormats += ",";
429 addComma = true;
430 switch (availableFormats.data.i32[i]) {
431 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
432 supportedPreviewFormats += "yuv422sp";
433 break;
434 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
435 supportedPreviewFormats += "yuv420sp";
436 break;
437 case HAL_PIXEL_FORMAT_YCbCr_422_I:
438 supportedPreviewFormats += "yuv422i-yuyv";
439 break;
440 case HAL_PIXEL_FORMAT_YV12:
441 supportedPreviewFormats += "yuv420p";
442 break;
443 case HAL_PIXEL_FORMAT_RGB_565:
444 supportedPreviewFormats += "rgb565";
445 break;
446 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
447 case HAL_PIXEL_FORMAT_RAW_SENSOR:
448 addComma = false;
449 break;
450 default:
451 ALOGW("%s: Camera %d: Unknown preview format: %x",
452 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
453 addComma = false;
454 break;
455 }
456 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700457 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700458 supportedPreviewFormats);
459 }
460
461 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
462 // still have to do something sane for them
463
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700464 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
465 mParameters.previewFpsRangeMin);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700466
467 {
468 String8 supportedPreviewFrameRates;
469 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
470 if (i != 0) supportedPreviewFrameRates += ",";
471 supportedPreviewFrameRates += String8::format("%d",
472 availableFpsRanges.data.i32[i]);
473 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700474 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700475 supportedPreviewFrameRates);
476 }
477
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700478 camera_metadata_entry_t availableJpegSizes =
479 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
480 if (!availableJpegSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700481
482 // TODO: Pick maximum
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700483 mParameters.pictureWidth = availableJpegSizes.data.i32[0];
484 mParameters.pictureHeight = availableJpegSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700485
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700486 params.setPictureSize(mParameters.pictureWidth,
487 mParameters.pictureHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700488
489 {
490 String8 supportedPictureSizes;
491 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
492 if (i != 0) supportedPictureSizes += ",";
493 supportedPictureSizes += String8::format("%dx%d",
494 availableJpegSizes.data.i32[i],
495 availableJpegSizes.data.i32[i+1]);
496 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700497 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700498 supportedPictureSizes);
499 }
500
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700501 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
502 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
503 CameraParameters::PIXEL_FORMAT_JPEG);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700504
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700505 camera_metadata_entry_t availableJpegThumbnailSizes =
506 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
507 if (!availableJpegThumbnailSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700508
509 // TODO: Pick default thumbnail size sensibly
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700510 mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
511 mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700512
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700513 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
514 mParameters.jpegThumbWidth);
515 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
516 mParameters.jpegThumbHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700517
518 {
519 String8 supportedJpegThumbSizes;
520 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
521 if (i != 0) supportedJpegThumbSizes += ",";
522 supportedJpegThumbSizes += String8::format("%dx%d",
523 availableJpegThumbnailSizes.data.i32[i],
524 availableJpegThumbnailSizes.data.i32[i+1]);
525 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700526 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700527 supportedJpegThumbSizes);
528 }
529
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700530 mParameters.jpegThumbQuality = 90;
531 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
532 mParameters.jpegThumbQuality);
533 mParameters.jpegQuality = 90;
534 params.set(CameraParameters::KEY_JPEG_QUALITY,
535 mParameters.jpegQuality);
536 mParameters.jpegRotation = 0;
537 params.set(CameraParameters::KEY_ROTATION,
538 mParameters.jpegRotation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700539
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700540 mParameters.gpsEnabled = false;
541 mParameters.gpsProcessingMethod = "unknown";
542 // GPS fields in CameraParameters are not set by implementation
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700543
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700544 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
545 params.set(CameraParameters::KEY_WHITE_BALANCE,
546 CameraParameters::WHITE_BALANCE_AUTO);
547
548 camera_metadata_entry_t availableWhiteBalanceModes =
549 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700550 {
551 String8 supportedWhiteBalance;
552 bool addComma = false;
553 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
554 if (addComma) supportedWhiteBalance += ",";
555 addComma = true;
556 switch (availableWhiteBalanceModes.data.u8[i]) {
557 case ANDROID_CONTROL_AWB_AUTO:
558 supportedWhiteBalance += "auto";
559 break;
560 case ANDROID_CONTROL_AWB_INCANDESCENT:
561 supportedWhiteBalance += "incandescent";
562 break;
563 case ANDROID_CONTROL_AWB_FLUORESCENT:
564 supportedWhiteBalance += "fluorescent";
565 break;
566 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
567 supportedWhiteBalance += "warm-fluorescent";
568 break;
569 case ANDROID_CONTROL_AWB_DAYLIGHT:
570 supportedWhiteBalance += "daylight";
571 break;
572 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
573 supportedWhiteBalance += "cloudy-daylight";
574 break;
575 case ANDROID_CONTROL_AWB_TWILIGHT:
576 supportedWhiteBalance += "twilight";
577 break;
578 case ANDROID_CONTROL_AWB_SHADE:
579 supportedWhiteBalance += "shade";
580 break;
581 // Skipping values not mappable to v1 API
582 case ANDROID_CONTROL_AWB_OFF:
583 addComma = false;
584 break;
585 default:
586 ALOGW("%s: Camera %d: Unknown white balance value: %d",
587 __FUNCTION__, mCameraId,
588 availableWhiteBalanceModes.data.u8[i]);
589 addComma = false;
590 break;
591 }
592 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700593 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700594 supportedWhiteBalance);
595 }
596
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700597 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
598 params.set(CameraParameters::KEY_EFFECT,
599 CameraParameters::EFFECT_NONE);
600
601 camera_metadata_entry_t availableEffects =
602 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
603 if (!availableEffects.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700604 {
605 String8 supportedEffects;
606 bool addComma = false;
607 for (size_t i=0; i < availableEffects.count; i++) {
608 if (addComma) supportedEffects += ",";
609 addComma = true;
610 switch (availableEffects.data.u8[i]) {
611 case ANDROID_CONTROL_EFFECT_OFF:
612 supportedEffects += "none";
613 break;
614 case ANDROID_CONTROL_EFFECT_MONO:
615 supportedEffects += "mono";
616 case ANDROID_CONTROL_EFFECT_NEGATIVE:
617 supportedEffects += "negative";
618 break;
619 case ANDROID_CONTROL_EFFECT_SOLARIZE:
620 supportedEffects += "solarize";
621 break;
622 case ANDROID_CONTROL_EFFECT_SEPIA:
623 supportedEffects += "sepia";
624 break;
625 case ANDROID_CONTROL_EFFECT_POSTERIZE:
626 supportedEffects += "posterize";
627 break;
628 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
629 supportedEffects += "whiteboard";
630 break;
631 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
632 supportedEffects += "blackboard";
633 break;
634 case ANDROID_CONTROL_EFFECT_AQUA:
635 supportedEffects += "aqua";
636 break;
637 default:
638 ALOGW("%s: Camera %d: Unknown effect value: %d",
639 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
640 addComma = false;
641 break;
642 }
643 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700644 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700645 }
646
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700647 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
648 params.set(CameraParameters::KEY_ANTIBANDING,
649 CameraParameters::ANTIBANDING_AUTO);
650
651 camera_metadata_entry_t availableAntibandingModes =
652 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
653 if (!availableAntibandingModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700654 {
655 String8 supportedAntibanding;
656 bool addComma = false;
657 for (size_t i=0; i < availableAntibandingModes.count; i++) {
658 if (addComma) supportedAntibanding += ",";
659 addComma = true;
660 switch (availableAntibandingModes.data.u8[i]) {
661 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
662 supportedAntibanding += "off";
663 break;
664 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
665 supportedAntibanding += "50hz";
666 break;
667 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
668 supportedAntibanding += "60hz";
669 break;
670 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
671 supportedAntibanding += "auto";
672 break;
673 default:
674 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
675 __FUNCTION__, mCameraId,
676 availableAntibandingModes.data.u8[i]);
677 addComma = false;
678 break;
679 }
680 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700681 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700682 supportedAntibanding);
683 }
684
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700685 mParameters.sceneMode = ANDROID_CONTROL_OFF;
686 params.set(CameraParameters::KEY_SCENE_MODE,
687 CameraParameters::SCENE_MODE_AUTO);
688
689 camera_metadata_entry_t availableSceneModes =
690 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
691 if (!availableSceneModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700692 {
693 String8 supportedSceneModes("auto");
694 bool addComma = true;
695 bool noSceneModes = false;
696 for (size_t i=0; i < availableSceneModes.count; i++) {
697 if (addComma) supportedSceneModes += ",";
698 addComma = true;
699 switch (availableSceneModes.data.u8[i]) {
700 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
701 noSceneModes = true;
702 break;
703 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
704 // Not in old API
705 addComma = false;
706 break;
707 case ANDROID_CONTROL_SCENE_MODE_ACTION:
708 supportedSceneModes += "action";
709 break;
710 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
711 supportedSceneModes += "portrait";
712 break;
713 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
714 supportedSceneModes += "landscape";
715 break;
716 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
717 supportedSceneModes += "night";
718 break;
719 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
720 supportedSceneModes += "night-portrait";
721 break;
722 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
723 supportedSceneModes += "theatre";
724 break;
725 case ANDROID_CONTROL_SCENE_MODE_BEACH:
726 supportedSceneModes += "beach";
727 break;
728 case ANDROID_CONTROL_SCENE_MODE_SNOW:
729 supportedSceneModes += "snow";
730 break;
731 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
732 supportedSceneModes += "sunset";
733 break;
734 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
735 supportedSceneModes += "steadyphoto";
736 break;
737 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
738 supportedSceneModes += "fireworks";
739 break;
740 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
741 supportedSceneModes += "sports";
742 break;
743 case ANDROID_CONTROL_SCENE_MODE_PARTY:
744 supportedSceneModes += "party";
745 break;
746 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
747 supportedSceneModes += "candlelight";
748 break;
749 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
750 supportedSceneModes += "barcode";
751 break;
752 default:
753 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
754 __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
755 addComma = false;
756 break;
757 }
758 }
759 if (!noSceneModes) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700760 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700761 supportedSceneModes);
762 }
763 }
764
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700765 camera_metadata_entry_t flashAvailable =
766 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
767 if (!flashAvailable.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700768
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700769 camera_metadata_entry_t availableAeModes =
770 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
771 if (!availableAeModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700772
773 if (flashAvailable.data.u8[0]) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700774 mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
775 params.set(CameraParameters::KEY_FLASH_MODE,
776 CameraParameters::FLASH_MODE_AUTO);
777
778 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
779 supportedFlashModes = supportedFlashModes +
780 "," + CameraParameters::FLASH_MODE_AUTO +
781 "," + CameraParameters::FLASH_MODE_ON +
782 "," + CameraParameters::FLASH_MODE_TORCH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700783 for (size_t i=0; i < availableAeModes.count; i++) {
784 if (availableAeModes.data.u8[i] ==
785 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700786 supportedFlashModes = supportedFlashModes + "," +
787 CameraParameters::FLASH_MODE_RED_EYE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700788 break;
789 }
790 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700791 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700792 supportedFlashModes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700793 } else {
794 mParameters.flashMode = Parameters::FLASH_MODE_OFF;
795 params.set(CameraParameters::KEY_FLASH_MODE,
796 CameraParameters::FLASH_MODE_OFF);
797 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
798 CameraParameters::FLASH_MODE_OFF);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700799 }
800
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700801 camera_metadata_entry_t minFocusDistance =
802 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
803 if (!minFocusDistance.count) return NO_INIT;
804
805 camera_metadata_entry_t availableAfModes =
806 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
807 if (!availableAfModes.count) return NO_INIT;
808
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700809 if (minFocusDistance.data.f[0] == 0) {
810 // Fixed-focus lens
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700811 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
812 params.set(CameraParameters::KEY_FOCUS_MODE,
813 CameraParameters::FOCUS_MODE_FIXED);
814 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
815 CameraParameters::FOCUS_MODE_FIXED);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700816 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700817 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
818 params.set(CameraParameters::KEY_FOCUS_MODE,
819 CameraParameters::FOCUS_MODE_AUTO);
820 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
821 supportedFocusModes = supportedFocusModes + "," +
822 CameraParameters::FOCUS_MODE_INFINITY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700823 bool addComma = true;
824 for (size_t i=0; i < availableAfModes.count; i++) {
825 if (addComma) supportedFocusModes += ",";
826 addComma = true;
827 switch (availableAfModes.data.u8[i]) {
828 case ANDROID_CONTROL_AF_AUTO:
829 supportedFocusModes += "auto";
830 break;
831 case ANDROID_CONTROL_AF_MACRO:
832 supportedFocusModes += "macro";
833 break;
834 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
835 supportedFocusModes += "continuous-video";
836 break;
837 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
838 supportedFocusModes += "continuous-picture";
839 break;
840 case ANDROID_CONTROL_AF_EDOF:
841 supportedFocusModes += "edof";
842 break;
843 // Not supported in v1 API
844 case ANDROID_CONTROL_AF_OFF:
845 addComma = false;
846 break;
847 default:
848 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
849 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
850 addComma = false;
851 break;
852 }
853 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700854 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700855 supportedFocusModes);
856 }
857
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700858 camera_metadata_entry_t max3aRegions =
859 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
860 if (!max3aRegions.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700861
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700862 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700863 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700864 params.set(CameraParameters::KEY_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700865 "(0,0,0,0,0)");
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700866 mParameters.focusingAreas.clear();
867 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700868
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700869 camera_metadata_entry_t availableFocalLengths =
870 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
871 if (!availableFocalLengths.count) return NO_INIT;
872
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700873 float minFocalLength = availableFocalLengths.data.f[0];
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700874 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700875
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700876 camera_metadata_entry_t sensorSize =
877 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
878 if (!sensorSize.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700879
880 // The fields of view here assume infinity focus, maximum wide angle
881 float horizFov = 180 / M_PI *
882 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
883 float vertFov = 180 / M_PI *
884 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700885 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
886 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700887
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700888 mParameters.exposureCompensation = 0;
889 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
890 mParameters.exposureCompensation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700891
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700892 camera_metadata_entry_t exposureCompensationRange =
893 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
894 if (!exposureCompensationRange.count) return NO_INIT;
895
896 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700897 exposureCompensationRange.data.i32[1]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700898 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700899 exposureCompensationRange.data.i32[0]);
900
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700901 camera_metadata_entry_t exposureCompensationStep =
902 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
903 if (!exposureCompensationStep.count) return NO_INIT;
904
905 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700906 exposureCompensationStep.data.r[0].numerator /
907 exposureCompensationStep.data.r[0].denominator);
908
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700909 mParameters.autoExposureLock = false;
910 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
911 CameraParameters::FALSE);
912 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
913 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700914
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700915 mParameters.autoWhiteBalanceLock = false;
916 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
917 CameraParameters::FALSE);
918 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
919 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700920
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700921 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
922 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700923 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700924 params.set(CameraParameters::KEY_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700925 "(0,0,0,0,0)");
926
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700927 mParameters.zoom = 0;
928 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
929 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700930
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700931 camera_metadata_entry_t maxDigitalZoom =
932 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
933 if (!maxDigitalZoom.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700934
935 {
936 String8 zoomRatios;
937 float zoom = 1.f;
938 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700939 (NUM_ZOOM_STEPS-1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700940 bool addComma = false;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700941 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700942 if (addComma) zoomRatios += ",";
943 addComma = true;
944 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
945 zoom += zoomIncrement;
946 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700947 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700948 }
949
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700950 params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
951 CameraParameters::TRUE);
952 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
953 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700954
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700955 params.set(CameraParameters::KEY_FOCUS_DISTANCES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700956 "Infinity,Infinity,Infinity");
957
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700958 camera_metadata_entry_t maxFacesDetected =
959 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
960 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700961 maxFacesDetected.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700962 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700963 0);
964
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700965 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
966 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700967
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700968 params.set(CameraParameters::KEY_RECORDING_HINT,
969 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700970
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700971 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
972 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700973
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700974 params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
975 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700976
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700977 camera_metadata_entry_t availableVideoStabilizationModes =
978 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
979 if (!availableVideoStabilizationModes.count) return NO_INIT;
980
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700981 if (availableVideoStabilizationModes.count > 1) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700982 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
983 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700984 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700985 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
986 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700987 }
988
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700989 mParamsFlattened = params.flatten();
990
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700991 return OK;
992}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700993
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700994status_t Camera2Client::updatePreviewRequest() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700995 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700996 status_t res;
997 if (mPreviewRequest == NULL) {
998 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
999 &mPreviewRequest);
1000 if (res != OK) {
1001 ALOGE("%s: Camera %d: Unable to create default preview request: "
1002 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1003 return res;
1004 }
1005 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001006 // TODO: Adjust for params changes
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001007 return OK;
1008}
1009
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001010const char* Camera2Client::formatEnumToString(int format) {
1011 const char *fmt;
1012 switch(format) {
1013 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1014 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
1015 break;
1016 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1017 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
1018 break;
1019 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1020 fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
1021 break;
1022 case HAL_PIXEL_FORMAT_YV12: // YV12
1023 fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
1024 break;
1025 case HAL_PIXEL_FORMAT_RGB_565: // RGB565
1026 fmt = CameraParameters::PIXEL_FORMAT_RGB565;
1027 break;
1028 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888
1029 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
1030 break;
1031 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1032 ALOGW("Raw sensor preview format requested.");
1033 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
1034 break;
1035 default:
1036 ALOGE("%s: Unknown preview format: %x",
1037 __FUNCTION__, format);
1038 fmt = NULL;
1039 break;
1040 }
1041 return fmt;
1042}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001043} // namespace android