AndroidCameraCapabilities.java revision c36e3c983c232dc45ed31f3d8e98d8cdd7ac14ba
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.ex.camera2.portability;
18
19import android.graphics.Point;
20import android.hardware.Camera;
21
22import com.android.ex.camera2.portability.debug.Log;
23
24import java.util.Collections;
25import java.util.Comparator;
26import java.util.List;
27
28/**
29 * The subclass of {@link CameraCapabilities} for Android Camera 1 API.
30 */
31public class AndroidCameraCapabilities extends CameraCapabilities {
32
33    private static Log.Tag TAG = new Log.Tag("AndroidCameraCapabilities");
34
35    private FpsComparator mFpsComparator = new FpsComparator();
36    private SizeComparator mSizeComparator = new SizeComparator();
37
38    AndroidCameraCapabilities(Camera.Parameters p) {
39        super(new AndroidCameraCapabilityStringifier());
40        mMaxExposureCompensation = p.getMaxExposureCompensation();
41        mMinExposureCompensation = p.getMinExposureCompensation();
42        mExposureCompensationStep = p.getExposureCompensationStep();
43        mMaxNumOfFacesSupported = p.getMaxNumDetectedFaces();
44        mMaxNumOfMeteringArea = p.getMaxNumMeteringAreas();
45        mSupportedPreviewFormats.addAll(p.getSupportedPreviewFormats());
46        mSupportedPictureFormats.addAll(p.getSupportedPictureFormats());
47        buildPreviewFpsRange(p);
48        buildPreviewSizes(p);
49        buildVideoSizes(p);
50        buildPictureSizes(p);
51        buildSceneModes(p);
52        buildFlashModes(p);
53        buildFocusModes(p);
54        buildWhiteBalances(p);
55
56        if (p.isZoomSupported()) {
57            mSupportedFeatures.add(Feature.ZOOM);
58        }
59        if (p.isVideoSnapshotSupported()) {
60            mSupportedFeatures.add(Feature.VIDEO_SNAPSHOT);
61        }
62        if (p.isAutoExposureLockSupported()) {
63            mSupportedFeatures.add(Feature.AUTO_EXPOSURE_LOCK);
64        }
65        if (p.isAutoWhiteBalanceLockSupported()) {
66            mSupportedFeatures.add(Feature.AUTO_WHITE_BALANCE_LOCK);
67        }
68        if (supports(FocusMode.AUTO)) {
69            mMaxNumOfFocusAreas = p.getMaxNumFocusAreas();
70            if (mMaxNumOfFocusAreas > 0) {
71                mSupportedFeatures.add(Feature.FOCUS_AREA);
72            }
73        }
74        if (mMaxNumOfMeteringArea > 0) {
75            mSupportedFeatures.add(Feature.METERING_AREA);
76        }
77    }
78
79    AndroidCameraCapabilities(AndroidCameraCapabilities src) {
80        super(src);
81    }
82
83    private void buildPreviewFpsRange(Camera.Parameters p) {
84        List<int[]> supportedPreviewFpsRange = p.getSupportedPreviewFpsRange();
85        if (supportedPreviewFpsRange != null) {
86            mSupportedPreviewFpsRange.addAll(supportedPreviewFpsRange);
87        }
88        Collections.sort(mSupportedPreviewFpsRange, mFpsComparator);
89    }
90
91    private void buildPreviewSizes(Camera.Parameters p) {
92        List<Camera.Size> supportedPreviewSizes = p.getSupportedPreviewSizes();
93        if (supportedPreviewSizes != null) {
94            for (Camera.Size s : supportedPreviewSizes) {
95                mSupportedPreviewSizes.add(new Point(s.width, s.height));
96            }
97        }
98        Collections.sort(mSupportedPreviewSizes, mSizeComparator);
99    }
100
101    private void buildVideoSizes(Camera.Parameters p) {
102        List<Camera.Size> supportedVideoSizes = p.getSupportedVideoSizes();
103        if (supportedVideoSizes != null) {
104            for (Camera.Size s : supportedVideoSizes) {
105                mSupportedVideoSizes.add(new Point(s.width, s.height));
106            }
107        }
108        Collections.sort(mSupportedVideoSizes, mSizeComparator);
109    }
110
111    private void buildPictureSizes(Camera.Parameters p) {
112        List<Camera.Size> supportedPictureSizes = p.getSupportedPictureSizes();
113        if (supportedPictureSizes != null) {
114            for (Camera.Size s : supportedPictureSizes) {
115                mSupportedPictureSizes.add(new Point(s.width, s.height));
116            }
117        }
118        Collections.sort(mSupportedPictureSizes, mSizeComparator);
119
120    }
121
122    private void buildSceneModes(Camera.Parameters p) {
123        List<String> supportedSceneModes = p.getSupportedSceneModes();
124        if (supportedSceneModes != null) {
125            for (String scene : supportedSceneModes) {
126                if (Camera.Parameters.SCENE_MODE_AUTO.equals(scene)) {
127                    mSupportedSceneModes.add(SceneMode.AUTO);
128                } else if (Camera.Parameters.SCENE_MODE_ACTION.equals(scene)) {
129                    mSupportedSceneModes.add(SceneMode.ACTION);
130                } else if (Camera.Parameters.SCENE_MODE_BARCODE.equals(scene)) {
131                    mSupportedSceneModes.add(SceneMode.BARCODE);
132                } else if (Camera.Parameters.SCENE_MODE_BEACH.equals(scene)) {
133                    mSupportedSceneModes.add(SceneMode.BEACH);
134                } else if (Camera.Parameters.SCENE_MODE_CANDLELIGHT.equals(scene)) {
135                    mSupportedSceneModes.add(SceneMode.CANDLELIGHT);
136                } else if (Camera.Parameters.SCENE_MODE_FIREWORKS.equals(scene)) {
137                    mSupportedSceneModes.add(SceneMode.FIREWORKS);
138                } else if (Camera.Parameters.SCENE_MODE_HDR.equals(scene)) {
139                    mSupportedSceneModes.add(SceneMode.HDR);
140                } else if (Camera.Parameters.SCENE_MODE_LANDSCAPE.equals(scene)) {
141                    mSupportedSceneModes.add(SceneMode.LANDSCAPE);
142                } else if (Camera.Parameters.SCENE_MODE_NIGHT.equals(scene)) {
143                    mSupportedSceneModes.add(SceneMode.NIGHT);
144                } else if (Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT.equals(scene)) {
145                    mSupportedSceneModes.add(SceneMode.NIGHT_PORTRAIT);
146                } else if (Camera.Parameters.SCENE_MODE_PARTY.equals(scene)) {
147                    mSupportedSceneModes.add(SceneMode.PARTY);
148                } else if (Camera.Parameters.SCENE_MODE_PORTRAIT.equals(scene)) {
149                    mSupportedSceneModes.add(SceneMode.PORTRAIT);
150                } else if (Camera.Parameters.SCENE_MODE_SNOW.equals(scene)) {
151                    mSupportedSceneModes.add(SceneMode.SNOW);
152                } else if (Camera.Parameters.SCENE_MODE_SPORTS.equals(scene)) {
153                    mSupportedSceneModes.add(SceneMode.SPORTS);
154                } else if (Camera.Parameters.SCENE_MODE_STEADYPHOTO.equals(scene)) {
155                    mSupportedSceneModes.add(SceneMode.STEADYPHOTO);
156                } else if (Camera.Parameters.SCENE_MODE_SUNSET.equals(scene)) {
157                    mSupportedSceneModes.add(SceneMode.SUNSET);
158                } else if (Camera.Parameters.SCENE_MODE_THEATRE.equals(scene)) {
159                    mSupportedSceneModes.add(SceneMode.THEATRE);
160                }
161            }
162        }
163    }
164
165    private void buildFlashModes(Camera.Parameters p) {
166        List<String> supportedFlashModes = p.getSupportedFlashModes();
167        if (supportedFlashModes != null) {
168            for (String flash : supportedFlashModes) {
169                if (Camera.Parameters.FLASH_MODE_AUTO.equals(flash)) {
170                    mSupportedFlashModes.add(FlashMode.AUTO);
171                } else if (Camera.Parameters.FLASH_MODE_OFF.equals(flash)) {
172                    mSupportedFlashModes.add(FlashMode.OFF);
173                } else if (Camera.Parameters.FLASH_MODE_ON.equals(flash)) {
174                    mSupportedFlashModes.add(FlashMode.ON);
175                } else if (Camera.Parameters.FLASH_MODE_RED_EYE.equals(flash)) {
176                    mSupportedFlashModes.add(FlashMode.RED_EYE);
177                }
178            }
179        }
180    }
181
182    private void buildFocusModes(Camera.Parameters p) {
183        List<String> supportedFocusModes = p.getSupportedFocusModes();
184        if (supportedFocusModes != null) {
185            for (String focus : supportedFocusModes) {
186                if (Camera.Parameters.FOCUS_MODE_AUTO.equals(focus)) {
187                    mSupportedFocusModes.add(FocusMode.AUTO);
188                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(focus)) {
189                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_PICTURE);
190                } else if (Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO.equals(focus)) {
191                    mSupportedFocusModes.add(FocusMode.CONTINUOUS_VIDEO);
192                } else if (Camera.Parameters.FOCUS_MODE_EDOF.equals(focus)) {
193                    mSupportedFocusModes.add(FocusMode.EXTENDED_DOF);
194                } else if (Camera.Parameters.FOCUS_MODE_FIXED.equals(focus)) {
195                    mSupportedFocusModes.add(FocusMode.FIXED);
196                } else if (Camera.Parameters.FOCUS_MODE_INFINITY.equals(focus)) {
197                    mSupportedFocusModes.add(FocusMode.INFINITY);
198                } else if (Camera.Parameters.FOCUS_MODE_MACRO.equals(focus)) {
199                    mSupportedFocusModes.add(FocusMode.MACRO);
200                }
201            }
202        }
203    }
204
205    private void buildWhiteBalances(Camera.Parameters p) {
206        List<String> supportedWhiteBalances = p.getSupportedFocusModes();
207        if (supportedWhiteBalances != null) {
208            for (String wb : supportedWhiteBalances) {
209                if (Camera.Parameters.WHITE_BALANCE_AUTO.equals(wb)) {
210                    mSupportedWhiteBalances.add(WhiteBalance.AUTO);
211                } else if (Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT.equals(wb)) {
212                    mSupportedWhiteBalances.add(WhiteBalance.CLOUDY_DAYLIGHT);
213                } else if (Camera.Parameters.WHITE_BALANCE_DAYLIGHT.equals(wb)) {
214                    mSupportedWhiteBalances.add(WhiteBalance.DAYLIGHT);
215                } else if (Camera.Parameters.WHITE_BALANCE_FLUORESCENT.equals(wb)) {
216                    mSupportedWhiteBalances.add(WhiteBalance.FLUORESCENT);
217                } else if (Camera.Parameters.WHITE_BALANCE_INCANDESCENT.equals(wb)) {
218                    mSupportedWhiteBalances.add(WhiteBalance.INCANDESCENT);
219                } else if (Camera.Parameters.WHITE_BALANCE_SHADE.equals(wb)) {
220                    mSupportedWhiteBalances.add(WhiteBalance.SHADE);
221                } else if (Camera.Parameters.WHITE_BALANCE_TWILIGHT.equals(wb)) {
222                    mSupportedWhiteBalances.add(WhiteBalance.TWILIGHT);
223                } else if (Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT.equals(wb)) {
224                    mSupportedWhiteBalances.add(WhiteBalance.WARM_FLUORESCENT);
225                }
226            }
227        }
228    }
229
230    private static class FpsComparator implements Comparator<int[]> {
231        @Override
232        public int compare(int[] fps1, int[] fps2) {
233            return (fps1[0] == fps2[0] ? fps1[1] - fps2[1] : fps1[0] - fps2[0]);
234        }
235    }
236
237    private static class SizeComparator implements Comparator<Point> {
238
239        @Override
240        public int compare(Point size1, Point size2) {
241            return (size1.x == size2.x ? size1.y - size2.y : size1.x - size2.x);
242        }
243    }
244
245    private static class AndroidCameraCapabilityStringifier implements Stringifier {
246
247        @Override
248        public String stringify(FocusMode focus) {
249            switch (focus) {
250                case AUTO:
251                    return Camera.Parameters.FOCUS_MODE_AUTO;
252                case CONTINUOUS_PICTURE:
253                    return Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
254                case CONTINUOUS_VIDEO:
255                    return Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
256                case EXTENDED_DOF:
257                    return Camera.Parameters.FOCUS_MODE_EDOF;
258                case FIXED:
259                    return Camera.Parameters.FOCUS_MODE_FIXED;
260                case INFINITY:
261                    return Camera.Parameters.FOCUS_MODE_INFINITY;
262                case MACRO:
263                    return Camera.Parameters.FOCUS_MODE_MACRO;
264            }
265            return null;
266        }
267
268        @Override
269        public FocusMode focusModeFromString(String val) {
270            if (val.equals(Camera.Parameters.FOCUS_MODE_AUTO)) {
271                return FocusMode.AUTO;
272            } else if (val.equals(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
273                return FocusMode.CONTINUOUS_PICTURE;
274            } else if (val.equals(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
275                return FocusMode.CONTINUOUS_VIDEO;
276            } else if (val.equals(Camera.Parameters.FOCUS_MODE_EDOF)) {
277                return FocusMode.EXTENDED_DOF;
278            } else if (val.equals(Camera.Parameters.FOCUS_MODE_FIXED)) {
279                return FocusMode.FIXED;
280            } else if (val.equals(Camera.Parameters.FOCUS_MODE_INFINITY)) {
281                return FocusMode.INFINITY;
282            } else if (val.equals(Camera.Parameters.FOCUS_MODE_MACRO)) {
283                return FocusMode.MACRO;
284            } else {
285                return null;
286            }
287        }
288
289        @Override
290        public String stringify(FlashMode flash) {
291            switch (flash) {
292                case AUTO:
293                    return Camera.Parameters.FLASH_MODE_AUTO;
294                case OFF:
295                    return Camera.Parameters.FLASH_MODE_OFF;
296                case ON:
297                    return Camera.Parameters.FLASH_MODE_ON;
298                case TORCH:
299                    return Camera.Parameters.FLASH_MODE_TORCH;
300                case RED_EYE:
301                    return Camera.Parameters.FLASH_MODE_RED_EYE;
302            }
303            return null;
304        }
305
306        @Override
307        public FlashMode flashModeFromString(String val) {
308            if (val.equals(Camera.Parameters.FLASH_MODE_AUTO)) {
309                return FlashMode.AUTO;
310            } else if (val.equals(Camera.Parameters.FLASH_MODE_OFF)) {
311                return FlashMode.OFF;
312            } else if (val.equals(Camera.Parameters.FLASH_MODE_ON)) {
313                return FlashMode.ON;
314            } else if (val.equals(Camera.Parameters.FLASH_MODE_TORCH)) {
315                return FlashMode.TORCH;
316            } else if (val.equals(Camera.Parameters.FLASH_MODE_RED_EYE)) {
317                return FlashMode.RED_EYE;
318            } else {
319                return null;
320            }
321        }
322
323        @Override
324        public String stringify(SceneMode scene) {
325            switch (scene) {
326                case AUTO:
327                    return Camera.Parameters.SCENE_MODE_AUTO;
328                case ACTION:
329                    return Camera.Parameters.SCENE_MODE_ACTION;
330                case BARCODE:
331                    return Camera.Parameters.SCENE_MODE_BARCODE;
332                case BEACH:
333                    return Camera.Parameters.SCENE_MODE_BEACH;
334                case CANDLELIGHT:
335                    return Camera.Parameters.SCENE_MODE_CANDLELIGHT;
336                case FIREWORKS:
337                    return Camera.Parameters.SCENE_MODE_FIREWORKS;
338                case HDR:
339                    return Camera.Parameters.SCENE_MODE_HDR;
340                case LANDSCAPE:
341                    return Camera.Parameters.SCENE_MODE_LANDSCAPE;
342                case NIGHT:
343                    return Camera.Parameters.SCENE_MODE_NIGHT;
344                case NIGHT_PORTRAIT:
345                    return Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT;
346                case PARTY:
347                    return Camera.Parameters.SCENE_MODE_PARTY;
348                case PORTRAIT:
349                    return Camera.Parameters.SCENE_MODE_PORTRAIT;
350                case SNOW:
351                    return Camera.Parameters.SCENE_MODE_SNOW;
352                case SPORTS:
353                    return Camera.Parameters.SCENE_MODE_SPORTS;
354                case STEADYPHOTO:
355                    return Camera.Parameters.SCENE_MODE_STEADYPHOTO;
356                case SUNSET:
357                    return Camera.Parameters.SCENE_MODE_SUNSET;
358                case THEATRE:
359                    return Camera.Parameters.SCENE_MODE_THEATRE;
360            }
361            return null;
362        }
363
364        @Override
365        public SceneMode sceneModeFromString(String val) {
366            if (val.equals(Camera.Parameters.SCENE_MODE_AUTO)) {
367                return SceneMode.AUTO;
368            } else if (val.equals(Camera.Parameters.SCENE_MODE_ACTION)) {
369                return SceneMode.ACTION;
370            } else if (val.equals(Camera.Parameters.SCENE_MODE_BARCODE)) {
371                return SceneMode.BARCODE;
372            } else if (val.equals(Camera.Parameters.SCENE_MODE_BEACH)) {
373                return SceneMode.BEACH;
374            } else if (val.equals(Camera.Parameters.SCENE_MODE_CANDLELIGHT)) {
375                return SceneMode.CANDLELIGHT;
376            } else if (val.equals(Camera.Parameters.SCENE_MODE_FIREWORKS)) {
377                return SceneMode.FIREWORKS;
378            } else if (val.equals(Camera.Parameters.SCENE_MODE_HDR)) {
379                return SceneMode.HDR;
380            } else if (val.equals(Camera.Parameters.SCENE_MODE_LANDSCAPE)) {
381                return SceneMode.LANDSCAPE;
382            } else if (val.equals(Camera.Parameters.SCENE_MODE_NIGHT)) {
383                return SceneMode.NIGHT;
384            } else if (val.equals(Camera.Parameters.SCENE_MODE_NIGHT_PORTRAIT)) {
385                return SceneMode.NIGHT_PORTRAIT;
386            } else if (val.equals(Camera.Parameters.SCENE_MODE_PARTY)) {
387                return SceneMode.PARTY;
388            } else if (val.equals(Camera.Parameters.SCENE_MODE_PORTRAIT)) {
389                return SceneMode.PORTRAIT;
390            } else if (val.equals(Camera.Parameters.SCENE_MODE_SNOW)) {
391                return SceneMode.SNOW;
392            } else if (val.equals(Camera.Parameters.SCENE_MODE_SPORTS)) {
393                return SceneMode.SPORTS;
394            } else if (val.equals(Camera.Parameters.SCENE_MODE_STEADYPHOTO)) {
395                return SceneMode.STEADYPHOTO;
396            } else if (val.equals(Camera.Parameters.SCENE_MODE_SUNSET)) {
397                return SceneMode.SUNSET;
398            } else if (val.equals(Camera.Parameters.SCENE_MODE_THEATRE)) {
399                return SceneMode.THEATRE;
400            } else {
401                return null;
402            }
403        }
404
405        @Override
406        public String stringify(WhiteBalance wb) {
407            switch (wb) {
408                case AUTO:
409                    return Camera.Parameters.WHITE_BALANCE_AUTO;
410                case CLOUDY_DAYLIGHT:
411                    return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
412                case DAYLIGHT:
413                    return Camera.Parameters.WHITE_BALANCE_DAYLIGHT;
414                case FLUORESCENT:
415                    return Camera.Parameters.WHITE_BALANCE_FLUORESCENT;
416                case INCANDESCENT:
417                    return Camera.Parameters.WHITE_BALANCE_INCANDESCENT;
418                case SHADE:
419                    return Camera.Parameters.WHITE_BALANCE_SHADE;
420                case TWILIGHT:
421                    return Camera.Parameters.WHITE_BALANCE_TWILIGHT;
422                case WARM_FLUORESCENT:
423                    return Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT;
424            }
425            return null;
426        }
427
428        @Override
429        public WhiteBalance whiteBalanceFromString(String val) {
430            if (val.equals(Camera.Parameters.WHITE_BALANCE_AUTO)) {
431                return WhiteBalance.AUTO;
432            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT)) {
433                return WhiteBalance.CLOUDY_DAYLIGHT;
434            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_DAYLIGHT)) {
435                return WhiteBalance.DAYLIGHT;
436            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_FLUORESCENT)) {
437                return WhiteBalance.FLUORESCENT;
438            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_INCANDESCENT)) {
439                return WhiteBalance.INCANDESCENT;
440            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_SHADE)) {
441                return WhiteBalance.SHADE;
442            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_TWILIGHT)) {
443                return WhiteBalance.TWILIGHT;
444            } else if (val.equals(Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT)) {
445                return WhiteBalance.WARM_FLUORESCENT;
446            } else {
447                return null;
448            }
449        }
450    }
451}
452