Camera2Client.cpp revision f69c70ded4316ea3ee504ac779bd024433ed4ef7
1/*
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"
18//#define LOG_NDEBUG 0
19#include <utils/Log.h>
20
21#include <cutils/properties.h>
22#include <gui/SurfaceTextureClient.h>
23#include <gui/Surface.h>
24
25#include <math.h>
26
27#include "Camera2Client.h"
28
29namespace android {
30
31#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
32#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
33
34#define ALOG1_ENTRY        \
35    int callingPid = getCallingPid(); \
36    ALOG1("%s: E (pid %d, id %d) ", __FUNCTION__, \
37            callingPid, mCameraId)
38
39#define ALOG1_EXIT        \
40    ALOG1("%s: X (pid %d, id %d) ", __FUNCTION__, \
41            callingPid, mCameraId)
42
43static int getCallingPid() {
44    return IPCThreadState::self()->getCallingPid();
45}
46
47static int getCallingUid() {
48    return IPCThreadState::self()->getCallingUid();
49}
50
51// Interface used by CameraService
52
53Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
54        const sp<ICameraClient>& cameraClient,
55        int cameraId,
56        int cameraFacing,
57        int clientPid):
58        Client(cameraService, cameraClient,
59                cameraId, cameraFacing, clientPid),
60        mParams(NULL)
61{
62    ALOG1_ENTRY;
63
64    mDevice = new Camera2Device(cameraId);
65
66    ALOG1_EXIT;
67}
68
69status_t Camera2Client::initialize(camera_module_t *module)
70{
71    ALOG1_ENTRY;
72    status_t res;
73
74    res = mDevice->initialize(module);
75    if (res != OK) {
76        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
77                __FUNCTION__, mCameraId, strerror(-res), res);
78        return NO_INIT;
79    }
80
81    res = buildDefaultParameters();
82    if (res != OK) {
83        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
84                __FUNCTION__, mCameraId, strerror(-res), res);
85        return NO_INIT;
86    }
87    if (gLogLevel >= 1) {
88        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
89              mCameraId);
90        mParams->dump();
91    }
92
93    ALOG1_EXIT;
94    return OK;
95}
96
97Camera2Client::~Camera2Client() {
98    mDestructionStarted = true;
99
100    if (mParams) delete mParams;
101
102    disconnect();
103}
104
105status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
106    return BAD_VALUE;
107}
108
109// ICamera interface
110
111void Camera2Client::disconnect() {
112
113    if (mDevice == 0) return;
114
115    mDevice->setStreamingRequest(NULL);
116
117    CameraService::Client::disconnect();
118}
119
120status_t Camera2Client::connect(const sp<ICameraClient>& client) {
121    return BAD_VALUE;
122}
123
124status_t Camera2Client::lock() {
125    return BAD_VALUE;
126}
127
128status_t Camera2Client::unlock() {
129    return BAD_VALUE;
130}
131
132status_t Camera2Client::setPreviewDisplay(const sp<Surface>& surface) {
133    return BAD_VALUE;
134}
135
136status_t Camera2Client::setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture) {
137    return BAD_VALUE;
138}
139
140void Camera2Client::setPreviewCallbackFlag(int flag) {
141
142}
143
144status_t Camera2Client::startPreview() {
145    return BAD_VALUE;
146}
147
148void Camera2Client::stopPreview() {
149
150}
151
152bool Camera2Client::previewEnabled() {
153    return false;
154}
155
156status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
157    return BAD_VALUE;
158}
159
160status_t Camera2Client::startRecording() {
161    return BAD_VALUE;
162}
163
164void Camera2Client::stopRecording() {
165}
166
167bool Camera2Client::recordingEnabled() {
168    return BAD_VALUE;
169}
170
171void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
172
173}
174
175status_t Camera2Client::autoFocus() {
176    return BAD_VALUE;
177}
178
179status_t Camera2Client::cancelAutoFocus() {
180    return BAD_VALUE;
181}
182
183status_t Camera2Client::takePicture(int msgType) {
184    return BAD_VALUE;
185}
186
187status_t Camera2Client::setParameters(const String8& params) {
188    return BAD_VALUE;
189}
190
191String8 Camera2Client::getParameters() const {
192    return mParams->flatten();
193}
194
195status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
196    return BAD_VALUE;
197}
198
199// private methods
200
201status_t Camera2Client::buildDefaultParameters() {
202    status_t res;
203    if (mParams) {
204        delete mParams;
205    }
206    mParams = new CameraParameters;
207
208    camera_metadata_entry_t availableProcessedSizes;
209    res = find_camera_metadata_entry(mDevice->info(),
210            ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
211            &availableProcessedSizes);
212    if (res != OK) return res;
213    if (availableProcessedSizes.count < 2) {
214        ALOGE("%s: Camera %d: "
215                "Malformed %s entry",
216                __FUNCTION__, mCameraId,
217                get_camera_metadata_tag_name(
218                    ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES));
219        return NO_INIT;
220    }
221
222    // TODO: Pick more intelligently
223    int previewWidth = availableProcessedSizes.data.i32[0];
224    int previewHeight = availableProcessedSizes.data.i32[1];
225
226    mParams->setPreviewSize(previewWidth, previewHeight);
227    mParams->setVideoSize(previewWidth, previewHeight);
228    mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
229            String8::format("%dx%d",previewWidth,previewHeight));
230    {
231        String8 supportedPreviewSizes;
232        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
233            if (i != 0) supportedPreviewSizes += ",";
234            supportedPreviewSizes += String8::format("%dx%d",
235                    availableProcessedSizes.data.i32[i],
236                    availableProcessedSizes.data.i32[i+1]);
237        }
238        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
239                supportedPreviewSizes);
240        mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
241                supportedPreviewSizes);
242    }
243
244    camera_metadata_entry_t availableFpsRanges;
245    res = find_camera_metadata_entry(mDevice->info(),
246            ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
247            &availableFpsRanges);
248    if (res != OK) return res;
249    if (availableFpsRanges.count < 2) {
250        ALOGE("%s: Camera %d: "
251                "Malformed %s entry",
252                __FUNCTION__, mCameraId,
253                get_camera_metadata_tag_name(
254                    ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
255        return NO_INIT;
256    }
257
258    int previewFpsRangeMin = availableFpsRanges.data.i32[0];
259    int previewFpsRangeMax = availableFpsRanges.data.i32[1];
260
261    mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
262            String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax));
263
264    {
265        String8 supportedPreviewFpsRange;
266        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
267            if (i != 0) supportedPreviewFpsRange += ",";
268            supportedPreviewFpsRange += String8::format("(%d,%d)",
269                    availableFpsRanges.data.i32[i],
270                    availableFpsRanges.data.i32[i+1]);
271        }
272        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
273                supportedPreviewFpsRange);
274    }
275
276    mParams->set(CameraParameters::KEY_PREVIEW_FORMAT,
277            "yuv420sp"); // NV21
278
279    camera_metadata_entry_t availableFormats;
280    res = find_camera_metadata_entry(mDevice->info(),
281            ANDROID_SCALER_AVAILABLE_FORMATS,
282            &availableFormats);
283    {
284        String8 supportedPreviewFormats;
285        bool addComma = false;
286        for (size_t i=0; i < availableFormats.count; i++) {
287            if (addComma) supportedPreviewFormats += ",";
288            addComma = true;
289            switch (availableFormats.data.i32[i]) {
290            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
291                supportedPreviewFormats += "yuv422sp";
292                break;
293            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
294                supportedPreviewFormats += "yuv420sp";
295                break;
296            case HAL_PIXEL_FORMAT_YCbCr_422_I:
297                supportedPreviewFormats += "yuv422i-yuyv";
298                break;
299            case HAL_PIXEL_FORMAT_YV12:
300                supportedPreviewFormats += "yuv420p";
301                break;
302            case HAL_PIXEL_FORMAT_RGB_565:
303                supportedPreviewFormats += "rgb565";
304                break;
305                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
306            case HAL_PIXEL_FORMAT_RAW_SENSOR:
307                addComma = false;
308                break;
309            default:
310                ALOGW("%s: Camera %d: Unknown preview format: %x",
311                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
312                addComma = false;
313                break;
314            }
315        }
316        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
317                supportedPreviewFormats);
318    }
319
320    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
321    // still have to do something sane for them
322
323    mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
324            previewFpsRangeMin);
325
326    {
327        String8 supportedPreviewFrameRates;
328        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
329            if (i != 0) supportedPreviewFrameRates += ",";
330            supportedPreviewFrameRates += String8::format("%d",
331                    availableFpsRanges.data.i32[i]);
332        }
333        mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
334                supportedPreviewFrameRates);
335    }
336
337    camera_metadata_entry_t availableJpegSizes;
338    res = find_camera_metadata_entry(mDevice->info(),
339            ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
340            &availableJpegSizes);
341    if (res != OK) return res;
342    if (availableJpegSizes.count < 2) {
343        ALOGE("%s: Camera %d: "
344                "Malformed %s entry",
345                __FUNCTION__, mCameraId,
346                get_camera_metadata_tag_name(
347                    ANDROID_SCALER_AVAILABLE_JPEG_SIZES));
348        return NO_INIT;
349    }
350
351    // TODO: Pick maximum
352    int32_t pictureWidth = availableJpegSizes.data.i32[0];
353    int32_t pictureHeight = availableJpegSizes.data.i32[1];
354
355    mParams->setPictureSize(pictureWidth, pictureHeight);
356
357    {
358        String8 supportedPictureSizes;
359        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
360            if (i != 0) supportedPictureSizes += ",";
361            supportedPictureSizes += String8::format("%dx%d",
362                    availableJpegSizes.data.i32[i],
363                    availableJpegSizes.data.i32[i+1]);
364        }
365        mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
366                supportedPictureSizes);
367    }
368
369    mParams->setPictureFormat("jpeg");
370
371    mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
372            "jpeg");
373
374    camera_metadata_entry_t availableJpegThumbnailSizes;
375    res = find_camera_metadata_entry(mDevice->info(),
376            ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
377            &availableJpegThumbnailSizes);
378    if (res != OK) return res;
379    if (availableJpegThumbnailSizes.count < 2) {
380        ALOGE("%s: Camera %d: "
381                "Malformed %s entry",
382                __FUNCTION__, mCameraId,
383                get_camera_metadata_tag_name(
384                    ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES));
385        return NO_INIT;
386    }
387
388    // TODO: Pick default thumbnail size sensibly
389    int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
390    int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
391
392    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
393            jpegThumbWidth);
394    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
395            jpegThumbHeight);
396
397    {
398        String8 supportedJpegThumbSizes;
399        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
400            if (i != 0) supportedJpegThumbSizes += ",";
401            supportedJpegThumbSizes += String8::format("%dx%d",
402                    availableJpegThumbnailSizes.data.i32[i],
403                    availableJpegThumbnailSizes.data.i32[i+1]);
404        }
405        mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
406                supportedJpegThumbSizes);
407    }
408
409    mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
410            "90");
411    mParams->set(CameraParameters::KEY_JPEG_QUALITY,
412            "90");
413    mParams->set(CameraParameters::KEY_ROTATION,
414            "0");
415    // Not settting GPS fields
416
417    mParams->set(CameraParameters::KEY_WHITE_BALANCE,
418            "auto");
419
420    camera_metadata_entry_t availableWhiteBalanceModes;
421    res = find_camera_metadata_entry(mDevice->info(),
422            ANDROID_CONTROL_AWB_AVAILABLE_MODES,
423            &availableWhiteBalanceModes);
424    {
425        String8 supportedWhiteBalance;
426        bool addComma = false;
427        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
428            if (addComma) supportedWhiteBalance += ",";
429            addComma = true;
430            switch (availableWhiteBalanceModes.data.u8[i]) {
431            case ANDROID_CONTROL_AWB_AUTO:
432                supportedWhiteBalance += "auto";
433                break;
434            case ANDROID_CONTROL_AWB_INCANDESCENT:
435                supportedWhiteBalance += "incandescent";
436                break;
437            case ANDROID_CONTROL_AWB_FLUORESCENT:
438                supportedWhiteBalance += "fluorescent";
439                break;
440            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
441                supportedWhiteBalance += "warm-fluorescent";
442                break;
443            case ANDROID_CONTROL_AWB_DAYLIGHT:
444                supportedWhiteBalance += "daylight";
445                break;
446            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
447                supportedWhiteBalance += "cloudy-daylight";
448                break;
449            case ANDROID_CONTROL_AWB_TWILIGHT:
450                supportedWhiteBalance += "twilight";
451                break;
452            case ANDROID_CONTROL_AWB_SHADE:
453                supportedWhiteBalance += "shade";
454                break;
455            // Skipping values not mappable to v1 API
456            case ANDROID_CONTROL_AWB_OFF:
457                addComma = false;
458                break;
459            default:
460                ALOGW("%s: Camera %d: Unknown white balance value: %d",
461                        __FUNCTION__, mCameraId,
462                        availableWhiteBalanceModes.data.u8[i]);
463                addComma = false;
464                break;
465            }
466        }
467        mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
468                supportedWhiteBalance);
469    }
470
471    mParams->set(CameraParameters::KEY_EFFECT, "none");
472    camera_metadata_entry_t availableEffects;
473    res = find_camera_metadata_entry(mDevice->info(),
474            ANDROID_CONTROL_AVAILABLE_EFFECTS,
475            &availableEffects);
476    if (res != OK) return res;
477    {
478        String8 supportedEffects;
479        bool addComma = false;
480        for (size_t i=0; i < availableEffects.count; i++) {
481            if (addComma) supportedEffects += ",";
482            addComma = true;
483            switch (availableEffects.data.u8[i]) {
484                case ANDROID_CONTROL_EFFECT_OFF:
485                    supportedEffects += "none";
486                    break;
487                case ANDROID_CONTROL_EFFECT_MONO:
488                    supportedEffects += "mono";
489                case ANDROID_CONTROL_EFFECT_NEGATIVE:
490                    supportedEffects += "negative";
491                    break;
492                case ANDROID_CONTROL_EFFECT_SOLARIZE:
493                    supportedEffects += "solarize";
494                    break;
495                case ANDROID_CONTROL_EFFECT_SEPIA:
496                    supportedEffects += "sepia";
497                    break;
498                case ANDROID_CONTROL_EFFECT_POSTERIZE:
499                    supportedEffects += "posterize";
500                    break;
501                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
502                    supportedEffects += "whiteboard";
503                    break;
504                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
505                    supportedEffects += "blackboard";
506                    break;
507                case ANDROID_CONTROL_EFFECT_AQUA:
508                    supportedEffects += "aqua";
509                    break;
510                default:
511                    ALOGW("%s: Camera %d: Unknown effect value: %d",
512                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
513                    addComma = false;
514                    break;
515            }
516        }
517        mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
518    }
519
520    mParams->set(CameraParameters::KEY_ANTIBANDING, "auto");
521    camera_metadata_entry_t availableAntibandingModes;
522    res = find_camera_metadata_entry(mDevice->info(),
523            ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
524            &availableAntibandingModes);
525    if (res != OK) return res;
526    {
527        String8 supportedAntibanding;
528        bool addComma = false;
529        for (size_t i=0; i < availableAntibandingModes.count; i++) {
530            if (addComma) supportedAntibanding += ",";
531            addComma = true;
532            switch (availableAntibandingModes.data.u8[i]) {
533                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
534                    supportedAntibanding += "off";
535                    break;
536                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
537                    supportedAntibanding += "50hz";
538                    break;
539                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
540                    supportedAntibanding += "60hz";
541                    break;
542                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
543                    supportedAntibanding += "auto";
544                    break;
545                default:
546                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
547                        __FUNCTION__, mCameraId,
548                            availableAntibandingModes.data.u8[i]);
549                    addComma = false;
550                    break;
551            }
552        }
553        mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
554                supportedAntibanding);
555    }
556
557    mParams->set(CameraParameters::KEY_SCENE_MODE, "auto");
558    camera_metadata_entry_t availableSceneModes;
559    res = find_camera_metadata_entry(mDevice->info(),
560            ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
561            &availableSceneModes);
562    if (res != OK) return res;
563    {
564        String8 supportedSceneModes("auto");
565        bool addComma = true;
566        bool noSceneModes = false;
567        for (size_t i=0; i < availableSceneModes.count; i++) {
568            if (addComma) supportedSceneModes += ",";
569            addComma = true;
570            switch (availableSceneModes.data.u8[i]) {
571                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
572                    noSceneModes = true;
573                    break;
574                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
575                    // Not in old API
576                    addComma = false;
577                    break;
578                case ANDROID_CONTROL_SCENE_MODE_ACTION:
579                    supportedSceneModes += "action";
580                    break;
581                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
582                    supportedSceneModes += "portrait";
583                    break;
584                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
585                    supportedSceneModes += "landscape";
586                    break;
587                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
588                    supportedSceneModes += "night";
589                    break;
590                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
591                    supportedSceneModes += "night-portrait";
592                    break;
593                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
594                    supportedSceneModes += "theatre";
595                    break;
596                case ANDROID_CONTROL_SCENE_MODE_BEACH:
597                    supportedSceneModes += "beach";
598                    break;
599                case ANDROID_CONTROL_SCENE_MODE_SNOW:
600                    supportedSceneModes += "snow";
601                    break;
602                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
603                    supportedSceneModes += "sunset";
604                    break;
605                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
606                    supportedSceneModes += "steadyphoto";
607                    break;
608                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
609                    supportedSceneModes += "fireworks";
610                    break;
611                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
612                    supportedSceneModes += "sports";
613                    break;
614                case ANDROID_CONTROL_SCENE_MODE_PARTY:
615                    supportedSceneModes += "party";
616                    break;
617                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
618                    supportedSceneModes += "candlelight";
619                    break;
620                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
621                    supportedSceneModes += "barcode";
622                    break;
623                default:
624                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
625                        __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
626                    addComma = false;
627                    break;
628            }
629        }
630        if (!noSceneModes) {
631            mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
632                    supportedSceneModes);
633        }
634    }
635
636    camera_metadata_entry_t flashAvailable;
637    res = find_camera_metadata_entry(mDevice->info(),
638            ANDROID_FLASH_AVAILABLE, &flashAvailable);
639    if (res != OK) return res;
640
641    camera_metadata_entry_t availableAeModes;
642    res = find_camera_metadata_entry(mDevice->info(),
643            ANDROID_CONTROL_AE_AVAILABLE_MODES,
644            &availableAeModes);
645    if (res != OK) return res;
646
647    if (flashAvailable.data.u8[0]) {
648        mParams->set(CameraParameters::KEY_FLASH_MODE, "auto");
649        String8 supportedFlashModes("off,auto,on,torch");
650        for (size_t i=0; i < availableAeModes.count; i++) {
651            if (availableAeModes.data.u8[i] ==
652                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
653                supportedFlashModes += ",red-eye";
654                break;
655            }
656        }
657        mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
658                supportedFlashModes);
659    }
660
661    camera_metadata_entry_t minFocusDistance;
662    res = find_camera_metadata_entry(mDevice->info(),
663            ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
664            &minFocusDistance);
665    if (res != OK) return res;
666    camera_metadata_entry_t availableAfModes;
667    res = find_camera_metadata_entry(mDevice->info(),
668            ANDROID_CONTROL_AF_AVAILABLE_MODES,
669            &availableAfModes);
670    if (res != OK) return res;
671    if (minFocusDistance.data.f[0] == 0) {
672        // Fixed-focus lens
673        mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed");
674        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed");
675    } else {
676        mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto");
677        String8 supportedFocusModes("fixed,infinity");
678        bool addComma = true;
679        for (size_t i=0; i < availableAfModes.count; i++) {
680            if (addComma) supportedFocusModes += ",";
681            addComma = true;
682            switch (availableAfModes.data.u8[i]) {
683                case ANDROID_CONTROL_AF_AUTO:
684                    supportedFocusModes += "auto";
685                    break;
686                case ANDROID_CONTROL_AF_MACRO:
687                    supportedFocusModes += "macro";
688                    break;
689                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
690                    supportedFocusModes += "continuous-video";
691                    break;
692                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
693                    supportedFocusModes += "continuous-picture";
694                    break;
695                case ANDROID_CONTROL_AF_EDOF:
696                    supportedFocusModes += "edof";
697                    break;
698                // Not supported in v1 API
699                case ANDROID_CONTROL_AF_OFF:
700                    addComma = false;
701                    break;
702                default:
703                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
704                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
705                    addComma = false;
706                    break;
707            }
708        }
709        mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
710                supportedFocusModes);
711    }
712
713    camera_metadata_entry_t max3aRegions;
714    res = find_camera_metadata_entry(mDevice->info(),
715            ANDROID_CONTROL_MAX_REGIONS, &max3aRegions);
716    if (res != OK) return res;
717
718    mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
719            max3aRegions.data.i32[0]);
720    mParams->set(CameraParameters::KEY_FOCUS_AREAS,
721            "(0,0,0,0,0)");
722
723    camera_metadata_entry_t availableFocalLengths;
724    res = find_camera_metadata_entry(mDevice->info(),
725            ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
726            &availableFocalLengths);
727    if (res != OK) return res;
728    float minFocalLength = availableFocalLengths.data.f[0];
729    mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
730
731    camera_metadata_entry_t sensorSize;
732    res = find_camera_metadata_entry(mDevice->info(),
733            ANDROID_SENSOR_PHYSICAL_SIZE,
734            &sensorSize);
735    if (res != OK) return res;
736
737    // The fields of view here assume infinity focus, maximum wide angle
738    float horizFov = 180 / M_PI *
739            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
740    float vertFov  = 180 / M_PI *
741            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
742    mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
743    mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
744
745    mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
746
747    camera_metadata_entry_t exposureCompensationRange;
748    res = find_camera_metadata_entry(mDevice->info(),
749            ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
750            &exposureCompensationRange);
751    if (res != OK) return res;
752    mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
753            exposureCompensationRange.data.i32[1]);
754    mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
755            exposureCompensationRange.data.i32[0]);
756
757    camera_metadata_entry_t exposureCompensationStep;
758    res = find_camera_metadata_entry(mDevice->info(),
759            ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
760            &exposureCompensationStep);
761    if (res != OK) return res;
762    mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
763            exposureCompensationStep.data.r[0].numerator /
764            exposureCompensationStep.data.r[0].denominator);
765
766    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
767    mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
768
769    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
770    mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
771
772    mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
773            max3aRegions.data.i32[0]);
774    mParams->set(CameraParameters::KEY_METERING_AREAS,
775            "(0,0,0,0,0)");
776
777    mParams->set(CameraParameters::KEY_ZOOM, 0);
778    mParams->set(CameraParameters::KEY_MAX_ZOOM, kNumZoomSteps - 1);
779
780    camera_metadata_entry_t maxDigitalZoom;
781    res = find_camera_metadata_entry(mDevice->info(),
782            ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom);
783    if (res != OK) return res;
784
785    {
786        String8 zoomRatios;
787        float zoom = 1.f;
788        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
789                (kNumZoomSteps-1);
790        bool addComma = false;
791        for (size_t i=0; i < kNumZoomSteps; i++) {
792            if (addComma) zoomRatios += ",";
793            addComma = true;
794            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
795            zoom += zoomIncrement;
796        }
797        mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
798    }
799
800    mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
801    mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
802
803    mParams->set(CameraParameters::KEY_FOCUS_DISTANCES,
804            "Infinity,Infinity,Infinity");
805
806    camera_metadata_entry_t maxFacesDetected;
807    res = find_camera_metadata_entry(mDevice->info(),
808            ANDROID_STATS_MAX_FACE_COUNT,
809            &maxFacesDetected);
810    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
811            maxFacesDetected.data.i32[0]);
812    mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
813            0);
814
815    mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
816            "yuv420sp");
817
818    mParams->set(CameraParameters::KEY_RECORDING_HINT,
819            "false");
820
821    mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
822            "true");
823
824    mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION,
825            "false");
826
827    camera_metadata_entry_t availableVideoStabilizationModes;
828    res = find_camera_metadata_entry(mDevice->info(),
829            ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
830            &availableVideoStabilizationModes);
831    if (res != OK) return res;
832    if (availableVideoStabilizationModes.count > 1) {
833        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
834                "true");
835    } else {
836        mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
837                "false");
838    }
839
840    return OK;
841}
842
843} // namespace android
844