13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/*
23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright 2008, The Android Open Source Project
43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License.
73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at
83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software
123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and
153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License.
163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/
173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LOG_TAG "CameraParams"
193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Log.h>
203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <string.h>
223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <stdlib.h>
233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/CameraParameters.h>
24b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk#include <system/graphics.h>
253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Parameter keys to communicate between camera application and driver.
283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_PREVIEW_SIZE[] = "preview-size";
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES[] = "preview-size-values";
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_PREVIEW_FORMAT[] = "preview-format";
313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS[] = "preview-format-values";
323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_PREVIEW_FRAME_RATE[] = "preview-frame-rate";
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES[] = "preview-frame-rate-values";
3404379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Liconst char CameraParameters::KEY_PREVIEW_FPS_RANGE[] = "preview-fps-range";
3504379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Liconst char CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE[] = "preview-fps-range-values";
363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_PICTURE_SIZE[] = "picture-size";
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_PICTURE_SIZES[] = "picture-size-values";
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_PICTURE_FORMAT[] = "picture-format";
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS[] = "picture-format-values";
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH[] = "jpeg-thumbnail-width";
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT[] = "jpeg-thumbnail-height";
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES[] = "jpeg-thumbnail-size-values";
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY[] = "jpeg-thumbnail-quality";
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_JPEG_QUALITY[] = "jpeg-quality";
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_ROTATION[] = "rotation";
463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_GPS_LATITUDE[] = "gps-latitude";
473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_GPS_LONGITUDE[] = "gps-longitude";
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_GPS_ALTITUDE[] = "gps-altitude";
493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_GPS_TIMESTAMP[] = "gps-timestamp";
50c0170bc6c6c81f5dfa86a132bf29ee48c01329d9Ray Chenconst char CameraParameters::KEY_GPS_PROCESSING_METHOD[] = "gps-processing-method";
513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_WHITE_BALANCE[] = "whitebalance";
523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_WHITE_BALANCE[] = "whitebalance-values";
533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_EFFECT[] = "effect";
543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_EFFECTS[] = "effect-values";
553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_ANTIBANDING[] = "antibanding";
563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_ANTIBANDING[] = "antibanding-values";
573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SCENE_MODE[] = "scene-mode";
583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_SCENE_MODES[] = "scene-mode-values";
593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_FLASH_MODE[] = "flash-mode";
603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_FLASH_MODES[] = "flash-mode-values";
613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_FOCUS_MODE[] = "focus-mode";
623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_SUPPORTED_FOCUS_MODES[] = "focus-mode-values";
63a1c3d37ef921bfc79a0f7d2ac7f897943134d48dWu-cheng Liconst char CameraParameters::KEY_MAX_NUM_FOCUS_AREAS[] = "max-num-focus-areas";
64a1c3d37ef921bfc79a0f7d2ac7f897943134d48dWu-cheng Liconst char CameraParameters::KEY_FOCUS_AREAS[] = "focus-areas";
653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_FOCAL_LENGTH[] = "focal-length";
663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE[] = "horizontal-view-angle";
673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_VERTICAL_VIEW_ANGLE[] = "vertical-view-angle";
683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::KEY_EXPOSURE_COMPENSATION[] = "exposure-compensation";
694f1bff97170d33575e55a8e110b097c05607095fWu-cheng Liconst char CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION[] = "max-exposure-compensation";
704f1bff97170d33575e55a8e110b097c05607095fWu-cheng Liconst char CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION[] = "min-exposure-compensation";
714f1bff97170d33575e55a8e110b097c05607095fWu-cheng Liconst char CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP[] = "exposure-compensation-step";
7295fbf2cdccb127bae1f68827564b36290c8de2c3Eino-Ville Talvalaconst char CameraParameters::KEY_AUTO_EXPOSURE_LOCK[] = "auto-exposure-lock";
7395fbf2cdccb127bae1f68827564b36290c8de2c3Eino-Ville Talvalaconst char CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED[] = "auto-exposure-lock-supported";
74fd99e1dda6a46ac3312cacb3bc1b633b2df95df2Eino-Ville Talvalaconst char CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK[] = "auto-whitebalance-lock";
75fd99e1dda6a46ac3312cacb3bc1b633b2df95df2Eino-Ville Talvalaconst char CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED[] = "auto-whitebalance-lock-supported";
7638ecadbeb09fc0504621f5aa513e51b7a204983fWu-cheng Liconst char CameraParameters::KEY_MAX_NUM_METERING_AREAS[] = "max-num-metering-areas";
7738ecadbeb09fc0504621f5aa513e51b7a204983fWu-cheng Liconst char CameraParameters::KEY_METERING_AREAS[] = "metering-areas";
78949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Liconst char CameraParameters::KEY_ZOOM[] = "zoom";
79949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Liconst char CameraParameters::KEY_MAX_ZOOM[] = "max-zoom";
80949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Liconst char CameraParameters::KEY_ZOOM_RATIOS[] = "zoom-ratios";
81949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Liconst char CameraParameters::KEY_ZOOM_SUPPORTED[] = "zoom-supported";
82949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Liconst char CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED[] = "smooth-zoom-supported";
8309a2ab9dfe5c8fe74703b9894d930b1b1dbf0c11Wu-cheng Liconst char CameraParameters::KEY_FOCUS_DISTANCES[] = "focus-distances";
840b0279e0d20a8beb69aa2af5f4cb278841710dfbWu-cheng Liconst char CameraParameters::KEY_VIDEO_FRAME_FORMAT[] = "video-frame-format";
850d14c25355b7807b88fcdc76040ef986aa754815James Dongconst char CameraParameters::KEY_VIDEO_SIZE[] = "video-size";
860d14c25355b7807b88fcdc76040ef986aa754815James Dongconst char CameraParameters::KEY_SUPPORTED_VIDEO_SIZES[] = "video-size-values";
870f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dongconst char CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO[] = "preferred-preview-size-for-video";
887fc25dd82dec8474139315b8e905f103c13406f5Wu-cheng Liconst char CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW[] = "max-num-detected-faces-hw";
897fc25dd82dec8474139315b8e905f103c13406f5Wu-cheng Liconst char CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW[] = "max-num-detected-faces-sw";
9040cdc56efa47580d89a93750cefecb8ccbaf9a72Wu-cheng Liconst char CameraParameters::KEY_RECORDING_HINT[] = "recording-hint";
91a8e409f8f9b40737d0b03355894b5e141d0aff6bWu-cheng Liconst char CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED[] = "video-snapshot-supported";
927019d2247e644470a0e8eb99b02b8b2d656fd9fbEino-Ville Talvalaconst char CameraParameters::KEY_VIDEO_STABILIZATION[] = "video-stabilization";
937019d2247e644470a0e8eb99b02b8b2d656fd9fbEino-Ville Talvalaconst char CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED[] = "video-stabilization-supported";
94c3dbf1a40df85b75e5805382838a90416f69730fJames Painterconst char CameraParameters::KEY_LIGHTFX[] = "light-fx";
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
96d8d888ea7c14715c2210c8dea1a623116c992264Wu-cheng Liconst char CameraParameters::TRUE[] = "true";
9795fbf2cdccb127bae1f68827564b36290c8de2c3Eino-Ville Talvalaconst char CameraParameters::FALSE[] = "false";
98ae77ffa16bda593fb3751e41d45327d867f3c8e1Wu-cheng Liconst char CameraParameters::FOCUS_DISTANCE_INFINITY[] = "Infinity";
99d8d888ea7c14715c2210c8dea1a623116c992264Wu-cheng Li
1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Values for white balance settings.
1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_AUTO[] = "auto";
1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_INCANDESCENT[] = "incandescent";
1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_FLUORESCENT[] = "fluorescent";
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT[] = "warm-fluorescent";
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_DAYLIGHT[] = "daylight";
1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT[] = "cloudy-daylight";
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_TWILIGHT[] = "twilight";
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::WHITE_BALANCE_SHADE[] = "shade";
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Values for effect settings.
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_NONE[] = "none";
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_MONO[] = "mono";
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_NEGATIVE[] = "negative";
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_SOLARIZE[] = "solarize";
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_SEPIA[] = "sepia";
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_POSTERIZE[] = "posterize";
1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_WHITEBOARD[] = "whiteboard";
1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_BLACKBOARD[] = "blackboard";
1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::EFFECT_AQUA[] = "aqua";
1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Values for antibanding settings.
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::ANTIBANDING_AUTO[] = "auto";
1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::ANTIBANDING_50HZ[] = "50hz";
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::ANTIBANDING_60HZ[] = "60hz";
1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::ANTIBANDING_OFF[] = "off";
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Values for flash mode settings.
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FLASH_MODE_OFF[] = "off";
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FLASH_MODE_AUTO[] = "auto";
1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FLASH_MODE_ON[] = "on";
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FLASH_MODE_TORCH[] = "torch";
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Values for scene mode settings.
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_AUTO[] = "auto";
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_ACTION[] = "action";
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_PORTRAIT[] = "portrait";
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_LANDSCAPE[] = "landscape";
1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_NIGHT[] = "night";
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_NIGHT_PORTRAIT[] = "night-portrait";
1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_THEATRE[] = "theatre";
1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_BEACH[] = "beach";
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_SNOW[] = "snow";
1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_SUNSET[] = "sunset";
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_STEADYPHOTO[] = "steadyphoto";
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_FIREWORKS[] = "fireworks";
1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_SPORTS[] = "sports";
1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_PARTY[] = "party";
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::SCENE_MODE_CANDLELIGHT[] = "candlelight";
150465d5a7f3517f11aaa819c8ae982e113ad5ec479Wu-cheng Liconst char CameraParameters::SCENE_MODE_BARCODE[] = "barcode";
151c81284a2b77c630046ee57e6d73ac5d367e558f1Eino-Ville Talvalaconst char CameraParameters::SCENE_MODE_HDR[] = "hdr";
1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::PIXEL_FORMAT_YUV422SP[] = "yuv422sp";
1543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::PIXEL_FORMAT_YUV420SP[] = "yuv420sp";
1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::PIXEL_FORMAT_YUV422I[] = "yuv422i-yuyv";
156d42c6e8904f1648a7dedcd1dc27b926951f8ff28Wu-cheng Liconst char CameraParameters::PIXEL_FORMAT_YUV420P[]  = "yuv420p";
1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::PIXEL_FORMAT_RGB565[] = "rgb565";
1585e7271d6e24efb891e0de141a06228c99866f49fIliyan Malchevconst char CameraParameters::PIXEL_FORMAT_RGBA8888[] = "rgba8888";
1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::PIXEL_FORMAT_JPEG[] = "jpeg";
16079e2ab42c38d1099bcd7c8840caa5a85c9fcb104Wu-cheng Liconst char CameraParameters::PIXEL_FORMAT_BAYER_RGGB[] = "bayer-rggb";
161f6d9696bf1db133d16dd8981380e1bfbd2e0bc70Eino-Ville Talvalaconst char CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE[] = "android-opaque";
1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// Values for focus mode settings.
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FOCUS_MODE_AUTO[] = "auto";
1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FOCUS_MODE_INFINITY[] = "infinity";
1663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FOCUS_MODE_MACRO[] = "macro";
1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char CameraParameters::FOCUS_MODE_FIXED[] = "fixed";
168465d5a7f3517f11aaa819c8ae982e113ad5ec479Wu-cheng Liconst char CameraParameters::FOCUS_MODE_EDOF[] = "edof";
169ac4205c9064ca961883b1ccf2ce565e449c0983eWu-cheng Liconst char CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO[] = "continuous-video";
170ab3f1388c71aed957f94ddab976faa77ab77e67fWu-cheng Liconst char CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE[] = "continuous-picture";
1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
172c3dbf1a40df85b75e5805382838a90416f69730fJames Painter// Values for light fx settings
173c3dbf1a40df85b75e5805382838a90416f69730fJames Painterconst char CameraParameters::LIGHTFX_LOWLIGHT[] = "low-light";
174c3dbf1a40df85b75e5805382838a90416f69730fJames Painterconst char CameraParameters::LIGHTFX_HDR[] = "high-dynamic-range";
175c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCameraParameters::CameraParameters()
1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                : mMap()
1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCameraParameters::~CameraParameters()
1823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 CameraParameters::flatten() const
1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 flattened("");
1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    size_t size = mMap.size();
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    for (size_t i = 0; i < size; i++) {
1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        String8 k, v;
1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        k = mMap.keyAt(i);
1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        v = mMap.valueAt(i);
1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        flattened += k;
1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        flattened += "=";
1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        flattened += v;
1983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        if (i != size-1)
1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            flattened += ";";
2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return flattened;
2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::unflatten(const String8 &params)
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const char *a = params.string();
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const char *b;
2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mMap.clear();
2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    for (;;) {
2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        // Find the bounds of the key name.
2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        b = strchr(a, '=');
2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        if (b == 0)
2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            break;
2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        // Create the key string.
2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        String8 k(a, (size_t)(b-a));
2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        // Find the value.
2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        a = b+1;
2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        b = strchr(a, ';');
2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        if (b == 0) {
2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // If there's no semicolon, this is the last item.
2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            String8 v(a);
2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            mMap.add(k, v);
2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            break;
2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        }
2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        String8 v(a, (size_t)(b-a));
2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mMap.add(k, v);
2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        a = b+1;
2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::set(const char *key, const char *value)
2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // XXX i think i can do this with strspn()
2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (strchr(key, '=') || strchr(key, ';')) {
24229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return;
2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2464c18eb30b493a4cd8d56bbcf8acb526b97c401a4You Kim    if (strchr(value, '=') || strchr(value, ';')) {
24729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return;
2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2511cebdb77323e4554a316b9c34bf36957b7dad5aeEino-Ville Talvala    mMap.replaceValueFor(String8(key), String8(value));
2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::set(const char *key, int value)
2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    char str[16];
2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sprintf(str, "%d", value);
2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(key, str);
2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::setFloat(const char *key, float value)
2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    char str[16];  // 14 should be enough. We overestimate to be safe.
2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    snprintf(str, sizeof(str), "%g", value);
2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(key, str);
2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char *CameraParameters::get(const char *key) const
2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2701cebdb77323e4554a316b9c34bf36957b7dad5aeEino-Ville Talvala    String8 v = mMap.valueFor(String8(key));
2711cebdb77323e4554a316b9c34bf36957b7dad5aeEino-Ville Talvala    if (v.length() == 0)
2721cebdb77323e4554a316b9c34bf36957b7dad5aeEino-Ville Talvala        return 0;
2731cebdb77323e4554a316b9c34bf36957b7dad5aeEino-Ville Talvala    return v.string();
2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianint CameraParameters::getInt(const char *key) const
2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const char *v = get(key);
2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (v == 0)
2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return -1;
2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return strtol(v, 0, 0);
2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianfloat CameraParameters::getFloat(const char *key) const
2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const char *v = get(key);
2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (v == 0) return -1;
2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return strtof(v, 0);
2893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
291adbda96f6a05507788bb4163d7fbe8a95948f0a5Wu-cheng Livoid CameraParameters::remove(const char *key)
292adbda96f6a05507788bb4163d7fbe8a95948f0a5Wu-cheng Li{
293adbda96f6a05507788bb4163d7fbe8a95948f0a5Wu-cheng Li    mMap.removeItem(String8(key));
294adbda96f6a05507788bb4163d7fbe8a95948f0a5Wu-cheng Li}
295adbda96f6a05507788bb4163d7fbe8a95948f0a5Wu-cheng Li
29604379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li// Parse string like "640x480" or "10000,20000"
29704379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Listatic int parse_pair(const char *str, int *first, int *second, char delim,
29804379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li                      char **endptr = NULL)
2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
30004379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    // Find the first integer.
3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    char *end;
3023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    int w = (int)strtol(str, &end, 10);
30304379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    // If a delimeter does not immediately follow, give up.
30404379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    if (*end != delim) {
30529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
3063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return -1;
30704379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    }
3083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
30904379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    // Find the second integer, immediately after the delimeter.
31034c91a321c297c1a7518ec4f10ae5993904034ddNipun Kwatra    int h = (int)strtol(end+1, &end, 10);
3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
31204379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    *first = w;
31304379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    *second = h;
3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
31534c91a321c297c1a7518ec4f10ae5993904034ddNipun Kwatra    if (endptr) {
31634c91a321c297c1a7518ec4f10ae5993904034ddNipun Kwatra        *endptr = end;
31734c91a321c297c1a7518ec4f10ae5993904034ddNipun Kwatra    }
31834c91a321c297c1a7518ec4f10ae5993904034ddNipun Kwatra
3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return 0;
3203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
322e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatrastatic void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
323e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra{
324e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    if (sizesStr == 0) {
325e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        return;
326e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    }
327e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra
328e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    char *sizeStartPtr = (char *)sizesStr;
329e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra
330e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    while (true) {
331e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        int width, height;
33204379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li        int success = parse_pair(sizeStartPtr, &width, &height, 'x',
33304379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li                                 &sizeStartPtr);
334e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
33529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
336e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra            return;
337e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        }
338e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        sizes.push(Size(width, height));
339e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra
340e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        if (*sizeStartPtr == '\0') {
341e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra            return;
342e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        }
343e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra        sizeStartPtr++;
344e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    }
345e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra}
346e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra
3473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::setPreviewSize(int width, int height)
3483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    char str[32];
3503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sprintf(str, "%dx%d", width, height);
3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(KEY_PREVIEW_SIZE, str);
3523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::getPreviewSize(int *width, int *height) const
3553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
35604379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    *width = *height = -1;
3573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // Get the current string, if it doesn't exist, leave the -1x-1
3583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const char *p = get(KEY_PREVIEW_SIZE);
35904379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    if (p == 0)  return;
3600f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong    parse_pair(p, width, height, 'x');
3610f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong}
3620f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong
3630f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dongvoid CameraParameters::getPreferredPreviewSizeForVideo(int *width, int *height) const
3640f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong{
3650f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong    *width = *height = -1;
3660f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong    const char *p = get(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO);
3670f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong    if (p == 0)  return;
36804379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    parse_pair(p, width, height, 'x');
3693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
371e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatravoid CameraParameters::getSupportedPreviewSizes(Vector<Size> &sizes) const
372e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra{
373e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    const char *previewSizesStr = get(KEY_SUPPORTED_PREVIEW_SIZES);
374e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    parseSizesList(previewSizesStr, sizes);
375e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra}
376e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra
3770d14c25355b7807b88fcdc76040ef986aa754815James Dongvoid CameraParameters::setVideoSize(int width, int height)
3780d14c25355b7807b88fcdc76040ef986aa754815James Dong{
3790d14c25355b7807b88fcdc76040ef986aa754815James Dong    char str[32];
3800d14c25355b7807b88fcdc76040ef986aa754815James Dong    sprintf(str, "%dx%d", width, height);
3810d14c25355b7807b88fcdc76040ef986aa754815James Dong    set(KEY_VIDEO_SIZE, str);
3820d14c25355b7807b88fcdc76040ef986aa754815James Dong}
3830d14c25355b7807b88fcdc76040ef986aa754815James Dong
3840d14c25355b7807b88fcdc76040ef986aa754815James Dongvoid CameraParameters::getVideoSize(int *width, int *height) const
3850d14c25355b7807b88fcdc76040ef986aa754815James Dong{
3860d14c25355b7807b88fcdc76040ef986aa754815James Dong    *width = *height = -1;
3870d14c25355b7807b88fcdc76040ef986aa754815James Dong    const char *p = get(KEY_VIDEO_SIZE);
3880d14c25355b7807b88fcdc76040ef986aa754815James Dong    if (p == 0) return;
3890d14c25355b7807b88fcdc76040ef986aa754815James Dong    parse_pair(p, width, height, 'x');
3900d14c25355b7807b88fcdc76040ef986aa754815James Dong}
3910d14c25355b7807b88fcdc76040ef986aa754815James Dong
3920d14c25355b7807b88fcdc76040ef986aa754815James Dongvoid CameraParameters::getSupportedVideoSizes(Vector<Size> &sizes) const
3930d14c25355b7807b88fcdc76040ef986aa754815James Dong{
3940d14c25355b7807b88fcdc76040ef986aa754815James Dong    const char *videoSizesStr = get(KEY_SUPPORTED_VIDEO_SIZES);
3950d14c25355b7807b88fcdc76040ef986aa754815James Dong    parseSizesList(videoSizesStr, sizes);
3960d14c25355b7807b88fcdc76040ef986aa754815James Dong}
3970d14c25355b7807b88fcdc76040ef986aa754815James Dong
3983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::setPreviewFrameRate(int fps)
3993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(KEY_PREVIEW_FRAME_RATE, fps);
4013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianint CameraParameters::getPreviewFrameRate() const
4043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return getInt(KEY_PREVIEW_FRAME_RATE);
4063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
40804379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Livoid CameraParameters::getPreviewFpsRange(int *min_fps, int *max_fps) const
40904379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li{
41004379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    *min_fps = *max_fps = -1;
41104379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    const char *p = get(KEY_PREVIEW_FPS_RANGE);
41204379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    if (p == 0) return;
41304379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    parse_pair(p, min_fps, max_fps, ',');
41404379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li}
41504379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li
4163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::setPreviewFormat(const char *format)
4173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(KEY_PREVIEW_FORMAT, format);
4193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char *CameraParameters::getPreviewFormat() const
4223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return get(KEY_PREVIEW_FORMAT);
4243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::setPictureSize(int width, int height)
4273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    char str[32];
4293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sprintf(str, "%dx%d", width, height);
4303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(KEY_PICTURE_SIZE, str);
4313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::getPictureSize(int *width, int *height) const
4343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
43504379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    *width = *height = -1;
4363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // Get the current string, if it doesn't exist, leave the -1x-1
4373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const char *p = get(KEY_PICTURE_SIZE);
43804379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    if (p == 0) return;
43904379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li    parse_pair(p, width, height, 'x');
4403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
442e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatravoid CameraParameters::getSupportedPictureSizes(Vector<Size> &sizes) const
443e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra{
444e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    const char *pictureSizesStr = get(KEY_SUPPORTED_PICTURE_SIZES);
445e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra    parseSizesList(pictureSizesStr, sizes);
446e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra}
447e44607eacd044362d3debf5d95abc93ca36a9274Nipun Kwatra
4483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::setPictureFormat(const char *format)
4493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    set(KEY_PICTURE_FORMAT, format);
4513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst char *CameraParameters::getPictureFormat() const
4543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return get(KEY_PICTURE_FORMAT);
4563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid CameraParameters::dump() const
4593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4607b73e7127dc727e78460c92ca4115ccad87cf321Mark Salyzyn    ALOGD("dump: mMap.size = %zu", mMap.size());
4613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    for (size_t i = 0; i < mMap.size(); i++) {
4623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        String8 k, v;
4633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        k = mMap.keyAt(i);
4643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        v = mMap.valueAt(i);
465b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("%s: %s\n", k.string(), v.string());
4663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4697b73e7127dc727e78460c92ca4115ccad87cf321Mark Salyzynstatus_t CameraParameters::dump(int fd, const Vector<String16>& /*args*/) const
4703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
4713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const size_t SIZE = 256;
4723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    char buffer[SIZE];
4733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 result;
474377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    snprintf(buffer, 255, "CameraParameters::dump: mMap.size = %zu\n", mMap.size());
4753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    result.append(buffer);
4763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    for (size_t i = 0; i < mMap.size(); i++) {
4773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        String8 k, v;
4783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        k = mMap.keyAt(i);
4793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        v = mMap.valueAt(i);
4803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        snprintf(buffer, 255, "\t%s: %s\n", k.string(), v.string());
4813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        result.append(buffer);
4823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    write(fd, result.string(), result.size());
4843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return NO_ERROR;
4853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
487b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunkvoid CameraParameters::getSupportedPreviewFormats(Vector<int>& formats) const {
488b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    const char* supportedPreviewFormats =
489b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk          get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS);
490b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
4915fc9d902510ccd04db80e0bc6aa679a4317a51b2Ruben Brunk    if (supportedPreviewFormats == NULL) {
4925fc9d902510ccd04db80e0bc6aa679a4317a51b2Ruben Brunk        ALOGW("%s: No supported preview formats.", __FUNCTION__);
4935fc9d902510ccd04db80e0bc6aa679a4317a51b2Ruben Brunk        return;
4945fc9d902510ccd04db80e0bc6aa679a4317a51b2Ruben Brunk    }
4955fc9d902510ccd04db80e0bc6aa679a4317a51b2Ruben Brunk
496b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    String8 fmtStr(supportedPreviewFormats);
497b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    char* prevFmts = fmtStr.lockBuffer(fmtStr.size());
498b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
499b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    char* savePtr;
500b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    char* fmt = strtok_r(prevFmts, ",", &savePtr);
501b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    while (fmt) {
502b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        int actual = previewFormatToEnum(fmt);
503b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        if (actual != -1) {
504b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            formats.add(actual);
505b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        }
506b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        fmt = strtok_r(NULL, ",", &savePtr);
507b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    }
508b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    fmtStr.unlockBuffer(fmtStr.size());
509b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk}
510b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
511b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
512b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunkint CameraParameters::previewFormatToEnum(const char* format) {
513b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    return
514b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !format ?
515b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_YCrCb_420_SP :
516b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_YUV422SP) ?
517b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
518b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_YUV420SP) ?
519b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
520b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_YUV422I) ?
521b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
522b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_YUV420P) ?
523b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_YV12 :         // YV12
524b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_RGB565) ?
525b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
526b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_RGBA8888) ?
527b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
528b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        !strcmp(format, PIXEL_FORMAT_BAYER_RGGB) ?
529a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala            HAL_PIXEL_FORMAT_RAW16 :   // Raw sensor data
530b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        -1;
531b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk}
532b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
533cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunkbool CameraParameters::isEmpty() const {
534cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk    return mMap.isEmpty();
535cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk}
536cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk
5373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
538