xref: /aosp_15_r20/frameworks/av/camera/CameraParameters.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2008, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "CameraParams"
19*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <string.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <unistd.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraParameters.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <system/graphics.h>
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker namespace android {
28*ec779b8eSAndroid Build Coastguard Worker // Parameter keys to communicate between camera application and driver.
29*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PREVIEW_SIZE[] = "preview-size";
30*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES[] = "preview-size-values";
31*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PREVIEW_FORMAT[] = "preview-format";
32*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS[] = "preview-format-values";
33*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PREVIEW_FRAME_RATE[] = "preview-frame-rate";
34*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES[] = "preview-frame-rate-values";
35*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PREVIEW_FPS_RANGE[] = "preview-fps-range";
36*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE[] = "preview-fps-range-values";
37*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PICTURE_SIZE[] = "picture-size";
38*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_PICTURE_SIZES[] = "picture-size-values";
39*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PICTURE_FORMAT[] = "picture-format";
40*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS[] = "picture-format-values";
41*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH[] = "jpeg-thumbnail-width";
42*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT[] = "jpeg-thumbnail-height";
43*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES[] = "jpeg-thumbnail-size-values";
44*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY[] = "jpeg-thumbnail-quality";
45*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_JPEG_QUALITY[] = "jpeg-quality";
46*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_ROTATION[] = "rotation";
47*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_GPS_LATITUDE[] = "gps-latitude";
48*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_GPS_LONGITUDE[] = "gps-longitude";
49*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_GPS_ALTITUDE[] = "gps-altitude";
50*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_GPS_TIMESTAMP[] = "gps-timestamp";
51*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_GPS_PROCESSING_METHOD[] = "gps-processing-method";
52*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_WHITE_BALANCE[] = "whitebalance";
53*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_WHITE_BALANCE[] = "whitebalance-values";
54*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_EFFECT[] = "effect";
55*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_EFFECTS[] = "effect-values";
56*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_ANTIBANDING[] = "antibanding";
57*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_ANTIBANDING[] = "antibanding-values";
58*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SCENE_MODE[] = "scene-mode";
59*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_SCENE_MODES[] = "scene-mode-values";
60*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_FLASH_MODE[] = "flash-mode";
61*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_FLASH_MODES[] = "flash-mode-values";
62*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_FOCUS_MODE[] = "focus-mode";
63*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_FOCUS_MODES[] = "focus-mode-values";
64*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MAX_NUM_FOCUS_AREAS[] = "max-num-focus-areas";
65*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_FOCUS_AREAS[] = "focus-areas";
66*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_FOCAL_LENGTH[] = "focal-length";
67*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE[] = "horizontal-view-angle";
68*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_VERTICAL_VIEW_ANGLE[] = "vertical-view-angle";
69*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_EXPOSURE_COMPENSATION[] = "exposure-compensation";
70*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION[] = "max-exposure-compensation";
71*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION[] = "min-exposure-compensation";
72*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP[] = "exposure-compensation-step";
73*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_AUTO_EXPOSURE_LOCK[] = "auto-exposure-lock";
74*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED[] = "auto-exposure-lock-supported";
75*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK[] = "auto-whitebalance-lock";
76*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED[] = "auto-whitebalance-lock-supported";
77*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MAX_NUM_METERING_AREAS[] = "max-num-metering-areas";
78*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_METERING_AREAS[] = "metering-areas";
79*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_ZOOM[] = "zoom";
80*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MAX_ZOOM[] = "max-zoom";
81*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_ZOOM_RATIOS[] = "zoom-ratios";
82*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_ZOOM_SUPPORTED[] = "zoom-supported";
83*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED[] = "smooth-zoom-supported";
84*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_FOCUS_DISTANCES[] = "focus-distances";
85*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_VIDEO_FRAME_FORMAT[] = "video-frame-format";
86*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_VIDEO_SIZE[] = "video-size";
87*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_SUPPORTED_VIDEO_SIZES[] = "video-size-values";
88*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO[] = "preferred-preview-size-for-video";
89*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW[] = "max-num-detected-faces-hw";
90*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW[] = "max-num-detected-faces-sw";
91*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_RECORDING_HINT[] = "recording-hint";
92*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED[] = "video-snapshot-supported";
93*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_VIDEO_STABILIZATION[] = "video-stabilization";
94*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED[] = "video-stabilization-supported";
95*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::KEY_LIGHTFX[] = "light-fx";
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::TRUE[] = "true";
98*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FALSE[] = "false";
99*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_DISTANCE_INFINITY[] = "Infinity";
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker // Values for white balance settings.
102*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_AUTO[] = "auto";
103*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_INCANDESCENT[] = "incandescent";
104*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_FLUORESCENT[] = "fluorescent";
105*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT[] = "warm-fluorescent";
106*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_DAYLIGHT[] = "daylight";
107*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT[] = "cloudy-daylight";
108*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_TWILIGHT[] = "twilight";
109*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::WHITE_BALANCE_SHADE[] = "shade";
110*ec779b8eSAndroid Build Coastguard Worker 
111*ec779b8eSAndroid Build Coastguard Worker // Values for effect settings.
112*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_NONE[] = "none";
113*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_MONO[] = "mono";
114*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_NEGATIVE[] = "negative";
115*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_SOLARIZE[] = "solarize";
116*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_SEPIA[] = "sepia";
117*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_POSTERIZE[] = "posterize";
118*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_WHITEBOARD[] = "whiteboard";
119*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_BLACKBOARD[] = "blackboard";
120*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::EFFECT_AQUA[] = "aqua";
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker // Values for antibanding settings.
123*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::ANTIBANDING_AUTO[] = "auto";
124*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::ANTIBANDING_50HZ[] = "50hz";
125*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::ANTIBANDING_60HZ[] = "60hz";
126*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::ANTIBANDING_OFF[] = "off";
127*ec779b8eSAndroid Build Coastguard Worker 
128*ec779b8eSAndroid Build Coastguard Worker // Values for flash mode settings.
129*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FLASH_MODE_OFF[] = "off";
130*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FLASH_MODE_AUTO[] = "auto";
131*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FLASH_MODE_ON[] = "on";
132*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
133*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FLASH_MODE_TORCH[] = "torch";
134*ec779b8eSAndroid Build Coastguard Worker 
135*ec779b8eSAndroid Build Coastguard Worker // Values for scene mode settings.
136*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_AUTO[] = "auto";
137*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_ACTION[] = "action";
138*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_PORTRAIT[] = "portrait";
139*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_LANDSCAPE[] = "landscape";
140*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_NIGHT[] = "night";
141*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_NIGHT_PORTRAIT[] = "night-portrait";
142*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_THEATRE[] = "theatre";
143*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_BEACH[] = "beach";
144*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_SNOW[] = "snow";
145*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_SUNSET[] = "sunset";
146*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_STEADYPHOTO[] = "steadyphoto";
147*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_FIREWORKS[] = "fireworks";
148*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_SPORTS[] = "sports";
149*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_PARTY[] = "party";
150*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_CANDLELIGHT[] = "candlelight";
151*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_BARCODE[] = "barcode";
152*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::SCENE_MODE_HDR[] = "hdr";
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_YUV422SP[] = "yuv422sp";
155*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_YUV420SP[] = "yuv420sp";
156*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_YUV422I[] = "yuv422i-yuyv";
157*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_YUV420P[]  = "yuv420p";
158*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_RGB565[] = "rgb565";
159*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_RGBA8888[] = "rgba8888";
160*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_JPEG[] = "jpeg";
161*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_BAYER_RGGB[] = "bayer-rggb";
162*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE[] = "android-opaque";
163*ec779b8eSAndroid Build Coastguard Worker 
164*ec779b8eSAndroid Build Coastguard Worker // Values for focus mode settings.
165*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_AUTO[] = "auto";
166*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_INFINITY[] = "infinity";
167*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_MACRO[] = "macro";
168*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_FIXED[] = "fixed";
169*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_EDOF[] = "edof";
170*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO[] = "continuous-video";
171*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE[] = "continuous-picture";
172*ec779b8eSAndroid Build Coastguard Worker 
173*ec779b8eSAndroid Build Coastguard Worker // Values for light fx settings
174*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::LIGHTFX_LOWLIGHT[] = "low-light";
175*ec779b8eSAndroid Build Coastguard Worker const char CameraParameters::LIGHTFX_HDR[] = "high-dynamic-range";
176*ec779b8eSAndroid Build Coastguard Worker 
CameraParameters()177*ec779b8eSAndroid Build Coastguard Worker CameraParameters::CameraParameters()
178*ec779b8eSAndroid Build Coastguard Worker                 : mMap()
179*ec779b8eSAndroid Build Coastguard Worker {
180*ec779b8eSAndroid Build Coastguard Worker }
181*ec779b8eSAndroid Build Coastguard Worker 
~CameraParameters()182*ec779b8eSAndroid Build Coastguard Worker CameraParameters::~CameraParameters()
183*ec779b8eSAndroid Build Coastguard Worker {
184*ec779b8eSAndroid Build Coastguard Worker }
185*ec779b8eSAndroid Build Coastguard Worker 
flatten() const186*ec779b8eSAndroid Build Coastguard Worker String8 CameraParameters::flatten() const
187*ec779b8eSAndroid Build Coastguard Worker {
188*ec779b8eSAndroid Build Coastguard Worker     String8 flattened("");
189*ec779b8eSAndroid Build Coastguard Worker     size_t size = mMap.size();
190*ec779b8eSAndroid Build Coastguard Worker 
191*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < size; i++) {
192*ec779b8eSAndroid Build Coastguard Worker         String8 k, v;
193*ec779b8eSAndroid Build Coastguard Worker         k = mMap.keyAt(i);
194*ec779b8eSAndroid Build Coastguard Worker         v = mMap.valueAt(i);
195*ec779b8eSAndroid Build Coastguard Worker 
196*ec779b8eSAndroid Build Coastguard Worker         flattened += k;
197*ec779b8eSAndroid Build Coastguard Worker         flattened += "=";
198*ec779b8eSAndroid Build Coastguard Worker         flattened += v;
199*ec779b8eSAndroid Build Coastguard Worker         if (i != size-1)
200*ec779b8eSAndroid Build Coastguard Worker             flattened += ";";
201*ec779b8eSAndroid Build Coastguard Worker     }
202*ec779b8eSAndroid Build Coastguard Worker 
203*ec779b8eSAndroid Build Coastguard Worker     return flattened;
204*ec779b8eSAndroid Build Coastguard Worker }
205*ec779b8eSAndroid Build Coastguard Worker 
unflatten(const String8 & params)206*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::unflatten(const String8 &params)
207*ec779b8eSAndroid Build Coastguard Worker {
208*ec779b8eSAndroid Build Coastguard Worker     const char *a = params.c_str();
209*ec779b8eSAndroid Build Coastguard Worker     const char *b;
210*ec779b8eSAndroid Build Coastguard Worker 
211*ec779b8eSAndroid Build Coastguard Worker     mMap.clear();
212*ec779b8eSAndroid Build Coastguard Worker 
213*ec779b8eSAndroid Build Coastguard Worker     for (;;) {
214*ec779b8eSAndroid Build Coastguard Worker         // Find the bounds of the key name.
215*ec779b8eSAndroid Build Coastguard Worker         b = strchr(a, '=');
216*ec779b8eSAndroid Build Coastguard Worker         if (b == 0)
217*ec779b8eSAndroid Build Coastguard Worker             break;
218*ec779b8eSAndroid Build Coastguard Worker 
219*ec779b8eSAndroid Build Coastguard Worker         // Create the key string.
220*ec779b8eSAndroid Build Coastguard Worker         String8 k(a, (size_t)(b-a));
221*ec779b8eSAndroid Build Coastguard Worker 
222*ec779b8eSAndroid Build Coastguard Worker         // Find the value.
223*ec779b8eSAndroid Build Coastguard Worker         a = b+1;
224*ec779b8eSAndroid Build Coastguard Worker         b = strchr(a, ';');
225*ec779b8eSAndroid Build Coastguard Worker         if (b == 0) {
226*ec779b8eSAndroid Build Coastguard Worker             // If there's no semicolon, this is the last item.
227*ec779b8eSAndroid Build Coastguard Worker             String8 v(a);
228*ec779b8eSAndroid Build Coastguard Worker             mMap.add(k, v);
229*ec779b8eSAndroid Build Coastguard Worker             break;
230*ec779b8eSAndroid Build Coastguard Worker         }
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker         String8 v(a, (size_t)(b-a));
233*ec779b8eSAndroid Build Coastguard Worker         mMap.add(k, v);
234*ec779b8eSAndroid Build Coastguard Worker         a = b+1;
235*ec779b8eSAndroid Build Coastguard Worker     }
236*ec779b8eSAndroid Build Coastguard Worker }
237*ec779b8eSAndroid Build Coastguard Worker 
238*ec779b8eSAndroid Build Coastguard Worker 
set(const char * key,const char * value)239*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::set(const char *key, const char *value)
240*ec779b8eSAndroid Build Coastguard Worker {
241*ec779b8eSAndroid Build Coastguard Worker     // XXX i think i can do this with strspn()
242*ec779b8eSAndroid Build Coastguard Worker     if (strchr(key, '=') || strchr(key, ';')) {
243*ec779b8eSAndroid Build Coastguard Worker         //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
244*ec779b8eSAndroid Build Coastguard Worker         return;
245*ec779b8eSAndroid Build Coastguard Worker     }
246*ec779b8eSAndroid Build Coastguard Worker 
247*ec779b8eSAndroid Build Coastguard Worker     if (strchr(value, '=') || strchr(value, ';')) {
248*ec779b8eSAndroid Build Coastguard Worker         //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
249*ec779b8eSAndroid Build Coastguard Worker         return;
250*ec779b8eSAndroid Build Coastguard Worker     }
251*ec779b8eSAndroid Build Coastguard Worker 
252*ec779b8eSAndroid Build Coastguard Worker     mMap.replaceValueFor(String8(key), String8(value));
253*ec779b8eSAndroid Build Coastguard Worker }
254*ec779b8eSAndroid Build Coastguard Worker 
set(const char * key,int value)255*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::set(const char *key, int value)
256*ec779b8eSAndroid Build Coastguard Worker {
257*ec779b8eSAndroid Build Coastguard Worker     char str[16];
258*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%d", value);
259*ec779b8eSAndroid Build Coastguard Worker     set(key, str);
260*ec779b8eSAndroid Build Coastguard Worker }
261*ec779b8eSAndroid Build Coastguard Worker 
setFloat(const char * key,float value)262*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setFloat(const char *key, float value)
263*ec779b8eSAndroid Build Coastguard Worker {
264*ec779b8eSAndroid Build Coastguard Worker     char str[16];  // 14 should be enough. We overestimate to be safe.
265*ec779b8eSAndroid Build Coastguard Worker     snprintf(str, sizeof(str), "%g", value);
266*ec779b8eSAndroid Build Coastguard Worker     set(key, str);
267*ec779b8eSAndroid Build Coastguard Worker }
268*ec779b8eSAndroid Build Coastguard Worker 
get(const char * key) const269*ec779b8eSAndroid Build Coastguard Worker const char *CameraParameters::get(const char *key) const
270*ec779b8eSAndroid Build Coastguard Worker {
271*ec779b8eSAndroid Build Coastguard Worker     String8 v = mMap.valueFor(String8(key));
272*ec779b8eSAndroid Build Coastguard Worker     if (v.length() == 0)
273*ec779b8eSAndroid Build Coastguard Worker         return 0;
274*ec779b8eSAndroid Build Coastguard Worker     return v.c_str();
275*ec779b8eSAndroid Build Coastguard Worker }
276*ec779b8eSAndroid Build Coastguard Worker 
getInt(const char * key) const277*ec779b8eSAndroid Build Coastguard Worker int CameraParameters::getInt(const char *key) const
278*ec779b8eSAndroid Build Coastguard Worker {
279*ec779b8eSAndroid Build Coastguard Worker     const char *v = get(key);
280*ec779b8eSAndroid Build Coastguard Worker     if (v == 0)
281*ec779b8eSAndroid Build Coastguard Worker         return -1;
282*ec779b8eSAndroid Build Coastguard Worker     return strtol(v, 0, 0);
283*ec779b8eSAndroid Build Coastguard Worker }
284*ec779b8eSAndroid Build Coastguard Worker 
getFloat(const char * key) const285*ec779b8eSAndroid Build Coastguard Worker float CameraParameters::getFloat(const char *key) const
286*ec779b8eSAndroid Build Coastguard Worker {
287*ec779b8eSAndroid Build Coastguard Worker     const char *v = get(key);
288*ec779b8eSAndroid Build Coastguard Worker     if (v == 0) return -1;
289*ec779b8eSAndroid Build Coastguard Worker     return strtof(v, 0);
290*ec779b8eSAndroid Build Coastguard Worker }
291*ec779b8eSAndroid Build Coastguard Worker 
remove(const char * key)292*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::remove(const char *key)
293*ec779b8eSAndroid Build Coastguard Worker {
294*ec779b8eSAndroid Build Coastguard Worker     mMap.removeItem(String8(key));
295*ec779b8eSAndroid Build Coastguard Worker }
296*ec779b8eSAndroid Build Coastguard Worker 
297*ec779b8eSAndroid Build Coastguard Worker // Parse string like "640x480" or "10000,20000"
parse_pair(const char * str,int * first,int * second,char delim,char ** endptr=NULL)298*ec779b8eSAndroid Build Coastguard Worker static int parse_pair(const char *str, int *first, int *second, char delim,
299*ec779b8eSAndroid Build Coastguard Worker                       char **endptr = NULL)
300*ec779b8eSAndroid Build Coastguard Worker {
301*ec779b8eSAndroid Build Coastguard Worker     // Find the first integer.
302*ec779b8eSAndroid Build Coastguard Worker     char *end;
303*ec779b8eSAndroid Build Coastguard Worker     int w = (int)strtol(str, &end, 10);
304*ec779b8eSAndroid Build Coastguard Worker     // If a delimeter does not immediately follow, give up.
305*ec779b8eSAndroid Build Coastguard Worker     if (*end != delim) {
306*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
307*ec779b8eSAndroid Build Coastguard Worker         return -1;
308*ec779b8eSAndroid Build Coastguard Worker     }
309*ec779b8eSAndroid Build Coastguard Worker 
310*ec779b8eSAndroid Build Coastguard Worker     // Find the second integer, immediately after the delimeter.
311*ec779b8eSAndroid Build Coastguard Worker     int h = (int)strtol(end+1, &end, 10);
312*ec779b8eSAndroid Build Coastguard Worker 
313*ec779b8eSAndroid Build Coastguard Worker     *first = w;
314*ec779b8eSAndroid Build Coastguard Worker     *second = h;
315*ec779b8eSAndroid Build Coastguard Worker 
316*ec779b8eSAndroid Build Coastguard Worker     if (endptr) {
317*ec779b8eSAndroid Build Coastguard Worker         *endptr = end;
318*ec779b8eSAndroid Build Coastguard Worker     }
319*ec779b8eSAndroid Build Coastguard Worker 
320*ec779b8eSAndroid Build Coastguard Worker     return 0;
321*ec779b8eSAndroid Build Coastguard Worker }
322*ec779b8eSAndroid Build Coastguard Worker 
parseSizesList(const char * sizesStr,Vector<Size> & sizes)323*ec779b8eSAndroid Build Coastguard Worker static void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
324*ec779b8eSAndroid Build Coastguard Worker {
325*ec779b8eSAndroid Build Coastguard Worker     if (sizesStr == 0) {
326*ec779b8eSAndroid Build Coastguard Worker         return;
327*ec779b8eSAndroid Build Coastguard Worker     }
328*ec779b8eSAndroid Build Coastguard Worker 
329*ec779b8eSAndroid Build Coastguard Worker     char *sizeStartPtr = (char *)sizesStr;
330*ec779b8eSAndroid Build Coastguard Worker 
331*ec779b8eSAndroid Build Coastguard Worker     while (true) {
332*ec779b8eSAndroid Build Coastguard Worker         int width, height;
333*ec779b8eSAndroid Build Coastguard Worker         int success = parse_pair(sizeStartPtr, &width, &height, 'x',
334*ec779b8eSAndroid Build Coastguard Worker                                  &sizeStartPtr);
335*ec779b8eSAndroid Build Coastguard Worker         if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
336*ec779b8eSAndroid Build Coastguard Worker             ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
337*ec779b8eSAndroid Build Coastguard Worker             return;
338*ec779b8eSAndroid Build Coastguard Worker         }
339*ec779b8eSAndroid Build Coastguard Worker         sizes.push(Size(width, height));
340*ec779b8eSAndroid Build Coastguard Worker 
341*ec779b8eSAndroid Build Coastguard Worker         if (*sizeStartPtr == '\0') {
342*ec779b8eSAndroid Build Coastguard Worker             return;
343*ec779b8eSAndroid Build Coastguard Worker         }
344*ec779b8eSAndroid Build Coastguard Worker         sizeStartPtr++;
345*ec779b8eSAndroid Build Coastguard Worker     }
346*ec779b8eSAndroid Build Coastguard Worker }
347*ec779b8eSAndroid Build Coastguard Worker 
setPreviewSize(int width,int height)348*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setPreviewSize(int width, int height)
349*ec779b8eSAndroid Build Coastguard Worker {
350*ec779b8eSAndroid Build Coastguard Worker     char str[32];
351*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%dx%d", width, height);
352*ec779b8eSAndroid Build Coastguard Worker     set(KEY_PREVIEW_SIZE, str);
353*ec779b8eSAndroid Build Coastguard Worker }
354*ec779b8eSAndroid Build Coastguard Worker 
getPreviewSize(int * width,int * height) const355*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getPreviewSize(int *width, int *height) const
356*ec779b8eSAndroid Build Coastguard Worker {
357*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
358*ec779b8eSAndroid Build Coastguard Worker     // Get the current string, if it doesn't exist, leave the -1x-1
359*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(KEY_PREVIEW_SIZE);
360*ec779b8eSAndroid Build Coastguard Worker     if (p == 0)  return;
361*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
362*ec779b8eSAndroid Build Coastguard Worker }
363*ec779b8eSAndroid Build Coastguard Worker 
getPreferredPreviewSizeForVideo(int * width,int * height) const364*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getPreferredPreviewSizeForVideo(int *width, int *height) const
365*ec779b8eSAndroid Build Coastguard Worker {
366*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
367*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO);
368*ec779b8eSAndroid Build Coastguard Worker     if (p == 0)  return;
369*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
370*ec779b8eSAndroid Build Coastguard Worker }
371*ec779b8eSAndroid Build Coastguard Worker 
getSupportedPreviewSizes(Vector<Size> & sizes) const372*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getSupportedPreviewSizes(Vector<Size> &sizes) const
373*ec779b8eSAndroid Build Coastguard Worker {
374*ec779b8eSAndroid Build Coastguard Worker     const char *previewSizesStr = get(KEY_SUPPORTED_PREVIEW_SIZES);
375*ec779b8eSAndroid Build Coastguard Worker     parseSizesList(previewSizesStr, sizes);
376*ec779b8eSAndroid Build Coastguard Worker }
377*ec779b8eSAndroid Build Coastguard Worker 
setVideoSize(int width,int height)378*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setVideoSize(int width, int height)
379*ec779b8eSAndroid Build Coastguard Worker {
380*ec779b8eSAndroid Build Coastguard Worker     char str[32];
381*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%dx%d", width, height);
382*ec779b8eSAndroid Build Coastguard Worker     set(KEY_VIDEO_SIZE, str);
383*ec779b8eSAndroid Build Coastguard Worker }
384*ec779b8eSAndroid Build Coastguard Worker 
getVideoSize(int * width,int * height) const385*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getVideoSize(int *width, int *height) const
386*ec779b8eSAndroid Build Coastguard Worker {
387*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
388*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(KEY_VIDEO_SIZE);
389*ec779b8eSAndroid Build Coastguard Worker     if (p == 0) return;
390*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
391*ec779b8eSAndroid Build Coastguard Worker }
392*ec779b8eSAndroid Build Coastguard Worker 
getSupportedVideoSizes(Vector<Size> & sizes) const393*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getSupportedVideoSizes(Vector<Size> &sizes) const
394*ec779b8eSAndroid Build Coastguard Worker {
395*ec779b8eSAndroid Build Coastguard Worker     const char *videoSizesStr = get(KEY_SUPPORTED_VIDEO_SIZES);
396*ec779b8eSAndroid Build Coastguard Worker     parseSizesList(videoSizesStr, sizes);
397*ec779b8eSAndroid Build Coastguard Worker }
398*ec779b8eSAndroid Build Coastguard Worker 
setPreviewFrameRate(int fps)399*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setPreviewFrameRate(int fps)
400*ec779b8eSAndroid Build Coastguard Worker {
401*ec779b8eSAndroid Build Coastguard Worker     set(KEY_PREVIEW_FRAME_RATE, fps);
402*ec779b8eSAndroid Build Coastguard Worker }
403*ec779b8eSAndroid Build Coastguard Worker 
getPreviewFrameRate() const404*ec779b8eSAndroid Build Coastguard Worker int CameraParameters::getPreviewFrameRate() const
405*ec779b8eSAndroid Build Coastguard Worker {
406*ec779b8eSAndroid Build Coastguard Worker     return getInt(KEY_PREVIEW_FRAME_RATE);
407*ec779b8eSAndroid Build Coastguard Worker }
408*ec779b8eSAndroid Build Coastguard Worker 
getPreviewFpsRange(int * min_fps,int * max_fps) const409*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getPreviewFpsRange(int *min_fps, int *max_fps) const
410*ec779b8eSAndroid Build Coastguard Worker {
411*ec779b8eSAndroid Build Coastguard Worker     *min_fps = *max_fps = -1;
412*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(KEY_PREVIEW_FPS_RANGE);
413*ec779b8eSAndroid Build Coastguard Worker     if (p == 0) return;
414*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, min_fps, max_fps, ',');
415*ec779b8eSAndroid Build Coastguard Worker }
416*ec779b8eSAndroid Build Coastguard Worker 
setPreviewFormat(const char * format)417*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setPreviewFormat(const char *format)
418*ec779b8eSAndroid Build Coastguard Worker {
419*ec779b8eSAndroid Build Coastguard Worker     set(KEY_PREVIEW_FORMAT, format);
420*ec779b8eSAndroid Build Coastguard Worker }
421*ec779b8eSAndroid Build Coastguard Worker 
getPreviewFormat() const422*ec779b8eSAndroid Build Coastguard Worker const char *CameraParameters::getPreviewFormat() const
423*ec779b8eSAndroid Build Coastguard Worker {
424*ec779b8eSAndroid Build Coastguard Worker     return get(KEY_PREVIEW_FORMAT);
425*ec779b8eSAndroid Build Coastguard Worker }
426*ec779b8eSAndroid Build Coastguard Worker 
setPictureSize(int width,int height)427*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setPictureSize(int width, int height)
428*ec779b8eSAndroid Build Coastguard Worker {
429*ec779b8eSAndroid Build Coastguard Worker     char str[32];
430*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%dx%d", width, height);
431*ec779b8eSAndroid Build Coastguard Worker     set(KEY_PICTURE_SIZE, str);
432*ec779b8eSAndroid Build Coastguard Worker }
433*ec779b8eSAndroid Build Coastguard Worker 
getPictureSize(int * width,int * height) const434*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getPictureSize(int *width, int *height) const
435*ec779b8eSAndroid Build Coastguard Worker {
436*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
437*ec779b8eSAndroid Build Coastguard Worker     // Get the current string, if it doesn't exist, leave the -1x-1
438*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(KEY_PICTURE_SIZE);
439*ec779b8eSAndroid Build Coastguard Worker     if (p == 0) return;
440*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
441*ec779b8eSAndroid Build Coastguard Worker }
442*ec779b8eSAndroid Build Coastguard Worker 
getSupportedPictureSizes(Vector<Size> & sizes) const443*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getSupportedPictureSizes(Vector<Size> &sizes) const
444*ec779b8eSAndroid Build Coastguard Worker {
445*ec779b8eSAndroid Build Coastguard Worker     const char *pictureSizesStr = get(KEY_SUPPORTED_PICTURE_SIZES);
446*ec779b8eSAndroid Build Coastguard Worker     parseSizesList(pictureSizesStr, sizes);
447*ec779b8eSAndroid Build Coastguard Worker }
448*ec779b8eSAndroid Build Coastguard Worker 
setPictureFormat(const char * format)449*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::setPictureFormat(const char *format)
450*ec779b8eSAndroid Build Coastguard Worker {
451*ec779b8eSAndroid Build Coastguard Worker     set(KEY_PICTURE_FORMAT, format);
452*ec779b8eSAndroid Build Coastguard Worker }
453*ec779b8eSAndroid Build Coastguard Worker 
getPictureFormat() const454*ec779b8eSAndroid Build Coastguard Worker const char *CameraParameters::getPictureFormat() const
455*ec779b8eSAndroid Build Coastguard Worker {
456*ec779b8eSAndroid Build Coastguard Worker     return get(KEY_PICTURE_FORMAT);
457*ec779b8eSAndroid Build Coastguard Worker }
458*ec779b8eSAndroid Build Coastguard Worker 
dump() const459*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::dump() const
460*ec779b8eSAndroid Build Coastguard Worker {
461*ec779b8eSAndroid Build Coastguard Worker     ALOGD("dump: mMap.size = %zu", mMap.size());
462*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < mMap.size(); i++) {
463*ec779b8eSAndroid Build Coastguard Worker         String8 k, v;
464*ec779b8eSAndroid Build Coastguard Worker         k = mMap.keyAt(i);
465*ec779b8eSAndroid Build Coastguard Worker         v = mMap.valueAt(i);
466*ec779b8eSAndroid Build Coastguard Worker         ALOGD("%s: %s\n", k.c_str(), v.c_str());
467*ec779b8eSAndroid Build Coastguard Worker     }
468*ec779b8eSAndroid Build Coastguard Worker }
469*ec779b8eSAndroid Build Coastguard Worker 
dump(int fd,const Vector<String16> &) const470*ec779b8eSAndroid Build Coastguard Worker status_t CameraParameters::dump(int fd, const Vector<String16>& /*args*/) const
471*ec779b8eSAndroid Build Coastguard Worker {
472*ec779b8eSAndroid Build Coastguard Worker     const size_t SIZE = 256;
473*ec779b8eSAndroid Build Coastguard Worker     char buffer[SIZE];
474*ec779b8eSAndroid Build Coastguard Worker     String8 result;
475*ec779b8eSAndroid Build Coastguard Worker     snprintf(buffer, 255, "CameraParameters::dump: mMap.size = %zu\n", mMap.size());
476*ec779b8eSAndroid Build Coastguard Worker     result.append(buffer);
477*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < mMap.size(); i++) {
478*ec779b8eSAndroid Build Coastguard Worker         String8 k, v;
479*ec779b8eSAndroid Build Coastguard Worker         k = mMap.keyAt(i);
480*ec779b8eSAndroid Build Coastguard Worker         v = mMap.valueAt(i);
481*ec779b8eSAndroid Build Coastguard Worker         snprintf(buffer, 255, "\t%s: %s\n", k.c_str(), v.c_str());
482*ec779b8eSAndroid Build Coastguard Worker         result.append(buffer);
483*ec779b8eSAndroid Build Coastguard Worker     }
484*ec779b8eSAndroid Build Coastguard Worker     write(fd, result.c_str(), result.size());
485*ec779b8eSAndroid Build Coastguard Worker     return NO_ERROR;
486*ec779b8eSAndroid Build Coastguard Worker }
487*ec779b8eSAndroid Build Coastguard Worker 
getSupportedPreviewFormats(Vector<int> & formats) const488*ec779b8eSAndroid Build Coastguard Worker void CameraParameters::getSupportedPreviewFormats(Vector<int>& formats) const {
489*ec779b8eSAndroid Build Coastguard Worker     const char* supportedPreviewFormats =
490*ec779b8eSAndroid Build Coastguard Worker           get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS);
491*ec779b8eSAndroid Build Coastguard Worker 
492*ec779b8eSAndroid Build Coastguard Worker     if (supportedPreviewFormats == NULL) {
493*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s: No supported preview formats.", __FUNCTION__);
494*ec779b8eSAndroid Build Coastguard Worker         return;
495*ec779b8eSAndroid Build Coastguard Worker     }
496*ec779b8eSAndroid Build Coastguard Worker 
497*ec779b8eSAndroid Build Coastguard Worker     String8 fmtStr(supportedPreviewFormats);
498*ec779b8eSAndroid Build Coastguard Worker     char* prevFmts = fmtStr.lockBuffer(fmtStr.size());
499*ec779b8eSAndroid Build Coastguard Worker 
500*ec779b8eSAndroid Build Coastguard Worker     char* savePtr;
501*ec779b8eSAndroid Build Coastguard Worker     char* fmt = strtok_r(prevFmts, ",", &savePtr);
502*ec779b8eSAndroid Build Coastguard Worker     while (fmt) {
503*ec779b8eSAndroid Build Coastguard Worker         int actual = previewFormatToEnum(fmt);
504*ec779b8eSAndroid Build Coastguard Worker         if (actual != -1) {
505*ec779b8eSAndroid Build Coastguard Worker             formats.add(actual);
506*ec779b8eSAndroid Build Coastguard Worker         }
507*ec779b8eSAndroid Build Coastguard Worker         fmt = strtok_r(NULL, ",", &savePtr);
508*ec779b8eSAndroid Build Coastguard Worker     }
509*ec779b8eSAndroid Build Coastguard Worker     fmtStr.unlockBuffer(fmtStr.size());
510*ec779b8eSAndroid Build Coastguard Worker }
511*ec779b8eSAndroid Build Coastguard Worker 
512*ec779b8eSAndroid Build Coastguard Worker 
previewFormatToEnum(const char * format)513*ec779b8eSAndroid Build Coastguard Worker int CameraParameters::previewFormatToEnum(const char* format) {
514*ec779b8eSAndroid Build Coastguard Worker     return
515*ec779b8eSAndroid Build Coastguard Worker         !format ?
516*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_YCrCb_420_SP :
517*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_YUV422SP) ?
518*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
519*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_YUV420SP) ?
520*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
521*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_YUV422I) ?
522*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
523*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_YUV420P) ?
524*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_YV12 :         // YV12
525*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_RGB565) ?
526*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
527*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_RGBA8888) ?
528*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
529*ec779b8eSAndroid Build Coastguard Worker         !strcmp(format, PIXEL_FORMAT_BAYER_RGGB) ?
530*ec779b8eSAndroid Build Coastguard Worker             HAL_PIXEL_FORMAT_RAW16 :   // Raw sensor data
531*ec779b8eSAndroid Build Coastguard Worker         -1;
532*ec779b8eSAndroid Build Coastguard Worker }
533*ec779b8eSAndroid Build Coastguard Worker 
isEmpty() const534*ec779b8eSAndroid Build Coastguard Worker bool CameraParameters::isEmpty() const {
535*ec779b8eSAndroid Build Coastguard Worker     return mMap.isEmpty();
536*ec779b8eSAndroid Build Coastguard Worker }
537*ec779b8eSAndroid Build Coastguard Worker 
538*ec779b8eSAndroid Build Coastguard Worker }; // namespace android
539