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