xref: /aosp_15_r20/frameworks/av/camera/CameraParameters2.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 "CameraParams2"
19*ec779b8eSAndroid Build Coastguard Worker // #define LOG_NDEBUG 0
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <string.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <unistd.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraParameters2.h>
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker namespace android {
28*ec779b8eSAndroid Build Coastguard Worker 
CameraParameters2()29*ec779b8eSAndroid Build Coastguard Worker CameraParameters2::CameraParameters2()
30*ec779b8eSAndroid Build Coastguard Worker                 : mMap()
31*ec779b8eSAndroid Build Coastguard Worker {
32*ec779b8eSAndroid Build Coastguard Worker }
33*ec779b8eSAndroid Build Coastguard Worker 
~CameraParameters2()34*ec779b8eSAndroid Build Coastguard Worker CameraParameters2::~CameraParameters2()
35*ec779b8eSAndroid Build Coastguard Worker {
36*ec779b8eSAndroid Build Coastguard Worker }
37*ec779b8eSAndroid Build Coastguard Worker 
flatten() const38*ec779b8eSAndroid Build Coastguard Worker String8 CameraParameters2::flatten() const
39*ec779b8eSAndroid Build Coastguard Worker {
40*ec779b8eSAndroid Build Coastguard Worker     String8 flattened("");
41*ec779b8eSAndroid Build Coastguard Worker     size_t size = mMap.size();
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < size; i++) {
44*ec779b8eSAndroid Build Coastguard Worker         String8 k, v;
45*ec779b8eSAndroid Build Coastguard Worker         k = mMap.keyAt(i);
46*ec779b8eSAndroid Build Coastguard Worker         v = mMap.valueAt(i);
47*ec779b8eSAndroid Build Coastguard Worker 
48*ec779b8eSAndroid Build Coastguard Worker         flattened += k;
49*ec779b8eSAndroid Build Coastguard Worker         flattened += "=";
50*ec779b8eSAndroid Build Coastguard Worker         flattened += v;
51*ec779b8eSAndroid Build Coastguard Worker         if (i != size-1)
52*ec779b8eSAndroid Build Coastguard Worker             flattened += ";";
53*ec779b8eSAndroid Build Coastguard Worker     }
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     ALOGV("%s: Flattened params = %s", __FUNCTION__, flattened.c_str());
56*ec779b8eSAndroid Build Coastguard Worker 
57*ec779b8eSAndroid Build Coastguard Worker     return flattened;
58*ec779b8eSAndroid Build Coastguard Worker }
59*ec779b8eSAndroid Build Coastguard Worker 
unflatten(const String8 & params)60*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::unflatten(const String8 &params)
61*ec779b8eSAndroid Build Coastguard Worker {
62*ec779b8eSAndroid Build Coastguard Worker     const char *a = params.c_str();
63*ec779b8eSAndroid Build Coastguard Worker     const char *b;
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker     mMap.clear();
66*ec779b8eSAndroid Build Coastguard Worker 
67*ec779b8eSAndroid Build Coastguard Worker     for (;;) {
68*ec779b8eSAndroid Build Coastguard Worker         // Find the bounds of the key name.
69*ec779b8eSAndroid Build Coastguard Worker         b = strchr(a, '=');
70*ec779b8eSAndroid Build Coastguard Worker         if (b == 0)
71*ec779b8eSAndroid Build Coastguard Worker             break;
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker         // Create the key string.
74*ec779b8eSAndroid Build Coastguard Worker         String8 k(a, (size_t)(b-a));
75*ec779b8eSAndroid Build Coastguard Worker 
76*ec779b8eSAndroid Build Coastguard Worker         // Find the value.
77*ec779b8eSAndroid Build Coastguard Worker         a = b+1;
78*ec779b8eSAndroid Build Coastguard Worker         b = strchr(a, ';');
79*ec779b8eSAndroid Build Coastguard Worker         if (b == 0) {
80*ec779b8eSAndroid Build Coastguard Worker             // If there's no semicolon, this is the last item.
81*ec779b8eSAndroid Build Coastguard Worker             String8 v(a);
82*ec779b8eSAndroid Build Coastguard Worker             mMap.add(k, v);
83*ec779b8eSAndroid Build Coastguard Worker             break;
84*ec779b8eSAndroid Build Coastguard Worker         }
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker         String8 v(a, (size_t)(b-a));
87*ec779b8eSAndroid Build Coastguard Worker         mMap.add(k, v);
88*ec779b8eSAndroid Build Coastguard Worker         a = b+1;
89*ec779b8eSAndroid Build Coastguard Worker     }
90*ec779b8eSAndroid Build Coastguard Worker }
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker 
set(const char * key,const char * value)93*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::set(const char *key, const char *value)
94*ec779b8eSAndroid Build Coastguard Worker {
95*ec779b8eSAndroid Build Coastguard Worker     // XXX i think i can do this with strspn()
96*ec779b8eSAndroid Build Coastguard Worker     if (strchr(key, '=') || strchr(key, ';')) {
97*ec779b8eSAndroid Build Coastguard Worker         //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
98*ec779b8eSAndroid Build Coastguard Worker         return;
99*ec779b8eSAndroid Build Coastguard Worker     }
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     if (strchr(value, '=') || strchr(value, ';')) {
102*ec779b8eSAndroid Build Coastguard Worker         //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
103*ec779b8eSAndroid Build Coastguard Worker         return;
104*ec779b8eSAndroid Build Coastguard Worker     }
105*ec779b8eSAndroid Build Coastguard Worker 
106*ec779b8eSAndroid Build Coastguard Worker     // Replacing a value updates the key's order to be the new largest order
107*ec779b8eSAndroid Build Coastguard Worker     ssize_t res = mMap.replaceValueFor(String8(key), String8(value));
108*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(res < 0, "replaceValueFor(%s,%s) failed", key, value);
109*ec779b8eSAndroid Build Coastguard Worker }
110*ec779b8eSAndroid Build Coastguard Worker 
set(const char * key,int value)111*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::set(const char *key, int value)
112*ec779b8eSAndroid Build Coastguard Worker {
113*ec779b8eSAndroid Build Coastguard Worker     char str[16];
114*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%d", value);
115*ec779b8eSAndroid Build Coastguard Worker     set(key, str);
116*ec779b8eSAndroid Build Coastguard Worker }
117*ec779b8eSAndroid Build Coastguard Worker 
setFloat(const char * key,float value)118*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setFloat(const char *key, float value)
119*ec779b8eSAndroid Build Coastguard Worker {
120*ec779b8eSAndroid Build Coastguard Worker     char str[16];  // 14 should be enough. We overestimate to be safe.
121*ec779b8eSAndroid Build Coastguard Worker     snprintf(str, sizeof(str), "%g", value);
122*ec779b8eSAndroid Build Coastguard Worker     set(key, str);
123*ec779b8eSAndroid Build Coastguard Worker }
124*ec779b8eSAndroid Build Coastguard Worker 
get(const char * key) const125*ec779b8eSAndroid Build Coastguard Worker const char *CameraParameters2::get(const char *key) const
126*ec779b8eSAndroid Build Coastguard Worker {
127*ec779b8eSAndroid Build Coastguard Worker     ssize_t idx = mMap.indexOfKey(String8(key));
128*ec779b8eSAndroid Build Coastguard Worker     if (idx < 0) {
129*ec779b8eSAndroid Build Coastguard Worker         return NULL;
130*ec779b8eSAndroid Build Coastguard Worker     } else {
131*ec779b8eSAndroid Build Coastguard Worker         return mMap.valueAt(idx).c_str();
132*ec779b8eSAndroid Build Coastguard Worker     }
133*ec779b8eSAndroid Build Coastguard Worker }
134*ec779b8eSAndroid Build Coastguard Worker 
getInt(const char * key) const135*ec779b8eSAndroid Build Coastguard Worker int CameraParameters2::getInt(const char *key) const
136*ec779b8eSAndroid Build Coastguard Worker {
137*ec779b8eSAndroid Build Coastguard Worker     const char *v = get(key);
138*ec779b8eSAndroid Build Coastguard Worker     if (v == 0)
139*ec779b8eSAndroid Build Coastguard Worker         return -1;
140*ec779b8eSAndroid Build Coastguard Worker     return strtol(v, 0, 0);
141*ec779b8eSAndroid Build Coastguard Worker }
142*ec779b8eSAndroid Build Coastguard Worker 
getFloat(const char * key) const143*ec779b8eSAndroid Build Coastguard Worker float CameraParameters2::getFloat(const char *key) const
144*ec779b8eSAndroid Build Coastguard Worker {
145*ec779b8eSAndroid Build Coastguard Worker     const char *v = get(key);
146*ec779b8eSAndroid Build Coastguard Worker     if (v == 0) return -1;
147*ec779b8eSAndroid Build Coastguard Worker     return strtof(v, 0);
148*ec779b8eSAndroid Build Coastguard Worker }
149*ec779b8eSAndroid Build Coastguard Worker 
compareSetOrder(const char * key1,const char * key2,int * order) const150*ec779b8eSAndroid Build Coastguard Worker status_t CameraParameters2::compareSetOrder(const char *key1, const char *key2,
151*ec779b8eSAndroid Build Coastguard Worker         int *order) const {
152*ec779b8eSAndroid Build Coastguard Worker     if (key1 == NULL) {
153*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: key1 must not be NULL", __FUNCTION__);
154*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
155*ec779b8eSAndroid Build Coastguard Worker     } else if (key2 == NULL) {
156*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: key2 must not be NULL", __FUNCTION__);
157*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
158*ec779b8eSAndroid Build Coastguard Worker     } else if (order == NULL) {
159*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: order must not be NULL", __FUNCTION__);
160*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
161*ec779b8eSAndroid Build Coastguard Worker     }
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker     ssize_t index1 = mMap.indexOfKey(String8(key1));
164*ec779b8eSAndroid Build Coastguard Worker     ssize_t index2 = mMap.indexOfKey(String8(key2));
165*ec779b8eSAndroid Build Coastguard Worker     if (index1 < 0) {
166*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s: Key1 (%s) was not set", __FUNCTION__, key1);
167*ec779b8eSAndroid Build Coastguard Worker         return NAME_NOT_FOUND;
168*ec779b8eSAndroid Build Coastguard Worker     } else if (index2 < 0) {
169*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s: Key2 (%s) was not set", __FUNCTION__, key2);
170*ec779b8eSAndroid Build Coastguard Worker         return NAME_NOT_FOUND;
171*ec779b8eSAndroid Build Coastguard Worker     }
172*ec779b8eSAndroid Build Coastguard Worker 
173*ec779b8eSAndroid Build Coastguard Worker     *order = (index1 == index2) ? 0  :
174*ec779b8eSAndroid Build Coastguard Worker              (index1 < index2)  ? -1 :
175*ec779b8eSAndroid Build Coastguard Worker              1;
176*ec779b8eSAndroid Build Coastguard Worker 
177*ec779b8eSAndroid Build Coastguard Worker     return OK;
178*ec779b8eSAndroid Build Coastguard Worker }
179*ec779b8eSAndroid Build Coastguard Worker 
remove(const char * key)180*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::remove(const char *key)
181*ec779b8eSAndroid Build Coastguard Worker {
182*ec779b8eSAndroid Build Coastguard Worker     mMap.removeItem(String8(key));
183*ec779b8eSAndroid Build Coastguard Worker }
184*ec779b8eSAndroid Build Coastguard Worker 
185*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)186*ec779b8eSAndroid Build Coastguard Worker static int parse_pair(const char *str, int *first, int *second, char delim,
187*ec779b8eSAndroid Build Coastguard Worker                       char **endptr = NULL)
188*ec779b8eSAndroid Build Coastguard Worker {
189*ec779b8eSAndroid Build Coastguard Worker     // Find the first integer.
190*ec779b8eSAndroid Build Coastguard Worker     char *end;
191*ec779b8eSAndroid Build Coastguard Worker     int w = (int)strtol(str, &end, 10);
192*ec779b8eSAndroid Build Coastguard Worker     // If a delimeter does not immediately follow, give up.
193*ec779b8eSAndroid Build Coastguard Worker     if (*end != delim) {
194*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
195*ec779b8eSAndroid Build Coastguard Worker         return -1;
196*ec779b8eSAndroid Build Coastguard Worker     }
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker     // Find the second integer, immediately after the delimeter.
199*ec779b8eSAndroid Build Coastguard Worker     int h = (int)strtol(end+1, &end, 10);
200*ec779b8eSAndroid Build Coastguard Worker 
201*ec779b8eSAndroid Build Coastguard Worker     *first = w;
202*ec779b8eSAndroid Build Coastguard Worker     *second = h;
203*ec779b8eSAndroid Build Coastguard Worker 
204*ec779b8eSAndroid Build Coastguard Worker     if (endptr) {
205*ec779b8eSAndroid Build Coastguard Worker         *endptr = end;
206*ec779b8eSAndroid Build Coastguard Worker     }
207*ec779b8eSAndroid Build Coastguard Worker 
208*ec779b8eSAndroid Build Coastguard Worker     return 0;
209*ec779b8eSAndroid Build Coastguard Worker }
210*ec779b8eSAndroid Build Coastguard Worker 
parseSizesList(const char * sizesStr,Vector<Size> & sizes)211*ec779b8eSAndroid Build Coastguard Worker static void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
212*ec779b8eSAndroid Build Coastguard Worker {
213*ec779b8eSAndroid Build Coastguard Worker     if (sizesStr == 0) {
214*ec779b8eSAndroid Build Coastguard Worker         return;
215*ec779b8eSAndroid Build Coastguard Worker     }
216*ec779b8eSAndroid Build Coastguard Worker 
217*ec779b8eSAndroid Build Coastguard Worker     char *sizeStartPtr = (char *)sizesStr;
218*ec779b8eSAndroid Build Coastguard Worker 
219*ec779b8eSAndroid Build Coastguard Worker     while (true) {
220*ec779b8eSAndroid Build Coastguard Worker         int width, height;
221*ec779b8eSAndroid Build Coastguard Worker         int success = parse_pair(sizeStartPtr, &width, &height, 'x',
222*ec779b8eSAndroid Build Coastguard Worker                                  &sizeStartPtr);
223*ec779b8eSAndroid Build Coastguard Worker         if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
224*ec779b8eSAndroid Build Coastguard Worker             ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
225*ec779b8eSAndroid Build Coastguard Worker             return;
226*ec779b8eSAndroid Build Coastguard Worker         }
227*ec779b8eSAndroid Build Coastguard Worker         sizes.push(Size(width, height));
228*ec779b8eSAndroid Build Coastguard Worker 
229*ec779b8eSAndroid Build Coastguard Worker         if (*sizeStartPtr == '\0') {
230*ec779b8eSAndroid Build Coastguard Worker             return;
231*ec779b8eSAndroid Build Coastguard Worker         }
232*ec779b8eSAndroid Build Coastguard Worker         sizeStartPtr++;
233*ec779b8eSAndroid Build Coastguard Worker     }
234*ec779b8eSAndroid Build Coastguard Worker }
235*ec779b8eSAndroid Build Coastguard Worker 
setPreviewSize(int width,int height)236*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setPreviewSize(int width, int height)
237*ec779b8eSAndroid Build Coastguard Worker {
238*ec779b8eSAndroid Build Coastguard Worker     char str[32];
239*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%dx%d", width, height);
240*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_PREVIEW_SIZE, str);
241*ec779b8eSAndroid Build Coastguard Worker }
242*ec779b8eSAndroid Build Coastguard Worker 
getPreviewSize(int * width,int * height) const243*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getPreviewSize(int *width, int *height) const
244*ec779b8eSAndroid Build Coastguard Worker {
245*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
246*ec779b8eSAndroid Build Coastguard Worker     // Get the current string, if it doesn't exist, leave the -1x-1
247*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(CameraParameters::KEY_PREVIEW_SIZE);
248*ec779b8eSAndroid Build Coastguard Worker     if (p == 0)  return;
249*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
250*ec779b8eSAndroid Build Coastguard Worker }
251*ec779b8eSAndroid Build Coastguard Worker 
getPreferredPreviewSizeForVideo(int * width,int * height) const252*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getPreferredPreviewSizeForVideo(int *width, int *height) const
253*ec779b8eSAndroid Build Coastguard Worker {
254*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
255*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO);
256*ec779b8eSAndroid Build Coastguard Worker     if (p == 0)  return;
257*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
258*ec779b8eSAndroid Build Coastguard Worker }
259*ec779b8eSAndroid Build Coastguard Worker 
getSupportedPreviewSizes(Vector<Size> & sizes) const260*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getSupportedPreviewSizes(Vector<Size> &sizes) const
261*ec779b8eSAndroid Build Coastguard Worker {
262*ec779b8eSAndroid Build Coastguard Worker     const char *previewSizesStr = get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
263*ec779b8eSAndroid Build Coastguard Worker     parseSizesList(previewSizesStr, sizes);
264*ec779b8eSAndroid Build Coastguard Worker }
265*ec779b8eSAndroid Build Coastguard Worker 
setVideoSize(int width,int height)266*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setVideoSize(int width, int height)
267*ec779b8eSAndroid Build Coastguard Worker {
268*ec779b8eSAndroid Build Coastguard Worker     char str[32];
269*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%dx%d", width, height);
270*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_VIDEO_SIZE, str);
271*ec779b8eSAndroid Build Coastguard Worker }
272*ec779b8eSAndroid Build Coastguard Worker 
getVideoSize(int * width,int * height) const273*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getVideoSize(int *width, int *height) const
274*ec779b8eSAndroid Build Coastguard Worker {
275*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
276*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(CameraParameters::KEY_VIDEO_SIZE);
277*ec779b8eSAndroid Build Coastguard Worker     if (p == 0) return;
278*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
279*ec779b8eSAndroid Build Coastguard Worker }
280*ec779b8eSAndroid Build Coastguard Worker 
getSupportedVideoSizes(Vector<Size> & sizes) const281*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getSupportedVideoSizes(Vector<Size> &sizes) const
282*ec779b8eSAndroid Build Coastguard Worker {
283*ec779b8eSAndroid Build Coastguard Worker     const char *videoSizesStr = get(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES);
284*ec779b8eSAndroid Build Coastguard Worker     parseSizesList(videoSizesStr, sizes);
285*ec779b8eSAndroid Build Coastguard Worker }
286*ec779b8eSAndroid Build Coastguard Worker 
setPreviewFrameRate(int fps)287*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setPreviewFrameRate(int fps)
288*ec779b8eSAndroid Build Coastguard Worker {
289*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_PREVIEW_FRAME_RATE, fps);
290*ec779b8eSAndroid Build Coastguard Worker }
291*ec779b8eSAndroid Build Coastguard Worker 
getPreviewFrameRate() const292*ec779b8eSAndroid Build Coastguard Worker int CameraParameters2::getPreviewFrameRate() const
293*ec779b8eSAndroid Build Coastguard Worker {
294*ec779b8eSAndroid Build Coastguard Worker     return getInt(CameraParameters::KEY_PREVIEW_FRAME_RATE);
295*ec779b8eSAndroid Build Coastguard Worker }
296*ec779b8eSAndroid Build Coastguard Worker 
getPreviewFpsRange(int * min_fps,int * max_fps) const297*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getPreviewFpsRange(int *min_fps, int *max_fps) const
298*ec779b8eSAndroid Build Coastguard Worker {
299*ec779b8eSAndroid Build Coastguard Worker     *min_fps = *max_fps = -1;
300*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
301*ec779b8eSAndroid Build Coastguard Worker     if (p == 0) return;
302*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, min_fps, max_fps, ',');
303*ec779b8eSAndroid Build Coastguard Worker }
304*ec779b8eSAndroid Build Coastguard Worker 
setPreviewFpsRange(int min_fps,int max_fps)305*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setPreviewFpsRange(int min_fps, int max_fps)
306*ec779b8eSAndroid Build Coastguard Worker {
307*ec779b8eSAndroid Build Coastguard Worker     String8 str = String8::format("%d,%d", min_fps, max_fps);
308*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_PREVIEW_FPS_RANGE, str.c_str());
309*ec779b8eSAndroid Build Coastguard Worker }
310*ec779b8eSAndroid Build Coastguard Worker 
setPreviewFormat(const char * format)311*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setPreviewFormat(const char *format)
312*ec779b8eSAndroid Build Coastguard Worker {
313*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_PREVIEW_FORMAT, format);
314*ec779b8eSAndroid Build Coastguard Worker }
315*ec779b8eSAndroid Build Coastguard Worker 
getPreviewFormat() const316*ec779b8eSAndroid Build Coastguard Worker const char *CameraParameters2::getPreviewFormat() const
317*ec779b8eSAndroid Build Coastguard Worker {
318*ec779b8eSAndroid Build Coastguard Worker     return get(CameraParameters::KEY_PREVIEW_FORMAT);
319*ec779b8eSAndroid Build Coastguard Worker }
320*ec779b8eSAndroid Build Coastguard Worker 
setPictureSize(int width,int height)321*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setPictureSize(int width, int height)
322*ec779b8eSAndroid Build Coastguard Worker {
323*ec779b8eSAndroid Build Coastguard Worker     char str[32];
324*ec779b8eSAndroid Build Coastguard Worker     sprintf(str, "%dx%d", width, height);
325*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_PICTURE_SIZE, str);
326*ec779b8eSAndroid Build Coastguard Worker }
327*ec779b8eSAndroid Build Coastguard Worker 
getPictureSize(int * width,int * height) const328*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getPictureSize(int *width, int *height) const
329*ec779b8eSAndroid Build Coastguard Worker {
330*ec779b8eSAndroid Build Coastguard Worker     *width = *height = -1;
331*ec779b8eSAndroid Build Coastguard Worker     // Get the current string, if it doesn't exist, leave the -1x-1
332*ec779b8eSAndroid Build Coastguard Worker     const char *p = get(CameraParameters::KEY_PICTURE_SIZE);
333*ec779b8eSAndroid Build Coastguard Worker     if (p == 0) return;
334*ec779b8eSAndroid Build Coastguard Worker     parse_pair(p, width, height, 'x');
335*ec779b8eSAndroid Build Coastguard Worker }
336*ec779b8eSAndroid Build Coastguard Worker 
getSupportedPictureSizes(Vector<Size> & sizes) const337*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::getSupportedPictureSizes(Vector<Size> &sizes) const
338*ec779b8eSAndroid Build Coastguard Worker {
339*ec779b8eSAndroid Build Coastguard Worker     const char *pictureSizesStr = get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES);
340*ec779b8eSAndroid Build Coastguard Worker     parseSizesList(pictureSizesStr, sizes);
341*ec779b8eSAndroid Build Coastguard Worker }
342*ec779b8eSAndroid Build Coastguard Worker 
setPictureFormat(const char * format)343*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::setPictureFormat(const char *format)
344*ec779b8eSAndroid Build Coastguard Worker {
345*ec779b8eSAndroid Build Coastguard Worker     set(CameraParameters::KEY_PICTURE_FORMAT, format);
346*ec779b8eSAndroid Build Coastguard Worker }
347*ec779b8eSAndroid Build Coastguard Worker 
getPictureFormat() const348*ec779b8eSAndroid Build Coastguard Worker const char *CameraParameters2::getPictureFormat() const
349*ec779b8eSAndroid Build Coastguard Worker {
350*ec779b8eSAndroid Build Coastguard Worker     return get(CameraParameters::KEY_PICTURE_FORMAT);
351*ec779b8eSAndroid Build Coastguard Worker }
352*ec779b8eSAndroid Build Coastguard Worker 
dump() const353*ec779b8eSAndroid Build Coastguard Worker void CameraParameters2::dump() const
354*ec779b8eSAndroid Build Coastguard Worker {
355*ec779b8eSAndroid Build Coastguard Worker     ALOGD("dump: mMap.size = %zu", mMap.size());
356*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < mMap.size(); i++) {
357*ec779b8eSAndroid Build Coastguard Worker         String8 k, v;
358*ec779b8eSAndroid Build Coastguard Worker         k = mMap.keyAt(i);
359*ec779b8eSAndroid Build Coastguard Worker         v = mMap.valueAt(i);
360*ec779b8eSAndroid Build Coastguard Worker         ALOGD("%s: %s\n", k.c_str(), v.c_str());
361*ec779b8eSAndroid Build Coastguard Worker     }
362*ec779b8eSAndroid Build Coastguard Worker }
363*ec779b8eSAndroid Build Coastguard Worker 
dump(int fd,const Vector<String16> & args) const364*ec779b8eSAndroid Build Coastguard Worker status_t CameraParameters2::dump(int fd, const Vector<String16>& args) const
365*ec779b8eSAndroid Build Coastguard Worker {
366*ec779b8eSAndroid Build Coastguard Worker     (void)args;
367*ec779b8eSAndroid Build Coastguard Worker     const size_t SIZE = 256;
368*ec779b8eSAndroid Build Coastguard Worker     char buffer[SIZE];
369*ec779b8eSAndroid Build Coastguard Worker     String8 result;
370*ec779b8eSAndroid Build Coastguard Worker     snprintf(buffer, 255, "CameraParameters2::dump: mMap.size = %zu\n", mMap.size());
371*ec779b8eSAndroid Build Coastguard Worker     result.append(buffer);
372*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < mMap.size(); i++) {
373*ec779b8eSAndroid Build Coastguard Worker         String8 k, v;
374*ec779b8eSAndroid Build Coastguard Worker         k = mMap.keyAt(i);
375*ec779b8eSAndroid Build Coastguard Worker         v = mMap.valueAt(i);
376*ec779b8eSAndroid Build Coastguard Worker         snprintf(buffer, 255, "\t%s: %s\n", k.c_str(), v.c_str());
377*ec779b8eSAndroid Build Coastguard Worker         result.append(buffer);
378*ec779b8eSAndroid Build Coastguard Worker     }
379*ec779b8eSAndroid Build Coastguard Worker     write(fd, result.c_str(), result.size());
380*ec779b8eSAndroid Build Coastguard Worker     return NO_ERROR;
381*ec779b8eSAndroid Build Coastguard Worker }
382*ec779b8eSAndroid Build Coastguard Worker 
383*ec779b8eSAndroid Build Coastguard Worker }; // namespace android
384