am ca9e6549: (-s ours) Camera2: Prepare to generate tags from script: DO NOT MERGE
# Via Igor Murashkin
* commit 'ca9e65498b00c26575209012b7da0b50a170f47e':
Camera2: Prepare to generate tags from script: DO NOT MERGE
diff --git a/audio_effects/include/audio_effects/effect_bassboost.h b/audio_effects/include/audio_effects/effect_bassboost.h
index cf9375e..3735904 100644
--- a/audio_effects/include/audio_effects/effect_bassboost.h
+++ b/audio_effects/include/audio_effects/effect_bassboost.h
@@ -24,7 +24,8 @@
#endif
#ifndef OPENSL_ES_H_
-static const effect_uuid_t SL_IID_BASSBOOST_ = { 0x0634f220, 0xddd4, 0x11db, 0xa0fc, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
+static const effect_uuid_t SL_IID_BASSBOOST_ = { 0x0634f220, 0xddd4, 0x11db, 0xa0fc,
+ { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
const effect_uuid_t * const SL_IID_BASSBOOST = &SL_IID_BASSBOOST_;
#endif //OPENSL_ES_H_
diff --git a/audio_effects/include/audio_effects/effect_environmentalreverb.h b/audio_effects/include/audio_effects/effect_environmentalreverb.h
index 77f3697..3acbd5c 100644
--- a/audio_effects/include/audio_effects/effect_environmentalreverb.h
+++ b/audio_effects/include/audio_effects/effect_environmentalreverb.h
@@ -24,7 +24,8 @@
#endif
#ifndef OPENSL_ES_H_
-static const effect_uuid_t SL_IID_ENVIRONMENTALREVERB_ = { 0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, { 0x4e, 0x23, 0x4d, 0x6, 0x83, 0x9e } };
+static const effect_uuid_t SL_IID_ENVIRONMENTALREVERB_ = { 0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac,
+ { 0x4e, 0x23, 0x4d, 0x6, 0x83, 0x9e } };
const effect_uuid_t * const SL_IID_ENVIRONMENTALREVERB = &SL_IID_ENVIRONMENTALREVERB_;
#endif //OPENSL_ES_H_
diff --git a/audio_effects/include/audio_effects/effect_equalizer.h b/audio_effects/include/audio_effects/effect_equalizer.h
index e0c3bbd..17ee74f 100644
--- a/audio_effects/include/audio_effects/effect_equalizer.h
+++ b/audio_effects/include/audio_effects/effect_equalizer.h
@@ -20,7 +20,8 @@
#include <hardware/audio_effect.h>
#ifndef OPENSL_ES_H_
-static const effect_uuid_t SL_IID_EQUALIZER_ = { 0x0bed4300, 0xddd6, 0x11db, 0x8f34, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
+static const effect_uuid_t SL_IID_EQUALIZER_ = { 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
+ { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
const effect_uuid_t * const SL_IID_EQUALIZER = &SL_IID_EQUALIZER_;
#endif //OPENSL_ES_H_
@@ -31,12 +32,14 @@
/* enumerated parameters for Equalizer effect */
typedef enum
{
- EQ_PARAM_NUM_BANDS, // Gets the number of frequency bands that the equalizer supports.
+ EQ_PARAM_NUM_BANDS, // Gets the number of frequency bands that the equalizer
+ // supports.
EQ_PARAM_LEVEL_RANGE, // Returns the minimum and maximum band levels supported.
EQ_PARAM_BAND_LEVEL, // Gets/Sets the gain set for the given equalizer band.
EQ_PARAM_CENTER_FREQ, // Gets the center frequency of the given band.
EQ_PARAM_BAND_FREQ_RANGE, // Gets the frequency range of the given frequency band.
- EQ_PARAM_GET_BAND, // Gets the band that has the most effect on the given frequency.
+ EQ_PARAM_GET_BAND, // Gets the band that has the most effect on the given
+ // frequency.
EQ_PARAM_CUR_PRESET, // Gets/Sets the current preset.
EQ_PARAM_GET_NUM_OF_PRESETS, // Gets the total number of presets the equalizer supports.
EQ_PARAM_GET_PRESET_NAME, // Gets the preset name based on the index.
diff --git a/audio_effects/include/audio_effects/effect_presetreverb.h b/audio_effects/include/audio_effects/effect_presetreverb.h
index e8d6052..ba1beae 100644
--- a/audio_effects/include/audio_effects/effect_presetreverb.h
+++ b/audio_effects/include/audio_effects/effect_presetreverb.h
@@ -24,7 +24,8 @@
#endif
#ifndef OPENSL_ES_H_
-static const effect_uuid_t SL_IID_PRESETREVERB_ = { 0x47382d60, 0xddd8, 0x11db, 0xbf3a, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
+static const effect_uuid_t SL_IID_PRESETREVERB_ = { 0x47382d60, 0xddd8, 0x11db, 0xbf3a,
+ { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
const effect_uuid_t * const SL_IID_PRESETREVERB = &SL_IID_PRESETREVERB_;
#endif //OPENSL_ES_H_
diff --git a/audio_effects/include/audio_effects/effect_virtualizer.h b/audio_effects/include/audio_effects/effect_virtualizer.h
index a6f6fa2..fdb68a9 100644
--- a/audio_effects/include/audio_effects/effect_virtualizer.h
+++ b/audio_effects/include/audio_effects/effect_virtualizer.h
@@ -24,7 +24,8 @@
#endif
#ifndef OPENSL_ES_H_
-static const effect_uuid_t SL_IID_VIRTUALIZER_ = { 0x37cc2c00, 0xdddd, 0x11db, 0x8577, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
+static const effect_uuid_t SL_IID_VIRTUALIZER_ = { 0x37cc2c00, 0xdddd, 0x11db, 0x8577,
+ { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
const effect_uuid_t * const SL_IID_VIRTUALIZER = &SL_IID_VIRTUALIZER_;
#endif //OPENSL_ES_H_
diff --git a/audio_route/Android.mk b/audio_route/Android.mk
new file mode 100644
index 0000000..7470dc6
--- /dev/null
+++ b/audio_route/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_C_INCLUDES += \
+ external/tinyalsa/include \
+ external/expat/lib
+LOCAL_SRC_FILES:= audio_route.c
+LOCAL_MODULE := libaudioroute
+LOCAL_SHARED_LIBRARIES:= liblog libcutils libutils libexpat libtinyalsa
+LOCAL_MODULE_TAGS := optional
+LOCAL_PRELINK_MODULE := false
+include $(BUILD_SHARED_LIBRARY)
diff --git a/audio_route/MODULE_LICENSE_BSD b/audio_route/MODULE_LICENSE_BSD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/audio_route/MODULE_LICENSE_BSD
diff --git a/audio_route/NOTICE b/audio_route/NOTICE
new file mode 100644
index 0000000..91b6565
--- /dev/null
+++ b/audio_route/NOTICE
@@ -0,0 +1,25 @@
+Copyright 2013, The Android Open Source Project
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Android Open Source Project nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
diff --git a/audio_route/audio_route.c b/audio_route/audio_route.c
new file mode 100644
index 0000000..ae6c7f7
--- /dev/null
+++ b/audio_route/audio_route.c
@@ -0,0 +1,707 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * Inspired by TinyHW, written by Mark Brown at Wolfson Micro
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "audio_route"
+/*#define LOG_NDEBUG 0*/
+
+#include <errno.h>
+#include <expat.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <cutils/log.h>
+
+#include <tinyalsa/asoundlib.h>
+
+#define BUF_SIZE 1024
+#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
+#define INITIAL_MIXER_PATH_SIZE 8
+
+struct mixer_state {
+ struct mixer_ctl *ctl;
+ unsigned int num_values;
+ int *old_value;
+ int *new_value;
+ int *reset_value;
+ /* If linked is true, only the first element in each array is valid */
+ bool old_linked;
+ bool new_linked;
+ bool reset_linked;
+};
+
+struct mixer_setting {
+ struct mixer_ctl *ctl;
+ unsigned int num_values;
+ int *value;
+ /* If linked is true, only the first element in each array is valid */
+ bool linked;
+};
+
+struct mixer_value {
+ struct mixer_ctl *ctl;
+ int index;
+ int value;
+};
+
+struct mixer_path {
+ char *name;
+ unsigned int size;
+ unsigned int length;
+ struct mixer_setting *setting;
+};
+
+struct audio_route {
+ struct mixer *mixer;
+ unsigned int num_mixer_ctls;
+ struct mixer_state *mixer_state;
+
+ unsigned int mixer_path_size;
+ unsigned int num_mixer_paths;
+ struct mixer_path *mixer_path;
+};
+
+struct config_parse_state {
+ struct audio_route *ar;
+ struct mixer_path *path;
+ int level;
+};
+
+/* path functions */
+
+static void path_print(struct mixer_path *path)
+{
+ unsigned int i;
+ unsigned int j;
+
+ ALOGE("Path: %s, length: %d", path->name, path->length);
+ for (i = 0; i < path->length; i++) {
+ ALOGE(" id=%d: ctl=%s linked=%c", i,
+ mixer_ctl_get_name(path->setting[i].ctl),
+ path->setting[i].linked ? 'y' : 'n');
+ for (j = 0; j < path->setting[i].num_values; j++)
+ ALOGE(" id=%d value=%d", j, path->setting[i].value[j]);
+ }
+}
+
+static void path_free(struct audio_route *ar)
+{
+ unsigned int i;
+
+ for (i = 0; i < ar->num_mixer_paths; i++) {
+ if (ar->mixer_path[i].name)
+ free(ar->mixer_path[i].name);
+ if (ar->mixer_path[i].setting) {
+ if (ar->mixer_path[i].setting->value)
+ free(ar->mixer_path[i].setting->value);
+ free(ar->mixer_path[i].setting);
+ }
+ }
+ free(ar->mixer_path);
+}
+
+static struct mixer_path *path_get_by_name(struct audio_route *ar,
+ const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; i < ar->num_mixer_paths; i++)
+ if (strcmp(ar->mixer_path[i].name, name) == 0)
+ return &ar->mixer_path[i];
+
+ return NULL;
+}
+
+static struct mixer_path *path_create(struct audio_route *ar, const char *name)
+{
+ struct mixer_path *new_mixer_path = NULL;
+
+ if (path_get_by_name(ar, name)) {
+ ALOGE("Path name '%s' already exists", name);
+ return NULL;
+ }
+
+ /* check if we need to allocate more space for mixer paths */
+ if (ar->mixer_path_size <= ar->num_mixer_paths) {
+ if (ar->mixer_path_size == 0)
+ ar->mixer_path_size = INITIAL_MIXER_PATH_SIZE;
+ else
+ ar->mixer_path_size *= 2;
+
+ new_mixer_path = realloc(ar->mixer_path, ar->mixer_path_size *
+ sizeof(struct mixer_path));
+ if (new_mixer_path == NULL) {
+ ALOGE("Unable to allocate more paths");
+ return NULL;
+ } else {
+ ar->mixer_path = new_mixer_path;
+ }
+ }
+
+ /* initialise the new mixer path */
+ ar->mixer_path[ar->num_mixer_paths].name = strdup(name);
+ ar->mixer_path[ar->num_mixer_paths].size = 0;
+ ar->mixer_path[ar->num_mixer_paths].length = 0;
+ ar->mixer_path[ar->num_mixer_paths].setting = NULL;
+
+ /* return the mixer path just added, then increment number of them */
+ return &ar->mixer_path[ar->num_mixer_paths++];
+}
+
+static int find_ctl_in_path(struct mixer_path *path, struct mixer_ctl *ctl)
+{
+ unsigned int i;
+
+ for (i = 0; i < path->length; i++)
+ if (path->setting[i].ctl == ctl)
+ return i;
+
+ return -1;
+}
+
+static int alloc_path_setting(struct mixer_path *path)
+{
+ struct mixer_setting *new_path_setting;
+ int path_index;
+
+ /* check if we need to allocate more space for path settings */
+ if (path->size <= path->length) {
+ if (path->size == 0)
+ path->size = INITIAL_MIXER_PATH_SIZE;
+ else
+ path->size *= 2;
+
+ new_path_setting = realloc(path->setting,
+ path->size * sizeof(struct mixer_setting));
+ if (new_path_setting == NULL) {
+ ALOGE("Unable to allocate more path settings");
+ return -1;
+ } else {
+ path->setting = new_path_setting;
+ }
+ }
+
+ path_index = path->length;
+ path->length++;
+
+ return path_index;
+}
+
+static int path_add_setting(struct mixer_path *path,
+ struct mixer_setting *setting)
+{
+ unsigned int i;
+ int path_index;
+
+ if (find_ctl_in_path(path, setting->ctl) != -1) {
+ ALOGE("Control '%s' already exists in path '%s'",
+ mixer_ctl_get_name(setting->ctl), path->name);
+ return -1;
+ }
+
+ path_index = alloc_path_setting(path);
+ if (path_index < 0)
+ return -1;
+
+ path->setting[path_index].ctl = setting->ctl;
+ path->setting[path_index].num_values = setting->num_values;
+ path->setting[path_index].value = malloc(setting->num_values * sizeof(int));
+ path->setting[path_index].linked = setting->linked;
+ if (setting->linked) {
+ path->setting[path_index].value[0] = setting->value[0];
+ } else {
+ for (i = 0; i < setting->num_values; i++)
+ path->setting[path_index].value[i] = setting->value[i];
+ }
+
+ return 0;
+}
+
+static int path_add_value(struct mixer_path *path,
+ struct mixer_value *mixer_value)
+{
+ unsigned int i;
+ int path_index;
+ unsigned int num_values;
+
+ /* Check that mixer value index is within range */
+ num_values = mixer_ctl_get_num_values(mixer_value->ctl);
+ if (mixer_value->index >= (int)num_values) {
+ ALOGE("mixer index %d is out of range for '%s'", mixer_value->index,
+ mixer_ctl_get_name(mixer_value->ctl));
+ return -1;
+ }
+
+ path_index = find_ctl_in_path(path, mixer_value->ctl);
+ if (path_index < 0) {
+ /* New path */
+
+ path_index = alloc_path_setting(path);
+ if (path_index < 0)
+ return -1;
+
+ /* initialise the new path setting */
+ path->setting[path_index].ctl = mixer_value->ctl;
+ path->setting[path_index].num_values = num_values;
+ path->setting[path_index].value = malloc(num_values * sizeof(int));
+ path->setting[path_index].linked = true;
+ path->setting[path_index].value[0] = mixer_value->value;
+ }
+
+ if (mixer_value->index == -1) {
+ /* Linked, so only set the first value */
+ path->setting[path_index].linked = true;
+ path->setting[path_index].value[0] = mixer_value->value;
+ } else {
+ if (path->setting[path_index].linked && (num_values > 1)) {
+ /* Unlinking the values, so duplicate them across */
+ for (i = 1; i < num_values; i++) {
+ path->setting[path_index].value[i] =
+ path->setting[path_index].value[0];
+ }
+ path->setting[path_index].linked = false;
+ }
+ path->setting[path_index].value[mixer_value->index] = mixer_value->value;
+ }
+
+ return 0;
+}
+
+static int path_add_path(struct mixer_path *path, struct mixer_path *sub_path)
+{
+ unsigned int i;
+
+ for (i = 0; i < sub_path->length; i++)
+ if (path_add_setting(path, &sub_path->setting[i]) < 0)
+ return -1;
+
+ return 0;
+}
+
+static int path_apply(struct audio_route *ar, struct mixer_path *path)
+{
+ unsigned int i;
+ unsigned int j;
+ unsigned int ctl_index;
+
+ for (i = 0; i < path->length; i++) {
+ struct mixer_ctl *ctl = path->setting[i].ctl;
+
+ /* locate the mixer ctl in the list */
+ for (ctl_index = 0; ctl_index < ar->num_mixer_ctls; ctl_index++)
+ if (ar->mixer_state[ctl_index].ctl == ctl)
+ break;
+
+ /* apply the new value(s) */
+ for (j = 0; j < ar->mixer_state[ctl_index].num_values; j++) {
+ ar->mixer_state[ctl_index].new_value[j] = path->setting[i].value[j];
+ if (path->setting[i].linked)
+ break;
+ }
+ ar->mixer_state[ctl_index].new_linked = path->setting[i].linked;
+ }
+
+ return 0;
+}
+
+/* mixer helper function */
+static int mixer_enum_string_to_value(struct mixer_ctl *ctl, const char *string)
+{
+ unsigned int i;
+
+ /* Search the enum strings for a particular one */
+ for (i = 0; i < mixer_ctl_get_num_enums(ctl); i++) {
+ if (strcmp(mixer_ctl_get_enum_string(ctl, i), string) == 0)
+ break;
+ }
+
+ return i;
+}
+
+static void start_tag(void *data, const XML_Char *tag_name,
+ const XML_Char **attr)
+{
+ const XML_Char *attr_name = NULL;
+ const XML_Char *attr_id = NULL;
+ const XML_Char *attr_value = NULL;
+ struct config_parse_state *state = data;
+ struct audio_route *ar = state->ar;
+ unsigned int i;
+ unsigned int ctl_index;
+ struct mixer_ctl *ctl;
+ int value;
+ unsigned int id;
+ struct mixer_value mixer_value;
+
+ /* Get name, id and value attributes (these may be empty) */
+ for (i = 0; attr[i]; i += 2) {
+ if (strcmp(attr[i], "name") == 0)
+ attr_name = attr[i + 1];
+ if (strcmp(attr[i], "id") == 0)
+ attr_id = attr[i + 1];
+ else if (strcmp(attr[i], "value") == 0)
+ attr_value = attr[i + 1];
+ }
+
+ /* Look at tags */
+ if (strcmp(tag_name, "path") == 0) {
+ if (attr_name == NULL) {
+ ALOGE("Unnamed path!");
+ } else {
+ if (state->level == 1) {
+ /* top level path: create and stash the path */
+ state->path = path_create(ar, (char *)attr_name);
+ } else {
+ /* nested path */
+ struct mixer_path *sub_path = path_get_by_name(ar, attr_name);
+ path_add_path(state->path, sub_path);
+ }
+ }
+ }
+
+ else if (strcmp(tag_name, "ctl") == 0) {
+ /* Obtain the mixer ctl and value */
+ ctl = mixer_get_ctl_by_name(ar->mixer, attr_name);
+ switch (mixer_ctl_get_type(ctl)) {
+ case MIXER_CTL_TYPE_BOOL:
+ case MIXER_CTL_TYPE_INT:
+ value = atoi((char *)attr_value);
+ break;
+ case MIXER_CTL_TYPE_ENUM:
+ value = mixer_enum_string_to_value(ctl, (char *)attr_value);
+ break;
+ default:
+ value = 0;
+ break;
+ }
+
+ if (state->level == 1) {
+ /* top level ctl (initial setting) */
+
+ /* locate the mixer ctl in the list */
+ for (ctl_index = 0; ctl_index < ar->num_mixer_ctls; ctl_index++) {
+ if (ar->mixer_state[ctl_index].ctl == ctl)
+ break;
+ }
+
+ /* apply the new value */
+ if (attr_id) {
+ /* set only one value */
+ id = atoi((char *)attr_id);
+ if (id < ar->mixer_state[ctl_index].num_values) {
+ if (ar->mixer_state[ctl_index].new_linked) {
+ /*
+ * We're unlinking the values, so copy old_value[0] into
+ * all the new_value elements.
+ */
+ for (i = 0; i < ar->mixer_state[ctl_index].num_values; i++) {
+ ar->mixer_state[ctl_index].new_value[i] =
+ ar->mixer_state[ctl_index].old_value[0];
+ }
+ ar->mixer_state[ctl_index].new_linked = false;
+ }
+ ar->mixer_state[ctl_index].new_value[id] = value;
+ } else {
+ ALOGE("value id out of range for mixer ctl '%s'",
+ mixer_ctl_get_name(ctl));
+ }
+ } else {
+ ar->mixer_state[ctl_index].new_value[0] = value;
+ ar->mixer_state[ctl_index].new_linked = true;
+ }
+ } else {
+ /* nested ctl (within a path) */
+ mixer_value.ctl = ctl;
+ mixer_value.value = value;
+ if (attr_id)
+ mixer_value.index = atoi((char *)attr_id);
+ else
+ mixer_value.index = -1;
+ path_add_value(state->path, &mixer_value);
+ }
+ }
+
+ state->level++;
+}
+
+static void end_tag(void *data, const XML_Char *tag_name)
+{
+ struct config_parse_state *state = data;
+
+ state->level--;
+}
+
+static int alloc_mixer_state(struct audio_route *ar)
+{
+ unsigned int i;
+ unsigned int j;
+ unsigned int num_values;
+ struct mixer_ctl *ctl;
+ bool linked;
+
+ ar->num_mixer_ctls = mixer_get_num_ctls(ar->mixer);
+ ar->mixer_state = malloc(ar->num_mixer_ctls * sizeof(struct mixer_state));
+ if (!ar->mixer_state)
+ return -1;
+
+ for (i = 0; i < ar->num_mixer_ctls; i++) {
+ ctl = mixer_get_ctl(ar->mixer, i);
+ num_values = mixer_ctl_get_num_values(ctl);
+
+ ar->mixer_state[i].old_value = malloc(num_values * sizeof(int));
+ ar->mixer_state[i].new_value = malloc(num_values * sizeof(int));
+ ar->mixer_state[i].reset_value = malloc(num_values * sizeof(int));
+
+ /*
+ * Get all mixer values for controls with multiple values. If all
+ * values are the same, set the linked flag.
+ */
+ linked = true;
+ for (j = 0; j < num_values; j++) {
+ ar->mixer_state[i].old_value[j] = mixer_ctl_get_value(ctl, j);
+ ar->mixer_state[i].new_value[j] = ar->mixer_state[i].old_value[j];
+
+ /*
+ * If the next value is different from the last, set linked to
+ * false.
+ */
+ if ((j > 0) && (ar->mixer_state[i].old_value[j - 1] !=
+ ar->mixer_state[i].old_value[j])) {
+ linked = false;
+ }
+ }
+ ar->mixer_state[i].ctl = ctl;
+ ar->mixer_state[i].old_linked = linked;
+ ar->mixer_state[i].new_linked = linked;
+ ar->mixer_state[i].num_values = num_values;
+ }
+
+ return 0;
+}
+
+static void free_mixer_state(struct audio_route *ar)
+{
+ unsigned int i;
+
+ for (i = 0; i < ar->num_mixer_ctls; i++) {
+ free(ar->mixer_state[i].old_value);
+ free(ar->mixer_state[i].new_value);
+ free(ar->mixer_state[i].reset_value);
+ }
+
+ free(ar->mixer_state);
+ ar->mixer_state = NULL;
+}
+
+/* Update the mixer with any changed values */
+int audio_route_update_mixer(struct audio_route *ar)
+{
+ unsigned int i;
+ unsigned int j;
+
+ for (i = 0; i < ar->num_mixer_ctls; i++) {
+ unsigned int num_values = ar->mixer_state[i].num_values;
+
+ /* if the value has changed, update the mixer */
+ if (ar->mixer_state[i].new_linked) {
+ if (ar->mixer_state[i].old_value[0] != ar->mixer_state[i].new_value[0]) {
+ /* linked ctl, so set all ctl values the same */
+ for (j = 0; j < num_values; j++)
+ mixer_ctl_set_value(ar->mixer_state[i].ctl, j,
+ ar->mixer_state[i].new_value[0]);
+ ar->mixer_state[i].old_value[0] = ar->mixer_state[i].new_value[0];
+ }
+ } else {
+ for (j = 0; j < num_values; j++) {
+ /*
+ * unlinked ctl, so set each value if necessary.
+ * Note that if the new value is unlinked but the old is
+ * linked, only value 0 is valid, so we always have to
+ * update the mixer for the other values.
+ */
+ if (ar->mixer_state[i].old_linked ||
+ (ar->mixer_state[i].old_value[j] !=
+ ar->mixer_state[i].new_value[j])) {
+ mixer_ctl_set_value(ar->mixer_state[i].ctl, j,
+ ar->mixer_state[i].new_value[j]);
+ ar->mixer_state[i].old_value[j] = ar->mixer_state[i].new_value[j];
+ }
+ }
+ }
+ ar->mixer_state[i].old_linked = ar->mixer_state[i].new_linked;
+ }
+
+ return 0;
+}
+
+/* saves the current state of the mixer, for resetting all controls */
+static void save_mixer_state(struct audio_route *ar)
+{
+ unsigned int i;
+ unsigned int j;
+
+ for (i = 0; i < ar->num_mixer_ctls; i++) {
+ for (j = 0; j < ar->mixer_state[i].num_values; j++) {
+ ar->mixer_state[i].reset_value[j] = ar->mixer_state[i].new_value[j];
+
+ /* if the values are linked, only need to save value 0 */
+ if (ar->mixer_state[i].new_linked)
+ break;
+ }
+ ar->mixer_state[i].reset_linked = ar->mixer_state[i].new_linked;
+ }
+}
+
+/* Reset the audio routes back to the initial state */
+void audio_route_reset(struct audio_route *ar)
+{
+ unsigned int i;
+ unsigned int j;
+
+ /* load all of the saved values */
+ for (i = 0; i < ar->num_mixer_ctls; i++) {
+ for (j = 0; j < ar->mixer_state[i].num_values; j++) {
+ ar->mixer_state[i].new_value[j] = ar->mixer_state[i].reset_value[j];
+
+ /* if the values are linked, only need to save value 0 */
+ if (ar->mixer_state[i].reset_linked)
+ break;
+ }
+ ar->mixer_state[i].new_linked = ar->mixer_state[i].reset_linked;
+ }
+}
+
+/* Apply an audio route path by name */
+int audio_route_apply_path(struct audio_route *ar, const char *name)
+{
+ struct mixer_path *path;
+
+ if (!ar) {
+ ALOGE("invalid audio_route");
+ return -1;
+ }
+
+ path = path_get_by_name(ar, name);
+ if (!path) {
+ ALOGE("unable to find path '%s'", name);
+ return -1;
+ }
+
+ path_apply(ar, path);
+
+ return 0;
+}
+
+struct audio_route *audio_route_init(unsigned int card, const char *xml_path)
+{
+ struct config_parse_state state;
+ XML_Parser parser;
+ FILE *file;
+ int bytes_read;
+ void *buf;
+ int i;
+ struct audio_route *ar;
+
+ ar = calloc(1, sizeof(struct audio_route));
+ if (!ar)
+ goto err_calloc;
+
+ ar->mixer = mixer_open(card);
+ if (!ar->mixer) {
+ ALOGE("Unable to open the mixer, aborting.");
+ goto err_mixer_open;
+ }
+
+ ar->mixer_path = NULL;
+ ar->mixer_path_size = 0;
+ ar->num_mixer_paths = 0;
+
+ /* allocate space for and read current mixer settings */
+ if (alloc_mixer_state(ar) < 0)
+ goto err_mixer_state;
+
+ /* use the default XML path if none is provided */
+ if (xml_path == NULL)
+ xml_path = MIXER_XML_PATH;
+
+ file = fopen(xml_path, "r");
+
+ if (!file) {
+ ALOGE("Failed to open %s", xml_path);
+ goto err_fopen;
+ }
+
+ parser = XML_ParserCreate(NULL);
+ if (!parser) {
+ ALOGE("Failed to create XML parser");
+ goto err_parser_create;
+ }
+
+ memset(&state, 0, sizeof(state));
+ state.ar = ar;
+ XML_SetUserData(parser, &state);
+ XML_SetElementHandler(parser, start_tag, end_tag);
+
+ for (;;) {
+ buf = XML_GetBuffer(parser, BUF_SIZE);
+ if (buf == NULL)
+ goto err_parse;
+
+ bytes_read = fread(buf, 1, BUF_SIZE, file);
+ if (bytes_read < 0)
+ goto err_parse;
+
+ if (XML_ParseBuffer(parser, bytes_read,
+ bytes_read == 0) == XML_STATUS_ERROR) {
+ ALOGE("Error in mixer xml (%s)", MIXER_XML_PATH);
+ goto err_parse;
+ }
+
+ if (bytes_read == 0)
+ break;
+ }
+
+ /* apply the initial mixer values, and save them so we can reset the
+ mixer to the original values */
+ audio_route_update_mixer(ar);
+ save_mixer_state(ar);
+
+ XML_ParserFree(parser);
+ fclose(file);
+ return ar;
+
+err_parse:
+ XML_ParserFree(parser);
+err_parser_create:
+ fclose(file);
+err_fopen:
+ free_mixer_state(ar);
+err_mixer_state:
+ mixer_close(ar->mixer);
+err_mixer_open:
+ free(ar);
+ ar = NULL;
+err_calloc:
+ return NULL;
+}
+
+void audio_route_free(struct audio_route *ar)
+{
+ free_mixer_state(ar);
+ mixer_close(ar->mixer);
+ free(ar);
+}
diff --git a/audio_route/include/audio_route/audio_route.h b/audio_route/include/audio_route/audio_route.h
new file mode 100644
index 0000000..0fea474
--- /dev/null
+++ b/audio_route/include/audio_route/audio_route.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AUDIO_ROUTE_H
+#define AUDIO_ROUTE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/* Initialize and free the audio routes */
+struct audio_route *audio_route_init(unsigned int card, const char *xml_path);
+void audio_route_free(struct audio_route *ar);
+
+/* Apply an audio route path by name */
+int audio_route_apply_path(struct audio_route *ar, const char *name);
+
+/* Reset the audio routes back to the initial state */
+void audio_route_reset(struct audio_route *ar);
+
+/* Update the mixer with any changed values */
+int audio_route_update_mixer(struct audio_route *ar);
+
+#if defined(__cplusplus)
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/audio_utils/Android.mk b/audio_utils/Android.mk
index e3f3e5e..1ddaced 100644
--- a/audio_utils/Android.mk
+++ b/audio_utils/Android.mk
@@ -21,3 +21,42 @@
libspeexresampler
include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libaudioutils
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := \
+ primitives.c
+LOCAL_C_INCLUDES += \
+ $(call include-path-for, audio-utils)
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libsndfile
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+ tinysndfile.c
+
+LOCAL_C_INCLUDES += \
+ $(call include-path-for, audio-utils)
+
+#LOCAL_SHARED_LIBRARIES := libaudioutils
+
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libsndfile
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+ tinysndfile.c
+
+LOCAL_C_INCLUDES += \
+ $(call include-path-for, audio-utils)
+
+#LOCAL_SHARED_LIBRARIES := libaudioutils
+
+include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/audio_utils/echo_reference.c b/audio_utils/echo_reference.c
index c05a60f..90f9a9f 100644
--- a/audio_utils/echo_reference.c
+++ b/audio_utils/echo_reference.c
@@ -83,9 +83,11 @@
return -ENODATA;
}
- buffer->frame_count = (buffer->frame_count > er->wr_frames_in) ? er->wr_frames_in : buffer->frame_count;
+ buffer->frame_count = (buffer->frame_count > er->wr_frames_in) ?
+ er->wr_frames_in : buffer->frame_count;
// this is er->rd_channel_count here as we resample after stereo to mono conversion if any
- buffer->i16 = (int16_t *)er->wr_src_buf + (er->wr_curr_frame_size - er->wr_frames_in) * er->rd_channel_count;
+ buffer->i16 = (int16_t *)er->wr_src_buf + (er->wr_curr_frame_size - er->wr_frames_in) *
+ er->rd_channel_count;
return 0;
}
@@ -234,8 +236,8 @@
goto exit;
}
}
- // er->wr_src_buf and er->wr_frames_in are used by getNexBuffer() called by the resampler
- // to get new frames
+ // er->wr_src_buf and er->wr_frames_in are used by getNexBuffer() called by the
+ // resampler to get new frames
if (er->rd_channel_count != er->wr_channel_count) {
er->wr_src_buf = er->wr_buf;
} else {
@@ -373,7 +375,8 @@
int64_t deltaNs = delayNs - expectedDelayNs;
- ALOGV("echo_reference_read(): EchoPathDelayDeviation between reference and DMA [%lld]", deltaNs);
+ ALOGV("echo_reference_read(): EchoPathDelayDeviation between reference and DMA [%lld]",
+ deltaNs);
if (abs(deltaNs) >= MIN_DELAY_DELTA_NS) {
// smooth the variation and update the reference buffer only
// if a deviation in the same direction is observed for more than MIN_DELTA_NUM
@@ -493,7 +496,8 @@
}
if ((rdChannelCount != 1 && rdChannelCount != 2) ||
wrChannelCount != 2) {
- ALOGW("create_echo_reference bad channel count rd %d, wr %d", rdChannelCount, wrChannelCount);
+ ALOGW("create_echo_reference bad channel count rd %d, wr %d", rdChannelCount,
+ wrChannelCount);
return -EINVAL;
}
diff --git a/audio_utils/fixedfft.cpp b/audio_utils/fixedfft.cpp
index 2c92e74..eba84e7 100644
--- a/audio_utils/fixedfft.cpp
+++ b/audio_utils/fixedfft.cpp
@@ -35,7 +35,9 @@
#define LOG_FFT_SIZE 10
#define MAX_FFT_SIZE (1 << LOG_FFT_SIZE)
-static const int32_t twiddle[MAX_FFT_SIZE / 4] = {
+// Actually int32_t, but declare as uint32_t to avoid warnings due to overflow.
+// Be sure to cast all accesses before use, for example "(int32_t) twiddle[...]".
+static const uint32_t twiddle[MAX_FFT_SIZE / 4] = {
0x00008000, 0xff378001, 0xfe6e8002, 0xfda58006, 0xfcdc800a, 0xfc13800f,
0xfb4a8016, 0xfa81801e, 0xf9b88027, 0xf8ef8032, 0xf827803e, 0xf75e804b,
0xf6958059, 0xf5cd8068, 0xf5058079, 0xf43c808b, 0xf374809e, 0xf2ac80b2,
@@ -132,7 +134,7 @@
for (r = 1; r < p; ++r) {
int32_t w = MAX_FFT_SIZE / 4 - (r << scale);
i = w >> 31;
- w = twiddle[(w ^ i) - i] ^ (i << 16);
+ w = ((int32_t) twiddle[(w ^ i) - i]) ^ (i << 16);
for (i = r; i < n; i += p << 1) {
int32_t x = half(v[i]);
int32_t y = mult(w, v[i + p]);
@@ -157,7 +159,7 @@
int32_t z = half(v[n - i]);
int32_t y = z - (x ^ 0xFFFF);
x = half(x + (z ^ 0xFFFF));
- y = mult(y, twiddle[i << scale]);
+ y = mult(y, ((int32_t) twiddle[i << scale]));
v[i] = x - y;
v[n - i] = (x + y) ^ 0xFFFF;
}
diff --git a/audio_utils/include/audio_utils/primitives.h b/audio_utils/include/audio_utils/primitives.h
index 00b5cd9..b34e309 100644
--- a/audio_utils/include/audio_utils/primitives.h
+++ b/audio_utils/include/audio_utils/primitives.h
@@ -18,6 +18,7 @@
#define ANDROID_AUDIO_PRIMITIVES_H
#include <stdint.h>
+#include <stdlib.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
@@ -44,6 +45,17 @@
*/
void memcpy_to_i16_from_u8(int16_t *dst, const uint8_t *src, size_t count);
+/* Shrink and copy samples from signed 16-bit to unsigned 8-bit offset by 0x80.
+ * Parameters:
+ * dst Destination buffer
+ * src Source buffer
+ * count Number of samples to copy
+ * The destination and source buffers must either be completely separate (non-overlapping), or
+ * they must both start at the same address. Partially overlapping buffers are not supported.
+ * The conversion is done by truncation, without dithering, so it loses resolution.
+ */
+void memcpy_to_u8_from_i16(uint8_t *dst, const int16_t *src, size_t count);
+
/* Downmix pairs of interleaved stereo input 16-bit samples to mono output 16-bit samples.
* Parameters:
* dst Destination buffer
diff --git a/audio_utils/include/audio_utils/sndfile.h b/audio_utils/include/audio_utils/sndfile.h
new file mode 100644
index 0000000..c652654
--- /dev/null
+++ b/audio_utils/include/audio_utils/sndfile.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __AUDIO_UTIL_SNDFILE_H
+#define __AUDIO_UTIL_SNDFILE_H
+
+// This is a C library for reading and writing PCM .wav files. It is
+// influenced by other libraries such as libsndfile and audiofile, except is
+// much smaller and has an Apache 2.0 license.
+// The API should be familiar to clients of similar libraries, but there is
+// no guarantee that it will stay exactly source-code compatible with other libraries.
+
+#include <stdio.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+// visible to clients
+typedef int sf_count_t;
+
+typedef struct {
+ sf_count_t frames;
+ int samplerate;
+ int channels;
+ int format;
+} SF_INFO;
+
+// opaque to clients
+typedef struct SNDFILE_ SNDFILE;
+
+// Access modes
+#define SFM_READ 1
+#define SFM_WRITE 2
+
+// Format
+#define SF_FORMAT_TYPEMASK 1
+#define SF_FORMAT_WAV 1
+#define SF_FORMAT_SUBMASK 6
+#define SF_FORMAT_PCM_16 2
+#define SF_FORMAT_PCM_U8 4
+
+// Open stream
+SNDFILE *sf_open(const char *path, int mode, SF_INFO *info);
+
+// Close stream
+void sf_close(SNDFILE *handle);
+
+// Read interleaved frames and return actual number of frames read
+sf_count_t sf_readf_short(SNDFILE *handle, short *ptr, sf_count_t desired);
+
+// Write interleaved frames and return actual number of frames written
+sf_count_t sf_writef_short(SNDFILE *handle, const short *ptr, sf_count_t desired);
+
+__END_DECLS
+
+#endif /* __AUDIO_UTIL_SNDFILE_H */
diff --git a/audio_utils/primitives.c b/audio_utils/primitives.c
index bec87e0..af9ab40 100644
--- a/audio_utils/primitives.c
+++ b/audio_utils/primitives.c
@@ -39,6 +39,13 @@
}
}
+void memcpy_to_u8_from_i16(uint8_t *dst, const int16_t *src, size_t count)
+{
+ while (count--) {
+ *dst++ = (*src++ >> 8) + 0x80;
+ }
+}
+
void downmix_to_mono_i16_from_stereo_i16(int16_t *dst, const int16_t *src, size_t count)
{
while (count--) {
diff --git a/audio_utils/tinysndfile.c b/audio_utils/tinysndfile.c
new file mode 100644
index 0000000..efdb3ce
--- /dev/null
+++ b/audio_utils/tinysndfile.c
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <audio_utils/sndfile.h>
+#include <audio_utils/primitives.h>
+#include <stdio.h>
+#include <string.h>
+
+struct SNDFILE_ {
+ int mode;
+ uint8_t *temp; // realloc buffer used for shrinking 16 bits to 8 bits and byte-swapping
+ FILE *stream;
+ size_t bytesPerFrame;
+ size_t remaining; // frames unread for SFM_READ, frames written for SFM_WRITE
+ SF_INFO info;
+};
+
+static unsigned little2u(unsigned char *ptr)
+{
+ return (ptr[1] << 8) + ptr[0];
+}
+
+static unsigned little4u(unsigned char *ptr)
+{
+ return (ptr[3] << 24) + (ptr[2] << 16) + (ptr[1] << 8) + ptr[0];
+}
+
+static int isLittleEndian(void)
+{
+ static const short one = 1;
+ return *((const char *) &one) == 1;
+}
+
+static void swab(short *ptr, size_t numToSwap)
+{
+ while (numToSwap > 0) {
+ *ptr = little2u((unsigned char *) ptr);
+ --numToSwap;
+ ++ptr;
+ }
+}
+
+static SNDFILE *sf_open_read(const char *path, SF_INFO *info)
+{
+ FILE *stream = fopen(path, "rb");
+ if (stream == NULL)
+ return NULL;
+ // don't attempt to parse all valid forms, just the most common one
+ unsigned char wav[44];
+ size_t actual;
+ actual = fread(wav, sizeof(char), sizeof(wav), stream);
+ if (actual != sizeof(wav))
+ return NULL;
+ for (;;) {
+ if (memcmp(wav, "RIFF", 4))
+ break;
+ unsigned riffSize = little4u(&wav[4]);
+ if (riffSize < 36)
+ break;
+ if (memcmp(&wav[8], "WAVEfmt ", 8))
+ break;
+ unsigned fmtsize = little4u(&wav[16]);
+ if (fmtsize != 16)
+ break;
+ unsigned format = little2u(&wav[20]);
+ if (format != 1) // PCM
+ break;
+ unsigned channels = little2u(&wav[22]);
+ if (channels != 1 && channels != 2)
+ break;
+ unsigned samplerate = little4u(&wav[24]);
+ if (samplerate == 0)
+ break;
+ // ignore byte rate
+ // ignore block alignment
+ unsigned bitsPerSample = little2u(&wav[34]);
+ if (bitsPerSample != 8 && bitsPerSample != 16)
+ break;
+ unsigned bytesPerFrame = (bitsPerSample >> 3) * channels;
+ if (memcmp(&wav[36], "data", 4))
+ break;
+ unsigned dataSize = little4u(&wav[40]);
+ SNDFILE *handle = (SNDFILE *) malloc(sizeof(SNDFILE));
+ handle->mode = SFM_READ;
+ handle->temp = NULL;
+ handle->stream = stream;
+ handle->bytesPerFrame = bytesPerFrame;
+ handle->remaining = dataSize / bytesPerFrame;
+ handle->info.frames = handle->remaining;
+ handle->info.samplerate = samplerate;
+ handle->info.channels = channels;
+ handle->info.format = SF_FORMAT_WAV;
+ if (bitsPerSample == 8)
+ handle->info.format |= SF_FORMAT_PCM_U8;
+ else
+ handle->info.format |= SF_FORMAT_PCM_16;
+ *info = handle->info;
+ return handle;
+ }
+ return NULL;
+}
+
+static void write4u(unsigned char *ptr, unsigned u)
+{
+ ptr[0] = u;
+ ptr[1] = u >> 8;
+ ptr[2] = u >> 16;
+ ptr[3] = u >> 24;
+}
+
+static SNDFILE *sf_open_write(const char *path, SF_INFO *info)
+{
+ if (!(
+ (info->samplerate > 0) &&
+ (info->channels == 1 || info->channels == 2) &&
+ ((info->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV) &&
+ ((info->format & SF_FORMAT_SUBMASK) == SF_FORMAT_PCM_16 ||
+ (info->format & SF_FORMAT_SUBMASK) == SF_FORMAT_PCM_U8)
+ )) {
+ return NULL;
+ }
+ FILE *stream = fopen(path, "w+b");
+ unsigned char wav[44];
+ memset(wav, 0, sizeof(wav));
+ memcpy(wav, "RIFF", 4);
+ wav[4] = 36; // riffSize
+ memcpy(&wav[8], "WAVEfmt ", 8);
+ wav[16] = 16; // fmtsize
+ wav[20] = 1; // format = PCM
+ wav[22] = info->channels;
+ write4u(&wav[24], info->samplerate);
+ unsigned bitsPerSample = (info->format & SF_FORMAT_SUBMASK) == SF_FORMAT_PCM_16 ? 16 : 8;
+ unsigned blockAlignment = (bitsPerSample >> 3) * info->channels;
+ unsigned byteRate = info->samplerate * blockAlignment;
+ write4u(&wav[28], byteRate);
+ wav[32] = blockAlignment;
+ wav[34] = bitsPerSample;
+ memcpy(&wav[36], "data", 4);
+ // dataSize is initially zero
+ (void) fwrite(wav, sizeof(wav), 1, stream);
+ SNDFILE *handle = (SNDFILE *) malloc(sizeof(SNDFILE));
+ handle->mode = SFM_WRITE;
+ handle->temp = NULL;
+ handle->stream = stream;
+ handle->bytesPerFrame = blockAlignment;
+ handle->remaining = 0;
+ handle->info = *info;
+ return handle;
+}
+
+SNDFILE *sf_open(const char *path, int mode, SF_INFO *info)
+{
+ if (path == NULL || info == NULL)
+ return NULL;
+ switch (mode) {
+ case SFM_READ:
+ return sf_open_read(path, info);
+ case SFM_WRITE:
+ return sf_open_write(path, info);
+ default:
+ return NULL;
+ }
+}
+
+void sf_close(SNDFILE *handle)
+{
+ if (handle == NULL)
+ return;
+ free(handle->temp);
+ if (handle->mode == SFM_WRITE) {
+ (void) fflush(handle->stream);
+ rewind(handle->stream);
+ unsigned char wav[44];
+ (void) fread(wav, sizeof(wav), 1, handle->stream);
+ unsigned dataSize = handle->remaining * handle->bytesPerFrame;
+ write4u(&wav[4], dataSize + 36); // riffSize
+ write4u(&wav[40], dataSize); // dataSize
+ rewind(handle->stream);
+ (void) fwrite(wav, sizeof(wav), 1, handle->stream);
+ }
+ (void) fclose(handle->stream);
+ free(handle);
+}
+
+sf_count_t sf_readf_short(SNDFILE *handle, short *ptr, sf_count_t desiredFrames)
+{
+ if (handle == NULL || handle->mode != SFM_READ || ptr == NULL || !handle->remaining ||
+ desiredFrames <= 0) {
+ return 0;
+ }
+ if (handle->remaining < (size_t) desiredFrames)
+ desiredFrames = handle->remaining;
+ size_t desiredBytes = desiredFrames * handle->bytesPerFrame;
+ // does not check for numeric overflow
+ size_t actualBytes = fread(ptr, sizeof(char), desiredBytes, handle->stream);
+ size_t actualFrames = actualBytes / handle->bytesPerFrame;
+ handle->remaining -= actualFrames;
+ switch (handle->info.format & SF_FORMAT_SUBMASK) {
+ case SF_FORMAT_PCM_U8:
+ memcpy_to_i16_from_u8(ptr, (unsigned char *) ptr, actualFrames * handle->info.channels);
+ break;
+ case SF_FORMAT_PCM_16:
+ if (!isLittleEndian())
+ swab(ptr, actualFrames * handle->info.channels);
+ break;
+ }
+ return actualFrames;
+}
+
+sf_count_t sf_writef_short(SNDFILE *handle, const short *ptr, sf_count_t desiredFrames)
+{
+ if (handle == NULL || handle->mode != SFM_WRITE || ptr == NULL || desiredFrames <= 0)
+ return 0;
+ size_t desiredBytes = desiredFrames * handle->bytesPerFrame;
+ size_t actualBytes = 0;
+ switch (handle->info.format & SF_FORMAT_SUBMASK) {
+ case SF_FORMAT_PCM_U8:
+ handle->temp = realloc(handle->temp, desiredBytes);
+ memcpy_to_u8_from_i16(handle->temp, ptr, desiredBytes);
+ actualBytes = fwrite(handle->temp, sizeof(char), desiredBytes, handle->stream);
+ break;
+ case SF_FORMAT_PCM_16:
+ // does not check for numeric overflow
+ if (isLittleEndian()) {
+ actualBytes = fwrite(ptr, sizeof(char), desiredBytes, handle->stream);
+ } else {
+ handle->temp = realloc(handle->temp, desiredBytes);
+ memcpy(handle->temp, ptr, desiredBytes);
+ swab((short *) handle->temp, desiredFrames * handle->info.channels);
+ actualBytes = fwrite(handle->temp, sizeof(char), desiredBytes, handle->stream);
+ }
+ break;
+ }
+ size_t actualFrames = actualBytes / handle->bytesPerFrame;
+ handle->remaining += actualFrames;
+ return actualFrames;
+}
diff --git a/camera/docs/README.md b/camera/docs/README.md
index b3cf0ce..3cdae4d 100644
--- a/camera/docs/README.md
+++ b/camera/docs/README.md
@@ -6,8 +6,21 @@
Many files can be generated from XML, such as the documentation (html/pdf),
C code, Java code, and even XML itself (as a sanity check).
-## Dependencies:
-sudo apt-get install python-mako # mako templates. needed to do file generation
-sudo apt-get install python-bs4 # beautiful soup. needed to parse the xml
-sudo apt-get install tidy # tidy, used to clean up xml/html
-sudo apt-get install xmllint # xmllint, used to validate XML against XSD
+## Dependencies
+* Python 2.7.x+
+* Beautiful Soup 4+ - HTML/XML parser, used to parse metadata_properties.xml
+* Mako 0.7+ - Template engine, needed to do file generation
+* Tidy - Cleans up the XML/HTML files.
+* XML Lint - Validates XML against XSD schema
+
+## Quick Setup (Ubuntu Precise):
+sudo apt-get install python-mako
+sudo apt-get install python-bs4
+sudo apt-get install tidy
+sudo apt-get install libxml2-utils #xmllint
+
+## Quick Setup (MacPorts)
+sudo port install py27-beautifulsoup4
+sudo port install py27-mako
+sudo port install tidy
+sudo port install libxml2 #xmllint
diff --git a/camera/docs/camera_metadata_tag_info.mako b/camera/docs/camera_metadata_tag_info.mako
index bceadc1..bfe5d86 100644
--- a/camera/docs/camera_metadata_tag_info.mako
+++ b/camera/docs/camera_metadata_tag_info.mako
@@ -49,11 +49,7 @@
${path_name(sec) | csym}_START] = {
% for entry in find_unique_entries(sec):
[ ${entry.name | csym} - ${path_name(sec) | csym}_START ] =
- % if entry.name == "android.scaler.availableFormats": #FIXME: support enums separately from the data type?
- { ${'"%s",' %(entry.name_short) | pad(40)} ${"int32" | ctype_enum,ljust(11)} },
- % else:
{ ${'"%s",' %(entry.name_short) | pad(40)} ${entry.type | ctype_enum,ljust(11)} },
- % endif
% endfor
};
@@ -76,7 +72,7 @@
% for sec in find_all_sections(metadata):
% for idx,entry in enumerate(find_unique_entries(sec)):
case ${entry.name | csym}: {
- % if entry.type == 'enum':
+ % if entry.enum:
switch (value) {
% for val in entry.enum.values:
case ${entry.name | csym}_${val.name}:
@@ -101,3 +97,9 @@
return ret;
}
+<%
+ find_values = lambda x: isinstance(x, metadata_model.EnumValue)
+ enum_values = metadata.find_all(find_values)
+ enum_value_max_len = max([len(value.name) for value in enum_values]) + 1
+%>
+#define CAMERA_METADATA_ENUM_STRING_MAX_SIZE ${enum_value_max_len}
diff --git a/camera/docs/camera_metadata_tags.mako b/camera/docs/camera_metadata_tags.mako
index 275510d..d7a5564 100644
--- a/camera/docs/camera_metadata_tags.mako
+++ b/camera/docs/camera_metadata_tags.mako
@@ -81,7 +81,7 @@
% for sec in find_all_sections(metadata):
% for entry in find_unique_entries(sec):
- % if entry.type == 'enum':
+ % if entry.enum:
// ${entry.name | csym}
typedef enum camera_metadata_enum_${csym(entry.name).lower()} {
% for val in entry.enum.values:
diff --git a/camera/docs/docs.html b/camera/docs/docs.html
new file mode 100644
index 0000000..9f5ad50
--- /dev/null
+++ b/camera/docs/docs.html
@@ -0,0 +1,9930 @@
+<!DOCTYPE html>
+<html>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<head>
+ <!-- automatically generated from html.mako. do NOT edit directly -->
+ <meta charset="utf-8" />
+ <title>Android Camera HAL2.0 Properties</title>
+ <style type="text/css">
+ .section { font-size: 1.5em; font-weight: bold; background-color: beige; padding: 0.5em 0em 0.5em 0.1em }
+ .kind { font-size: 1.2em; font-weight: bold; padding-left: 0.5em; background-color: gray }
+ .entry { background-color: burlywood }
+
+ /* table column sizes */
+ table { table-layout: fixed; width: 100%; word-wrap: break-word }
+ td,th { border: 1px solid; }
+ .th_name { width: 20% }
+ .th_units { width: 10% }
+ .th_tags { width: 5% }
+ .th_notes { width: 30% }
+ .th_type { width: 20% }
+ td { font-size: 0.9em; }
+
+ /* hide the first thead, we need it there only to enforce column sizes */
+ .thead_dummy { visibility: hidden; }
+
+ /* Entry flair */
+ .entry_name { font-family: monospace; font-style: italic; }
+
+ /* Entry type flair */
+ .entry_type_name { color: darkgreen; font-weight: bold; }
+ .entry_type_name_enum:after { color: darkgreen; font-weight: bold; content:" (enum)" }
+ .entry_type_enum_name { font-family: monospace; font-weight: bolder; }
+ .entry_type_enum_notes:before { content:" - " }
+ .entry_type_enum_value:before { content:" = " }
+ .entry_type_enum_value { font-family: monospace; }
+ .entry ul { margin: 0 0 0 0; list-style-position: inside; padding-left: 0.5em; }
+ .entry ul li { padding: 0 0 0 0; margin: 0 0 0 0;}
+
+ /* Entry tags flair */
+ .entry_tags ul { list-style-type: none; }
+
+
+ /* TODO: generate abbr element for each tag link? */
+ /* TODO for each x.y.z try to link it to the entry */
+
+ </style>
+
+ <style>
+
+ {
+ /* broken...
+ supposedly there is a bug in chrome that it lays out tables before
+ it knows its being printed, so the page-break-* styles are ignored
+ */
+ tr { page-break-after: always; page-break-inside: avoid; }
+ }
+
+ </style>
+</head>
+
+
+
+
+<body>
+ <h1>Android Camera HAL2.0 Properties</h1>
+
+ <h2>Table of Contents</h2>
+ <ul class="toc">
+ <li><a href="#tag_index">Tags</a></li>
+
+
+ <li><p class="toc_section"><a href="#section_colorCorrection">colorCorrection</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.colorCorrection.mode">android.colorCorrection.mode</a> (controls)</li>
+ <li><a href="#controls_android.colorCorrection.transform">android.colorCorrection.transform</a> (controls)</li>
+ <li><a href="#dynamic_android.colorCorrection.mode">android.colorCorrection.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_control">control</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.control.aeAntibandingMode">android.control.aeAntibandingMode</a> (controls)</li>
+ <li><a href="#controls_android.control.aeExposureCompensation">android.control.aeExposureCompensation</a> (controls)</li>
+ <li><a href="#controls_android.control.aeLock">android.control.aeLock</a> (controls)</li>
+ <li><a href="#controls_android.control.aeMode">android.control.aeMode</a> (controls)</li>
+ <li><a href="#controls_android.control.aeRegions">android.control.aeRegions</a> (controls)</li>
+ <li><a href="#controls_android.control.aeTargetFpsRange">android.control.aeTargetFpsRange</a> (controls)</li>
+ <li><a href="#controls_android.control.afMode">android.control.afMode</a> (controls)</li>
+ <li><a href="#controls_android.control.afRegions">android.control.afRegions</a> (controls)</li>
+ <li><a href="#controls_android.control.awbLock">android.control.awbLock</a> (controls)</li>
+ <li><a href="#controls_android.control.awbMode">android.control.awbMode</a> (controls)</li>
+ <li><a href="#controls_android.control.awbRegions">android.control.awbRegions</a> (controls)</li>
+ <li><a href="#controls_android.control.captureIntent">android.control.captureIntent</a> (controls)</li>
+ <li><a href="#controls_android.control.effectMode">android.control.effectMode</a> (controls)</li>
+ <li><a href="#controls_android.control.mode">android.control.mode</a> (controls)</li>
+ <li><a href="#controls_android.control.sceneMode">android.control.sceneMode</a> (controls)</li>
+ <li><a href="#controls_android.control.videoStabilizationMode">android.control.videoStabilizationMode</a> (controls)</li>
+ <li><a href="#static_android.control.aeAvailableAntibandingModes">android.control.aeAvailableAntibandingModes</a> (static)</li>
+ <li><a href="#static_android.control.aeAvailableModes">android.control.aeAvailableModes</a> (static)</li>
+ <li><a href="#static_android.control.aeAvailableTargetFpsRanges">android.control.aeAvailableTargetFpsRanges</a> (static)</li>
+ <li><a href="#static_android.control.aeCompensationRange">android.control.aeCompensationRange</a> (static)</li>
+ <li><a href="#static_android.control.aeCompensationStep">android.control.aeCompensationStep</a> (static)</li>
+ <li><a href="#static_android.control.afAvailableModes">android.control.afAvailableModes</a> (static)</li>
+ <li><a href="#static_android.control.availableEffects">android.control.availableEffects</a> (static)</li>
+ <li><a href="#static_android.control.availableSceneModes">android.control.availableSceneModes</a> (static)</li>
+ <li><a href="#static_android.control.availableVideoStabilizationModes">android.control.availableVideoStabilizationModes</a> (static)</li>
+ <li><a href="#static_android.control.awbAvailableModes">android.control.awbAvailableModes</a> (static)</li>
+ <li><a href="#static_android.control.maxRegions">android.control.maxRegions</a> (static)</li>
+ <li><a href="#static_android.control.sceneModeOverrides">android.control.sceneModeOverrides</a> (static)</li>
+ <li><a href="#dynamic_android.control.aePrecaptureId">android.control.aePrecaptureId</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.aeRegions">android.control.aeRegions</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.aeState">android.control.aeState</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.afMode">android.control.afMode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.afRegions">android.control.afRegions</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.afState">android.control.afState</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.afTriggerId">android.control.afTriggerId</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.awbMode">android.control.awbMode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.awbRegions">android.control.awbRegions</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.awbState">android.control.awbState</a> (dynamic)</li>
+ <li><a href="#dynamic_android.control.mode">android.control.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_demosaic">demosaic</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.demosaic.mode">android.demosaic.mode</a> (controls)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_edge">edge</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.edge.mode">android.edge.mode</a> (controls)</li>
+ <li><a href="#controls_android.edge.strength">android.edge.strength</a> (controls)</li>
+ <li><a href="#dynamic_android.edge.mode">android.edge.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_flash">flash</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.flash.firingPower">android.flash.firingPower</a> (controls)</li>
+ <li><a href="#controls_android.flash.firingTime">android.flash.firingTime</a> (controls)</li>
+ <li><a href="#controls_android.flash.mode">android.flash.mode</a> (controls)</li>
+ <li><a href="#static_android.flash.info.available">android.flash.info.available</a> (static)</li>
+ <li><a href="#static_android.flash.info.chargeDuration">android.flash.info.chargeDuration</a> (static)</li>
+ <li><a href="#static_android.flash.colorTemperature">android.flash.colorTemperature</a> (static)</li>
+ <li><a href="#static_android.flash.maxEnergy">android.flash.maxEnergy</a> (static)</li>
+ <li><a href="#dynamic_android.flash.firingPower">android.flash.firingPower</a> (dynamic)</li>
+ <li><a href="#dynamic_android.flash.firingTime">android.flash.firingTime</a> (dynamic)</li>
+ <li><a href="#dynamic_android.flash.mode">android.flash.mode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.flash.state">android.flash.state</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_geometric">geometric</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.geometric.mode">android.geometric.mode</a> (controls)</li>
+ <li><a href="#controls_android.geometric.strength">android.geometric.strength</a> (controls)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_hotPixel">hotPixel</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.hotPixel.mode">android.hotPixel.mode</a> (controls)</li>
+ <li><a href="#static_android.hotPixel.info.map">android.hotPixel.info.map</a> (static)</li>
+ <li><a href="#dynamic_android.hotPixel.mode">android.hotPixel.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_jpeg">jpeg</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.jpeg.gpsCoordinates">android.jpeg.gpsCoordinates</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.gpsProcessingMethod">android.jpeg.gpsProcessingMethod</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.gpsTimestamp">android.jpeg.gpsTimestamp</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.orientation">android.jpeg.orientation</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.quality">android.jpeg.quality</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.thumbnailQuality">android.jpeg.thumbnailQuality</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.thumbnailSize">android.jpeg.thumbnailSize</a> (controls)</li>
+ <li><a href="#static_android.jpeg.availableThumbnailSizes">android.jpeg.availableThumbnailSizes</a> (static)</li>
+ <li><a href="#static_android.jpeg.maxSize">android.jpeg.maxSize</a> (static)</li>
+ <li><a href="#dynamic_android.jpeg.gpsCoordinates">android.jpeg.gpsCoordinates</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.gpsProcessingMethod">android.jpeg.gpsProcessingMethod</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.gpsTimestamp">android.jpeg.gpsTimestamp</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.orientation">android.jpeg.orientation</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.quality">android.jpeg.quality</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.size">android.jpeg.size</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.thumbnailQuality">android.jpeg.thumbnailQuality</a> (dynamic)</li>
+ <li><a href="#dynamic_android.jpeg.thumbnailSize">android.jpeg.thumbnailSize</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_lens">lens</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.lens.aperture">android.lens.aperture</a> (controls)</li>
+ <li><a href="#controls_android.lens.filterDensity">android.lens.filterDensity</a> (controls)</li>
+ <li><a href="#controls_android.lens.focalLength">android.lens.focalLength</a> (controls)</li>
+ <li><a href="#controls_android.lens.focusDistance">android.lens.focusDistance</a> (controls)</li>
+ <li><a href="#controls_android.lens.opticalStabilizationMode">android.lens.opticalStabilizationMode</a> (controls)</li>
+ <li><a href="#static_android.lens.info.availableApertures">android.lens.info.availableApertures</a> (static)</li>
+ <li><a href="#static_android.lens.info.availableFilterDensities">android.lens.info.availableFilterDensities</a> (static)</li>
+ <li><a href="#static_android.lens.info.availableFocalLengths">android.lens.info.availableFocalLengths</a> (static)</li>
+ <li><a href="#static_android.lens.info.availableOpticalStabilization">android.lens.info.availableOpticalStabilization</a> (static)</li>
+ <li><a href="#static_android.lens.info.geometricCorrectionMap">android.lens.info.geometricCorrectionMap</a> (static)</li>
+ <li><a href="#static_android.lens.info.geometricCorrectionMapSize">android.lens.info.geometricCorrectionMapSize</a> (static)</li>
+ <li><a href="#static_android.lens.info.hyperfocalDistance">android.lens.info.hyperfocalDistance</a> (static)</li>
+ <li><a href="#static_android.lens.info.minimumFocusDistance">android.lens.info.minimumFocusDistance</a> (static)</li>
+ <li><a href="#static_android.lens.info.shadingMap">android.lens.info.shadingMap</a> (static)</li>
+ <li><a href="#static_android.lens.info.shadingMapSize">android.lens.info.shadingMapSize</a> (static)</li>
+ <li><a href="#static_android.lens.facing">android.lens.facing</a> (static)</li>
+ <li><a href="#static_android.lens.opticalAxisAngle">android.lens.opticalAxisAngle</a> (static)</li>
+ <li><a href="#static_android.lens.position">android.lens.position</a> (static)</li>
+ <li><a href="#dynamic_android.lens.aperture">android.lens.aperture</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.filterDensity">android.lens.filterDensity</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.focalLength">android.lens.focalLength</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.focusDistance">android.lens.focusDistance</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.focusRange">android.lens.focusRange</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.opticalStabilizationMode">android.lens.opticalStabilizationMode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.state">android.lens.state</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_noiseReduction">noiseReduction</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.noiseReduction.mode">android.noiseReduction.mode</a> (controls)</li>
+ <li><a href="#controls_android.noiseReduction.strength">android.noiseReduction.strength</a> (controls)</li>
+ <li><a href="#dynamic_android.noiseReduction.mode">android.noiseReduction.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_quirks">quirks</a></p>
+ <ul class="toc_section">
+ <li><a href="#static_android.quirks.meteringCropRegion">android.quirks.meteringCropRegion</a> (static)</li>
+ <li><a href="#static_android.quirks.triggerAfWithAuto">android.quirks.triggerAfWithAuto</a> (static)</li>
+ <li><a href="#static_android.quirks.useZslFormat">android.quirks.useZslFormat</a> (static)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_request">request</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.request.frameCount">android.request.frameCount</a> (controls)</li>
+ <li><a href="#controls_android.request.id">android.request.id</a> (controls)</li>
+ <li><a href="#controls_android.request.inputStreams">android.request.inputStreams</a> (controls)</li>
+ <li><a href="#controls_android.request.metadataMode">android.request.metadataMode</a> (controls)</li>
+ <li><a href="#controls_android.request.outputStreams">android.request.outputStreams</a> (controls)</li>
+ <li><a href="#controls_android.request.type">android.request.type</a> (controls)</li>
+ <li><a href="#static_android.request.maxNumOutputStreams">android.request.maxNumOutputStreams</a> (static)</li>
+ <li><a href="#static_android.request.maxNumReprocessStreams">android.request.maxNumReprocessStreams</a> (static)</li>
+ <li><a href="#dynamic_android.request.frameCount">android.request.frameCount</a> (dynamic)</li>
+ <li><a href="#dynamic_android.request.id">android.request.id</a> (dynamic)</li>
+ <li><a href="#dynamic_android.request.metadataMode">android.request.metadataMode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.request.outputStreams">android.request.outputStreams</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_scaler">scaler</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.scaler.cropRegion">android.scaler.cropRegion</a> (controls)</li>
+ <li><a href="#static_android.scaler.availableFormats">android.scaler.availableFormats</a> (static)</li>
+ <li><a href="#static_android.scaler.availableJpegMinDurations">android.scaler.availableJpegMinDurations</a> (static)</li>
+ <li><a href="#static_android.scaler.availableJpegSizes">android.scaler.availableJpegSizes</a> (static)</li>
+ <li><a href="#static_android.scaler.availableMaxDigitalZoom">android.scaler.availableMaxDigitalZoom</a> (static)</li>
+ <li><a href="#static_android.scaler.availableProcessedMinDurations">android.scaler.availableProcessedMinDurations</a> (static)</li>
+ <li><a href="#static_android.scaler.availableProcessedSizes">android.scaler.availableProcessedSizes</a> (static)</li>
+ <li><a href="#static_android.scaler.availableRawMinDurations">android.scaler.availableRawMinDurations</a> (static)</li>
+ <li><a href="#static_android.scaler.availableRawSizes">android.scaler.availableRawSizes</a> (static)</li>
+ <li><a href="#static_android.scaler.maxDigitalZoom">android.scaler.maxDigitalZoom</a> (static)</li>
+ <li><a href="#dynamic_android.scaler.cropRegion">android.scaler.cropRegion</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_sensor">sensor</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.sensor.exposureTime">android.sensor.exposureTime</a> (controls)</li>
+ <li><a href="#controls_android.sensor.frameDuration">android.sensor.frameDuration</a> (controls)</li>
+ <li><a href="#controls_android.sensor.sensitivity">android.sensor.sensitivity</a> (controls)</li>
+ <li><a href="#static_android.sensor.info.activeArraySize">android.sensor.info.activeArraySize</a> (static)</li>
+ <li><a href="#static_android.sensor.info.availableSensitivities">android.sensor.info.availableSensitivities</a> (static)</li>
+ <li><a href="#static_android.sensor.info.colorFilterArrangement">android.sensor.info.colorFilterArrangement</a> (static)</li>
+ <li><a href="#static_android.sensor.info.exposureTimeRange">android.sensor.info.exposureTimeRange</a> (static)</li>
+ <li><a href="#static_android.sensor.info.maxFrameDuration">android.sensor.info.maxFrameDuration</a> (static)</li>
+ <li><a href="#static_android.sensor.info.physicalSize">android.sensor.info.physicalSize</a> (static)</li>
+ <li><a href="#static_android.sensor.info.pixelArraySize">android.sensor.info.pixelArraySize</a> (static)</li>
+ <li><a href="#static_android.sensor.info.whiteLevel">android.sensor.info.whiteLevel</a> (static)</li>
+ <li><a href="#static_android.sensor.baseGainFactor">android.sensor.baseGainFactor</a> (static)</li>
+ <li><a href="#static_android.sensor.blackLevelPattern">android.sensor.blackLevelPattern</a> (static)</li>
+ <li><a href="#static_android.sensor.calibrationTransform1">android.sensor.calibrationTransform1</a> (static)</li>
+ <li><a href="#static_android.sensor.calibrationTransform2">android.sensor.calibrationTransform2</a> (static)</li>
+ <li><a href="#static_android.sensor.colorTransform1">android.sensor.colorTransform1</a> (static)</li>
+ <li><a href="#static_android.sensor.colorTransform2">android.sensor.colorTransform2</a> (static)</li>
+ <li><a href="#static_android.sensor.forwardMatrix1">android.sensor.forwardMatrix1</a> (static)</li>
+ <li><a href="#static_android.sensor.forwardMatrix2">android.sensor.forwardMatrix2</a> (static)</li>
+ <li><a href="#static_android.sensor.maxAnalogSensitivity">android.sensor.maxAnalogSensitivity</a> (static)</li>
+ <li><a href="#static_android.sensor.noiseModelCoefficients">android.sensor.noiseModelCoefficients</a> (static)</li>
+ <li><a href="#static_android.sensor.orientation">android.sensor.orientation</a> (static)</li>
+ <li><a href="#static_android.sensor.referenceIlluminant1">android.sensor.referenceIlluminant1</a> (static)</li>
+ <li><a href="#static_android.sensor.referenceIlluminant2">android.sensor.referenceIlluminant2</a> (static)</li>
+ <li><a href="#dynamic_android.sensor.exposureTime">android.sensor.exposureTime</a> (dynamic)</li>
+ <li><a href="#dynamic_android.sensor.frameDuration">android.sensor.frameDuration</a> (dynamic)</li>
+ <li><a href="#dynamic_android.sensor.sensitivity">android.sensor.sensitivity</a> (dynamic)</li>
+ <li><a href="#dynamic_android.sensor.timestamp">android.sensor.timestamp</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_shading">shading</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.shading.mode">android.shading.mode</a> (controls)</li>
+ <li><a href="#controls_android.shading.strength">android.shading.strength</a> (controls)</li>
+ <li><a href="#dynamic_android.shading.mode">android.shading.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_statistics">statistics</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.statistics.faceDetectMode">android.statistics.faceDetectMode</a> (controls)</li>
+ <li><a href="#controls_android.statistics.histogramMode">android.statistics.histogramMode</a> (controls)</li>
+ <li><a href="#controls_android.statistics.sharpnessMapMode">android.statistics.sharpnessMapMode</a> (controls)</li>
+ <li><a href="#static_android.statistics.info.availableFaceDetectModes">android.statistics.info.availableFaceDetectModes</a> (static)</li>
+ <li><a href="#static_android.statistics.info.histogramBucketCount">android.statistics.info.histogramBucketCount</a> (static)</li>
+ <li><a href="#static_android.statistics.info.maxFaceCount">android.statistics.info.maxFaceCount</a> (static)</li>
+ <li><a href="#static_android.statistics.info.maxHistogramCount">android.statistics.info.maxHistogramCount</a> (static)</li>
+ <li><a href="#static_android.statistics.info.maxSharpnessMapValue">android.statistics.info.maxSharpnessMapValue</a> (static)</li>
+ <li><a href="#static_android.statistics.info.sharpnessMapSize">android.statistics.info.sharpnessMapSize</a> (static)</li>
+ <li><a href="#dynamic_android.statistics.faceDetectMode">android.statistics.faceDetectMode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceIds">android.statistics.faceIds</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceLandmarks">android.statistics.faceLandmarks</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceRectangles">android.statistics.faceRectangles</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceScores">android.statistics.faceScores</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.histogram">android.statistics.histogram</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.histogramMode">android.statistics.histogramMode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.sharpnessMap">android.statistics.sharpnessMap</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.sharpnessMapMode">android.statistics.sharpnessMapMode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ <li><p class="toc_section"><a href="#section_tonemap">tonemap</a></p>
+ <ul class="toc_section">
+ <li><a href="#controls_android.tonemap.curveBlue">android.tonemap.curveBlue</a> (controls)</li>
+ <li><a href="#controls_android.tonemap.curveGreen">android.tonemap.curveGreen</a> (controls)</li>
+ <li><a href="#controls_android.tonemap.curveRed">android.tonemap.curveRed</a> (controls)</li>
+ <li><a href="#controls_android.tonemap.mode">android.tonemap.mode</a> (controls)</li>
+ <li><a href="#static_android.tonemap.maxCurvePoints">android.tonemap.maxCurvePoints</a> (static)</li>
+ <li><a href="#dynamic_android.tonemap.curveBlue">android.tonemap.curveBlue</a> (dynamic)</li>
+ <li><a href="#dynamic_android.tonemap.curveGreen">android.tonemap.curveGreen</a> (dynamic)</li>
+ <li><a href="#dynamic_android.tonemap.curveRed">android.tonemap.curveRed</a> (dynamic)</li>
+ <li><a href="#dynamic_android.tonemap.mode">android.tonemap.mode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- toc_section -->
+ </ul>
+
+ <h1>Properties</h1>
+ <table class="properties">
+
+ <thead class="thead_dummy">
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead> <!-- so that the first occurrence of thead is not
+ above the first occurrence of tr -->
+<!-- <namespace name="android"> -->
+ <tr><td colspan="7" id="section_colorCorrection" class="section">colorCorrection</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.colorCorrection.mode">
+ <td class="entry_name">android.<wbr>color<wbr>Correction.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">TRANSFORM_MATRIX</span>
+ <span class="entry_type_enum_notes">Use the android.<wbr>color<wbr>Correction.<wbr>transform matrix
+ to do color conversion</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.colorCorrection.transform">
+ <td class="entry_name">android.<wbr>color<wbr>Correction.<wbr>transform</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3 x 3
+ </span>
+
+ <div class="entry_type_notes">3x3 float matrix in row-major order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A transform matrix to chromatically adapt
+ pixels in the CIE XYZ (1931) color space from the scene
+ illuminant to the sRGB-standard
+ D65-illuminant
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Output values are expected to be in the range
+ (0,<wbr>1)
+ </td>
+
+ <td class="entry_notes">
+ Values outside (0,<wbr>1) should be clamped.<wbr> Need to
+ provide utilities to go from CCT (+hue?),<wbr> or (x,<wbr>y) white
+ point,<wbr> (or AWB mode) to matrix; use linear Bradford
+ algorithm.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.colorCorrection.mode">
+ <td class="entry_name">android.<wbr>color<wbr>Correction.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">TRANSFORM_MATRIX</span>
+ <span class="entry_type_enum_notes">Use the android.<wbr>color<wbr>Correction.<wbr>transform matrix
+ to do color conversion</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_control" class="section">control</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.control.aeAntibandingMode">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Antibanding<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">50HZ</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">60HZ</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Enum for controlling
+ antibanding
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+
+ android.<wbr>control.<wbr>ae<wbr>Available<wbr>Antibanding<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.aeExposureCompensation">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Exposure<wbr>Compensation</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Adjustment to AE target image
+ brightness
+ </td>
+
+ <td class="entry_units">
+ count of positive/<wbr>negative EV steps
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ For example,<wbr> if EV step is 0.<wbr>333,<wbr> '6' will mean an
+ exposure compensation of +2 EV; -3 will mean an exposure
+ compensation of -1
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.aeLock">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Lock</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Autoexposure lock is disabled; the AE algorithm
+ is free to update its parameters.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ <span class="entry_type_enum_notes">Autoexposure lock is enabled; the AE algorithm
+ must not update the exposure and sensitivity parameters
+ while the lock is active</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AE is currently locked to its latest
+ calculated values
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Note that even when AE is locked,<wbr> the flash may be
+ fired if the AE mode is ON_<wbr>AUTO_<wbr>FLASH /<wbr> ON_<wbr>ALWAYS_<wbr>FLASH /<wbr>
+ ON_<wbr>AUTO_<wbr>FLASH_<wbr>REDEYE.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.aeMode">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Autoexposure is disabled; sensor.<wbr>exposureTime
+ and sensor.<wbr>sensitivity are used</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ <span class="entry_type_enum_notes">Autoexposure is active,<wbr> no flash
+ control</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON_AUTO_FLASH</span>
+ <span class="entry_type_enum_notes">if flash exists Autoexposure is active,<wbr> auto
+ flash control; flash may be fired when precapture
+ trigger is activated,<wbr> and for captures for which
+ captureIntent = STILL_<wbr>CAPTURE</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON_ALWAYS_FLASH</span>
+ <span class="entry_type_enum_notes">if flash exists Autoexposure is active,<wbr> auto
+ flash control for precapture trigger and always flash
+ when captureIntent = STILL_<wbr>CAPTURE</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON_AUTO_FLASH_REDEYE</span>
+ <span class="entry_type_enum_notes">optional Automatic red eye reduction with flash.<wbr>
+ If deemed necessary,<wbr> red eye reduction sequence should
+ fire when precapture trigger is activated,<wbr> and final
+ flash should fire when captureIntent =
+ STILL_<wbr>CAPTURE</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AE is currently updating the sensor
+ exposure and sensitivity fields
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>control.<wbr>ae<wbr>Available<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ Only effective if android.<wbr>control.<wbr>mode =
+ AUTO
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.aeRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 5 x area_count
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of areas to use for
+ metering
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Each area is a rectangle plus weight: xmin,<wbr> ymin,<wbr>
+ xmax,<wbr> ymax,<wbr> weight.<wbr> The coordinate system is based on the
+ active pixel array,<wbr> with (0,<wbr>0) being the top-left of the
+ active pixel array,<wbr> and
+ (android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>width,<wbr>
+ android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>height) being the
+ bottom-right point of the active pixel array.<wbr> The weight
+ should be nonnegative.<wbr> If all regions have 0 weight,<wbr> then
+ no specific metering area needs to be used by the HAL.<wbr> If
+ the metering region is outside the current
+ android.<wbr>scaler.<wbr>crop<wbr>Region,<wbr> the HAL should ignore the
+ sections outside the region and output the used sections
+ in the frame metadata
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.aeTargetFpsRange">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Target<wbr>Fps<wbr>Range</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Range over which fps can be adjusted to
+ maintain exposure
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>control.<wbr>ae<wbr>Available<wbr>Target<wbr>Fps<wbr>Ranges
+ </td>
+
+ <td class="entry_notes">
+ Only constrains AE algorithm,<wbr> not manual control
+ of android.<wbr>sensor.<wbr>exposure<wbr>Time
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.afMode">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">The 3A routines do not control the lens;
+ android.<wbr>lens.<wbr>focus<wbr>Position is controlled by the
+ application</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ <span class="entry_type_enum_notes">if lens is not fixed focus.<wbr> Use
+ android.<wbr>lens.<wbr>minimum<wbr>Focus<wbr>Distance to determine if lens
+ is fixed focus In this mode,<wbr> the lens does not move
+ unless the autofocus trigger action is called.<wbr> When
+ that trigger is activated,<wbr> AF must transition to
+ ACTIVE_<wbr>SCAN,<wbr> then to the outcome of the scan (FOCUSED
+ or NOT_<wbr>FOCUSED).<wbr> Triggering cancel AF resets the lens
+ position to default,<wbr> and sets the AF state to
+ INACTIVE.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">MACRO</span>
+ <span class="entry_type_enum_notes">In this mode,<wbr> the lens does not move unless the
+ autofocus trigger action is called.<wbr> When that trigger
+ is activated,<wbr> AF must transition to ACTIVE_<wbr>SCAN,<wbr> then
+ to the outcome of the scan (FOCUSED or NOT_<wbr>FOCUSED).<wbr>
+ Triggering cancel AF resets the lens position to
+ default,<wbr> and sets the AF state to
+ INACTIVE.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CONTINUOUS_VIDEO</span>
+ <span class="entry_type_enum_notes">In this mode,<wbr> the AF algorithm modifies the lens
+ position continually to attempt to provide a
+ constantly-in-focus image stream.<wbr> The focusing behavior
+ should be suitable for good quality video recording;
+ typically this means slower focus movement and no
+ overshoots.<wbr> When the AF trigger is not involved,<wbr> the AF
+ algorithm should start in INACTIVE state,<wbr> and then
+ transition into PASSIVE_<wbr>SCAN and PASSIVE_<wbr>FOCUSED states
+ as appropriate.<wbr> When the AF trigger is activated,<wbr> the
+ algorithm should immediately transition into AF_<wbr>FOCUSED
+ or AF_<wbr>NOT_<wbr>FOCUSED as appropriate,<wbr> and lock the lens
+ position until a cancel AF trigger is received.<wbr> Once
+ cancel is received,<wbr> the algorithm should transition
+ back to INACTIVE and resume passive scan.<wbr> Note that
+ this behavior is not identical to CONTINUOUS_<wbr>PICTURE,<wbr>
+ since an ongoing PASSIVE_<wbr>SCAN must immediately be
+ canceled.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CONTINUOUS_PICTURE</span>
+ <span class="entry_type_enum_notes">In this mode,<wbr> the AF algorithm modifies the lens
+ position continually to attempt to provide a
+ constantly-in-focus image stream.<wbr> The focusing behavior
+ should be suitable for still image capture; typically
+ this means focusing as fast as possible.<wbr> When the AF
+ trigger is not involved,<wbr> the AF algorithm should start
+ in INACTIVE state,<wbr> and then transition into
+ PASSIVE_<wbr>SCAN and PASSIVE_<wbr>FOCUSED states as appropriate
+ as it attempts to maintain focus.<wbr> When the AF trigger
+ is activated,<wbr> the algorithm should finish its
+ PASSIVE_<wbr>SCAN if active,<wbr> and then transition into
+ AF_<wbr>FOCUSED or AF_<wbr>NOT_<wbr>FOCUSED as appropriate,<wbr> and lock
+ the lens position until a cancel AF trigger is
+ received.<wbr> When the AF cancel trigger is activated,<wbr> the
+ algorithm should transition back to INACTIVE and then
+ act as if it has just been started.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">EDOF</span>
+ <span class="entry_type_enum_notes">Extended depth of field (digital focus).<wbr> AF
+ trigger is ignored,<wbr> AF state should always be
+ INACTIVE.<wbr></span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AF is currently enabled,<wbr> and what
+ mode it is set to
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.afRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 5 x area_count
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of areas to use for focus
+ estimation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Each area is a rectangle plus weight: xmin,<wbr> ymin,<wbr>
+ xmax,<wbr> ymax,<wbr> weight.<wbr> The coordinate system is based on the
+ active pixel array,<wbr> with (0,<wbr>0) being the top-left of the
+ active pixel array,<wbr> and
+ (android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>width,<wbr>
+ android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>height) being the
+ bottom-right point of the active pixel array.<wbr> The weight
+ should be nonnegative.<wbr> If all regions have 0 weight,<wbr> then
+ no specific focus area needs to be used by the HAL.<wbr> If
+ the focusing region is outside the current
+ android.<wbr>scaler.<wbr>crop<wbr>Region,<wbr> the HAL should ignore the
+ sections outside the region and output the used sections
+ in the frame metadata
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.awbLock">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>Lock</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Auto-whitebalance lock is disabled; the AWB
+ algorithm is free to update its parameters if in AUTO
+ mode.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ <span class="entry_type_enum_notes">Auto-whitebalance lock is enabled; the AWB
+ algorithm must not update the exposure and sensitivity
+ parameters while the lock is active</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AWB is currently locked to its
+ latest calculated values
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Note that AWB lock is only meaningful for AUTO
+ mode; in other modes,<wbr> AWB is already fixed to a specific
+ setting
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.awbMode">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">INCANDESCENT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FLUORESCENT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">WARM_FLUORESCENT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">DAYLIGHT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CLOUDY_DAYLIGHT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">TWILIGHT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SHADE</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AWB is currently setting the color
+ transform fields,<wbr> and what its illumination target
+ is
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ [BC - AWB lock,<wbr>AWB modes]
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ <li><a href="#tag_AWB">AWB</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.awbRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 5 x area_count
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of areas to use for illuminant
+ estimation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Only used in AUTO mode.<wbr> Each area is a rectangle
+ plus weight: xmin,<wbr> ymin,<wbr> xmax,<wbr> ymax,<wbr> weight.<wbr> The
+ coordinate system is based on the active pixel array,<wbr>
+ with (0,<wbr>0) being the top-left of the active pixel array,<wbr>
+ and (android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>width,<wbr>
+ android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>height) being the
+ bottom-right point of the active pixel array.<wbr> The weight
+ should be nonnegative.<wbr> If all regions have 0 weight,<wbr> then
+ no specific metering area needs to be used by the HAL.<wbr> If
+ the metering region is outside the current
+ android.<wbr>scaler.<wbr>crop<wbr>Region,<wbr> the HAL should ignore the
+ sections outside the region and output the used sections
+ in the frame metadata
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.captureIntent">
+ <td class="entry_name">android.<wbr>control.<wbr>capture<wbr>Intent</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">CUSTOM</span>
+ <span class="entry_type_enum_notes">This request doesn't fall into the other
+ categories.<wbr> Default to preview-like
+ behavior.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">PREVIEW</span>
+ <span class="entry_type_enum_notes">This request is for a preview-like usecase.<wbr> The
+ precapture trigger may be used to start off a metering
+ w/<wbr>flash sequence</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">STILL_CAPTURE</span>
+ <span class="entry_type_enum_notes">This request is for a still capture-type
+ usecase.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">VIDEO_RECORD</span>
+ <span class="entry_type_enum_notes">This request is for a video recording
+ usecase.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">VIDEO_SNAPSHOT</span>
+ <span class="entry_type_enum_notes">This request is for a video snapshot (still
+ image while recording video) usecase</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ZERO_SHUTTER_LAG</span>
+ <span class="entry_type_enum_notes">This request is for a ZSL usecase; the
+ application will stream full-resolution images and
+ reprocess one or several later for a final
+ capture</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Information to 3A routines about the purpose
+ of this capture,<wbr> to help decide optimal 3A
+ strategy
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ all must be supported
+ </td>
+
+ <td class="entry_notes">
+ Only used if android.<wbr>control.<wbr>mode != OFF.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.effectMode">
+ <td class="entry_name">android.<wbr>control.<wbr>effect<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">MONO</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">NEGATIVE</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SOLARIZE</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SEPIA</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">POSTERIZE</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">WHITEBOARD</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">BLACKBOARD</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AQUA</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether any special color effect is in use.<wbr>
+ Only used if android.<wbr>control.<wbr>mode != OFF
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>control.<wbr>available<wbr>Effects
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.mode">
+ <td class="entry_name">android.<wbr>control.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Full application control of pipeline.<wbr> All 3A
+ routines are disabled,<wbr> no other settings in
+ android.<wbr>control.<wbr>* have any effect</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ <span class="entry_type_enum_notes">Use settings for each individual 3A routine.<wbr>
+ Manual control of capture parameters is disabled.<wbr> All
+ controls in android.<wbr>control.<wbr>* besides sceneMode take
+ effect</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">USE_SCENE_MODE</span>
+ <span class="entry_type_enum_notes">Use specific scene mode.<wbr> Enabling this disables
+ control.<wbr>aeMode,<wbr> control.<wbr>awbMode and control.<wbr>afMode
+ controls; the HAL must ignore those settings while
+ USE_<wbr>SCENE_<wbr>MODE is active (except for FACE_<wbr>PRIORITY
+ scene mode).<wbr> Other control entries are still active.<wbr>
+ This setting can only be used if availableSceneModes !=
+ UNSUPPORTED</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Overall mode of 3A control
+ routines
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ all must be supported
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.sceneMode">
+ <td class="entry_name">android.<wbr>control.<wbr>scene<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">UNSUPPORTED</span>
+ <span class="entry_type_enum_value">0</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FACE_PRIORITY</span>
+ <span class="entry_type_enum_notes">if face detection support exists Use face
+ detection data to drive 3A routines.<wbr> If face detection
+ statistics are disabled,<wbr> should still operate correctly
+ (but not return face detection statistics to the
+ framework).<wbr> Unlike the other scene modes,<wbr> aeMode,<wbr>
+ awbMode,<wbr> and afMode remain active when FACE_<wbr>PRIORITY is
+ set.<wbr> This is due to compatibility concerns with the old
+ camera API</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ACTION</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">PORTRAIT</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">LANDSCAPE</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">NIGHT</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">NIGHT_PORTRAIT</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">THEATRE</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">BEACH</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SNOW</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SUNSET</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">STEADYPHOTO</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FIREWORKS</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SPORTS</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">PARTY</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CANDLELIGHT</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">BARCODE</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Which scene mode is active when
+ android.<wbr>control.<wbr>mode = SCENE_<wbr>MODE
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>control.<wbr>available<wbr>Scene<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.control.videoStabilizationMode">
+ <td class="entry_name">android.<wbr>control.<wbr>video<wbr>Stabilization<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether video stabilization is
+ active
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ If enabled,<wbr> video stabilization can modify the
+ android.<wbr>scaler.<wbr>crop<wbr>Region to keep the video stream
+ stabilized
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.control.aeAvailableAntibandingModes">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Available<wbr>Antibanding<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">list of enums</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Which set of antibanding modes are
+ supported
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.aeAvailableModes">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Available<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">list of enums</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Which subset of AE modes is
+ supported
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ OFF,<wbr> ON must be supported.<wbr>
+ ON_<wbr>AUTO_<wbr>FLASH/<wbr>ON_<wbr>ALWAYS_<wbr>FLASH must be supported if flash
+ unit is available
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.aeAvailableTargetFpsRanges">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Available<wbr>Target<wbr>Fps<wbr>Ranges</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2 x n
+ </span>
+
+ <div class="entry_type_notes">list of pairs of frame rates</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of frame rate ranges supported by the
+ AE algorithm/<wbr>hardware
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.aeCompensationRange">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Compensation<wbr>Range</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum and minimum exposure compensation
+ setting,<wbr> in counts of
+ android.<wbr>control.<wbr>ae<wbr>Compensation<wbr>Step<wbr>Size
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ At least (-2,<wbr>2)/<wbr>(exp compensation step
+ size)
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.aeCompensationStep">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Compensation<wbr>Step</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Smallest step by which exposure compensation
+ can be changed
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ <= 1/<wbr>2
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.afAvailableModes">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>Available<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">List of enums</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of AF modes that can be
+ selected
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ OFF must be included.<wbr> AUTO must be supported if
+ lens allows for changing focus
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.availableEffects">
+ <td class="entry_name">android.<wbr>control.<wbr>available<wbr>Effects</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">list of enums</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ what subset of the full color effect enum
+ list is supported
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ OFF must be listed
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.availableSceneModes">
+ <td class="entry_name">android.<wbr>control.<wbr>available<wbr>Scene<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">list of enums from android.<wbr>control.<wbr>scene<wbr>Mode,<wbr> plus UNSUPPORTED to indicate no scene modes are supported</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ what subset of the scene mode enum list is
+ supported.<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ SCENE_<wbr>MODE_<wbr>FACE_<wbr>PRIORITY must be supported if face
+ detection is supported
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.availableVideoStabilizationModes">
+ <td class="entry_name">android.<wbr>control.<wbr>available<wbr>Video<wbr>Stabilization<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">List of enums.<wbr></div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of video stabilization modes that can
+ be supported
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ OFF must be included
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.awbAvailableModes">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>Available<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ </td>
+
+ <td class="entry_units">
+ List of enums (android.<wbr>control.<wbr>awb<wbr>Mode)
+ </td>
+
+ <td class="entry_range">
+ OFF,<wbr> AUTO must be included
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.maxRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>max<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ For AE,<wbr> AWB,<wbr> and AF,<wbr> how many individual
+ regions can be listed for metering?
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 1
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.control.sceneModeOverrides">
+ <td class="entry_name">android.<wbr>control.<wbr>scene<wbr>Mode<wbr>Overrides</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3 x lengthavailablescenemodes
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of AE,<wbr> AWB,<wbr> and AF modes to use for
+ each available scene mode
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ For each listed scene mode,<wbr> lists the aeMode,<wbr>
+ awbMode,<wbr> and afMode that the HAL wants to use for that
+ scene mode.<wbr> For each entry,<wbr> the order is {aeMode,<wbr>
+ awbMode,<wbr> afMode} in order of increasing index
+ </td>
+
+ <td class="entry_notes">
+ When a scene mode is enabled,<wbr> the HAL is expected
+ to override aeMode,<wbr> awbMode,<wbr> and afMode with its
+ preferred settings for that scene mode.<wbr> To simplify
+ communication with old camera API applications,<wbr> the
+ service wants this override list in the static metadata.<wbr>
+ The order of this list matches that of
+ availableSceneModes,<wbr> with 3 entires for each scene mode.<wbr>
+ The overrides listed for SCENE_<wbr>MODE_<wbr>FACE_<wbr>PRIORITY are
+ ignored,<wbr> since for that mode,<wbr> the application-set aeMode,<wbr>
+ awbMode,<wbr> and afMode are used instead,<wbr> like they are when
+ android.<wbr>control.<wbr>mode is AUTO.<wbr> It is recommended that for
+ FACE_<wbr>PRIORITY,<wbr> the overrides should be set to 0.<wbr> As an
+ example,<wbr> if availableSceneModes is { FACE_<wbr>PRIORITY,<wbr>
+ ACTION,<wbr> NIGHT },<wbr> then the service expects this field to
+ have 9 entries; for example { 0 ,<wbr> 0,<wbr> 0,<wbr> ON_<wbr>AUTO_<wbr>FLASH,<wbr>
+ AUTO,<wbr> CONTINUOUS_<wbr>PICTURE,<wbr> ON_<wbr>AUTO_<wbr>FLASH,<wbr> INCANDESCENT,<wbr>
+ AUTO }
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.control.aePrecaptureId">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Precapture<wbr>Id</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The ID sent with the latest
+ CAMERA2_<wbr>TRIGGER_<wbr>PRECAPTURE_<wbr>METERING call
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Must be 0 if no
+ CAMERA2_<wbr>TRIGGER_<wbr>PRECAPTURE_<wbr>METERING trigger received yet
+ by HAL.<wbr> Always updated even if AE algorithm ignores the
+ trigger
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.aeRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 5 x area_count
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of areas to use for
+ metering
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Each area is a rectangle plus weight: xmin,<wbr> ymin,<wbr>
+ xmax,<wbr> ymax,<wbr> weight.<wbr> The coordinate system is based on the
+ active pixel array,<wbr> with (0,<wbr>0) being the top-left of the
+ active pixel array,<wbr> and
+ (android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>width,<wbr>
+ android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>height) being the
+ bottom-right point of the active pixel array.<wbr> The weight
+ should be nonnegative.<wbr> If all regions have 0 weight,<wbr> then
+ no specific metering area needs to be used by the HAL.<wbr> If
+ the metering region is outside the current
+ android.<wbr>scaler.<wbr>crop<wbr>Region,<wbr> the HAL should ignore the
+ sections outside the region and output the used sections
+ in the frame metadata
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.aeState">
+ <td class="entry_name">android.<wbr>control.<wbr>ae<wbr>State</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">INACTIVE</span>
+ <span class="entry_type_enum_notes">AE is off</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SEARCHING</span>
+ <span class="entry_type_enum_notes">AE doesn't yet have a good set of control values
+ for the current scene</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CONVERGED</span>
+ <span class="entry_type_enum_notes">AE has a good set of control values for the
+ current scene</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">LOCKED</span>
+ <span class="entry_type_enum_notes">AE has been locked (aeMode =
+ LOCKED)</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FLASH_REQUIRED</span>
+ <span class="entry_type_enum_notes">AE has a good set of control values,<wbr> but flash
+ needs to be fired for good quality still
+ capture</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">PRECAPTURE</span>
+ <span class="entry_type_enum_notes">AE has been asked to do a precapture sequence
+ (through the
+ trigger_<wbr>action(CAMERA2_<wbr>TRIGGER_<wbr>PRECAPTURE_<wbr>METERING)
+ call),<wbr> and is currently executing it.<wbr> Once PRECAPTURE
+ completes,<wbr> AE will transition to CONVERGED or
+ FLASH_<wbr>REQUIRED as appropriate</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Current state of AE algorithm
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Whenever the AE algorithm state changes,<wbr> a
+ MSG_<wbr>AUTOEXPOSURE notification must be send if a
+ notification callback is registered.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.afMode">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">The 3A routines do not control the lens;
+ android.<wbr>lens.<wbr>focus<wbr>Position is controlled by the
+ application</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ <span class="entry_type_enum_notes">if lens is not fixed focus.<wbr> Use
+ android.<wbr>lens.<wbr>minimum<wbr>Focus<wbr>Distance to determine if lens
+ is fixed focus In this mode,<wbr> the lens does not move
+ unless the autofocus trigger action is called.<wbr> When
+ that trigger is activated,<wbr> AF must transition to
+ ACTIVE_<wbr>SCAN,<wbr> then to the outcome of the scan (FOCUSED
+ or NOT_<wbr>FOCUSED).<wbr> Triggering cancel AF resets the lens
+ position to default,<wbr> and sets the AF state to
+ INACTIVE.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">MACRO</span>
+ <span class="entry_type_enum_notes">In this mode,<wbr> the lens does not move unless the
+ autofocus trigger action is called.<wbr> When that trigger
+ is activated,<wbr> AF must transition to ACTIVE_<wbr>SCAN,<wbr> then
+ to the outcome of the scan (FOCUSED or NOT_<wbr>FOCUSED).<wbr>
+ Triggering cancel AF resets the lens position to
+ default,<wbr> and sets the AF state to
+ INACTIVE.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CONTINUOUS_VIDEO</span>
+ <span class="entry_type_enum_notes">In this mode,<wbr> the AF algorithm modifies the lens
+ position continually to attempt to provide a
+ constantly-in-focus image stream.<wbr> The focusing behavior
+ should be suitable for good quality video recording;
+ typically this means slower focus movement and no
+ overshoots.<wbr> When the AF trigger is not involved,<wbr> the AF
+ algorithm should start in INACTIVE state,<wbr> and then
+ transition into PASSIVE_<wbr>SCAN and PASSIVE_<wbr>FOCUSED states
+ as appropriate.<wbr> When the AF trigger is activated,<wbr> the
+ algorithm should immediately transition into AF_<wbr>FOCUSED
+ or AF_<wbr>NOT_<wbr>FOCUSED as appropriate,<wbr> and lock the lens
+ position until a cancel AF trigger is received.<wbr> Once
+ cancel is received,<wbr> the algorithm should transition
+ back to INACTIVE and resume passive scan.<wbr> Note that
+ this behavior is not identical to CONTINUOUS_<wbr>PICTURE,<wbr>
+ since an ongoing PASSIVE_<wbr>SCAN must immediately be
+ canceled.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CONTINUOUS_PICTURE</span>
+ <span class="entry_type_enum_notes">In this mode,<wbr> the AF algorithm modifies the lens
+ position continually to attempt to provide a
+ constantly-in-focus image stream.<wbr> The focusing behavior
+ should be suitable for still image capture; typically
+ this means focusing as fast as possible.<wbr> When the AF
+ trigger is not involved,<wbr> the AF algorithm should start
+ in INACTIVE state,<wbr> and then transition into
+ PASSIVE_<wbr>SCAN and PASSIVE_<wbr>FOCUSED states as appropriate
+ as it attempts to maintain focus.<wbr> When the AF trigger
+ is activated,<wbr> the algorithm should finish its
+ PASSIVE_<wbr>SCAN if active,<wbr> and then transition into
+ AF_<wbr>FOCUSED or AF_<wbr>NOT_<wbr>FOCUSED as appropriate,<wbr> and lock
+ the lens position until a cancel AF trigger is
+ received.<wbr> When the AF cancel trigger is activated,<wbr> the
+ algorithm should transition back to INACTIVE and then
+ act as if it has just been started.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">EDOF</span>
+ <span class="entry_type_enum_notes">Extended depth of field (digital focus).<wbr> AF
+ trigger is ignored,<wbr> AF state should always be
+ INACTIVE.<wbr></span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AF is currently enabled,<wbr> and what
+ mode it is set to
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.afRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 5 x area_count
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of areas to use for focus
+ estimation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Each area is a rectangle plus weight: xmin,<wbr> ymin,<wbr>
+ xmax,<wbr> ymax,<wbr> weight.<wbr> The coordinate system is based on the
+ active pixel array,<wbr> with (0,<wbr>0) being the top-left of the
+ active pixel array,<wbr> and
+ (android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>width,<wbr>
+ android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>height) being the
+ bottom-right point of the active pixel array.<wbr> The weight
+ should be nonnegative.<wbr> If all regions have 0 weight,<wbr> then
+ no specific focus area needs to be used by the HAL.<wbr> If
+ the focusing region is outside the current
+ android.<wbr>scaler.<wbr>crop<wbr>Region,<wbr> the HAL should ignore the
+ sections outside the region and output the used sections
+ in the frame metadata
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.afState">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>State</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">INACTIVE</span>
+ <span class="entry_type_enum_notes">AF off or has not yet tried to scan/<wbr>been asked
+ to scan</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">PASSIVE_SCAN</span>
+ <span class="entry_type_enum_notes">if CONTINUOUS_<wbr>* modes are supported AF is
+ currently doing an AF scan initiated by a continuous
+ autofocus mode</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">PASSIVE_FOCUSED</span>
+ <span class="entry_type_enum_notes">if CONTINUOUS_<wbr>* modes are supported AF currently
+ believes it is in focus,<wbr> but may restart scanning at
+ any time.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ACTIVE_SCAN</span>
+ <span class="entry_type_enum_notes">if AUTO or MACRO modes are supported AF is doing
+ an AF scan because it was triggered by AF
+ trigger</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FOCUSED_LOCKED</span>
+ <span class="entry_type_enum_notes">if any AF mode besides OFF is supported AF
+ believes it is focused correctly and is
+ locked</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">NOT_FOCUSED_LOCKED</span>
+ <span class="entry_type_enum_notes">if any AF mode besides OFF is supported AF has
+ failed to focus successfully and is
+ locked</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Current state of AF algorithm
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Whenever the AF algorithm state changes,<wbr> a
+ MSG_<wbr>AUTOFOCUS notification must be send if a notification
+ callback is registered.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.afTriggerId">
+ <td class="entry_name">android.<wbr>control.<wbr>af<wbr>Trigger<wbr>Id</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The ID sent with the latest
+ CAMERA2_<wbr>TRIGGER_<wbr>AUTOFOCUS call
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Must be 0 if no CAMERA2_<wbr>TRIGGER_<wbr>AUTOFOCUS trigger
+ received yet by HAL.<wbr> Always updated even if AF algorithm
+ ignores the trigger
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.awbMode">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">INCANDESCENT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FLUORESCENT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">WARM_FLUORESCENT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">DAYLIGHT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CLOUDY_DAYLIGHT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">TWILIGHT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SHADE</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether AWB is currently setting the color
+ transform fields,<wbr> and what its illumination target
+ is
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ [BC - AWB lock,<wbr>AWB modes]
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ <li><a href="#tag_AWB">AWB</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.awbRegions">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>Regions</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 5 x area_count
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of areas to use for illuminant
+ estimation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Only used in AUTO mode.<wbr> Each area is a rectangle
+ plus weight: xmin,<wbr> ymin,<wbr> xmax,<wbr> ymax,<wbr> weight.<wbr> The
+ coordinate system is based on the active pixel array,<wbr>
+ with (0,<wbr>0) being the top-left of the active pixel array,<wbr>
+ and (android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>width,<wbr>
+ android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size.<wbr>height) being the
+ bottom-right point of the active pixel array.<wbr> The weight
+ should be nonnegative.<wbr> If all regions have 0 weight,<wbr> then
+ no specific metering area needs to be used by the HAL.<wbr> If
+ the metering region is outside the current
+ android.<wbr>scaler.<wbr>crop<wbr>Region,<wbr> the HAL should ignore the
+ sections outside the region and output the used sections
+ in the frame metadata
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.awbState">
+ <td class="entry_name">android.<wbr>control.<wbr>awb<wbr>State</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">INACTIVE</span>
+ <span class="entry_type_enum_notes">AWB is not in auto mode</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SEARCHING</span>
+ <span class="entry_type_enum_notes">AWB doesn't yet have a good set of control
+ values for the current scene</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CONVERGED</span>
+ <span class="entry_type_enum_notes">AWB has a good set of control values for the
+ current scene</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">LOCKED</span>
+ <span class="entry_type_enum_notes">AE has been locked (aeMode =
+ LOCKED)</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Current state of AWB algorithm
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Whenever the AWB algorithm state changes,<wbr> a
+ MSG_<wbr>AUTOWHITEBALANCE notification must be send if a
+ notification callback is registered.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.control.mode">
+ <td class="entry_name">android.<wbr>control.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Full application control of pipeline.<wbr> All 3A
+ routines are disabled,<wbr> no other settings in
+ android.<wbr>control.<wbr>* have any effect</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">AUTO</span>
+ <span class="entry_type_enum_notes">Use settings for each individual 3A routine.<wbr>
+ Manual control of capture parameters is disabled.<wbr> All
+ controls in android.<wbr>control.<wbr>* besides sceneMode take
+ effect</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">USE_SCENE_MODE</span>
+ <span class="entry_type_enum_notes">Use specific scene mode.<wbr> Enabling this disables
+ control.<wbr>aeMode,<wbr> control.<wbr>awbMode and control.<wbr>afMode
+ controls; the HAL must ignore those settings while
+ USE_<wbr>SCENE_<wbr>MODE is active (except for FACE_<wbr>PRIORITY
+ scene mode).<wbr> Other control entries are still active.<wbr>
+ This setting can only be used if availableSceneModes !=
+ UNSUPPORTED</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Overall mode of 3A control
+ routines
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ all must be supported
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_demosaic" class="section">demosaic</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.demosaic.mode">
+ <td class="entry_name">android.<wbr>demosaic.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Minimal or no slowdown of frame rate compared to
+ Bayer RAW output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">High-quality may reduce output frame
+ rate</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Controls the quality of the demosaicing
+ processing
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_edge" class="section">edge</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.edge.mode">
+ <td class="entry_name">android.<wbr>edge.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No edge enhancement is applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operation mode for edge
+ enhancement
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.edge.strength">
+ <td class="entry_name">android.<wbr>edge.<wbr>strength</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Control the amount of edge enhancement
+ applied to the images
+ </td>
+
+ <td class="entry_units">
+ 1-10; 10 is maximum sharpening
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.edge.mode">
+ <td class="entry_name">android.<wbr>edge.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No edge enhancement is applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operation mode for edge
+ enhancement
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_flash" class="section">flash</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.flash.firingPower">
+ <td class="entry_name">android.<wbr>flash.<wbr>firing<wbr>Power</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Power for flash firing/<wbr>torch
+ </td>
+
+ <td class="entry_units">
+ 10 is max power; 0 is no flash.<wbr> Linear
+ </td>
+
+ <td class="entry_range">
+ 0 - 10
+ </td>
+
+ <td class="entry_notes">
+ Power for snapshot may use a different scale than
+ for torch mode.<wbr> Only one entry for torch mode will be
+ used
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.flash.firingTime">
+ <td class="entry_name">android.<wbr>flash.<wbr>firing<wbr>Time</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Firing time of flash relative to start of
+ exposure
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ 0-(exposure time-flash duration)
+ </td>
+
+ <td class="entry_notes">
+ Clamped to (0,<wbr> exposure time - flash
+ duration).<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.flash.mode">
+ <td class="entry_name">android.<wbr>flash.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Do not fire the flash for this
+ capture</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SINGLE</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Fire flash
+ for this capture based on firingPower,<wbr>
+ firingTime.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">TORCH</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Flash
+ continuously on,<wbr> power set by
+ firingPower</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Select flash operation mode
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.flash.info.available">
+ <td class="entry_name">android.<wbr>flash.<wbr>info.<wbr>available</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether this camera has a
+ flash
+ </td>
+
+ <td class="entry_units">
+ boolean (0 = false,<wbr> otherwise true)
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ If no flash,<wbr> none of the flash controls do
+ anything.<wbr> All other metadata should return 0
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.flash.info.chargeDuration">
+ <td class="entry_name">android.<wbr>flash.<wbr>info.<wbr>charge<wbr>Duration</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Time taken before flash can fire
+ again
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ 0-1e9
+ </td>
+
+ <td class="entry_notes">
+ 1 second too long/<wbr>too short for recharge? Should
+ this be power-dependent?
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+
+
+ <tr class="entry" id="static_android.flash.colorTemperature">
+ <td class="entry_name">android.<wbr>flash.<wbr>color<wbr>Temperature</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The x,<wbr>y whitepoint of the
+ flash
+ </td>
+
+ <td class="entry_units">
+ pair of floats
+ </td>
+
+ <td class="entry_range">
+ 0-1 for both
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_ADV">ADV</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.flash.maxEnergy">
+ <td class="entry_name">android.<wbr>flash.<wbr>max<wbr>Energy</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Max energy output of the flash for a full
+ power single flash
+ </td>
+
+ <td class="entry_units">
+ lumen-seconds
+ </td>
+
+ <td class="entry_range">
+ >= 0
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_ADV">ADV</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.flash.firingPower">
+ <td class="entry_name">android.<wbr>flash.<wbr>firing<wbr>Power</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Power for flash firing/<wbr>torch
+ </td>
+
+ <td class="entry_units">
+ 10 is max power; 0 is no flash.<wbr> Linear
+ </td>
+
+ <td class="entry_range">
+ 0 - 10
+ </td>
+
+ <td class="entry_notes">
+ Power for snapshot may use a different scale than
+ for torch mode.<wbr> Only one entry for torch mode will be
+ used
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.flash.firingTime">
+ <td class="entry_name">android.<wbr>flash.<wbr>firing<wbr>Time</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Firing time of flash relative to start of
+ exposure
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ 0-(exposure time-flash duration)
+ </td>
+
+ <td class="entry_notes">
+ Clamped to (0,<wbr> exposure time - flash
+ duration).<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.flash.mode">
+ <td class="entry_name">android.<wbr>flash.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">Do not fire the flash for this
+ capture</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SINGLE</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Fire flash
+ for this capture based on firingPower,<wbr>
+ firingTime.<wbr></span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">TORCH</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Flash
+ continuously on,<wbr> power set by
+ firingPower</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Select flash operation mode
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.flash.state">
+ <td class="entry_name">android.<wbr>flash.<wbr>state</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">UNAVAILABLE</span>
+ <span class="entry_type_enum_notes">No flash on camera</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CHARGING</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Flash is
+ charging and cannot be fired</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">READY</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Flash is
+ ready to fire</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FIRED</span>
+ <span class="entry_type_enum_notes">if android.<wbr>flash.<wbr>available is true Flash fired
+ for this capture</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Current state of the flash
+ unit
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_geometric" class="section">geometric</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.geometric.mode">
+ <td class="entry_name">android.<wbr>geometric.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No geometric correction is
+ applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operating mode of geometric
+ correction
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.geometric.strength">
+ <td class="entry_name">android.<wbr>geometric.<wbr>strength</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Control the amount of shading correction
+ applied to the images
+ </td>
+
+ <td class="entry_units">
+ unitless: 1-10; 10 is full shading
+ compensation
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_ADV">ADV</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_hotPixel" class="section">hotPixel</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.hotPixel.mode">
+ <td class="entry_name">android.<wbr>hot<wbr>Pixel.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No hot pixel correction can be
+ applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Frame rate must not be reduced compared to raw
+ Bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Set operational mode for hot pixel
+ correction
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.hotPixel.info.map">
+ <td class="entry_name">android.<wbr>hot<wbr>Pixel.<wbr>info.<wbr>map</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2 x n
+ </span>
+
+ <div class="entry_type_notes">list of coordinates based on android.<wbr>sensor.<wbr>pixel<wbr>Array<wbr>Size</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Location of hot/<wbr>defective pixels on
+ sensor
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_ADV">ADV</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.hotPixel.mode">
+ <td class="entry_name">android.<wbr>hot<wbr>Pixel.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No hot pixel correction can be
+ applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Frame rate must not be reduced compared to raw
+ Bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Set operational mode for hot pixel
+ correction
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_jpeg" class="section">jpeg</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.jpeg.gpsCoordinates">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>gps<wbr>Coordinates</td>
+ <td class="entry_type">
+ <span class="entry_type_name">double</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3
+ </span>
+
+ <div class="entry_type_notes">latitude,<wbr> longitude,<wbr> altitude.<wbr> First two in degrees,<wbr> the third in meters</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ GPS coordinates to include in output JPEG
+ EXIF
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ (-180 - 180],<wbr> [-90,<wbr>90],<wbr> [-inf,<wbr> inf]
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.jpeg.gpsProcessingMethod">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>gps<wbr>Processing<wbr>Method</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ 32 characters describing GPS algorithm to
+ include in EXIF
+ </td>
+
+ <td class="entry_units">
+ UTF-8 null-terminated string
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.jpeg.gpsTimestamp">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>gps<wbr>Timestamp</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Time GPS fix was made to include in
+ EXIF
+ </td>
+
+ <td class="entry_units">
+ UTC in seconds since January 1,<wbr> 1970
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.jpeg.orientation">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>orientation</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Orientation of JPEG image to
+ write
+ </td>
+
+ <td class="entry_units">
+ Degrees in multiples of 90
+ </td>
+
+ <td class="entry_range">
+ 0,<wbr> 90,<wbr> 180,<wbr> 270
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.jpeg.quality">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>quality</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Compression quality of the final JPEG
+ image
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 1-100; larger is higher quality
+ </td>
+
+ <td class="entry_notes">
+ 85-95 is typical usage range
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.jpeg.thumbnailQuality">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>thumbnail<wbr>Quality</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Compression quality of JPEG
+ thumbnail
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 1-100; larger is higher quality
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.jpeg.thumbnailSize">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>thumbnail<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Resolution of embedded JPEG
+ thumbnail
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ from android.<wbr>jpeg.<wbr>available<wbr>Thumbnail<wbr>Sizes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.jpeg.availableThumbnailSizes">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>available<wbr>Thumbnail<wbr>Sizes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2 x n
+ </span>
+
+ <div class="entry_type_notes">list of resolution pairs</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Supported resolutions for the JPEG
+ thumbnail
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must include at least one valid resolution,<wbr> plus
+ (0,<wbr>0) for no thumbnail generation
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.jpeg.maxSize">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>max<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum size in bytes for the compressed
+ JPEG buffer
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must be large enough to fit any JPEG produced by
+ the camera
+ </td>
+
+ <td class="entry_notes">
+ This is used for sizing the gralloc buffers for
+ JPEG
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.jpeg.gpsCoordinates">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>gps<wbr>Coordinates</td>
+ <td class="entry_type">
+ <span class="entry_type_name">double</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3
+ </span>
+
+ <div class="entry_type_notes">latitude,<wbr> longitude,<wbr> altitude.<wbr> First two in degrees,<wbr> the third in meters</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ GPS coordinates to include in output JPEG
+ EXIF
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ (-180 - 180],<wbr> [-90,<wbr>90],<wbr> [-inf,<wbr> inf]
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.gpsProcessingMethod">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>gps<wbr>Processing<wbr>Method</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ 32 characters describing GPS algorithm to
+ include in EXIF
+ </td>
+
+ <td class="entry_units">
+ UTF-8 null-terminated string
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.gpsTimestamp">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>gps<wbr>Timestamp</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Time GPS fix was made to include in
+ EXIF
+ </td>
+
+ <td class="entry_units">
+ UTC in seconds since January 1,<wbr> 1970
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.orientation">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>orientation</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Orientation of JPEG image to
+ write
+ </td>
+
+ <td class="entry_units">
+ Degrees in multiples of 90
+ </td>
+
+ <td class="entry_range">
+ 0,<wbr> 90,<wbr> 180,<wbr> 270
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.quality">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>quality</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Compression quality of the final JPEG
+ image
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 1-100; larger is higher quality
+ </td>
+
+ <td class="entry_notes">
+ 85-95 is typical usage range
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.size">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The size of the compressed JPEG image,<wbr> in
+ bytes
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 0
+ </td>
+
+ <td class="entry_notes">
+ If no JPEG output is produced for the request,<wbr>
+ this must be 0.<wbr> Otherwise,<wbr> this describes the real size
+ of the compressed JPEG image placed in the output stream.<wbr>
+ More specifically,<wbr> if android.<wbr>jpeg.<wbr>max<wbr>Size = 1000000,<wbr> and
+ a specific capture has android.<wbr>jpeg.<wbr>size = 500000,<wbr> then
+ the output buffer from the JPEG stream will be 1000000
+ bytes,<wbr> of which the first 500000 make up the real
+ data.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.thumbnailQuality">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>thumbnail<wbr>Quality</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Compression quality of JPEG
+ thumbnail
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 1-100; larger is higher quality
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.jpeg.thumbnailSize">
+ <td class="entry_name">android.<wbr>jpeg.<wbr>thumbnail<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Resolution of embedded JPEG
+ thumbnail
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ from android.<wbr>jpeg.<wbr>available<wbr>Thumbnail<wbr>Sizes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_lens" class="section">lens</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.lens.aperture">
+ <td class="entry_name">android.<wbr>lens.<wbr>aperture</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Size of the lens aperture
+ </td>
+
+ <td class="entry_units">
+ f-number (f/<wbr>NNN)
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>lens.<wbr>info.<wbr>available<wbr>Apertures
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr> Can only
+ pick from supported list
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.lens.filterDensity">
+ <td class="entry_name">android.<wbr>lens.<wbr>filter<wbr>Density</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ State of lens neutral density
+ filter(s)
+ </td>
+
+ <td class="entry_units">
+ number of stops of filtering
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>lens.<wbr>info.<wbr>available<wbr>Filter<wbr>Densities
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr> Can only
+ pick from supported list
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.lens.focalLength">
+ <td class="entry_name">android.<wbr>lens.<wbr>focal<wbr>Length</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Lens optical zoom setting
+ </td>
+
+ <td class="entry_units">
+ focal length in mm
+ </td>
+
+ <td class="entry_range">
+ > 0
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.lens.focusDistance">
+ <td class="entry_name">android.<wbr>lens.<wbr>focus<wbr>Distance</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Distance to plane of sharpest focus,<wbr>
+ measured from frontmost surface of the lens
+ </td>
+
+ <td class="entry_units">
+ diopters (1/<wbr>m)
+ </td>
+
+ <td class="entry_range">
+ >= 0
+ </td>
+
+ <td class="entry_notes">
+ 0 = infinity focus.<wbr> Used value should be clamped
+ to (0,<wbr>minimum focus distance)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.lens.opticalStabilizationMode">
+ <td class="entry_name">android.<wbr>lens.<wbr>optical<wbr>Stabilization<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether optical image stabilization is
+ enabled.<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>lens.<wbr>available<wbr>Optical<wbr>Stabilization
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.lens.info.availableApertures">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>available<wbr>Apertures</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of supported aperture
+ values
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ one entry required,<wbr> > 0
+ </td>
+
+ <td class="entry_notes">
+ If variable aperture not available,<wbr> only setting
+ should be for the fixed aperture
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.availableFilterDensities">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>available<wbr>Filter<wbr>Densities</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of supported ND filter
+ values
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ one entry required,<wbr> >= 0
+ </td>
+
+ <td class="entry_notes">
+ If not available,<wbr> only setting is 0.<wbr> Otherwise,<wbr>
+ lists the available exposure index values for dimming
+ (2 would mean the filter is set to reduce incoming
+ light by two stops)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.availableFocalLengths">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>available<wbr>Focal<wbr>Lengths</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">the list of available focal lengths</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ If fitted with optical zoom,<wbr> what focal
+ lengths are available.<wbr> If not,<wbr> the static focal
+ length
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ > 0
+ </td>
+
+ <td class="entry_notes">
+ If optical zoom not supported,<wbr> only one value
+ should be reported
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.availableOpticalStabilization">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>available<wbr>Optical<wbr>Stabilization</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">list of enums</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of supported optical image
+ stabilization modes
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.geometricCorrectionMap">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>geometric<wbr>Correction<wbr>Map</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2 x 3 x n x m
+ </span>
+
+ <div class="entry_type_notes">2D array of destination coordinate pairs for uniform grid points in source image,<wbr> per color channel.<wbr> Size in the range of 2x3x40x30</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A low-resolution map for correction of
+ geometric distortions and chromatic aberrations,<wbr> per
+ color channel
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ N,<wbr> M >= 2
+ </td>
+
+ <td class="entry_notes">
+ [DNG wants a function instead].<wbr> What's easiest
+ for implementers? With an array size (M,<wbr> N),<wbr> entry (i,<wbr>
+ j) provides the destination for pixel (i/<wbr>(M-1) * width,<wbr>
+ j/<wbr>(N-1) * height).<wbr> Data is row-major,<wbr> with each array
+ entry being ( (X,<wbr> Y)_<wbr>r,<wbr> (X,<wbr> Y)_<wbr>g,<wbr> (X,<wbr> Y)_<wbr>b ) )
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.geometricCorrectionMapSize">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>geometric<wbr>Correction<wbr>Map<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">width and height of geometric correction map</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Dimensions of geometric correction
+ map
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Both values >= 2
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.hyperfocalDistance">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>hyperfocal<wbr>Distance</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Hyperfocal distance for this lens; set to
+ 0 if fixed focus
+ </td>
+
+ <td class="entry_units">
+ diopters
+ </td>
+
+ <td class="entry_range">
+ >= 0
+ </td>
+
+ <td class="entry_notes">
+ The hyperfocal distance is used for the old
+ API's 'fixed' setting
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.minimumFocusDistance">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>minimum<wbr>Focus<wbr>Distance</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Shortest distance from frontmost surface
+ of the lens that can be focused correctly
+ </td>
+
+ <td class="entry_units">
+ diopters
+ </td>
+
+ <td class="entry_range">
+ >= 0
+ </td>
+
+ <td class="entry_notes">
+ If the lens is fixed-focus,<wbr> this should be
+ 0
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.shadingMap">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>shading<wbr>Map</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3 x n x m
+ </span>
+
+ <div class="entry_type_notes">2D array of float gain factors per channel to correct for lens falloff.<wbr> Should be on the order of 3x40x30</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A low-resolution map of lens shading,<wbr> per
+ color channel
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Each gain factor is >= 1
+ </td>
+
+ <td class="entry_notes">
+ Assume bilinear interpolation of map.<wbr> The least
+ shaded section of the image should have a gain factor
+ of 1; all other sections should have gains above
+ 1.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.info.shadingMapSize">
+ <td class="entry_name">android.<wbr>lens.<wbr>info.<wbr>shading<wbr>Map<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">width and height of lens shading map</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Dimensions of lens shading
+ map
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Both values >= 1
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+
+
+ <tr class="entry" id="static_android.lens.facing">
+ <td class="entry_name">android.<wbr>lens.<wbr>facing</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">FRONT</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">BACK</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Direction the camera faces relative to
+ device screen
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.opticalAxisAngle">
+ <td class="entry_name">android.<wbr>lens.<wbr>optical<wbr>Axis<wbr>Angle</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">degrees.<wbr> First defines the angle of separation between the perpendicular to the screen and the camera optical axis.<wbr> The second then defines the clockwise rotation of the optical axis from native device up.<wbr></div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Relative angle of camera optical axis to the
+ perpendicular axis from the display
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ [0-90) for first angle,<wbr> [0-360) for second
+ </td>
+
+ <td class="entry_notes">
+ Examples: (0,<wbr>0) means that the camera optical axis
+ is perpendicular to the display surface; (45,<wbr>0) means
+ that the camera points 45 degrees up when device is held
+ upright; (45,<wbr>90) means the camera points 45 degrees to
+ the right when the device is held upright.<wbr> Use FACING
+ field to determine perpendicular outgoing
+ direction
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_ADV">ADV</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.lens.position">
+ <td class="entry_name">android.<wbr>lens.<wbr>position</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3, location in mm, in the sensor coordinate
+ system
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Coordinates of camera optical axis on
+ device
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.lens.aperture">
+ <td class="entry_name">android.<wbr>lens.<wbr>aperture</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Size of the lens aperture
+ </td>
+
+ <td class="entry_units">
+ f-number (f/<wbr>NNN)
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>lens.<wbr>info.<wbr>available<wbr>Apertures
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr> Can only
+ pick from supported list
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.lens.filterDensity">
+ <td class="entry_name">android.<wbr>lens.<wbr>filter<wbr>Density</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ State of lens neutral density
+ filter(s)
+ </td>
+
+ <td class="entry_units">
+ number of stops of filtering
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>lens.<wbr>info.<wbr>available<wbr>Filter<wbr>Densities
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr> Can only
+ pick from supported list
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.lens.focalLength">
+ <td class="entry_name">android.<wbr>lens.<wbr>focal<wbr>Length</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Lens optical zoom setting
+ </td>
+
+ <td class="entry_units">
+ focal length in mm
+ </td>
+
+ <td class="entry_range">
+ > 0
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.lens.focusDistance">
+ <td class="entry_name">android.<wbr>lens.<wbr>focus<wbr>Distance</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Distance to plane of sharpest focus,<wbr>
+ measured from frontmost surface of the lens
+ </td>
+
+ <td class="entry_units">
+ diopters (1/<wbr>m)
+ </td>
+
+ <td class="entry_range">
+ >= 0
+ </td>
+
+ <td class="entry_notes">
+ Should be zero for fixed-focus cameras
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.lens.focusRange">
+ <td class="entry_name">android.<wbr>lens.<wbr>focus<wbr>Range</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The range of scene distances that are in
+ sharp focus (depth of field)
+ </td>
+
+ <td class="entry_units">
+ pair of focus distances in diopters: (near,<wbr>
+ far)
+ </td>
+
+ <td class="entry_range">
+ >=0
+ </td>
+
+ <td class="entry_notes">
+ If variable focus not supported,<wbr> can still report
+ fixed depth of field range
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.lens.opticalStabilizationMode">
+ <td class="entry_name">android.<wbr>lens.<wbr>optical<wbr>Stabilization<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ <span class="entry_type_enum_optional">optional</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Whether optical image stabilization is
+ enabled.<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>lens.<wbr>available<wbr>Optical<wbr>Stabilization
+ </td>
+
+ <td class="entry_notes">
+ Will not be supported on most devices.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.lens.state">
+ <td class="entry_name">android.<wbr>lens.<wbr>state</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">STATIONARY</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Current lens status
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_noiseReduction" class="section">noiseReduction</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.noiseReduction.mode">
+ <td class="entry_name">android.<wbr>noise<wbr>Reduction.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No noise reduction is applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">May slow down frame rate to provide highest
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Mode of operation for the noise reduction
+ algorithm
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>noise<wbr>Reduction.<wbr>available<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.noiseReduction.strength">
+ <td class="entry_name">android.<wbr>noise<wbr>Reduction.<wbr>strength</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Control the amount of noise reduction
+ applied to the images
+ </td>
+
+ <td class="entry_units">
+ 1-10; 10 is max noise reduction
+ </td>
+
+ <td class="entry_range">
+ 1 - 10
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.noiseReduction.mode">
+ <td class="entry_name">android.<wbr>noise<wbr>Reduction.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No noise reduction is applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">May slow down frame rate to provide highest
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Mode of operation for the noise reduction
+ algorithm
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>noise<wbr>Reduction.<wbr>available<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_quirks" class="section">quirks</td></tr>
+
+
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.quirks.meteringCropRegion">
+ <td class="entry_name">android.<wbr>quirks.<wbr>metering<wbr>Crop<wbr>Region</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ If set to 1,<wbr> the camera service does not
+ scale 'normalized' coordinates with respect to the crop
+ region.<wbr> This applies to metering input (a{e,<wbr>f,<wbr>wb}Region
+ and output (face rectangles).<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Normalized coordinates refer to those in the
+ (-1000,<wbr>1000) range mentioned in the
+ android.<wbr>hardware.<wbr><wbr>Camera API.<wbr> HAL implementations should
+ instead always use and emit sensor array-relative
+ coordinates for all region data.<wbr> Does not need to be
+ listed in static metadata.<wbr> Support will be removed in
+ future versions of camera service.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.quirks.triggerAfWithAuto">
+ <td class="entry_name">android.<wbr>quirks.<wbr>trigger<wbr>Af<wbr>With<wbr>Auto</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ If set to 1,<wbr> then the camera service always
+ switches to FOCUS_<wbr>MODE_<wbr>AUTO before issuing a AF
+ trigger.<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ HAL implementations should implement AF trigger
+ modes for AUTO,<wbr> MACRO,<wbr> CONTINUOUS_<wbr>FOCUS,<wbr> and
+ CONTINUOUS_<wbr>PICTURE modes instead of using this flag.<wbr> Does
+ not need to be listed in static metadata.<wbr> Support will be
+ removed in future versions of camera service
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.quirks.useZslFormat">
+ <td class="entry_name">android.<wbr>quirks.<wbr>use<wbr>Zsl<wbr>Format</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ If set to 1,<wbr> the camera service uses
+ CAMERA2_<wbr>PIXEL_<wbr>FORMAT_<wbr>ZSL instead of
+ HAL_<wbr>PIXEL_<wbr>FORMAT_<wbr>IMPLEMENTATION_<wbr>DEFINED for the zero
+ shutter lag stream
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ HAL implementations should use gralloc usage flags
+ to determine that a stream will be used for
+ zero-shutter-lag,<wbr> instead of relying on an explicit
+ format setting.<wbr> Does not need to be listed in static
+ metadata.<wbr> Support will be removed in future versions of
+ camera service.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_request" class="section">request</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.request.frameCount">
+ <td class="entry_name">android.<wbr>request.<wbr>frame<wbr>Count</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A frame counter set by the framework.<wbr> Must
+ be maintained unchanged in output frame
+ </td>
+
+ <td class="entry_units">
+ incrementing integer
+ </td>
+
+ <td class="entry_range">
+ Any int
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.request.id">
+ <td class="entry_name">android.<wbr>request.<wbr>id</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ An application-specified ID for the current
+ request.<wbr> Must be maintained unchanged in output
+ frame
+ </td>
+
+ <td class="entry_units">
+ arbitrary integer assigned by application
+ </td>
+
+ <td class="entry_range">
+ Any int
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.request.inputStreams">
+ <td class="entry_name">android.<wbr>request.<wbr>input<wbr>Streams</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List which camera reprocess stream is used
+ for the source of reprocessing data.<wbr>
+ </td>
+
+ <td class="entry_units">
+ List of camera reprocess stream IDs
+ </td>
+
+ <td class="entry_range">
+ Typically,<wbr> only one entry allowed,<wbr> must be a valid
+ reprocess stream ID.<wbr> If android.<wbr>jpeg.<wbr>needs<wbr>Thumbnail is
+ set,<wbr> then multiple reprocess streams may be included in a
+ single request; they must be different scaled versions of
+ the same image.<wbr>
+ </td>
+
+ <td class="entry_notes">
+ Only meaningful when android.<wbr>request.<wbr>type ==
+ REPROCESS.<wbr> Ignored otherwise
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.request.metadataMode">
+ <td class="entry_name">android.<wbr>request.<wbr>metadata<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">NONE</span>
+ <span class="entry_type_enum_notes">No metadata should be produced on output,<wbr> except
+ for application-bound buffer data.<wbr> If no
+ application-bound streams exist,<wbr> no frame should be
+ placed in the output frame queue.<wbr> If such streams
+ exist,<wbr> a frame should be placed on the output queue
+ with null metadata but with the necessary output buffer
+ information.<wbr> Timestamp information should still be
+ included with any output stream buffers</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FULL</span>
+ <span class="entry_type_enum_notes">All metadata should be produced.<wbr> Statistics will
+ only be produced if they are separately
+ enabled</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ How much metadata to produce on
+ output
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.request.outputStreams">
+ <td class="entry_name">android.<wbr>request.<wbr>output<wbr>Streams</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Lists which camera output streams image data
+ from this capture must be sent to
+ </td>
+
+ <td class="entry_units">
+ List of camera stream IDs
+ </td>
+
+ <td class="entry_range">
+ List must only include streams that have been
+ created
+ </td>
+
+ <td class="entry_notes">
+ If no output streams are listed,<wbr> then the image
+ data should simply be discarded.<wbr> The image data must
+ still be captured for metadata and statistics production,<wbr>
+ and the lens and flash must operate as requested.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.request.type">
+ <td class="entry_name">android.<wbr>request.<wbr>type</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">CAPTURE</span>
+ <span class="entry_type_enum_notes">Capture a new image from the imaging hardware,<wbr>
+ and process it according to the
+ settings</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">REPROCESS</span>
+ <span class="entry_type_enum_notes">Process previously captured data; the
+ android.<wbr>request.<wbr>input<wbr>Stream parameter determines the
+ source reprocessing stream.<wbr> TODO: Mark dynamic metadata
+ needed for reprocessing with [RP]</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The type of the request; either CAPTURE or
+ REPROCESS
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.request.maxNumOutputStreams">
+ <td class="entry_name">android.<wbr>request.<wbr>max<wbr>Num<wbr>Output<wbr>Streams</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ How many output streams can be allocated at
+ the same time for each type of stream
+ </td>
+
+ <td class="entry_units">
+ The number of raw sensor streams; the number of
+ processed,<wbr> uncompressed streams; and the number of
+ JPEG-compressed streams
+ </td>
+
+ <td class="entry_range">
+ >=1 for Raw and JPEG-compressed stream.<wbr> >= 3
+ for processed,<wbr> uncompressed streams
+ </td>
+
+ <td class="entry_notes">
+ Video snapshot with preview callbacks requires 3
+ processed streams (preview,<wbr> record,<wbr> app callbacks) and
+ one JPEG stream (snapshot)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.request.maxNumReprocessStreams">
+ <td class="entry_name">android.<wbr>request.<wbr>max<wbr>Num<wbr>Reprocess<wbr>Streams</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 1
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ How many reprocessing streams of any type
+ can be allocated at the same time
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 1
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.request.frameCount">
+ <td class="entry_name">android.<wbr>request.<wbr>frame<wbr>Count</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Number of frames captured since
+ open()
+ </td>
+
+ <td class="entry_units">
+ count of frames
+ </td>
+
+ <td class="entry_range">
+ > 0
+ </td>
+
+ <td class="entry_notes">
+ Reset on release()
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.request.id">
+ <td class="entry_name">android.<wbr>request.<wbr>id</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ An application-specified ID for the current
+ request.<wbr> Must be maintained unchanged in output
+ frame
+ </td>
+
+ <td class="entry_units">
+ arbitrary integer assigned by application
+ </td>
+
+ <td class="entry_range">
+ Any int
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.request.metadataMode">
+ <td class="entry_name">android.<wbr>request.<wbr>metadata<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">NONE</span>
+ <span class="entry_type_enum_notes">No metadata should be produced on output,<wbr> except
+ for application-bound buffer data.<wbr> If no
+ application-bound streams exist,<wbr> no frame should be
+ placed in the output frame queue.<wbr> If such streams
+ exist,<wbr> a frame should be placed on the output queue
+ with null metadata but with the necessary output buffer
+ information.<wbr> Timestamp information should still be
+ included with any output stream buffers</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FULL</span>
+ <span class="entry_type_enum_notes">All metadata should be produced.<wbr> Statistics will
+ only be produced if they are separately
+ enabled</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ How much metadata to produce on
+ output
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.request.outputStreams">
+ <td class="entry_name">android.<wbr>request.<wbr>output<wbr>Streams</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Lists which camera output streams image data
+ from this capture must be sent to
+ </td>
+
+ <td class="entry_units">
+ List of camera stream IDs
+ </td>
+
+ <td class="entry_range">
+ List must only include streams that have been
+ created
+ </td>
+
+ <td class="entry_notes">
+ If no output streams are listed,<wbr> then the image
+ data should simply be discarded.<wbr> The image data must
+ still be captured for metadata and statistics production,<wbr>
+ and the lens and flash must operate as requested.<wbr>
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_scaler" class="section">scaler</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.scaler.cropRegion">
+ <td class="entry_name">android.<wbr>scaler.<wbr>crop<wbr>Region</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Top-left corner and width of the output
+ region to select from the active pixel
+ array
+ </td>
+
+ <td class="entry_units">
+ (x,<wbr>y) of top-left corner,<wbr> width of region in
+ pixels; (0,<wbr>0) is top-left corner of
+ android.<wbr>sensor.<wbr>active<wbr>Pixel<wbr>Array
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ [BC - zoom] Height determined based on width and
+ aspect ratio of output stream.<wbr> Negative values for corner
+ are allowed for raw output if full pixel array is larger
+ than active pixel array.<wbr> Width may be rounded to nearest
+ larger supportable width,<wbr> especially for raw output,<wbr>
+ where only a few fixed scales may be possible
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.scaler.availableFormats">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Formats</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">values from HAL_<wbr>PIXEL_<wbr>FORMAT_<wbr>* in /<wbr>system/<wbr>core/<wbr>include/<wbr>system/<wbr>graphics.<wbr>h</div>
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">RAW_SENSOR</span>
+ <span class="entry_type_enum_value">0x20</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">YV12</span>
+ <span class="entry_type_enum_value">0x32315659</span>
+ <span class="entry_type_enum_notes">YCrCb 4:2:0 Planar</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">YCbCr_420_SP</span>
+ <span class="entry_type_enum_value">0x11</span>
+ <span class="entry_type_enum_notes">NV21</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">JPEG</span>
+ <span class="entry_type_enum_value">0x21</span>
+ <span class="entry_type_enum_notes">BLOB</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of app-visible formats
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableJpegMinDurations">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Jpeg<wbr>Min<wbr>Durations</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The minimum frame duration that is supported
+ for each resolution in availableJpegSizes.<wbr> Should
+ correspond to the frame duration when only that JPEG
+ stream is active,<wbr> with all processing set to
+ FAST
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ When multiple streams are configured,<wbr> the minimum
+ frame duration will be >= max(individual stream min
+ durations)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableJpegSizes">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Jpeg<wbr>Sizes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The resolutions available for output from
+ the JPEG block.<wbr> Listed as width x height
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must include: - sensor maximum resolution Should
+ include: - half/<wbr>quarter max resolution
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableMaxDigitalZoom">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Max<wbr>Digital<wbr>Zoom</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ TODO: have a real description here
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableProcessedMinDurations">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Processed<wbr>Min<wbr>Durations</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The minimum frame duration that is supported
+ for each resolution in availableProcessedSizes.<wbr> Should
+ correspond to the frame duration when only that processed
+ stream is active,<wbr> with all processing set to
+ FAST
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ When multiple streams are configured,<wbr> the minimum
+ frame duration will be >= max(individual stream min
+ durations)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableProcessedSizes">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Processed<wbr>Sizes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The resolutions available for use with
+ processed output streams,<wbr> such as YV12,<wbr> NV12,<wbr> and
+ platform opaque YUV/<wbr>RGB streams to the GPU or video
+ encoders.<wbr> Listed as width,<wbr> height
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must include: - sensor maximum resolution -
+ standard QCIF,<wbr> 240p,<wbr> 480p,<wbr> 720p,<wbr> and 1080p
+ resolutions
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableRawMinDurations">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Raw<wbr>Min<wbr>Durations</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The minimum frame duration that is supported
+ for each raw resolution in availableRawSizes.<wbr> Should
+ correspond to the frame duration when only the raw stream
+ is active.<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ When multiple streams are configured,<wbr> the minimum
+ frame duration will be >= max(individual stream min
+ durations)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.availableRawSizes">
+ <td class="entry_name">android.<wbr>scaler.<wbr>available<wbr>Raw<wbr>Sizes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The resolutions available for use with raw
+ sensor output streams,<wbr> listed as width,<wbr>
+ height
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must include: - sensor maximum resolution
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.scaler.maxDigitalZoom">
+ <td class="entry_name">android.<wbr>scaler.<wbr>max<wbr>Digital<wbr>Zoom</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The maximum ratio between active area width
+ and crop region width,<wbr> or between active area height and
+ crop region height,<wbr> if the crop region height is larger
+ than width
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >=1
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.scaler.cropRegion">
+ <td class="entry_name">android.<wbr>scaler.<wbr>crop<wbr>Region</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 3
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Top-left corner and width of the output
+ region to select from the active pixel
+ array
+ </td>
+
+ <td class="entry_units">
+ (x,<wbr>y) of top-left corner,<wbr> width of region in
+ pixels; (0,<wbr>0) is top-left corner of
+ android.<wbr>sensor.<wbr>active<wbr>Pixel<wbr>Array
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ [BC - zoom] Height determined based on width and
+ aspect ratio of output stream.<wbr> Negative values for corner
+ are allowed for raw output if full pixel array is larger
+ than active pixel array.<wbr> Width may be rounded to nearest
+ larger supportable width,<wbr> especially for raw output,<wbr>
+ where only a few fixed scales may be possible
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_sensor" class="section">sensor</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.sensor.exposureTime">
+ <td class="entry_name">android.<wbr>sensor.<wbr>exposure<wbr>Time</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Duration each pixel is exposed to
+ light
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>sensor.<wbr>info.<wbr>exposure<wbr>Time<wbr>Range
+ </td>
+
+ <td class="entry_notes">
+ 1/<wbr>10000 - 30 sec range.<wbr> No bulb mode
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.sensor.frameDuration">
+ <td class="entry_name">android.<wbr>sensor.<wbr>frame<wbr>Duration</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Duration from start of frame exposure to
+ start of next frame exposure
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ see android.<wbr>sensor.<wbr>info.<wbr>max<wbr>Frame<wbr>Duration,<wbr>
+ android.<wbr>scaler.<wbr>info.<wbr>available<wbr>Min<wbr>Frame<wbr>Durations
+ </td>
+
+ <td class="entry_notes">
+ Exposure time has priority,<wbr> so duration is set to
+ max(duration,<wbr> exposure time + overhead)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.sensor.sensitivity">
+ <td class="entry_name">android.<wbr>sensor.<wbr>sensitivity</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Gain applied to image data.<wbr> Must be
+ implemented through analog gain only if set to values
+ below 'maximum analog sensitivity'.<wbr>
+ </td>
+
+ <td class="entry_units">
+ ISO arithmetic units
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>sensor.<wbr>info.<wbr>sensitivity<wbr>Range
+ </td>
+
+ <td class="entry_notes">
+ ISO 12232:2006 REI method
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.sensor.info.activeArraySize">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>active<wbr>Array<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 4
+ </span>
+
+ <div class="entry_type_notes">Four ints defining the active pixel rectangle</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Area of raw data which corresponds to only
+ active pixels; smaller or equal to
+ pixelArraySize.<wbr>
+ </td>
+
+ <td class="entry_units">
+ xmin,<wbr> ymin,<wbr> width,<wbr> height.<wbr> Top left of full
+ pixel array is (0,<wbr>0)
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.availableSensitivities">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>available<wbr>Sensitivities</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">List of supported sensitivity values</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Range of valid sensitivities
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must at least include 100,<wbr> 200,<wbr> 400,<wbr> 800,<wbr>
+ 1600
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.colorFilterArrangement">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>color<wbr>Filter<wbr>Arrangement</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">RGGB</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">GRBG</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">GBRG</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">BGGR</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">RGB</span>
+ <span class="entry_type_enum_notes">Sensor is not Bayer; output has 3 16-bit
+ values for each pixel,<wbr> instead of just 1 16-bit value
+ per pixel.<wbr></span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Arrangement of color filters on sensor;
+ represents the colors in the top-left 2x2 section of
+ the sensor,<wbr> in reading order
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.exposureTimeRange">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>exposure<wbr>Time<wbr>Range</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">nanoseconds</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Range of valid exposure
+ times
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Min <= 100e3 (100 us),<wbr> Max >= 30e9 (30
+ sec)
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.maxFrameDuration">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>max<wbr>Frame<wbr>Duration</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum frame duration (minimum frame
+ rate)
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ >= 30e9
+ </td>
+
+ <td class="entry_notes">
+ Minimum duration is a function of resolution,<wbr>
+ processing settings.<wbr> See
+ android.<wbr>scaler.<wbr>info.<wbr>available<wbr>Min<wbr>Frame<wbr>Durations
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.physicalSize">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>physical<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">width x height in millimeters</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ The physical dimensions of the full pixel
+ array
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Needed for FOV calculation for old API
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.pixelArraySize">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>pixel<wbr>Array<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Dimensions of full pixel array,<wbr> possibly
+ including black calibration pixels
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Maximum output resolution for raw format must
+ match this in
+ android.<wbr>scaler.<wbr>info.<wbr>available<wbr>Sizes<wbr>Per<wbr>Format
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.info.whiteLevel">
+ <td class="entry_name">android.<wbr>sensor.<wbr>info.<wbr>white<wbr>Level</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum raw value output by
+ sensor
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ > 1024 (10-bit output)
+ </td>
+
+ <td class="entry_notes">
+ Defines sensor bit depth (10-14 bits is
+ expected)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+
+
+ <tr class="entry" id="static_android.sensor.baseGainFactor">
+ <td class="entry_name">android.<wbr>sensor.<wbr>base<wbr>Gain<wbr>Factor</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Gain factor from electrons to raw units when
+ ISO=100
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.blackLevelPattern">
+ <td class="entry_name">android.<wbr>sensor.<wbr>black<wbr>Level<wbr>Pattern</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 4
+ </span>
+
+ <div class="entry_type_notes">2x2 raw count block</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A fixed black level offset for each of the
+ Bayer mosaic channels
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 0 each
+ </td>
+
+ <td class="entry_notes">
+ As per DNG BlackLevelRepeatDim /<wbr> BlackLevel
+ tags
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.calibrationTransform1">
+ <td class="entry_name">android.<wbr>sensor.<wbr>calibration<wbr>Transform1</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 9
+ </span>
+
+ <div class="entry_type_notes">3x3 matrix in row-major-order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Per-device calibration on top of color space
+ transform 1
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.calibrationTransform2">
+ <td class="entry_name">android.<wbr>sensor.<wbr>calibration<wbr>Transform2</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 9
+ </span>
+
+ <div class="entry_type_notes">3x3 matrix in row-major-order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Per-device calibration on top of color space
+ transform 2
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.colorTransform1">
+ <td class="entry_name">android.<wbr>sensor.<wbr>color<wbr>Transform1</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 9
+ </span>
+
+ <div class="entry_type_notes">3x3 matrix in row-major-order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Linear mapping from XYZ (D50) color space to
+ reference linear sensor color,<wbr> for first reference
+ illuminant
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Use as follows XYZ = inv(transform) * clip( (raw -
+ black level(raw) ) /<wbr> ( white level - max black level) ).<wbr>
+ At least in the simple case
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.colorTransform2">
+ <td class="entry_name">android.<wbr>sensor.<wbr>color<wbr>Transform2</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 9
+ </span>
+
+ <div class="entry_type_notes">3x3 matrix in row-major-order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Linear mapping from XYZ (D50) color space to
+ reference linear sensor color,<wbr> for second reference
+ illuminant
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.forwardMatrix1">
+ <td class="entry_name">android.<wbr>sensor.<wbr>forward<wbr>Matrix1</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 9
+ </span>
+
+ <div class="entry_type_notes">3x3 matrix in row-major-order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Used by DNG for better WB
+ adaptation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.forwardMatrix2">
+ <td class="entry_name">android.<wbr>sensor.<wbr>forward<wbr>Matrix2</td>
+ <td class="entry_type">
+ <span class="entry_type_name">rational</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 9
+ </span>
+
+ <div class="entry_type_notes">3x3 matrix in row-major-order</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Used by DNG for better WB
+ adaptation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.maxAnalogSensitivity">
+ <td class="entry_name">android.<wbr>sensor.<wbr>max<wbr>Analog<wbr>Sensitivity</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum sensitivity that is implemented
+ purely through analog gain
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ For android.<wbr>sensor.<wbr>sensitivity values less than or
+ equal to this,<wbr> all applied gain must be analog.<wbr> For
+ values above this,<wbr> it can be a mix of analog and
+ digital
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.noiseModelCoefficients">
+ <td class="entry_name">android.<wbr>sensor.<wbr>noise<wbr>Model<wbr>Coefficients</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">float constants A,<wbr> B for the noise variance model</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Estimation of sensor noise
+ characteristics
+ </td>
+
+ <td class="entry_units">
+ var(raw pixel value) = electrons * (baseGainFactor
+ * iso/<wbr>100)^2 + A * (baseGainFactor * iso/<wbr>100)^2 +
+ B
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ A represents sensor read noise before analog
+ amplification; B represents noise from A/<wbr>D conversion and
+ other circuits after amplification.<wbr> Both noise sources
+ are assumed to be gaussian,<wbr> independent,<wbr> and not to vary
+ across the sensor
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.orientation">
+ <td class="entry_name">android.<wbr>sensor.<wbr>orientation</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Clockwise angle through which the output
+ image needs to be rotated to be upright on the device
+ screen in its native orientation.<wbr> Also defines the
+ direction of rolling shutter readout,<wbr> which is from top
+ to bottom in the sensor's coordinate system
+ </td>
+
+ <td class="entry_units">
+ degrees clockwise rotation,<wbr> only multiples of
+ 90
+ </td>
+
+ <td class="entry_range">
+ 0,<wbr>90,<wbr>180,<wbr>270
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.referenceIlluminant1">
+ <td class="entry_name">android.<wbr>sensor.<wbr>reference<wbr>Illuminant1</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">DAYLIGHT</span>
+ <span class="entry_type_enum_value">1</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FLUORESCENT</span>
+ <span class="entry_type_enum_value">2</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">TUNGSTEN</span>
+ <span class="entry_type_enum_value">3</span>
+ <span class="entry_type_enum_notes">Incandescent light</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FLASH</span>
+ <span class="entry_type_enum_value">4</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FINE_WEATHER</span>
+ <span class="entry_type_enum_value">9</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">CLOUDY_WEATHER</span>
+ <span class="entry_type_enum_value">10</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SHADE</span>
+ <span class="entry_type_enum_value">11</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">DAYLIGHT_FLUORESCENT</span>
+ <span class="entry_type_enum_value">12</span>
+ <span class="entry_type_enum_notes">D 5700 - 7100K</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">DAY_WHITE_FLUORESCENT</span>
+ <span class="entry_type_enum_value">13</span>
+ <span class="entry_type_enum_notes">N 4600 - 5400K</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">COOL_WHITE_FLUORESCENT</span>
+ <span class="entry_type_enum_value">14</span>
+ <span class="entry_type_enum_notes">W 3900 - 4500K</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">WHITE_FLUORESCENT</span>
+ <span class="entry_type_enum_value">15</span>
+ <span class="entry_type_enum_notes">WW 3200 - 3700K</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">STANDARD_A</span>
+ <span class="entry_type_enum_value">17</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">STANDARD_B</span>
+ <span class="entry_type_enum_value">18</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">STANDARD_C</span>
+ <span class="entry_type_enum_value">19</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">D55</span>
+ <span class="entry_type_enum_value">20</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">D65</span>
+ <span class="entry_type_enum_value">21</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">D75</span>
+ <span class="entry_type_enum_value">22</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">D50</span>
+ <span class="entry_type_enum_value">23</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ISO_STUDIO_TUNGSTEN</span>
+ <span class="entry_type_enum_value">24</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Light source used to define transform
+ 1
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ [EXIF LightSource tag] Must all these be
+ supported? Need CCT for each!
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ <li><a href="#tag_EXIF">EXIF</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.sensor.referenceIlluminant2">
+ <td class="entry_name">android.<wbr>sensor.<wbr>reference<wbr>Illuminant2</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Light source used to define transform
+ 2
+ </td>
+
+ <td class="entry_units">
+ Same as illuminant 1
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.sensor.exposureTime">
+ <td class="entry_name">android.<wbr>sensor.<wbr>exposure<wbr>Time</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Duration each pixel is exposed to
+ light
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>sensor.<wbr>info.<wbr>exposure<wbr>Time<wbr>Range
+ </td>
+
+ <td class="entry_notes">
+ 1/<wbr>10000 - 30 sec range.<wbr> No bulb mode
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.sensor.frameDuration">
+ <td class="entry_name">android.<wbr>sensor.<wbr>frame<wbr>Duration</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Duration from start of frame exposure to
+ start of next frame exposure
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ see android.<wbr>sensor.<wbr>info.<wbr>max<wbr>Frame<wbr>Duration,<wbr>
+ android.<wbr>scaler.<wbr>info.<wbr>available<wbr>Min<wbr>Frame<wbr>Durations
+ </td>
+
+ <td class="entry_notes">
+ Exposure time has priority,<wbr> so duration is set to
+ max(duration,<wbr> exposure time + overhead)
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.sensor.sensitivity">
+ <td class="entry_name">android.<wbr>sensor.<wbr>sensitivity</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Gain applied to image data.<wbr> Must be
+ implemented through analog gain only if set to values
+ below 'maximum analog sensitivity'.<wbr>
+ </td>
+
+ <td class="entry_units">
+ ISO arithmetic units
+ </td>
+
+ <td class="entry_range">
+ android.<wbr>sensor.<wbr>info.<wbr>sensitivity<wbr>Range
+ </td>
+
+ <td class="entry_notes">
+ ISO 12232:2006 REI method
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.sensor.timestamp">
+ <td class="entry_name">android.<wbr>sensor.<wbr>timestamp</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int64</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Time at start of exposure of first
+ row
+ </td>
+
+ <td class="entry_units">
+ nanoseconds
+ </td>
+
+ <td class="entry_range">
+ > 0
+ </td>
+
+ <td class="entry_notes">
+ Monotonic,<wbr> should be synced to other timestamps in
+ system
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_shading" class="section">shading</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.shading.mode">
+ <td class="entry_name">android.<wbr>shading.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No shading correction is applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Quality of lens shading correction applied
+ to the image data
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.shading.strength">
+ <td class="entry_name">android.<wbr>shading.<wbr>strength</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Control the amount of shading correction
+ applied to the images
+ </td>
+
+ <td class="entry_units">
+ unitless: 1-10; 10 is full shading
+ compensation
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_ADV">ADV</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.shading.mode">
+ <td class="entry_name">android.<wbr>shading.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ <span class="entry_type_enum_notes">No shading correction is applied</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Quality of lens shading correction applied
+ to the image data
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_statistics" class="section">statistics</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.statistics.faceDetectMode">
+ <td class="entry_name">android.<wbr>statistics.<wbr>face<wbr>Detect<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SIMPLE</span>
+ <span class="entry_type_enum_notes">Optional Return rectangle and confidence
+ only</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FULL</span>
+ <span class="entry_type_enum_notes">Optional Return all face
+ metadata</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ State of the face detector
+ unit
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+
+ android.<wbr>statistics.<wbr>available<wbr>Face<wbr>Detect<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.statistics.histogramMode">
+ <td class="entry_name">android.<wbr>statistics.<wbr>histogram<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operating mode for histogram
+ generation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.statistics.sharpnessMapMode">
+ <td class="entry_name">android.<wbr>statistics.<wbr>sharpness<wbr>Map<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operating mode for sharpness map
+ generation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.statistics.info.availableFaceDetectModes">
+ <td class="entry_name">android.<wbr>statistics.<wbr>info.<wbr>available<wbr>Face<wbr>Detect<wbr>Modes</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+ <div class="entry_type_notes">List of enums</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Which face detection modes are available,<wbr>
+ if any
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ OFF
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.statistics.info.histogramBucketCount">
+ <td class="entry_name">android.<wbr>statistics.<wbr>info.<wbr>histogram<wbr>Bucket<wbr>Count</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Number of histogram buckets
+ supported
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 64
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.statistics.info.maxFaceCount">
+ <td class="entry_name">android.<wbr>statistics.<wbr>info.<wbr>max<wbr>Face<wbr>Count</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ If face detection is supported,<wbr> how many
+ faces can be detected at once
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 4 if availableFaceDetectionModes lists
+ modes besides OFF,<wbr> otherwise 0
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.statistics.info.maxHistogramCount">
+ <td class="entry_name">android.<wbr>statistics.<wbr>info.<wbr>max<wbr>Histogram<wbr>Count</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum value possible for a histogram
+ bucket
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.statistics.info.maxSharpnessMapValue">
+ <td class="entry_name">android.<wbr>statistics.<wbr>info.<wbr>max<wbr>Sharpness<wbr>Map<wbr>Value</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum value possible for a sharpness map
+ region.<wbr>
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="static_android.statistics.info.sharpnessMapSize">
+ <td class="entry_name">android.<wbr>statistics.<wbr>info.<wbr>sharpness<wbr>Map<wbr>Size</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ 2
+ </span>
+
+ <div class="entry_type_notes">width x height</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Dimensions of the sharpness
+ map
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ Must be at least 32 x 32
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.statistics.faceDetectMode">
+ <td class="entry_name">android.<wbr>statistics.<wbr>face<wbr>Detect<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">SIMPLE</span>
+ <span class="entry_type_enum_notes">Optional Return rectangle and confidence
+ only</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FULL</span>
+ <span class="entry_type_enum_notes">Optional Return all face
+ metadata</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ State of the face detector
+ unit
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+
+ android.<wbr>statistics.<wbr>available<wbr>Face<wbr>Detect<wbr>Modes
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.faceIds">
+ <td class="entry_name">android.<wbr>statistics.<wbr>face<wbr>Ids</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of unique IDs for detected
+ faces
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Only available if faceDetectMode == FULL
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.faceLandmarks">
+ <td class="entry_name">android.<wbr>statistics.<wbr>face<wbr>Landmarks</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 6
+ </span>
+
+ <div class="entry_type_notes">(leftEyeX,<wbr> leftEyeY,<wbr> rightEyeX,<wbr> rightEyeY,<wbr> mouthX,<wbr> mouthY)</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of landmarks for detected
+ faces
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Only available if faceDetectMode == FULL
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.faceRectangles">
+ <td class="entry_name">android.<wbr>statistics.<wbr>face<wbr>Rectangles</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 4
+ </span>
+
+ <div class="entry_type_notes">(xmin,<wbr> ymin,<wbr> xmax,<wbr> ymax).<wbr> (0,<wbr>0) is top-left of active pixel area</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of the bounding rectangles for detected
+ faces
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ Only available if faceDetectMode != OFF
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.faceScores">
+ <td class="entry_name">android.<wbr>statistics.<wbr>face<wbr>Scores</td>
+ <td class="entry_type">
+ <span class="entry_type_name">byte</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n
+ </span>
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ List of the face confidence scores for
+ detected faces
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 0-100
+ </td>
+
+ <td class="entry_notes">
+ Only available if faceDetectMode != OFF
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_BC">BC</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.histogram">
+ <td class="entry_name">android.<wbr>statistics.<wbr>histogram</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 3
+ </span>
+
+ <div class="entry_type_notes">count of pixels for each color channel that fall into each histogram bucket,<wbr> scaled to be between 0 and maxHistogramCount</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A 3-channel histogram based on the raw
+ sensor data
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ The k'th bucket (0-based) covers the input range
+ (with w = android.<wbr>sensor.<wbr>info.<wbr>white<wbr>Level) of [ k * w/<wbr>N,<wbr>
+ (k + 1) * w /<wbr> N ).<wbr> If only a monochrome sharpness map is
+ supported,<wbr> all channels should have the same data
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.histogramMode">
+ <td class="entry_name">android.<wbr>statistics.<wbr>histogram<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operating mode for histogram
+ generation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.sharpnessMap">
+ <td class="entry_name">android.<wbr>statistics.<wbr>sharpness<wbr>Map</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x m x 3
+ </span>
+
+ <div class="entry_type_notes">estimated sharpness for each region of the input image.<wbr> Normalized to be between 0 and maxSharpnessMapValue.<wbr> Higher values mean sharper (better focused)</div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ A 3-channel sharpness map,<wbr> based on the raw
+ sensor data
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ If only a monochrome sharpness map is supported,<wbr>
+ all channels should have the same data
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.statistics.sharpnessMapMode">
+ <td class="entry_name">android.<wbr>statistics.<wbr>sharpness<wbr>Map<wbr>Mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">OFF</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">ON</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Operating mode for sharpness map
+ generation
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_V1">V1</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+ <tr><td colspan="7" id="section_tonemap" class="section">tonemap</td></tr>
+
+
+ <tr><td colspan="7" class="kind">controls</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="controls_android.tonemap.curveBlue">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>curve<wbr>Blue</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Table mapping blue input values to output
+ values
+ </td>
+
+ <td class="entry_units">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_range">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.tonemap.curveGreen">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>curve<wbr>Green</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Table mapping green input values to output
+ values
+ </td>
+
+ <td class="entry_units">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_range">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.tonemap.curveRed">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>curve<wbr>Red</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 2
+ </span>
+
+ <div class="entry_type_notes">A 1D array of pairs of floats.<wbr> mapping a 0-1 input range to a 0-1 output range.<wbr></div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Table mapping red input values to output
+ values
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 0-1 on input and output coordinates.<wbr> Max entry
+ count speciied by android.<wbr>tonemap.<wbr>max<wbr>Curve<wbr>Points
+ </td>
+
+ <td class="entry_notes">
+ .<wbr>The input range must be monotonically increasing
+ with N,<wbr> and values between entries should be linearly
+ interpolated.<wbr> For example,<wbr> if the array is: [0.<wbr>0,<wbr> 0.<wbr>0,<wbr>
+ 0.<wbr>3,<wbr> 0.<wbr>5,<wbr> 1.<wbr>0,<wbr> 1.<wbr>0],<wbr> then the input->output mapping
+ for a few sample points would be: 0 -> 0,<wbr> 0.<wbr>15 ->
+ 0.<wbr>25,<wbr> 0.<wbr>3 -> 0.<wbr>5,<wbr> 0.<wbr>5 -> 0.<wbr>64
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="controls_android.tonemap.mode">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">CONTRAST_CURVE</span>
+ <span class="entry_type_enum_notes">Use the tone mapping curve specified in
+ android.<wbr>tonemap.<wbr>curve</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">static</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="static_android.tonemap.maxCurvePoints">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>max<wbr>Curve<wbr>Points</td>
+ <td class="entry_type">
+ <span class="entry_type_name">int32</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Maximum number of supported points in the
+ tonemap curve
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ >= 128
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+ <tr><td colspan="7" class="kind">dynamic</td></tr>
+
+ <thead>
+ <tr>
+ <th class="th_name">Property Name</th>
+ <th class="th_type">Type</th>
+ <th class="th_description">Description</th>
+ <th class="th_units">Units</th>
+ <th class="th_range">Range</th>
+ <th class="th_notes">Notes</th>
+ <th class="th_tags">Tags</th>
+ </tr>
+ </thead>
+
+ <tbody>
+
+
+
+
+
+
+
+
+
+
+ <tr class="entry" id="dynamic_android.tonemap.curveBlue">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>curve<wbr>Blue</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Table mapping blue input values to output
+ values
+ </td>
+
+ <td class="entry_units">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_range">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.tonemap.curveGreen">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>curve<wbr>Green</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+
+
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Table mapping green input values to output
+ values
+ </td>
+
+ <td class="entry_units">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_range">
+ same as android.<wbr>tonemap.<wbr>curve<wbr>Red
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.tonemap.curveRed">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>curve<wbr>Red</td>
+ <td class="entry_type">
+ <span class="entry_type_name">float</span>
+ <span class="entry_type_container">x</span>
+
+ <span class="entry_type_array">
+ n x 2
+ </span>
+
+ <div class="entry_type_notes">A 1D array of pairs of floats.<wbr> mapping a 0-1 input range to a 0-1 output range.<wbr></div>
+
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ Table mapping red input values to output
+ values
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ 0-1 on input and output coordinates.<wbr> Max entry
+ count speciied by android.<wbr>tonemap.<wbr>max<wbr>Curve<wbr>Points
+ </td>
+
+ <td class="entry_notes">
+ .<wbr>The input range must be monotonically increasing
+ with N,<wbr> and values between entries should be linearly
+ interpolated.<wbr> For example,<wbr> if the array is: [0.<wbr>0,<wbr> 0.<wbr>0,<wbr>
+ 0.<wbr>3,<wbr> 0.<wbr>5,<wbr> 1.<wbr>0,<wbr> 1.<wbr>0],<wbr> then the input->output mapping
+ for a few sample points would be: 0 -> 0,<wbr> 0.<wbr>15 ->
+ 0.<wbr>25,<wbr> 0.<wbr>3 -> 0.<wbr>5,<wbr> 0.<wbr>5 -> 0.<wbr>64
+ </td>
+
+ <td class="entry_tags">
+ <ul class="entry_tags">
+ <li><a href="#tag_DNG">DNG</a></li>
+ </ul>
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+ <tr class="entry" id="dynamic_android.tonemap.mode">
+ <td class="entry_name">android.<wbr>tonemap.<wbr>mode</td>
+ <td class="entry_type">
+ <span class="entry_type_name entry_type_name_enum">byte</span>
+
+
+
+ <ul class="entry_type_enum">
+ <li>
+ <span class="entry_type_enum_name">CONTRAST_CURVE</span>
+ <span class="entry_type_enum_notes">Use the tone mapping curve specified in
+ android.<wbr>tonemap.<wbr>curve</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">FAST</span>
+ <span class="entry_type_enum_notes">Must not slow down frame rate relative to raw
+ bayer output</span>
+ </li>
+ <li>
+ <span class="entry_type_enum_name">HIGH_QUALITY</span>
+ <span class="entry_type_enum_notes">Frame rate may be reduced by high
+ quality</span>
+ </li>
+ </ul>
+
+ </td> <!-- entry_type -->
+
+ <td class="entry_description">
+ </td>
+
+ <td class="entry_units">
+ </td>
+
+ <td class="entry_range">
+ </td>
+
+ <td class="entry_notes">
+ </td>
+
+ <td class="entry_tags">
+ </td>
+
+ </tr> <!-- end of entry -->
+
+
+
+ <!-- end of kind -->
+ </tbody>
+
+ <!-- end of section -->
+<!-- </namespace> -->
+ </table>
+
+ <div class="tags" id="tag_index">
+ <h2>Tags</h2>
+ <ul>
+ <li id="tag_AWB">AWB -
+ Needed for auto white balance
+
+ <ul class="tags_entries">
+ <li><a href="#controls_android.control.awbMode">android.control.awbMode</a> (controls)</li>
+ </ul>
+ </li> <!-- tag_AWB -->
+ <li id="tag_BC">BC -
+ Needed for backwards compatibility with old Java API
+
+ <ul class="tags_entries">
+ <li><a href="#controls_android.control.aeExposureCompensation">android.control.aeExposureCompensation</a> (controls)</li>
+ <li><a href="#controls_android.control.aeLock">android.control.aeLock</a> (controls)</li>
+ <li><a href="#controls_android.control.aeMode">android.control.aeMode</a> (controls)</li>
+ <li><a href="#controls_android.control.aeRegions">android.control.aeRegions</a> (controls)</li>
+ <li><a href="#controls_android.control.aeTargetFpsRange">android.control.aeTargetFpsRange</a> (controls)</li>
+ <li><a href="#controls_android.control.afMode">android.control.afMode</a> (controls)</li>
+ <li><a href="#controls_android.control.afRegions">android.control.afRegions</a> (controls)</li>
+ <li><a href="#controls_android.control.awbLock">android.control.awbLock</a> (controls)</li>
+ <li><a href="#controls_android.control.awbMode">android.control.awbMode</a> (controls)</li>
+ <li><a href="#controls_android.control.awbRegions">android.control.awbRegions</a> (controls)</li>
+ <li><a href="#controls_android.control.captureIntent">android.control.captureIntent</a> (controls)</li>
+ <li><a href="#controls_android.control.effectMode">android.control.effectMode</a> (controls)</li>
+ <li><a href="#controls_android.control.mode">android.control.mode</a> (controls)</li>
+ <li><a href="#controls_android.control.sceneMode">android.control.sceneMode</a> (controls)</li>
+ <li><a href="#controls_android.control.videoStabilizationMode">android.control.videoStabilizationMode</a> (controls)</li>
+ <li><a href="#static_android.control.aeCompensationRange">android.control.aeCompensationRange</a> (static)</li>
+ <li><a href="#static_android.control.aeCompensationStep">android.control.aeCompensationStep</a> (static)</li>
+ <li><a href="#static_android.control.afAvailableModes">android.control.afAvailableModes</a> (static)</li>
+ <li><a href="#static_android.control.availableEffects">android.control.availableEffects</a> (static)</li>
+ <li><a href="#static_android.control.availableSceneModes">android.control.availableSceneModes</a> (static)</li>
+ <li><a href="#static_android.control.availableVideoStabilizationModes">android.control.availableVideoStabilizationModes</a> (static)</li>
+ <li><a href="#static_android.control.awbAvailableModes">android.control.awbAvailableModes</a> (static)</li>
+ <li><a href="#static_android.control.maxRegions">android.control.maxRegions</a> (static)</li>
+ <li><a href="#static_android.control.sceneModeOverrides">android.control.sceneModeOverrides</a> (static)</li>
+ <li><a href="#controls_android.flash.mode">android.flash.mode</a> (controls)</li>
+ <li><a href="#static_android.flash.info.available">android.flash.info.available</a> (static)</li>
+ <li><a href="#controls_android.jpeg.gpsCoordinates">android.jpeg.gpsCoordinates</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.gpsProcessingMethod">android.jpeg.gpsProcessingMethod</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.gpsTimestamp">android.jpeg.gpsTimestamp</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.orientation">android.jpeg.orientation</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.quality">android.jpeg.quality</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.thumbnailQuality">android.jpeg.thumbnailQuality</a> (controls)</li>
+ <li><a href="#controls_android.jpeg.thumbnailSize">android.jpeg.thumbnailSize</a> (controls)</li>
+ <li><a href="#static_android.jpeg.availableThumbnailSizes">android.jpeg.availableThumbnailSizes</a> (static)</li>
+ <li><a href="#controls_android.lens.focusDistance">android.lens.focusDistance</a> (controls)</li>
+ <li><a href="#static_android.lens.info.availableFocalLengths">android.lens.info.availableFocalLengths</a> (static)</li>
+ <li><a href="#static_android.lens.info.hyperfocalDistance">android.lens.info.hyperfocalDistance</a> (static)</li>
+ <li><a href="#dynamic_android.lens.focusRange">android.lens.focusRange</a> (dynamic)</li>
+ <li><a href="#static_android.request.maxNumOutputStreams">android.request.maxNumOutputStreams</a> (static)</li>
+ <li><a href="#controls_android.scaler.cropRegion">android.scaler.cropRegion</a> (controls)</li>
+ <li><a href="#static_android.scaler.availableFormats">android.scaler.availableFormats</a> (static)</li>
+ <li><a href="#static_android.scaler.availableJpegMinDurations">android.scaler.availableJpegMinDurations</a> (static)</li>
+ <li><a href="#static_android.scaler.availableJpegSizes">android.scaler.availableJpegSizes</a> (static)</li>
+ <li><a href="#static_android.scaler.availableProcessedMinDurations">android.scaler.availableProcessedMinDurations</a> (static)</li>
+ <li><a href="#static_android.scaler.availableProcessedSizes">android.scaler.availableProcessedSizes</a> (static)</li>
+ <li><a href="#static_android.scaler.availableRawMinDurations">android.scaler.availableRawMinDurations</a> (static)</li>
+ <li><a href="#static_android.scaler.maxDigitalZoom">android.scaler.maxDigitalZoom</a> (static)</li>
+ <li><a href="#controls_android.sensor.frameDuration">android.sensor.frameDuration</a> (controls)</li>
+ <li><a href="#static_android.sensor.info.availableSensitivities">android.sensor.info.availableSensitivities</a> (static)</li>
+ <li><a href="#static_android.sensor.info.maxFrameDuration">android.sensor.info.maxFrameDuration</a> (static)</li>
+ <li><a href="#static_android.sensor.info.physicalSize">android.sensor.info.physicalSize</a> (static)</li>
+ <li><a href="#static_android.sensor.info.pixelArraySize">android.sensor.info.pixelArraySize</a> (static)</li>
+ <li><a href="#static_android.sensor.orientation">android.sensor.orientation</a> (static)</li>
+ <li><a href="#dynamic_android.sensor.timestamp">android.sensor.timestamp</a> (dynamic)</li>
+ <li><a href="#controls_android.statistics.faceDetectMode">android.statistics.faceDetectMode</a> (controls)</li>
+ <li><a href="#dynamic_android.statistics.faceIds">android.statistics.faceIds</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceLandmarks">android.statistics.faceLandmarks</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceRectangles">android.statistics.faceRectangles</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.faceScores">android.statistics.faceScores</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.focalLength">android.lens.focalLength</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.focusDistance">android.lens.focusDistance</a> (dynamic)</li>
+ </ul>
+ </li> <!-- tag_BC -->
+ <li id="tag_V1">V1 -
+ New features for first camera 2 release (API1)
+
+ <ul class="tags_entries">
+ <li><a href="#controls_android.demosaic.mode">android.demosaic.mode</a> (controls)</li>
+ <li><a href="#controls_android.flash.firingPower">android.flash.firingPower</a> (controls)</li>
+ <li><a href="#controls_android.flash.firingTime">android.flash.firingTime</a> (controls)</li>
+ <li><a href="#static_android.flash.info.chargeDuration">android.flash.info.chargeDuration</a> (static)</li>
+ <li><a href="#controls_android.hotPixel.mode">android.hotPixel.mode</a> (controls)</li>
+ <li><a href="#controls_android.lens.aperture">android.lens.aperture</a> (controls)</li>
+ <li><a href="#controls_android.lens.filterDensity">android.lens.filterDensity</a> (controls)</li>
+ <li><a href="#controls_android.lens.focalLength">android.lens.focalLength</a> (controls)</li>
+ <li><a href="#controls_android.lens.focusDistance">android.lens.focusDistance</a> (controls)</li>
+ <li><a href="#controls_android.lens.opticalStabilizationMode">android.lens.opticalStabilizationMode</a> (controls)</li>
+ <li><a href="#static_android.lens.info.availableApertures">android.lens.info.availableApertures</a> (static)</li>
+ <li><a href="#static_android.lens.info.availableFilterDensities">android.lens.info.availableFilterDensities</a> (static)</li>
+ <li><a href="#static_android.lens.info.availableFocalLengths">android.lens.info.availableFocalLengths</a> (static)</li>
+ <li><a href="#static_android.lens.info.availableOpticalStabilization">android.lens.info.availableOpticalStabilization</a> (static)</li>
+ <li><a href="#static_android.lens.info.geometricCorrectionMapSize">android.lens.info.geometricCorrectionMapSize</a> (static)</li>
+ <li><a href="#static_android.lens.info.minimumFocusDistance">android.lens.info.minimumFocusDistance</a> (static)</li>
+ <li><a href="#static_android.lens.info.shadingMapSize">android.lens.info.shadingMapSize</a> (static)</li>
+ <li><a href="#static_android.lens.position">android.lens.position</a> (static)</li>
+ <li><a href="#dynamic_android.lens.state">android.lens.state</a> (dynamic)</li>
+ <li><a href="#controls_android.noiseReduction.mode">android.noiseReduction.mode</a> (controls)</li>
+ <li><a href="#controls_android.request.id">android.request.id</a> (controls)</li>
+ <li><a href="#controls_android.sensor.exposureTime">android.sensor.exposureTime</a> (controls)</li>
+ <li><a href="#controls_android.sensor.frameDuration">android.sensor.frameDuration</a> (controls)</li>
+ <li><a href="#controls_android.sensor.sensitivity">android.sensor.sensitivity</a> (controls)</li>
+ <li><a href="#static_android.sensor.info.availableSensitivities">android.sensor.info.availableSensitivities</a> (static)</li>
+ <li><a href="#static_android.sensor.info.exposureTimeRange">android.sensor.info.exposureTimeRange</a> (static)</li>
+ <li><a href="#static_android.sensor.info.maxFrameDuration">android.sensor.info.maxFrameDuration</a> (static)</li>
+ <li><a href="#static_android.sensor.info.physicalSize">android.sensor.info.physicalSize</a> (static)</li>
+ <li><a href="#static_android.sensor.baseGainFactor">android.sensor.baseGainFactor</a> (static)</li>
+ <li><a href="#static_android.sensor.maxAnalogSensitivity">android.sensor.maxAnalogSensitivity</a> (static)</li>
+ <li><a href="#static_android.sensor.noiseModelCoefficients">android.sensor.noiseModelCoefficients</a> (static)</li>
+ <li><a href="#controls_android.statistics.histogramMode">android.statistics.histogramMode</a> (controls)</li>
+ <li><a href="#controls_android.statistics.sharpnessMapMode">android.statistics.sharpnessMapMode</a> (controls)</li>
+ <li><a href="#dynamic_android.statistics.histogram">android.statistics.histogram</a> (dynamic)</li>
+ <li><a href="#dynamic_android.statistics.sharpnessMap">android.statistics.sharpnessMap</a> (dynamic)</li>
+ <li><a href="#dynamic_android.hotPixel.mode">android.hotPixel.mode</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.aperture">android.lens.aperture</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.filterDensity">android.lens.filterDensity</a> (dynamic)</li>
+ <li><a href="#dynamic_android.lens.opticalStabilizationMode">android.lens.opticalStabilizationMode</a> (dynamic)</li>
+ </ul>
+ </li> <!-- tag_V1 -->
+ <li id="tag_ADV">ADV - None
+ <ul class="tags_entries">
+ <li><a href="#static_android.flash.colorTemperature">android.flash.colorTemperature</a> (static)</li>
+ <li><a href="#static_android.flash.maxEnergy">android.flash.maxEnergy</a> (static)</li>
+ <li><a href="#controls_android.geometric.strength">android.geometric.strength</a> (controls)</li>
+ <li><a href="#static_android.hotPixel.info.map">android.hotPixel.info.map</a> (static)</li>
+ <li><a href="#static_android.lens.opticalAxisAngle">android.lens.opticalAxisAngle</a> (static)</li>
+ <li><a href="#controls_android.shading.strength">android.shading.strength</a> (controls)</li>
+ </ul>
+ </li> <!-- tag_ADV -->
+ <li id="tag_DNG">DNG -
+ Needed for DNG file support
+
+ <ul class="tags_entries">
+ <li><a href="#static_android.lens.info.geometricCorrectionMap">android.lens.info.geometricCorrectionMap</a> (static)</li>
+ <li><a href="#static_android.lens.info.shadingMap">android.lens.info.shadingMap</a> (static)</li>
+ <li><a href="#static_android.sensor.info.activeArraySize">android.sensor.info.activeArraySize</a> (static)</li>
+ <li><a href="#static_android.sensor.info.colorFilterArrangement">android.sensor.info.colorFilterArrangement</a> (static)</li>
+ <li><a href="#static_android.sensor.info.pixelArraySize">android.sensor.info.pixelArraySize</a> (static)</li>
+ <li><a href="#static_android.sensor.info.whiteLevel">android.sensor.info.whiteLevel</a> (static)</li>
+ <li><a href="#static_android.sensor.blackLevelPattern">android.sensor.blackLevelPattern</a> (static)</li>
+ <li><a href="#static_android.sensor.calibrationTransform1">android.sensor.calibrationTransform1</a> (static)</li>
+ <li><a href="#static_android.sensor.calibrationTransform2">android.sensor.calibrationTransform2</a> (static)</li>
+ <li><a href="#static_android.sensor.colorTransform1">android.sensor.colorTransform1</a> (static)</li>
+ <li><a href="#static_android.sensor.colorTransform2">android.sensor.colorTransform2</a> (static)</li>
+ <li><a href="#static_android.sensor.forwardMatrix1">android.sensor.forwardMatrix1</a> (static)</li>
+ <li><a href="#static_android.sensor.forwardMatrix2">android.sensor.forwardMatrix2</a> (static)</li>
+ <li><a href="#static_android.sensor.referenceIlluminant1">android.sensor.referenceIlluminant1</a> (static)</li>
+ <li><a href="#controls_android.tonemap.curveRed">android.tonemap.curveRed</a> (controls)</li>
+ </ul>
+ </li> <!-- tag_DNG -->
+ <li id="tag_EXIF">EXIF - None
+ <ul class="tags_entries">
+ <li><a href="#static_android.sensor.referenceIlluminant1">android.sensor.referenceIlluminant1</a> (static)</li>
+ </ul>
+ </li> <!-- tag_EXIF -->
+ </ul>
+ </div>
+
+ [ <a href="#">top</a> ]
+
+</body>
+</html>
diff --git a/camera/docs/html.mako b/camera/docs/html.mako
index c29859e..0baf181 100644
--- a/camera/docs/html.mako
+++ b/camera/docs/html.mako
@@ -42,6 +42,7 @@
/* Entry type flair */
.entry_type_name { color: darkgreen; font-weight: bold; }
+ .entry_type_name_enum:after { color: darkgreen; font-weight: bold; content:" (enum)" }
.entry_type_enum_name { font-family: monospace; font-weight: bolder; }
.entry_type_enum_notes:before { content:" - " }
.entry_type_enum_value:before { content:" = " }
@@ -136,7 +137,7 @@
<tr class="description"><td>${section.description}</td></tr>
% endif
- % for kind in section.kinds: # dynamic,static,controls
+ % for kind in section.merged_kinds: # dynamic,static,controls
<tr><td colspan="7" class="kind">${kind.name}</td></tr>
<thead>
@@ -184,7 +185,11 @@
<tr class="entry" id="${prop.kind}_${prop.name}">
<td class="entry_name">${prop.name | wbr}</td>
<td class="entry_type">
- <span class="entry_type_name">${prop.type}</span>
+ % if prop.enum:
+ <span class="entry_type_name entry_type_name_enum">${prop.type}</span>
+ % else:
+ <span class="entry_type_name">${prop.type}</span>
+ % endif
% if prop.container is not None:
<span class="entry_type_container">x</span>
% endif
@@ -205,7 +210,7 @@
<div class="entry_type_notes">${prop.type_notes | wbr}</div>
% endif
- % if prop.type == 'enum':
+ % if prop.enum:
<ul class="entry_type_enum">
% for value in prop.enum.values:
<li>
@@ -251,7 +256,7 @@
</td>
<td class="entry_tags">
- % if list(prop.tags):
+ % if next(prop.tags, None):
<ul class="entry_tags">
% for tag in prop.tags:
<li><a href="#tag_${tag.id}">${tag.id}</a></li>
diff --git a/camera/docs/metadata-check-dependencies b/camera/docs/metadata-check-dependencies
new file mode 100755
index 0000000..d4f768a
--- /dev/null
+++ b/camera/docs/metadata-check-dependencies
@@ -0,0 +1,114 @@
+#!/bin/bash
+
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+packager=""
+retcode=0
+if [[ "$OSTYPE" == "darwin"* ]]
+then
+ packager="macports"
+
+ if ! which port >& /dev/null
+ then
+ echo "Missing port binary, please install from http://www.macports.org/" >& 2
+ fi
+elif [[ "$OSTYPE" == "linux-gnu" ]] && which apt-get >& /dev/null
+then
+ packager="apt-get"
+fi
+
+function packager_install
+{
+ if [[ $packager == "macports" ]]
+ then
+ echo "sudo port install $1"
+ elif [[ $packager == "apt-get" ]]
+ then
+ echo "sudo apt-get install $1"
+ else
+ echo "<your package manager> install $1"
+ fi
+}
+
+function binary_check()
+{
+ local bin=$1
+ local macports=$2
+ local aptget=$3
+
+ local pkg=""
+
+ if type -f "$bin" >& /dev/null
+ then
+ return 0
+ fi
+
+ if [[ $packager == "macports" ]]
+ then
+ pkg="$macports"
+ elif [[ $packager == "apt-get" ]]
+ then
+ pkg="$aptget"
+ fi
+
+ if [[ -n $pkg ]]
+ then
+ echo "Missing $bin binary please install with '$(packager_install $pkg)'"
+ fi
+
+ retcode=1
+ return 1
+}
+
+function python_check()
+{
+ local mod=$1
+ local macports=$2
+ local aptget=$3
+
+ local pkg=""
+
+ if python -c "import $mod" >& /dev/null
+ then
+ return 0
+ fi
+
+ if [[ $packager == "macports" ]]
+ then
+ pkg="$macports"
+ elif [[ $packager == "apt-get" ]]
+ then
+ pkg="$aptget"
+ fi
+
+ if [[ -n $pkg ]]
+ then
+ echo "Missing python module $mod, please install with '$(packager_install $pkg)'"
+ fi
+
+ retcode=1
+ return 1
+}
+
+binary_check xmllint libxml2 libxml2-utils
+binary_check tidy tidy tidy
+binary_check python python27 python2.7
+python_check bs4 py27-beautifulsoup4 python-bs4
+python_check mako py27-mako python-mako
+
+exit $retcode
+
diff --git a/camera/docs/metadata-generate b/camera/docs/metadata-generate
index bf3e3ee..7869763 100755
--- a/camera/docs/metadata-generate
+++ b/camera/docs/metadata-generate
@@ -25,14 +25,29 @@
thisdir=$(dirname $(readlink -f $0))
+function relpath() {
+ python -c "import os.path; print os.path.relpath('$1', '$PWD')"
+}
+
function gen_file() {
local in=$thisdir/$1
local out=$thisdir/$2
- $thisdir/metadata_parser_xml.py $thisdir/metadata_properties.xml $in > $out
- return $?
+ python $thisdir/metadata_parser_xml.py $thisdir/metadata_properties.xml $in $out
+
+ local succ=$?
+
+ if [[ $succ -eq 0 ]]
+ then
+ echo "OK: Generated $(relpath "$out")"
+ else
+ echo "FAIL: Errors while generating $(relpath "$out")" >& 2
+ fi
+
+ return $succ
}
+$thisdir/metadata-check-dependencies || exit 1
$thisdir/metadata-parser-sanity-check || exit 1
gen_file html.mako docs.html || exit 1
gen_file camera_metadata_tag_info.mako ../src/camera_metadata_tag_info.c || exit 1
diff --git a/camera/docs/metadata-parser-sanity-check b/camera/docs/metadata-parser-sanity-check
index 940300c..520a5f2 100755
--- a/camera/docs/metadata-parser-sanity-check
+++ b/camera/docs/metadata-parser-sanity-check
@@ -21,20 +21,15 @@
# as the original parsed data.
#
-tidy=$(which tidy)
-if [[ $? -ne 0 ]]
-then
- echo "Missing tidy binary, please install with 'sudo apt-get install tidy'" 1>&2
- exit 1
-fi
-
thisdir=$(dirname $(readlink -f $0))
+$thisdir/metadata-check-dependencies || exit 1
+
tmp_out=$(mktemp)
tmp_tidy1=$(mktemp)
tmp_tidy2=$(mktemp)
-$thisdir/metadata_parser_xml.py $thisdir/metadata_properties.xml $thisdir/metadata_template.mako > $tmp_out || exit 1
+python $thisdir/metadata_parser_xml.py $thisdir/metadata_properties.xml $thisdir/metadata_template.mako $tmp_out || exit 1
tidy -indent -xml -quiet $thisdir/metadata_properties.xml > $tmp_tidy1
tidy -indent -xml -quiet $tmp_out > $tmp_tidy2
diff --git a/camera/docs/metadata-validate b/camera/docs/metadata-validate
index fe0266b..20ad9e6 100755
--- a/camera/docs/metadata-validate
+++ b/camera/docs/metadata-validate
@@ -16,12 +16,8 @@
# limitations under the License.
#
-xmllint=$(which xmllint)
-if [[ $? -ne 0 ]]
-then
- echo "Missing xmllint binary, please install with 'sudo apt-get install libxml2-utils'" 1>&2
- exit 1
-fi
+thisdir=$(dirname $(readlink -f $0))
+$thisdir/metadata-check-dependencies || exit 1
if [[ $# -lt 1 ]]
then
@@ -29,11 +25,9 @@
exit
fi
-thisdir=$(dirname $(readlink -f $0))
-
schema=$thisdir/metadata_properties.xsd
doc=$1
xmllint --noout --schema $schema $out $doc || exit 1
-$thisdir/metadata_validate.py $doc || exit 1
+python $thisdir/metadata_validate.py $doc || exit 1
diff --git a/camera/docs/metadata_helpers.py b/camera/docs/metadata_helpers.py
index 1a01dff..fd09d98 100644
--- a/camera/docs/metadata_helpers.py
+++ b/camera/docs/metadata_helpers.py
@@ -19,6 +19,7 @@
"""
import metadata_model
+from collections import OrderedDict
_context_buf = None
@@ -76,7 +77,7 @@
not isinstance(node, metadata_model.InnerNamespace):
raise TypeError("expected node to be a Section or InnerNamespace")
- d = {}
+ d = OrderedDict()
# remove the 'kinds' from the path between sec and the closest entries
# then search the immediate children of the search path
search_path = isinstance(node, metadata_model.Section) and node.kinds \
@@ -234,12 +235,9 @@
ctype_enum('int32') == 'TYPE_INT32'
ctype_enum('int64') == 'TYPE_INT64'
ctype_enum('float') == 'TYPE_FLOAT'
- ctype_enum('enum') == 'TYPE_BYTE'
Remarks:
An enum is coerced to a byte since the rest of the camera_metadata
code doesn't support enums directly yet.
"""
- if what == 'enum':
- return 'TYPE_BYTE'
return 'TYPE_%s' %(what.upper())
diff --git a/camera/docs/metadata_model.py b/camera/docs/metadata_model.py
index 1acf2b5..fa85a58 100644
--- a/camera/docs/metadata_model.py
+++ b/camera/docs/metadata_model.py
@@ -34,6 +34,8 @@
"""
import sys
+import itertools
+from collections import OrderedDict
class Node(object):
"""
@@ -152,7 +154,7 @@
@staticmethod
def _dictionary_by_name(values):
- d = {}
+ d = OrderedDict()
for i in values:
d[i.name] = i
@@ -205,6 +207,7 @@
self._entries = []
# kind => { name => entry }
self._entry_map = { 'static': {}, 'dynamic': {}, 'controls': {} }
+ self._entries_ordered = [] # list of ordered Entry/Clone instances
self._clones = []
# Public (Read Only)
@@ -265,6 +268,7 @@
e = Entry(**entry)
self._entries.append(e)
self._entry_map[e.kind][e.name] = e
+ self._entries_ordered.append(e)
def insert_clone(self, clone):
"""
@@ -285,6 +289,7 @@
c = Clone(entry, **clone)
self._entry_map[c.kind][c.name] = c
self._clones.append(c)
+ self._entries_ordered.append(c)
def prune_clones(self):
"""
@@ -311,6 +316,7 @@
# remove from global list
self._clones.remove(p)
self._entry_map[p.kind].pop(p.name)
+ self._entries_ordered.remove(p)
# After all entries/clones are inserted,
@@ -367,7 +373,7 @@
for ons_name, ons in root.iteritems():
ons._leafs = []
- for p in self._get_properties():
+ for p in self._entries_ordered:
ons_name = p.get_outer_namespace()
ons = root.get(ons_name, OuterNamespace(ons_name, self))
root[ons_name] = ons
@@ -380,7 +386,6 @@
ons.validate_tree()
self._construct_sections(ons)
- ons.sort_children()
if ons not in self._outer_namespaces:
self._outer_namespaces.append(ons)
@@ -414,7 +419,6 @@
%(sec)
self._construct_kinds(sec)
- sec.sort_children()
if sec not in outer_namespace.sections:
outer_namespace._sections.append(sec)
@@ -426,43 +430,35 @@
# 'controls', 'static' 'dynamic'. etc
def _construct_kinds(self, section):
-
- kinds_dict = self._dictionary_by_name(section.kinds)
- for name, kind in kinds_dict.iteritems():
+ for kind in section.kinds:
kind._leafs = []
section.validate_tree()
- for p in section._leafs:
- kind = kinds_dict.get(p.kind, Kind(p.kind, section))
- kinds_dict[p.kind] = kind
- section.validate_tree()
+ group_entry_by_kind = itertools.groupby(section._leafs, lambda x: x.kind)
+ leaf_it = ((k, g) for k, g in group_entry_by_kind)
- if p not in kind._leafs:
- kind._leafs.append(p)
+ # allow multiple kinds with the same name. merge if adjacent
+ # e.g. dynamic,dynamic,static,static,dynamic -> dynamic,static,dynamic
+ # this helps maintain ABI compatibility when adding an entry in a new kind
+ for idx, (kind_name, entry_it) in enumerate(leaf_it):
+ if idx >= len(section._kinds):
+ kind = Kind(kind_name, section)
+ section._kinds.append(kind)
+ section.validate_tree()
- if len(kinds_dict) > 3:
- sec = section
- if sec is not None:
- sec_name = sec.name
- else:
- sec_name = "Unknown"
+ kind = section._kinds[idx]
- print >> sys.stderr, ("ERROR: Kind '%s' has too many children(%d) " + \
- "in section '%s'") %(name, len(kc), sec_name)
+ for p in entry_it:
+ if p not in kind._leafs:
+ kind._leafs.append(p)
-
- for name, kind in kinds_dict.iteritems():
-
+ for kind in section._kinds:
kind.validate_tree()
self._construct_inner_namespaces(kind)
kind.validate_tree()
self._construct_entries(kind)
- kind.sort_children()
kind.validate_tree()
- if kind not in section.kinds:
- section._kinds.append(kind)
-
if not section.validate_tree():
print >> sys.stderr, ("ERROR: Failed to validate tree in " + \
"construct_kinds, with kind = '%s'") %(kind)
@@ -495,7 +491,6 @@
ins.validate_tree()
# construct children entries
self._construct_entries(ins, depth + 1)
- ins.sort_children()
if ins not in parent.namespaces:
parent._namespaces.append(ins)
@@ -603,6 +598,8 @@
parent: An edge to the parent, which is always an OuterNamespace instance.
description: A string description of the section, or None.
kinds: A sequence of Kind children.
+ merged_kinds: A sequence of virtual Kind children,
+ with each Kind's children merged by the kind.name
"""
def __init__(self, name, parent, description=None, kinds=[]):
self._name = name
@@ -634,6 +631,27 @@
def _get_children(self):
return (i for i in self.kinds)
+ @property
+ def merged_kinds(self):
+
+ def aggregate_by_name(acc, el):
+ existing = [i for i in acc if i.name == el.name]
+ if existing:
+ k = existing[0]
+ else:
+ k = Kind(el.name, el.parent)
+ acc.append(k)
+
+ k._namespaces.extend(el._namespaces)
+ k._entries.extend(el._entries)
+
+ return acc
+
+ new_kinds_lst = reduce(aggregate_by_name, self.kinds, [])
+
+ for k in new_kinds_lst:
+ yield k
+
class Kind(Node):
"""
A node corresponding to one of: <static>,<dynamic>,<controls> under a
@@ -719,7 +737,7 @@
for i in self.entries:
yield i
-class EnumValue(object):
+class EnumValue(Node):
"""
A class corresponding to a <value> element within an <enum> within an <entry>.
@@ -728,16 +746,14 @@
id: An optional numeric string, e.g. '0' or '0xFF'
optional: A boolean
notes: A string describing the notes, or None.
+ parent: An edge to the parent, always an Enum instance.
"""
- def __init__(self, name, id=None, optional=False, notes=None):
+ def __init__(self, name, parent, id=None, optional=False, notes=None):
self._name = name # str, e.g. 'ON' or 'OFF'
self._id = id # int, e.g. '0'
self._optional = optional # bool
self._notes = notes # None or str
-
- @property
- def name(self):
- return self._name
+ self._parent = parent
@property
def id(self):
@@ -751,7 +767,10 @@
def notes(self):
return self._notes
-class Enum(object):
+ def _get_children(self):
+ return None
+
+class Enum(Node):
"""
A class corresponding to an <enum> element within an <entry>.
@@ -761,19 +780,19 @@
"""
def __init__(self, parent, values, ids={}, optionals=[], notes={}):
self._values = \
- [ EnumValue(val, ids.get(val), val in optionals, notes.get(val)) \
+ [ EnumValue(val, self, ids.get(val), val in optionals, notes.get(val)) \
for val in values ]
self._parent = parent
-
- @property
- def parent(self):
- return self._parent
+ self._name = None
@property
def values(self):
return (i for i in self._values)
+ def _get_children(self):
+ return (i for i in self._values)
+
class Entry(Node):
"""
A node corresponding to an <entry> element.
@@ -787,7 +806,7 @@
ancestor Kind#name
container: The container attribute from <entry container="array">, or None.
container_sizes: A sequence of size strings or None if container is None.
- enum: An Enum instance if type is 'enum', None otherwise.
+ enum: An Enum instance if the enum attribute is true, None otherwise.
tuple_values: A sequence of strings describing the tuple values,
None if container is not 'tuple'.
description: A string description, or None.
@@ -819,7 +838,8 @@
Args (if container is 'tuple'):
tuple_values: A list of tuple values, e.g. ['width', 'height']
- Args (if type is 'enum'):
+ Args (if the 'enum' attribute is true):
+ enum: A boolean, True if this is an enum, False otherwise
enum_values: A list of value strings, e.g. ['ON', 'OFF']
enum_optionals: A list of optional enum values, e.g. ['OFF']
enum_notes: A dictionary of value->notes strings.
@@ -909,7 +929,8 @@
return self._enum
def _get_children(self):
- return None
+ if self.enum:
+ yield self.enum
def sort_children(self):
return None
@@ -947,7 +968,7 @@
self._type_notes = kwargs.get('type_notes')
- if self._type == 'enum':
+ if kwargs.get('enum', False):
self._enum = Enum(self, enum_values, enum_ids, enum_optionals, enum_notes)
else:
self._enum = None
@@ -1065,7 +1086,8 @@
Args (if container is 'tuple'):
tuple_values: A list of tuple values, e.g. ['width', 'height']
- Args (if type is 'enum'):
+ Args (if the 'enum' attribute is true):
+ enum: A boolean, True if this is an enum, False otherwise
enum_values: A list of value strings, e.g. ['ON', 'OFF']
enum_optionals: A list of optional enum values, e.g. ['OFF']
enum_notes: A dictionary of value->notes strings.
@@ -1132,22 +1154,22 @@
props_distinct = ['description', 'units', 'range', 'notes', 'tags', 'kind']
for p in props_distinct:
+ p = '_' + p
if entry.is_clone():
- setattr(self, '_' + p, getattr(entry, p) or getattr(entry.entry, p))
+ setattr(self, p, getattr(entry, p) or getattr(entry.entry, p))
else:
- setattr(self, '_' + p, getattr(entry, p))
+ setattr(self, p, getattr(entry, p))
- props_common = ['parent', 'name', 'name_short', 'container',
+ props_common = ['parent', 'name', 'container',
'container_sizes', 'enum',
'tuple_values',
'type',
'type_notes',
- 'enum'
]
for p in props_common:
+ p = '_' + p
if entry.is_clone():
- setattr(self, '_' + p, getattr(entry.entry, p))
+ setattr(self, p, getattr(entry.entry, p))
else:
- setattr(self, '_' + p, getattr(entry, p))
-
+ setattr(self, p, getattr(entry, p))
diff --git a/camera/docs/metadata_parser_xml.py b/camera/docs/metadata_parser_xml.py
index a9ee25f..7b55273 100755
--- a/camera/docs/metadata_parser_xml.py
+++ b/camera/docs/metadata_parser_xml.py
@@ -21,8 +21,8 @@
over a Mako template.
Usage:
- metadata_parser_xml.py <filename.xml> <template.mako>
- - outputs the resulting template to stdout
+ metadata_parser_xml.py <filename.xml> <template.mako> [<output_file>]
+ - outputs the resulting template to output_file (stdout if none specified)
Module:
The parser is also available as a module import (MetadataParserXml) to use
@@ -107,34 +107,36 @@
for tag in tags.find_all('tag'):
self.metadata.insert_tag(tag['id'], tag.string)
- for entry in self.soup.find_all("entry"):
- d = {
- 'name': fully_qualified_name(entry),
- 'type': entry['type'],
- 'kind': find_kind(entry),
- 'type_notes': entry.attrs.get('type_notes')
- }
+ # add all entries, preserving the ordering of the XML file
+ # this is important for future ABI compatibility when generating code
+ entry_filter = lambda x: x.name == 'entry' or x.name == 'clone'
+ for entry in self.soup.find_all(entry_filter):
+ if entry.name == 'entry':
+ d = {
+ 'name': fully_qualified_name(entry),
+ 'type': entry['type'],
+ 'kind': find_kind(entry),
+ 'type_notes': entry.attrs.get('type_notes')
+ }
- d2 = self._parse_entry(entry)
+ d2 = self._parse_entry(entry)
+ insert = self.metadata.insert_entry
+ else:
+ d = {
+ 'name': entry['entry'],
+ 'kind': find_kind(entry),
+ 'target_kind': entry['kind'],
+ # no type since its the same
+ # no type_notes since its the same
+ }
+ d2 = {}
+
+ insert = self.metadata.insert_clone
+
d3 = self._parse_entry_optional(entry)
entry_dict = dict(d.items() + d2.items() + d3.items())
- self.metadata.insert_entry(entry_dict)
-
- entry = None
-
- for clone in self.soup.find_all("clone"):
- d = {
- 'name': clone['entry'],
- 'kind': find_kind(clone),
- 'target_kind': clone['kind'],
- # no type since its the same
- # no type_notes since its the same
- }
-
- d2 = self._parse_entry_optional(clone)
- clone_dict = dict(d.items() + d2.items())
- self.metadata.insert_clone(clone_dict)
+ insert(entry_dict)
self.metadata.construct_graph()
@@ -144,7 +146,7 @@
#
# Enum
#
- if entry['type'] == 'enum':
+ if entry.get('enum', 'false') == 'true':
enum_values = []
enum_optionals = []
@@ -169,6 +171,7 @@
d['enum_optionals'] = enum_optionals
d['enum_notes'] = enum_notes
d['enum_ids'] = enum_ids
+ d['enum'] = True
#
# Container (Array/Tuple)
@@ -250,14 +253,16 @@
#####################
if __name__ == "__main__":
- if len(sys.argv) <= 1:
- print >> sys.stderr, "Usage: %s <filename.xml> <template.mako>" \
- % (sys.argv[0])
+ if len(sys.argv) <= 2:
+ print >> sys.stderr, \
+ "Usage: %s <filename.xml> <template.mako> [<output_file>]" \
+ % (sys.argv[0])
sys.exit(0)
file_name = sys.argv[1]
template_name = sys.argv[2]
+ output_name = sys.argv[3] if len(sys.argv) > 3 else None
parser = MetadataParserXml(file_name)
- parser.render(template_name)
+ parser.render(template_name, output_name)
sys.exit(0)
diff --git a/camera/docs/metadata_properties.xml b/camera/docs/metadata_properties.xml
index 3bca091..d0a1d33 100644
--- a/camera/docs/metadata_properties.xml
+++ b/camera/docs/metadata_properties.xml
@@ -40,7 +40,7 @@
<namespace name="android">
<section name="colorCorrection">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>TRANSFORM_MATRIX
<notes>Use the android.colorCorrection.transform matrix
@@ -82,7 +82,7 @@
</section>
<section name="control">
<controls>
- <entry name="aeAntibandingMode" type="enum">
+ <entry name="aeAntibandingMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value>50HZ</value>
@@ -103,15 +103,15 @@
compensation of -1</notes>
<tag id="BC" />
</entry>
- <entry name="aeLock" type="enum">
+ <entry name="aeLock" type="byte" enum="true">
<enum>
+ <value>OFF
+ <notes>Autoexposure lock is disabled; the AE algorithm
+ is free to update its parameters.</notes></value>
<value>ON
<notes>Autoexposure lock is enabled; the AE algorithm
must not update the exposure and sensitivity parameters
while the lock is active</notes></value>
- <value>OFF
- <notes>Autoexposure lock is disabled; the AE algorithm
- is free to update its parameters.</notes></value>
</enum>
<description>Whether AE is currently locked to its latest
calculated values</description>
@@ -120,7 +120,7 @@
ON_AUTO_FLASH_REDEYE.</notes>
<tag id="BC" />
</entry>
- <entry name="aeMode" type="enum">
+ <entry name="aeMode" type="byte" enum="true">
<enum>
<value>OFF
<notes>Autoexposure is disabled; sensor.exposureTime
@@ -187,7 +187,7 @@
of android.sensor.exposureTime</notes>
<tag id="BC" />
</entry>
- <entry name="afMode" type="enum">
+ <entry name="afMode" type="byte" enum="true">
<enum>
<value>OFF
<notes>The 3A routines do not control the lens;
@@ -277,16 +277,16 @@
in the frame metadata</notes>
<tag id="BC" />
</entry>
- <entry name="awbLock" type="enum">
+ <entry name="awbLock" type="byte" enum="true">
<enum>
- <value>ON
- <notes>Auto-whitebalance lock is enabled; the AWB
- algorithm must not update the exposure and sensitivity
- parameters while the lock is active</notes></value>
<value>OFF
<notes>Auto-whitebalance lock is disabled; the AWB
algorithm is free to update its parameters if in AUTO
mode.</notes></value>
+ <value>ON
+ <notes>Auto-whitebalance lock is enabled; the AWB
+ algorithm must not update the exposure and sensitivity
+ parameters while the lock is active</notes></value>
</enum>
<description>Whether AWB is currently locked to its
latest calculated values</description>
@@ -295,7 +295,7 @@
setting</notes>
<tag id="BC" />
</entry>
- <entry name="awbMode" type="enum">
+ <entry name="awbMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value>AUTO</value>
@@ -336,7 +336,7 @@
in the frame metadata</notes>
<tag id="BC" />
</entry>
- <entry name="captureIntent" type="enum">
+ <entry name="captureIntent" type="byte" enum="true">
<enum>
<value>CUSTOM
<notes>This request doesn't fall into the other
@@ -368,7 +368,7 @@
<notes>Only used if android.control.mode != OFF.</notes>
<tag id="BC" />
</entry>
- <entry name="effectMode" type="enum">
+ <entry name="effectMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value optional="true">MONO</value>
@@ -385,7 +385,7 @@
<range>android.control.availableEffects</range>
<tag id="BC" />
</entry>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>Full application control of pipeline. All 3A
@@ -410,7 +410,7 @@
<range>all must be supported</range>
<tag id="BC" />
</entry>
- <entry name="sceneMode" type="enum">
+ <entry name="sceneMode" type="byte" enum="true">
<enum>
<value id="0">UNSUPPORTED</value>
<value>FACE_PRIORITY
@@ -443,7 +443,7 @@
<range>android.control.availableSceneModes</range>
<tag id="BC" />
</entry>
- <entry name="videoStabilizationMode" type="enum">
+ <entry name="videoStabilizationMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value>ON</value>
@@ -601,7 +601,7 @@
</entry>
<clone entry="android.control.aeRegions" kind="controls">
</clone>
- <entry name="aeState" type="enum">
+ <entry name="aeState" type="byte" enum="true">
<enum>
<value>INACTIVE
<notes>AE is off</notes></value>
@@ -635,7 +635,7 @@
</clone>
<clone entry="android.control.afRegions" kind="controls">
</clone>
- <entry name="afState" type="enum">
+ <entry name="afState" type="byte" enum="true">
<enum>
<value>INACTIVE
<notes>AF off or has not yet tried to scan/been asked
@@ -677,7 +677,7 @@
</clone>
<clone entry="android.control.awbRegions" kind="controls">
</clone>
- <entry name="awbState" type="enum">
+ <entry name="awbState" type="byte" enum="true">
<enum>
<value>INACTIVE
<notes>AWB is not in auto mode</notes></value>
@@ -702,7 +702,7 @@
</section>
<section name="demosaic">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>FAST
<notes>Minimal or no slowdown of frame rate compared to
@@ -719,7 +719,7 @@
</section>
<section name="edge">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>No edge enhancement is applied</notes></value>
@@ -763,7 +763,7 @@
duration).</notes>
<tag id="V1" />
</entry>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>Do not fire the flash for this
@@ -822,7 +822,7 @@
<clone entry="android.flash.firingTime" kind="controls">
</clone>
<clone entry="android.flash.mode" kind="controls"></clone>
- <entry name="state" type="enum">
+ <entry name="state" type="byte" enum="true">
<enum>
<value>UNAVAILABLE
<notes>No flash on camera</notes></value>
@@ -843,7 +843,7 @@
</section>
<section name="geometric">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>No geometric correction is
@@ -869,7 +869,7 @@
</section>
<section name="hotPixel">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>No hot pixel correction can be
@@ -1050,7 +1050,7 @@
<tag id="BC" />
<tag id="V1" />
</entry>
- <entry name="opticalStabilizationMode" type="enum">
+ <entry name="opticalStabilizationMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value optional="true">ON</value>
@@ -1192,7 +1192,7 @@
<tag id="V1" />
</entry>
</namespace>
- <entry name="facing" type="enum">
+ <entry name="facing" type="byte" enum="true">
<enum>
<value>FRONT</value>
<value>BACK</value>
@@ -1256,7 +1256,7 @@
kind="controls">
<tag id="V1" />
</clone>
- <entry name="state" type="enum">
+ <entry name="state" type="byte" enum="true">
<enum>
<value>STATIONARY</value>
</enum>
@@ -1267,7 +1267,7 @@
</section>
<section name="noiseReduction">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>No noise reduction is applied</notes></value>
@@ -1362,7 +1362,7 @@
<notes>Only meaningful when android.request.type ==
REPROCESS. Ignored otherwise</notes>
</entry>
- <entry name="metadataMode" type="enum">
+ <entry name="metadataMode" type="byte" enum="true">
<enum>
<value>NONE
<notes>No metadata should be produced on output, except
@@ -1392,7 +1392,7 @@
still be captured for metadata and statistics production,
and the lens and flash must operate as requested.</notes>
</entry>
- <entry name="type" type="enum">
+ <entry name="type" type="byte" enum="true">
<enum>
<value>CAPTURE
<notes>Capture a new image from the imaging hardware,
@@ -1473,7 +1473,7 @@
</entry>
</controls>
<static>
- <entry name="availableFormats" type="enum"
+ <entry name="availableFormats" type="int32" enum="true"
type_notes="values from HAL_PIXEL_FORMAT_* in /system/core/include/system/graphics.h"
container="array">
<array>
@@ -1652,7 +1652,7 @@
<tag id="BC" />
<tag id="V1" />
</entry>
- <entry name="colorFilterArrangement" type="enum">
+ <entry name="colorFilterArrangement" type="byte" enum="true">
<enum>
<value>RGGB</value>
<value>GRBG</value>
@@ -1844,7 +1844,7 @@
<range>0,90,180,270</range>
<tag id="BC" />
</entry>
- <entry name="referenceIlluminant1" type="enum">
+ <entry name="referenceIlluminant1" type="byte" enum="true">
<enum>
<value id="1">DAYLIGHT</value>
<value id="2">FLUORESCENT</value>
@@ -1904,7 +1904,7 @@
</section>
<section name="shading">
<controls>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>OFF
<notes>No shading correction is applied</notes></value>
@@ -1933,7 +1933,7 @@
</section>
<section name="statistics">
<controls>
- <entry name="faceDetectMode" type="enum">
+ <entry name="faceDetectMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value>SIMPLE
@@ -1949,7 +1949,7 @@
android.statistics.availableFaceDetectModes</range>
<tag id="BC" />
</entry>
- <entry name="histogramMode" type="enum">
+ <entry name="histogramMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value>ON</value>
@@ -1958,7 +1958,7 @@
generation</description>
<tag id="V1" />
</entry>
- <entry name="sharpnessMapMode" type="enum">
+ <entry name="sharpnessMapMode" type="byte" enum="true">
<enum>
<value>OFF</value>
<value>ON</value>
@@ -2092,13 +2092,13 @@
</section>
<section name="tonemap">
<controls>
- <entry name="curveBlue" type="byte">
+ <entry name="curveBlue" type="float">
<description>Table mapping blue input values to output
values</description>
<units>same as android.tonemap.curveRed</units>
<range>same as android.tonemap.curveRed</range>
</entry>
- <entry name="curveGreen" type="byte">
+ <entry name="curveGreen" type="float">
<description>Table mapping green input values to output
values</description>
<units>same as android.tonemap.curveRed</units>
@@ -2123,7 +2123,7 @@
0.25, 0.3 -> 0.5, 0.5 -> 0.64</notes>
<tag id="DNG" />
</entry>
- <entry name="mode" type="enum">
+ <entry name="mode" type="byte" enum="true">
<enum>
<value>CONTRAST_CURVE
<notes>Use the tone mapping curve specified in
diff --git a/camera/docs/metadata_properties.xsd b/camera/docs/metadata_properties.xsd
index 8159e45..259aebf 100644
--- a/camera/docs/metadata_properties.xsd
+++ b/camera/docs/metadata_properties.xsd
@@ -37,11 +37,13 @@
</complexType>
<complexType name="SectionType">
- <all>
- <element name="controls" type="tns:SectionKindType" maxOccurs="1" minOccurs="0"></element>
- <element name="static" type="tns:SectionKindType" maxOccurs="1" minOccurs="0"></element>
- <element name="dynamic" type="tns:SectionKindType" maxOccurs="1" minOccurs="0"></element>
- </all>
+ <sequence>
+ <choice maxOccurs="unbounded">
+ <element name="controls" type="tns:SectionKindType" maxOccurs="unbounded" minOccurs="0"></element>
+ <element name="static" type="tns:SectionKindType" maxOccurs="unbounded" minOccurs="0"></element>
+ <element name="dynamic" type="tns:SectionKindType" maxOccurs="unbounded" minOccurs="0"></element>
+ </choice>
+ </sequence>
<attribute name="name" type="string" use="required"></attribute>
</complexType>
@@ -124,7 +126,6 @@
<enumeration value="float" />
<enumeration value="double" />
<enumeration value="rational" />
- <enumeration value="enum" />
</restriction>
</simpleType>
</attribute>
@@ -137,6 +138,14 @@
</restriction>
</simpleType>
</attribute>
+ <attribute name="enum">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="true"></enumeration>
+ <enumeration value="false"></enumeration>
+ </restriction>
+ </simpleType>
+ </attribute>
</complexType>
<complexType name="EnumType">
diff --git a/camera/docs/metadata_template.mako b/camera/docs/metadata_template.mako
index 84ac43d..253db61 100644
--- a/camera/docs/metadata_template.mako
+++ b/camera/docs/metadata_template.mako
@@ -72,6 +72,9 @@
</clone>
% else:
<entry name="${prop.name_short}" type="${prop.type}"
+ % if prop.enum:
+ enum="true"
+ % endif
% if prop.type_notes is not None:
type_notes="${prop.type_notes}"
% endif
@@ -93,7 +96,7 @@
% endfor
</tuple>
% endif
- % if prop.type == 'enum':
+ % if prop.enum:
<enum>
% for value in prop.enum.values:
<value
diff --git a/camera/docs/metadata_validate.py b/camera/docs/metadata_validate.py
index 6c9c408..0dc4ae9 100755
--- a/camera/docs/metadata_validate.py
+++ b/camera/docs/metadata_validate.py
@@ -236,15 +236,15 @@
%(fully_qualified_name(entry), find_kind(entry), \
entry_container, entry_container))
- typ = entry.attrs.get('type')
- if typ == 'enum':
+ enum = entry.attrs.get('enum')
+ if enum and enum == 'true':
if entry.enum is None:
validate_error(("Entry '%s' in kind '%s' is missing enum") \
% (fully_qualified_name(entry), find_kind(entry),
))
+ success = False
- if typ == 'enum' and entry.enum is not None:
-
+ else:
for value in entry.enum.find_all('value'):
value_id = value.attrs.get('id')
@@ -256,6 +256,12 @@
" numeric.") \
%(fully_qualified_name(entry), value_id))
success = False
+ else:
+ if entry.enum:
+ validate_error(("Entry '%s' kind '%s' has enum el, but no enum attr") \
+ % (fully_qualified_name(entry), find_kind(entry),
+ ))
+ success = False
return success
diff --git a/camera/include/system/camera_metadata_tags.h b/camera/include/system/camera_metadata_tags.h
index 796e571..8d20ae8 100644
--- a/camera/include/system/camera_metadata_tags.h
+++ b/camera/include/system/camera_metadata_tags.h
@@ -20,6 +20,12 @@
* Include camera_metadata.h instead.
*/
+/**
+ * ! Do not edit this file directly !
+ *
+ * Generated automatically from camera_metadata_tags.mako
+ */
+
/** TODO: Nearly every enum in this file needs a description */
/**
@@ -28,83 +34,63 @@
* New sections must be added right before ANDROID_SECTION_COUNT to maintain
* existing enumerations.
*/
-enum {
- ANDROID_REQUEST = 0,
- ANDROID_LENS,
- ANDROID_LENS_INFO,
- ANDROID_SENSOR,
- ANDROID_SENSOR_INFO,
+typedef enum camera_metadata_section {
+ ANDROID_COLOR_CORRECTION,
+ ANDROID_CONTROL,
+ ANDROID_DEMOSAIC,
+ ANDROID_EDGE,
ANDROID_FLASH,
ANDROID_FLASH_INFO,
+ ANDROID_GEOMETRIC,
ANDROID_HOT_PIXEL,
ANDROID_HOT_PIXEL_INFO,
- ANDROID_DEMOSAIC,
- ANDROID_DEMOSAIC_INFO,
- ANDROID_NOISE,
- ANDROID_NOISE_INFO,
- ANDROID_SHADING,
- ANDROID_SHADING_INFO,
- ANDROID_GEOMETRIC,
- ANDROID_GEOMETRIC_INFO,
- ANDROID_COLOR,
- ANDROID_COLOR_INFO,
- ANDROID_TONEMAP,
- ANDROID_TONEMAP_INFO,
- ANDROID_EDGE,
- ANDROID_EDGE_INFO,
- ANDROID_SCALER,
- ANDROID_SCALER_INFO,
ANDROID_JPEG,
- ANDROID_JPEG_INFO,
- ANDROID_STATS,
- ANDROID_STATS_INFO,
- ANDROID_CONTROL,
- ANDROID_CONTROL_INFO,
- ANDROID_QUIRKS_INFO,
+ ANDROID_LENS,
+ ANDROID_LENS_INFO,
+ ANDROID_NOISE_REDUCTION,
+ ANDROID_QUIRKS,
+ ANDROID_REQUEST,
+ ANDROID_SCALER,
+ ANDROID_SENSOR,
+ ANDROID_SENSOR_INFO,
+ ANDROID_SHADING,
+ ANDROID_STATISTICS,
+ ANDROID_STATISTICS_INFO,
+ ANDROID_TONEMAP,
ANDROID_SECTION_COUNT,
VENDOR_SECTION = 0x8000
-};
+} camera_metadata_section_t;
/**
* Hierarchy positions in enum space. All vendor extension tags must be
* defined with tag >= VENDOR_SECTION_START
*/
-enum {
- ANDROID_REQUEST_START = ANDROID_REQUEST << 16,
- ANDROID_LENS_START = ANDROID_LENS << 16,
- ANDROID_LENS_INFO_START = ANDROID_LENS_INFO << 16,
- ANDROID_SENSOR_START = ANDROID_SENSOR << 16,
- ANDROID_SENSOR_INFO_START = ANDROID_SENSOR_INFO << 16,
- ANDROID_FLASH_START = ANDROID_FLASH << 16,
- ANDROID_FLASH_INFO_START = ANDROID_FLASH_INFO << 16,
- ANDROID_HOT_PIXEL_START = ANDROID_HOT_PIXEL << 16,
- ANDROID_HOT_PIXEL_INFO_START = ANDROID_HOT_PIXEL_INFO << 16,
- ANDROID_DEMOSAIC_START = ANDROID_DEMOSAIC << 16,
- ANDROID_DEMOSAIC_INFO_START = ANDROID_DEMOSAIC_INFO << 16,
- ANDROID_NOISE_START = ANDROID_NOISE << 16,
- ANDROID_NOISE_INFO_START = ANDROID_NOISE_INFO << 16,
- ANDROID_SHADING_START = ANDROID_SHADING << 16,
- ANDROID_SHADING_INFO_START = ANDROID_SHADING_INFO << 16,
- ANDROID_GEOMETRIC_START = ANDROID_GEOMETRIC << 16,
- ANDROID_GEOMETRIC_INFO_START = ANDROID_GEOMETRIC_INFO << 16,
- ANDROID_COLOR_START = ANDROID_COLOR << 16,
- ANDROID_COLOR_INFO_START = ANDROID_COLOR_INFO << 16,
- ANDROID_TONEMAP_START = ANDROID_TONEMAP << 16,
- ANDROID_TONEMAP_INFO_START = ANDROID_TONEMAP_INFO << 16,
- ANDROID_EDGE_START = ANDROID_EDGE << 16,
- ANDROID_EDGE_INFO_START = ANDROID_EDGE_INFO << 16,
- ANDROID_SCALER_START = ANDROID_SCALER << 16,
- ANDROID_SCALER_INFO_START = ANDROID_SCALER_INFO << 16,
- ANDROID_JPEG_START = ANDROID_JPEG << 16,
- ANDROID_JPEG_INFO_START = ANDROID_JPEG_INFO << 16,
- ANDROID_STATS_START = ANDROID_STATS << 16,
- ANDROID_STATS_INFO_START = ANDROID_STATS_INFO << 16,
- ANDROID_CONTROL_START = ANDROID_CONTROL << 16,
- ANDROID_CONTROL_INFO_START = ANDROID_CONTROL_INFO << 16,
- ANDROID_QUIRKS_INFO_START = ANDROID_QUIRKS_INFO << 16,
- VENDOR_SECTION_START = VENDOR_SECTION << 16
-};
+typedef enum camera_metadata_section_start {
+ ANDROID_COLOR_CORRECTION_START = ANDROID_COLOR_CORRECTION << 16,
+ ANDROID_CONTROL_START = ANDROID_CONTROL << 16,
+ ANDROID_DEMOSAIC_START = ANDROID_DEMOSAIC << 16,
+ ANDROID_EDGE_START = ANDROID_EDGE << 16,
+ ANDROID_FLASH_START = ANDROID_FLASH << 16,
+ ANDROID_FLASH_INFO_START = ANDROID_FLASH_INFO << 16,
+ ANDROID_GEOMETRIC_START = ANDROID_GEOMETRIC << 16,
+ ANDROID_HOT_PIXEL_START = ANDROID_HOT_PIXEL << 16,
+ ANDROID_HOT_PIXEL_INFO_START = ANDROID_HOT_PIXEL_INFO << 16,
+ ANDROID_JPEG_START = ANDROID_JPEG << 16,
+ ANDROID_LENS_START = ANDROID_LENS << 16,
+ ANDROID_LENS_INFO_START = ANDROID_LENS_INFO << 16,
+ ANDROID_NOISE_REDUCTION_START = ANDROID_NOISE_REDUCTION << 16,
+ ANDROID_QUIRKS_START = ANDROID_QUIRKS << 16,
+ ANDROID_REQUEST_START = ANDROID_REQUEST << 16,
+ ANDROID_SCALER_START = ANDROID_SCALER << 16,
+ ANDROID_SENSOR_START = ANDROID_SENSOR << 16,
+ ANDROID_SENSOR_INFO_START = ANDROID_SENSOR_INFO << 16,
+ ANDROID_SHADING_START = ANDROID_SHADING << 16,
+ ANDROID_STATISTICS_START = ANDROID_STATISTICS << 16,
+ ANDROID_STATISTICS_INFO_START = ANDROID_STATISTICS_INFO << 16,
+ ANDROID_TONEMAP_START = ANDROID_TONEMAP << 16,
+ VENDOR_SECTION_START = VENDOR_SECTION << 16
+} camera_metadata_section_start_t;
/**
* Main enum for defining camera metadata tags. New entries must always go
@@ -112,318 +98,306 @@
* addition, the name and type of the tag needs to be added to
* system/media/camera/src/camera_metadata_tag_info.c
*/
-enum {
- ANDROID_REQUEST_ID = ANDROID_REQUEST_START,
- ANDROID_REQUEST_TYPE,
- ANDROID_REQUEST_METADATA_MODE,
- ANDROID_REQUEST_OUTPUT_STREAMS,
- ANDROID_REQUEST_INPUT_STREAMS,
- ANDROID_REQUEST_FRAME_COUNT,
- ANDROID_REQUEST_END,
+typedef enum camera_metadata_tag {
+ ANDROID_COLOR_CORRECTION_MODE = ANDROID_COLOR_CORRECTION_START,
+ ANDROID_COLOR_CORRECTION_TRANSFORM,
+ ANDROID_COLOR_CORRECTION_END,
- ANDROID_LENS_FOCUS_DISTANCE = ANDROID_LENS_START,
- ANDROID_LENS_APERTURE,
- ANDROID_LENS_FOCAL_LENGTH,
- ANDROID_LENS_FILTER_DENSITY,
- ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
- ANDROID_LENS_FOCUS_RANGE,
- ANDROID_LENS_END,
+ ANDROID_CONTROL_AE_ANTIBANDING_MODE
+ = ANDROID_CONTROL_START,
+ ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
+ ANDROID_CONTROL_AE_LOCK,
+ ANDROID_CONTROL_AE_MODE,
+ ANDROID_CONTROL_AE_REGIONS,
+ ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
+ ANDROID_CONTROL_AF_MODE,
+ ANDROID_CONTROL_AF_REGIONS,
+ ANDROID_CONTROL_AWB_LOCK,
+ ANDROID_CONTROL_AWB_MODE,
+ ANDROID_CONTROL_AWB_REGIONS,
+ ANDROID_CONTROL_CAPTURE_INTENT,
+ ANDROID_CONTROL_EFFECT_MODE,
+ ANDROID_CONTROL_MODE,
+ ANDROID_CONTROL_SCENE_MODE,
+ ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
+ ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
+ ANDROID_CONTROL_AE_AVAILABLE_MODES,
+ ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
+ ANDROID_CONTROL_AE_COMPENSATION_RANGE,
+ ANDROID_CONTROL_AE_COMPENSATION_STEP,
+ ANDROID_CONTROL_AF_AVAILABLE_MODES,
+ ANDROID_CONTROL_AVAILABLE_EFFECTS,
+ ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
+ ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
+ ANDROID_CONTROL_AWB_AVAILABLE_MODES,
+ ANDROID_CONTROL_MAX_REGIONS,
+ ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
+ ANDROID_CONTROL_AE_PRECAPTURE_ID,
+ ANDROID_CONTROL_AE_STATE,
+ ANDROID_CONTROL_AF_STATE,
+ ANDROID_CONTROL_AF_TRIGGER_ID,
+ ANDROID_CONTROL_AWB_STATE,
+ ANDROID_CONTROL_END,
- ANDROID_LENS_MINIMUM_FOCUS_DISTANCE = ANDROID_LENS_INFO_START,
- ANDROID_LENS_HYPERFOCAL_DISTANCE,
- ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
- ANDROID_LENS_AVAILABLE_APERTURES,
- ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
- ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
- ANDROID_LENS_SHADING_MAP_SIZE,
- ANDROID_LENS_SHADING_MAP,
- ANDROID_LENS_GEOMETRIC_CORRECTION_MAP_SIZE,
- ANDROID_LENS_GEOMETRIC_CORRECTION_MAP,
- ANDROID_LENS_FACING,
- ANDROID_LENS_POSITION,
- ANDROID_LENS_INFO_END,
-
- ANDROID_SENSOR_EXPOSURE_TIME = ANDROID_SENSOR_START,
- ANDROID_SENSOR_FRAME_DURATION,
- ANDROID_SENSOR_SENSITIVITY,
- ANDROID_SENSOR_TIMESTAMP,
- ANDROID_SENSOR_END,
-
- ANDROID_SENSOR_EXPOSURE_TIME_RANGE = ANDROID_SENSOR_INFO_START,
- ANDROID_SENSOR_MAX_FRAME_DURATION,
- ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
- ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
- ANDROID_SENSOR_PHYSICAL_SIZE,
- ANDROID_SENSOR_PIXEL_ARRAY_SIZE,
- ANDROID_SENSOR_ACTIVE_ARRAY_SIZE,
- ANDROID_SENSOR_WHITE_LEVEL,
- ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
- ANDROID_SENSOR_COLOR_TRANSFORM_1,
- ANDROID_SENSOR_COLOR_TRANSFORM_2,
- ANDROID_SENSOR_REFERENCE_ILLUMINANT_1,
- ANDROID_SENSOR_REFERENCE_ILLUMINANT_2,
- ANDROID_SENSOR_FORWARD_MATRIX_1,
- ANDROID_SENSOR_FORWARD_MATRIX_2,
- ANDROID_SENSOR_CALIBRATION_TRANSFORM_1,
- ANDROID_SENSOR_CALIBRATION_TRANSFORM_2,
- ANDROID_SENSOR_BASE_GAIN_FACTOR,
- ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
- ANDROID_SENSOR_NOISE_MODEL_COEFFICIENTS,
- ANDROID_SENSOR_ORIENTATION,
- ANDROID_SENSOR_INFO_END,
-
- ANDROID_FLASH_MODE = ANDROID_FLASH_START,
- ANDROID_FLASH_FIRING_POWER,
- ANDROID_FLASH_FIRING_TIME,
- ANDROID_FLASH_END,
-
- ANDROID_FLASH_AVAILABLE = ANDROID_FLASH_INFO_START,
- ANDROID_FLASH_CHARGE_DURATION,
- ANDROID_FLASH_INFO_END,
-
- ANDROID_HOT_PIXEL_MODE = ANDROID_HOT_PIXEL_START,
- ANDROID_HOT_PIXEL_END,
-
- ANDROID_HOT_PIXEL_INFO_END = ANDROID_HOT_PIXEL_INFO_START,
-
- ANDROID_DEMOSAIC_MODE = ANDROID_DEMOSAIC_START,
+ ANDROID_DEMOSAIC_MODE = ANDROID_DEMOSAIC_START,
ANDROID_DEMOSAIC_END,
- ANDROID_DEMOSAIC_INFO_END = ANDROID_DEMOSAIC_INFO_START,
-
- ANDROID_NOISE_MODE = ANDROID_NOISE_START,
- ANDROID_NOISE_STRENGTH,
- ANDROID_NOISE_END,
-
- ANDROID_NOISE_INFO_END = ANDROID_NOISE_INFO_START,
-
- ANDROID_SHADING_MODE = ANDROID_SHADING_START,
- ANDROID_SHADING_END,
-
- ANDROID_SHADING_INFO_END = ANDROID_SHADING_INFO_START,
-
- ANDROID_GEOMETRIC_MODE = ANDROID_GEOMETRIC_START,
- ANDROID_GEOMETRIC_END,
-
- ANDROID_GEOMETRIC_INFO_END = ANDROID_GEOMETRIC_INFO_START,
-
- ANDROID_COLOR_MODE = ANDROID_COLOR_START,
- ANDROID_COLOR_TRANSFORM,
- ANDROID_COLOR_END,
-
- ANDROID_COLOR_INFO_END = ANDROID_COLOR_INFO_START,
-
- ANDROID_TONEMAP_MODE = ANDROID_TONEMAP_START,
- ANDROID_TONEMAP_CURVE_RED,
- ANDROID_TONEMAP_CURVE_GREEN,
- ANDROID_TONEMAP_CURVE_BLUE,
- ANDROID_TONEMAP_END,
-
- ANDROID_TONEMAP_MAX_CURVE_POINTS = ANDROID_TONEMAP_INFO_START,
- ANDROID_TONEMAP_INFO_END,
-
- ANDROID_EDGE_MODE = ANDROID_EDGE_START,
+ ANDROID_EDGE_MODE = ANDROID_EDGE_START,
ANDROID_EDGE_STRENGTH,
ANDROID_EDGE_END,
- ANDROID_EDGE_INFO_END = ANDROID_EDGE_INFO_START,
+ ANDROID_FLASH_FIRING_POWER = ANDROID_FLASH_START,
+ ANDROID_FLASH_FIRING_TIME,
+ ANDROID_FLASH_MODE,
+ ANDROID_FLASH_COLOR_TEMPERATURE,
+ ANDROID_FLASH_MAX_ENERGY,
+ ANDROID_FLASH_STATE,
+ ANDROID_FLASH_END,
- ANDROID_SCALER_CROP_REGION = ANDROID_SCALER_START,
- ANDROID_SCALER_END,
+ ANDROID_FLASH_INFO_AVAILABLE = ANDROID_FLASH_INFO_START,
+ ANDROID_FLASH_INFO_CHARGE_DURATION,
+ ANDROID_FLASH_INFO_END,
- ANDROID_SCALER_AVAILABLE_FORMATS = ANDROID_SCALER_INFO_START,
- ANDROID_SCALER_AVAILABLE_RAW_SIZES,
- ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
- ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
- ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
- ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
- ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
- ANDROID_SCALER_AVAILABLE_MAX_ZOOM,
- ANDROID_SCALER_INFO_END,
+ ANDROID_GEOMETRIC_MODE = ANDROID_GEOMETRIC_START,
+ ANDROID_GEOMETRIC_STRENGTH,
+ ANDROID_GEOMETRIC_END,
- ANDROID_JPEG_QUALITY = ANDROID_JPEG_START,
- ANDROID_JPEG_THUMBNAIL_SIZE,
- ANDROID_JPEG_THUMBNAIL_QUALITY,
- ANDROID_JPEG_GPS_COORDINATES,
+ ANDROID_HOT_PIXEL_MODE = ANDROID_HOT_PIXEL_START,
+ ANDROID_HOT_PIXEL_END,
+
+ ANDROID_HOT_PIXEL_INFO_MAP = ANDROID_HOT_PIXEL_INFO_START,
+ ANDROID_HOT_PIXEL_INFO_END,
+
+ ANDROID_JPEG_GPS_COORDINATES = ANDROID_JPEG_START,
ANDROID_JPEG_GPS_PROCESSING_METHOD,
ANDROID_JPEG_GPS_TIMESTAMP,
ANDROID_JPEG_ORIENTATION,
+ ANDROID_JPEG_QUALITY,
+ ANDROID_JPEG_THUMBNAIL_QUALITY,
+ ANDROID_JPEG_THUMBNAIL_SIZE,
+ ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
+ ANDROID_JPEG_MAX_SIZE,
ANDROID_JPEG_SIZE,
ANDROID_JPEG_END,
- ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES = ANDROID_JPEG_INFO_START,
- ANDROID_JPEG_MAX_SIZE,
- ANDROID_JPEG_INFO_END,
+ ANDROID_LENS_APERTURE = ANDROID_LENS_START,
+ ANDROID_LENS_FILTER_DENSITY,
+ ANDROID_LENS_FOCAL_LENGTH,
+ ANDROID_LENS_FOCUS_DISTANCE,
+ ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
+ ANDROID_LENS_FACING,
+ ANDROID_LENS_OPTICAL_AXIS_ANGLE,
+ ANDROID_LENS_POSITION,
+ ANDROID_LENS_FOCUS_RANGE,
+ ANDROID_LENS_STATE,
+ ANDROID_LENS_END,
- ANDROID_STATS_FACE_DETECT_MODE = ANDROID_STATS_START,
- ANDROID_STATS_FACE_RECTANGLES,
- ANDROID_STATS_FACE_SCORES,
- ANDROID_STATS_FACE_LANDMARKS,
- ANDROID_STATS_FACE_IDS,
- ANDROID_STATS_HISTOGRAM_MODE,
- ANDROID_STATS_HISTOGRAM,
- ANDROID_STATS_SHARPNESS_MAP_MODE,
- ANDROID_STATS_SHARPNESS_MAP,
- ANDROID_STATS_END,
+ ANDROID_LENS_INFO_AVAILABLE_APERTURES
+ = ANDROID_LENS_INFO_START,
+ ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
+ ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
+ ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
+ ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
+ ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
+ ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
+ ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
+ ANDROID_LENS_INFO_SHADING_MAP,
+ ANDROID_LENS_INFO_SHADING_MAP_SIZE,
+ ANDROID_LENS_INFO_END,
- ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES = ANDROID_STATS_INFO_START,
- ANDROID_STATS_MAX_FACE_COUNT,
- ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
- ANDROID_STATS_MAX_HISTOGRAM_COUNT,
- ANDROID_STATS_SHARPNESS_MAP_SIZE,
- ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
- ANDROID_STATS_INFO_END,
+ ANDROID_NOISE_REDUCTION_MODE = ANDROID_NOISE_REDUCTION_START,
+ ANDROID_NOISE_REDUCTION_STRENGTH,
+ ANDROID_NOISE_REDUCTION_END,
- ANDROID_CONTROL_CAPTURE_INTENT = ANDROID_CONTROL_START,
- ANDROID_CONTROL_MODE,
- ANDROID_CONTROL_EFFECT_MODE,
- ANDROID_CONTROL_SCENE_MODE,
- ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
- ANDROID_CONTROL_AE_MODE,
- ANDROID_CONTROL_AE_LOCK,
- ANDROID_CONTROL_AE_REGIONS,
- ANDROID_CONTROL_AE_EXP_COMPENSATION,
- ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
- ANDROID_CONTROL_AE_ANTIBANDING_MODE,
- ANDROID_CONTROL_AE_STATE,
- ANDROID_CONTROL_AE_PRECAPTURE_ID,
- ANDROID_CONTROL_AWB_MODE,
- ANDROID_CONTROL_AWB_LOCK,
- ANDROID_CONTROL_AWB_REGIONS,
- ANDROID_CONTROL_AWB_STATE,
- ANDROID_CONTROL_AF_MODE,
- ANDROID_CONTROL_AF_REGIONS,
- ANDROID_CONTROL_AF_STATE,
- ANDROID_CONTROL_AF_TRIGGER_ID,
- ANDROID_CONTROL_END,
-
- ANDROID_CONTROL_AVAILABLE_SCENE_MODES = ANDROID_CONTROL_INFO_START,
- ANDROID_CONTROL_AVAILABLE_EFFECTS,
- ANDROID_CONTROL_MAX_REGIONS,
- ANDROID_CONTROL_AE_AVAILABLE_MODES,
- ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
- ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
- ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
- ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
- ANDROID_CONTROL_AWB_AVAILABLE_MODES,
- ANDROID_CONTROL_AF_AVAILABLE_MODES,
- ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
- ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
- ANDROID_CONTROL_INFO_END,
-
- ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO = ANDROID_QUIRKS_INFO_START,
+ ANDROID_QUIRKS_METERING_CROP_REGION
+ = ANDROID_QUIRKS_START,
+ ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO,
ANDROID_QUIRKS_USE_ZSL_FORMAT,
- ANDROID_QUIRKS_METERING_CROP_REGION,
- ANDROID_QUIRKS_INFO_END
-};
+ ANDROID_QUIRKS_END,
+
+ ANDROID_REQUEST_FRAME_COUNT = ANDROID_REQUEST_START,
+ ANDROID_REQUEST_ID,
+ ANDROID_REQUEST_INPUT_STREAMS,
+ ANDROID_REQUEST_METADATA_MODE,
+ ANDROID_REQUEST_OUTPUT_STREAMS,
+ ANDROID_REQUEST_TYPE,
+ ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
+ ANDROID_REQUEST_MAX_NUM_REPROCESS_STREAMS,
+ ANDROID_REQUEST_END,
+
+ ANDROID_SCALER_CROP_REGION = ANDROID_SCALER_START,
+ ANDROID_SCALER_AVAILABLE_FORMATS,
+ ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
+ ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
+ ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
+ ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
+ ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
+ ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
+ ANDROID_SCALER_AVAILABLE_RAW_SIZES,
+ ANDROID_SCALER_MAX_DIGITAL_ZOOM,
+ ANDROID_SCALER_END,
+
+ ANDROID_SENSOR_EXPOSURE_TIME = ANDROID_SENSOR_START,
+ ANDROID_SENSOR_FRAME_DURATION,
+ ANDROID_SENSOR_SENSITIVITY,
+ ANDROID_SENSOR_BASE_GAIN_FACTOR,
+ ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
+ ANDROID_SENSOR_CALIBRATION_TRANSFORM1,
+ ANDROID_SENSOR_CALIBRATION_TRANSFORM2,
+ ANDROID_SENSOR_COLOR_TRANSFORM1,
+ ANDROID_SENSOR_COLOR_TRANSFORM2,
+ ANDROID_SENSOR_FORWARD_MATRIX1,
+ ANDROID_SENSOR_FORWARD_MATRIX2,
+ ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
+ ANDROID_SENSOR_NOISE_MODEL_COEFFICIENTS,
+ ANDROID_SENSOR_ORIENTATION,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT2,
+ ANDROID_SENSOR_TIMESTAMP,
+ ANDROID_SENSOR_END,
+
+ ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ = ANDROID_SENSOR_INFO_START,
+ ANDROID_SENSOR_INFO_AVAILABLE_SENSITIVITIES,
+ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
+ ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
+ ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
+ ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
+ ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
+ ANDROID_SENSOR_INFO_WHITE_LEVEL,
+ ANDROID_SENSOR_INFO_END,
+
+ ANDROID_SHADING_MODE = ANDROID_SHADING_START,
+ ANDROID_SHADING_STRENGTH,
+ ANDROID_SHADING_END,
+
+ ANDROID_STATISTICS_FACE_DETECT_MODE
+ = ANDROID_STATISTICS_START,
+ ANDROID_STATISTICS_HISTOGRAM_MODE,
+ ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
+ ANDROID_STATISTICS_FACE_IDS,
+ ANDROID_STATISTICS_FACE_LANDMARKS,
+ ANDROID_STATISTICS_FACE_RECTANGLES,
+ ANDROID_STATISTICS_FACE_SCORES,
+ ANDROID_STATISTICS_HISTOGRAM,
+ ANDROID_STATISTICS_SHARPNESS_MAP,
+ ANDROID_STATISTICS_END,
+
+ ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES
+ = ANDROID_STATISTICS_INFO_START,
+ ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
+ ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
+ ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
+ ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
+ ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
+ ANDROID_STATISTICS_INFO_END,
+
+ ANDROID_TONEMAP_CURVE_BLUE = ANDROID_TONEMAP_START,
+ ANDROID_TONEMAP_CURVE_GREEN,
+ ANDROID_TONEMAP_CURVE_RED,
+ ANDROID_TONEMAP_MODE,
+ ANDROID_TONEMAP_MAX_CURVE_POINTS,
+ ANDROID_TONEMAP_END,
+
+} camera_metadata_tag_t;
/**
* Enumeration definitions for the various entries that need them
*/
-// ANDROID_REQUEST_METADATA_TYPE
-enum {
- ANDROID_REQUEST_TYPE_CAPTURE = 0,
- ANDROID_REQUEST_TYPE_REPROCESS
-};
+// ANDROID_COLOR_CORRECTION_MODE
+typedef enum camera_metadata_enum_android_color_correction_mode {
+ ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX,
+ ANDROID_COLOR_CORRECTION_MODE_FAST,
+ ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_color_correction_mode_t;
-// ANDROID_REQUEST_METADATA_MODE
-enum {
- ANDROID_REQUEST_METADATA_NONE = 0,
- ANDROID_REQUEST_METADATA_FULL
-};
-// ANDROID_LENS_OPTICAL_STABILIZATION_MODE
-enum {
- ANDROID_LENS_OPTICAL_STABILIZATION_OFF = 0,
- ANDROID_LENS_OPTICAL_STABILIZATION_ON
-};
+// ANDROID_CONTROL_AE_ANTIBANDING_MODE
+typedef enum camera_metadata_enum_android_control_ae_antibanding_mode {
+ ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,
+ ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ,
+ ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ,
+ ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO,
+} camera_metadata_enum_android_control_ae_antibanding_mode_t;
-// ANDROID_LENS_FACING
-enum {
- ANDROID_LENS_FACING_BACK = 0,
- ANDROID_LENS_FACING_FRONT
-};
+// ANDROID_CONTROL_AE_LOCK
+typedef enum camera_metadata_enum_android_control_ae_lock {
+ ANDROID_CONTROL_AE_LOCK_OFF,
+ ANDROID_CONTROL_AE_LOCK_ON,
+} camera_metadata_enum_android_control_ae_lock_t;
-// ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
-enum {
- ANDROID_SENSOR_RGGB = 0,
- ANDROID_SENSOR_GRBG,
- ANDROID_SENSOR_GBRG,
- ANDROID_SENSOR_BGGR,
- ANDROID_SENSOR_RGB
-};
+// ANDROID_CONTROL_AE_MODE
+typedef enum camera_metadata_enum_android_control_ae_mode {
+ ANDROID_CONTROL_AE_MODE_OFF,
+ ANDROID_CONTROL_AE_MODE_ON,
+ ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,
+ ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,
+ ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE,
+} camera_metadata_enum_android_control_ae_mode_t;
-// ANDROID_FLASH_MODE
-enum {
- ANDROID_FLASH_OFF = 0,
- ANDROID_FLASH_SINGLE,
- ANDROID_FLASH_TORCH
-};
+// ANDROID_CONTROL_AF_MODE
+typedef enum camera_metadata_enum_android_control_af_mode {
+ ANDROID_CONTROL_AF_MODE_OFF,
+ ANDROID_CONTROL_AF_MODE_AUTO,
+ ANDROID_CONTROL_AF_MODE_MACRO,
+ ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,
+ ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE,
+ ANDROID_CONTROL_AF_MODE_EDOF,
+} camera_metadata_enum_android_control_af_mode_t;
-// General processing block modes
-enum {
- ANDROID_PROCESSING_OFF = 0,
- ANDROID_PROCESSING_FAST,
- ANDROID_PROCESSING_HIGH_QUALITY
-};
+// ANDROID_CONTROL_AWB_LOCK
+typedef enum camera_metadata_enum_android_control_awb_lock {
+ ANDROID_CONTROL_AWB_LOCK_OFF,
+ ANDROID_CONTROL_AWB_LOCK_ON,
+} camera_metadata_enum_android_control_awb_lock_t;
-// ANDROID_DEMOSAIC_MODE
-enum {
- ANDROID_DEMOSAIC_FAST = 1,
- ANDROID_DEMOSAIC_HIGH_QUALITY
-};
-
-// ANDROID_COLOR_MODE
-enum {
- ANDROID_COLOR_FAST = 1,
- ANDROID_COLOR_HIGH_QUALITY,
- ANDROID_COLOR_TRANSFORM_MATRIX
-};
-
-// ANDROID_TONEMAP_MODE
-enum {
- ANDROID_TONEMAP_FAST = 1,
- ANDROID_TONEMAP_HIGH_QUALITY,
- ANDROID_TONEMAP_CONTRAST_CURVE
-};
-
-// ANDROID_SCALER_AVAILABLE_FORMATS uses HAL_PIXEL_FORMAT_* from
-// system/graphics.h
-
-// ANDROID_STATS_FACE_DETECTION_MODE
-enum {
- ANDROID_STATS_FACE_DETECTION_OFF = 0,
- ANDROID_STATS_FACE_DETECTION_SIMPLE,
- ANDROID_STATS_FACE_DETECTION_FULL
-};
-
-// ANDROID_STATS_HISTOGRAM/SHARPNESS_MAP_MODE
-enum {
- ANDROID_STATS_OFF = 0,
- ANDROID_STATS_ON
-};
+// ANDROID_CONTROL_AWB_MODE
+typedef enum camera_metadata_enum_android_control_awb_mode {
+ ANDROID_CONTROL_AWB_MODE_OFF,
+ ANDROID_CONTROL_AWB_MODE_AUTO,
+ ANDROID_CONTROL_AWB_MODE_INCANDESCENT,
+ ANDROID_CONTROL_AWB_MODE_FLUORESCENT,
+ ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,
+ ANDROID_CONTROL_AWB_MODE_DAYLIGHT,
+ ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT,
+ ANDROID_CONTROL_AWB_MODE_TWILIGHT,
+ ANDROID_CONTROL_AWB_MODE_SHADE,
+} camera_metadata_enum_android_control_awb_mode_t;
// ANDROID_CONTROL_CAPTURE_INTENT
-enum {
- ANDROID_CONTROL_INTENT_CUSTOM = 0,
- ANDROID_CONTROL_INTENT_PREVIEW,
- ANDROID_CONTROL_INTENT_STILL_CAPTURE,
- ANDROID_CONTROL_INTENT_VIDEO_RECORD,
- ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT,
- ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG
-};
+typedef enum camera_metadata_enum_android_control_capture_intent {
+ ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM,
+ ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW,
+ ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
+ ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD,
+ ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT,
+ ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG,
+} camera_metadata_enum_android_control_capture_intent_t;
+
+// ANDROID_CONTROL_EFFECT_MODE
+typedef enum camera_metadata_enum_android_control_effect_mode {
+ ANDROID_CONTROL_EFFECT_MODE_OFF,
+ ANDROID_CONTROL_EFFECT_MODE_MONO,
+ ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,
+ ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,
+ ANDROID_CONTROL_EFFECT_MODE_SEPIA,
+ ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,
+ ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD,
+ ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD,
+ ANDROID_CONTROL_EFFECT_MODE_AQUA,
+} camera_metadata_enum_android_control_effect_mode_t;
// ANDROID_CONTROL_MODE
-enum {
- ANDROID_CONTROL_OFF = 0,
- ANDROID_CONTROL_AUTO,
- ANDROID_CONTROL_USE_SCENE_MODE
-};
+typedef enum camera_metadata_enum_android_control_mode {
+ ANDROID_CONTROL_MODE_OFF,
+ ANDROID_CONTROL_MODE_AUTO,
+ ANDROID_CONTROL_MODE_USE_SCENE_MODE,
+} camera_metadata_enum_android_control_mode_t;
// ANDROID_CONTROL_SCENE_MODE
-enum {
- ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED = 0, // Only for availableSceneModes
+typedef enum camera_metadata_enum_android_control_scene_mode {
+ ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED = 0,
ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY,
ANDROID_CONTROL_SCENE_MODE_ACTION,
ANDROID_CONTROL_SCENE_MODE_PORTRAIT,
@@ -439,104 +413,217 @@
ANDROID_CONTROL_SCENE_MODE_SPORTS,
ANDROID_CONTROL_SCENE_MODE_PARTY,
ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,
- ANDROID_CONTROL_SCENE_MODE_BARCODE
-};
+ ANDROID_CONTROL_SCENE_MODE_BARCODE,
+} camera_metadata_enum_android_control_scene_mode_t;
-// ANDROID_CONTROL_EFFECT_MODE
-enum {
- ANDROID_CONTROL_EFFECT_OFF = 0,
- ANDROID_CONTROL_EFFECT_MONO,
- ANDROID_CONTROL_EFFECT_NEGATIVE,
- ANDROID_CONTROL_EFFECT_SOLARIZE,
- ANDROID_CONTROL_EFFECT_SEPIA,
- ANDROID_CONTROL_EFFECT_POSTERIZE,
- ANDROID_CONTROL_EFFECT_WHITEBOARD,
- ANDROID_CONTROL_EFFECT_BLACKBOARD,
- ANDROID_CONTROL_EFFECT_AQUA
-};
-
-// ANDROID_CONTROL_AE_MODE
-enum {
- ANDROID_CONTROL_AE_OFF = 0,
- ANDROID_CONTROL_AE_ON,
- ANDROID_CONTROL_AE_ON_AUTO_FLASH,
- ANDROID_CONTROL_AE_ON_ALWAYS_FLASH,
- ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE
-};
-
-// ANDROID_CONTROL_AE_LOCK
-enum {
- ANDROID_CONTROL_AE_LOCK_OFF = 0,
- ANDROID_CONTROL_AE_LOCK_ON
-};
-
-// ANDROID_CONTROL_AE_ANTIBANDING_MODE
-enum {
- ANDROID_CONTROL_AE_ANTIBANDING_OFF = 0,
- ANDROID_CONTROL_AE_ANTIBANDING_50HZ,
- ANDROID_CONTROL_AE_ANTIBANDING_60HZ,
- ANDROID_CONTROL_AE_ANTIBANDING_AUTO
-};
+// ANDROID_CONTROL_VIDEO_STABILIZATION_MODE
+typedef enum camera_metadata_enum_android_control_video_stabilization_mode {
+ ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF,
+ ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON,
+} camera_metadata_enum_android_control_video_stabilization_mode_t;
// ANDROID_CONTROL_AE_STATE
-enum {
- ANDROID_CONTROL_AE_STATE_INACTIVE = 0,
+typedef enum camera_metadata_enum_android_control_ae_state {
+ ANDROID_CONTROL_AE_STATE_INACTIVE,
ANDROID_CONTROL_AE_STATE_SEARCHING,
ANDROID_CONTROL_AE_STATE_CONVERGED,
ANDROID_CONTROL_AE_STATE_LOCKED,
ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED,
- ANDROID_CONTROL_AE_STATE_PRECAPTURE
-};
-
-// ANDROID_CONTROL_AWB_MODE
-enum {
- ANDROID_CONTROL_AWB_OFF = 0,
- ANDROID_CONTROL_AWB_AUTO,
- ANDROID_CONTROL_AWB_INCANDESCENT,
- ANDROID_CONTROL_AWB_FLUORESCENT,
- ANDROID_CONTROL_AWB_WARM_FLUORESCENT,
- ANDROID_CONTROL_AWB_DAYLIGHT,
- ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT,
- ANDROID_CONTROL_AWB_TWILIGHT,
- ANDROID_CONTROL_AWB_SHADE
-};
-
-// ANDROID_CONTROL_AWB_LOCK
-enum {
- ANDROID_CONTROL_AWB_LOCK_OFF = 0,
- ANDROID_CONTROL_AWB_LOCK_ON
-};
-
-// ANDROID_CONTROL_AWB_STATE
-enum {
- ANDROID_CONTROL_AWB_STATE_INACTIVE = 0,
- ANDROID_CONTROL_AWB_STATE_SEARCHING,
- ANDROID_CONTROL_AWB_STATE_CONVERGED,
- ANDROID_CONTROL_AWB_STATE_LOCKED,
-};
-
-// ANDROID_CONTROL_AF_MODE
-enum {
- ANDROID_CONTROL_AF_OFF = 0,
- ANDROID_CONTROL_AF_AUTO,
- ANDROID_CONTROL_AF_MACRO,
- ANDROID_CONTROL_AF_CONTINUOUS_VIDEO,
- ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
- ANDROID_CONTROL_AF_EDOF
-};
+ ANDROID_CONTROL_AE_STATE_PRECAPTURE,
+} camera_metadata_enum_android_control_ae_state_t;
// ANDROID_CONTROL_AF_STATE
-enum {
- ANDROID_CONTROL_AF_STATE_INACTIVE = 0,
+typedef enum camera_metadata_enum_android_control_af_state {
+ ANDROID_CONTROL_AF_STATE_INACTIVE,
ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN,
ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED,
ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN,
ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED,
- ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
-};
+ ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED,
+} camera_metadata_enum_android_control_af_state_t;
-// ANDROID_CONTROL_VIDEO_STABILIZATION
-enum {
- ANDROID_CONTROL_VIDEO_STABILIZATION_OFF = 0,
- ANDROID_CONTROL_VIDEO_STABILIZATION_ON
-};
+// ANDROID_CONTROL_AWB_STATE
+typedef enum camera_metadata_enum_android_control_awb_state {
+ ANDROID_CONTROL_AWB_STATE_INACTIVE,
+ ANDROID_CONTROL_AWB_STATE_SEARCHING,
+ ANDROID_CONTROL_AWB_STATE_CONVERGED,
+ ANDROID_CONTROL_AWB_STATE_LOCKED,
+} camera_metadata_enum_android_control_awb_state_t;
+
+
+// ANDROID_DEMOSAIC_MODE
+typedef enum camera_metadata_enum_android_demosaic_mode {
+ ANDROID_DEMOSAIC_MODE_FAST,
+ ANDROID_DEMOSAIC_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_demosaic_mode_t;
+
+
+// ANDROID_EDGE_MODE
+typedef enum camera_metadata_enum_android_edge_mode {
+ ANDROID_EDGE_MODE_OFF,
+ ANDROID_EDGE_MODE_FAST,
+ ANDROID_EDGE_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_edge_mode_t;
+
+
+// ANDROID_FLASH_MODE
+typedef enum camera_metadata_enum_android_flash_mode {
+ ANDROID_FLASH_MODE_OFF,
+ ANDROID_FLASH_MODE_SINGLE,
+ ANDROID_FLASH_MODE_TORCH,
+} camera_metadata_enum_android_flash_mode_t;
+
+// ANDROID_FLASH_STATE
+typedef enum camera_metadata_enum_android_flash_state {
+ ANDROID_FLASH_STATE_UNAVAILABLE,
+ ANDROID_FLASH_STATE_CHARGING,
+ ANDROID_FLASH_STATE_READY,
+ ANDROID_FLASH_STATE_FIRED,
+} camera_metadata_enum_android_flash_state_t;
+
+
+
+// ANDROID_GEOMETRIC_MODE
+typedef enum camera_metadata_enum_android_geometric_mode {
+ ANDROID_GEOMETRIC_MODE_OFF,
+ ANDROID_GEOMETRIC_MODE_FAST,
+ ANDROID_GEOMETRIC_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_geometric_mode_t;
+
+
+// ANDROID_HOT_PIXEL_MODE
+typedef enum camera_metadata_enum_android_hot_pixel_mode {
+ ANDROID_HOT_PIXEL_MODE_OFF,
+ ANDROID_HOT_PIXEL_MODE_FAST,
+ ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_hot_pixel_mode_t;
+
+
+
+
+// ANDROID_LENS_OPTICAL_STABILIZATION_MODE
+typedef enum camera_metadata_enum_android_lens_optical_stabilization_mode {
+ ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF,
+ ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON,
+} camera_metadata_enum_android_lens_optical_stabilization_mode_t;
+
+// ANDROID_LENS_FACING
+typedef enum camera_metadata_enum_android_lens_facing {
+ ANDROID_LENS_FACING_FRONT,
+ ANDROID_LENS_FACING_BACK,
+} camera_metadata_enum_android_lens_facing_t;
+
+// ANDROID_LENS_STATE
+typedef enum camera_metadata_enum_android_lens_state {
+ ANDROID_LENS_STATE_STATIONARY,
+} camera_metadata_enum_android_lens_state_t;
+
+
+
+// ANDROID_NOISE_REDUCTION_MODE
+typedef enum camera_metadata_enum_android_noise_reduction_mode {
+ ANDROID_NOISE_REDUCTION_MODE_OFF,
+ ANDROID_NOISE_REDUCTION_MODE_FAST,
+ ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_noise_reduction_mode_t;
+
+
+
+// ANDROID_REQUEST_METADATA_MODE
+typedef enum camera_metadata_enum_android_request_metadata_mode {
+ ANDROID_REQUEST_METADATA_MODE_NONE,
+ ANDROID_REQUEST_METADATA_MODE_FULL,
+} camera_metadata_enum_android_request_metadata_mode_t;
+
+// ANDROID_REQUEST_TYPE
+typedef enum camera_metadata_enum_android_request_type {
+ ANDROID_REQUEST_TYPE_CAPTURE,
+ ANDROID_REQUEST_TYPE_REPROCESS,
+} camera_metadata_enum_android_request_type_t;
+
+
+// ANDROID_SCALER_AVAILABLE_FORMATS
+typedef enum camera_metadata_enum_android_scaler_available_formats {
+ ANDROID_SCALER_AVAILABLE_FORMATS_RAW_SENSOR = 0x20,
+ ANDROID_SCALER_AVAILABLE_FORMATS_YV12 = 0x32315659,
+ ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_SP = 0x11,
+ ANDROID_SCALER_AVAILABLE_FORMATS_JPEG = 0x21,
+} camera_metadata_enum_android_scaler_available_formats_t;
+
+
+// ANDROID_SENSOR_REFERENCE_ILLUMINANT1
+typedef enum camera_metadata_enum_android_sensor_reference_illuminant1 {
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT = 1,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT = 2,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN = 3,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FLASH = 4,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER = 9,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER = 10,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_SHADE = 11,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT = 12,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT = 13,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT = 14,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT = 15,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A = 17,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B = 18,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C = 19,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D55 = 20,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D65 = 21,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D75 = 22,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D50 = 23,
+ ANDROID_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN = 24,
+} camera_metadata_enum_android_sensor_reference_illuminant1_t;
+
+
+// ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
+typedef enum camera_metadata_enum_android_sensor_info_color_filter_arrangement {
+ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB,
+ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG,
+ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG,
+ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR,
+ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB,
+} camera_metadata_enum_android_sensor_info_color_filter_arrangement_t;
+
+
+// ANDROID_SHADING_MODE
+typedef enum camera_metadata_enum_android_shading_mode {
+ ANDROID_SHADING_MODE_OFF,
+ ANDROID_SHADING_MODE_FAST,
+ ANDROID_SHADING_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_shading_mode_t;
+
+
+// ANDROID_STATISTICS_FACE_DETECT_MODE
+typedef enum camera_metadata_enum_android_statistics_face_detect_mode {
+ ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
+ ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE,
+ ANDROID_STATISTICS_FACE_DETECT_MODE_FULL,
+} camera_metadata_enum_android_statistics_face_detect_mode_t;
+
+// ANDROID_STATISTICS_HISTOGRAM_MODE
+typedef enum camera_metadata_enum_android_statistics_histogram_mode {
+ ANDROID_STATISTICS_HISTOGRAM_MODE_OFF,
+ ANDROID_STATISTICS_HISTOGRAM_MODE_ON,
+} camera_metadata_enum_android_statistics_histogram_mode_t;
+
+// ANDROID_STATISTICS_SHARPNESS_MAP_MODE
+typedef enum camera_metadata_enum_android_statistics_sharpness_map_mode {
+ ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF,
+ ANDROID_STATISTICS_SHARPNESS_MAP_MODE_ON,
+} camera_metadata_enum_android_statistics_sharpness_map_mode_t;
+
+
+
+// ANDROID_TONEMAP_MODE
+typedef enum camera_metadata_enum_android_tonemap_mode {
+ ANDROID_TONEMAP_MODE_CONTRAST_CURVE,
+ ANDROID_TONEMAP_MODE_FAST,
+ ANDROID_TONEMAP_MODE_HIGH_QUALITY,
+} camera_metadata_enum_android_tonemap_mode_t;
+
+
+
+int camera_metadata_enum_snprint(uint32_t tag,
+ uint32_t value,
+ char *dst,
+ size_t size);
diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c
index e5c2f25..1963b89 100644
--- a/camera/src/camera_metadata.c
+++ b/camera/src/camera_metadata.c
@@ -640,7 +640,8 @@
return OK;
}
-static void print_data(int fd, const uint8_t *data_ptr, int type, int count,
+static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag, int type,
+ int count,
int indentation);
void dump_camera_metadata(const camera_metadata_t *metadata,
@@ -714,11 +715,11 @@
int count = entry->count;
if (verbosity < 2 && count > 16) count = 16;
- print_data(fd, data_ptr, entry->type, count, indentation);
+ print_data(fd, data_ptr, entry->tag, entry->type, count, indentation);
}
}
-static void print_data(int fd, const uint8_t *data_ptr,
+static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag,
int type, int count, int indentation) {
static int values_per_line[NUM_TYPES] = {
[TYPE_BYTE] = 16,
@@ -729,6 +730,8 @@
[TYPE_RATIONAL] = 2,
};
size_t type_size = camera_metadata_type_size[type];
+ char value_string_tmp[CAMERA_METADATA_ENUM_STRING_MAX_SIZE];
+ uint32_t value;
int lines = count / values_per_line[type];
if (count % values_per_line[type] != 0) lines++;
@@ -743,12 +746,31 @@
switch (type) {
case TYPE_BYTE:
- fdprintf(fd, "%hhu ",
- *(data_ptr + index));
+ value = *(data_ptr + index);
+ if (camera_metadata_enum_snprint(tag,
+ value,
+ value_string_tmp,
+ sizeof(value_string_tmp))
+ == OK) {
+ fdprintf(fd, "%s ", value_string_tmp);
+ } else {
+ fdprintf(fd, "%hhu ",
+ *(data_ptr + index));
+ }
break;
case TYPE_INT32:
- fdprintf(fd, "%d ",
- *(int32_t*)(data_ptr + index));
+ value =
+ *(int32_t*)(data_ptr + index);
+ if (camera_metadata_enum_snprint(tag,
+ value,
+ value_string_tmp,
+ sizeof(value_string_tmp))
+ == OK) {
+ fdprintf(fd, "%s ", value_string_tmp);
+ } else {
+ fdprintf(fd, "%d ",
+ *(int32_t*)(data_ptr + index));
+ }
break;
case TYPE_FLOAT:
fdprintf(fd, "%0.2f ",
diff --git a/camera/src/camera_metadata_tag_info.c b/camera/src/camera_metadata_tag_info.c
index 2b723c9..e8d340a 100644
--- a/camera/src/camera_metadata_tag_info.c
+++ b/camera/src/camera_metadata_tag_info.c
@@ -24,549 +24,1755 @@
* sync with camera_metadata_tags.h
*/
+/**
+ * ! Do not edit this file directly !
+ *
+ * Generated automatically from camera_metadata_tag_info.mako
+ */
+
const char *camera_metadata_section_names[ANDROID_SECTION_COUNT] = {
- [ANDROID_REQUEST] = "android.request",
- [ANDROID_LENS] = "android.lens",
- [ANDROID_LENS_INFO] = "android.lens.info",
- [ANDROID_SENSOR] = "android.sensor",
- [ANDROID_SENSOR_INFO] = "android.sensor.info",
- [ANDROID_FLASH] = "android.flash",
- [ANDROID_FLASH_INFO] = "android.flash.info",
- [ANDROID_HOT_PIXEL] = "android.hotPixel",
- [ANDROID_HOT_PIXEL_INFO] = "android.hotPixel.info",
- [ANDROID_DEMOSAIC] = "android.demosaic",
- [ANDROID_DEMOSAIC_INFO] = "android.demosaic.info",
- [ANDROID_NOISE] = "android.noiseReduction",
- [ANDROID_NOISE_INFO] = "android.noiseReduction.info",
- [ANDROID_SHADING] = "android.shadingCorrection",
- [ANDROID_SHADING_INFO] = "android.shadingCorrection.info",
- [ANDROID_GEOMETRIC] = "android.geometricCorrection",
- [ANDROID_GEOMETRIC_INFO] = "android.geometricCorrection.info",
- [ANDROID_COLOR] = "android.colorCorrection",
- [ANDROID_COLOR_INFO] = "android.colorCorrection.info",
- [ANDROID_TONEMAP] = "android.tonemap",
- [ANDROID_TONEMAP_INFO] = "android.tonemap.info",
- [ANDROID_EDGE] = "android.edge",
- [ANDROID_EDGE_INFO] = "android.edge.info",
- [ANDROID_SCALER] = "android.scaler",
- [ANDROID_SCALER_INFO] = "android.scaler.info",
- [ANDROID_JPEG] = "android.jpeg",
- [ANDROID_JPEG_INFO] = "android.jpeg.info",
- [ANDROID_STATS] = "android.statistics",
- [ANDROID_STATS_INFO] = "android.statistics.info",
- [ANDROID_CONTROL] = "android.control",
- [ANDROID_CONTROL_INFO] = "android.control.info",
- [ANDROID_QUIRKS_INFO] = "android.quirks.info"
+ [ANDROID_COLOR_CORRECTION] = "android.colorCorrection",
+ [ANDROID_CONTROL] = "android.control",
+ [ANDROID_DEMOSAIC] = "android.demosaic",
+ [ANDROID_EDGE] = "android.edge",
+ [ANDROID_FLASH] = "android.flash",
+ [ANDROID_FLASH_INFO] = "android.flash.info",
+ [ANDROID_GEOMETRIC] = "android.geometric",
+ [ANDROID_HOT_PIXEL] = "android.hotPixel",
+ [ANDROID_HOT_PIXEL_INFO] = "android.hotPixel.info",
+ [ANDROID_JPEG] = "android.jpeg",
+ [ANDROID_LENS] = "android.lens",
+ [ANDROID_LENS_INFO] = "android.lens.info",
+ [ANDROID_NOISE_REDUCTION] = "android.noiseReduction",
+ [ANDROID_QUIRKS] = "android.quirks",
+ [ANDROID_REQUEST] = "android.request",
+ [ANDROID_SCALER] = "android.scaler",
+ [ANDROID_SENSOR] = "android.sensor",
+ [ANDROID_SENSOR_INFO] = "android.sensor.info",
+ [ANDROID_SHADING] = "android.shading",
+ [ANDROID_STATISTICS] = "android.statistics",
+ [ANDROID_STATISTICS_INFO] = "android.statistics.info",
+ [ANDROID_TONEMAP] = "android.tonemap",
};
unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2] = {
- [ANDROID_REQUEST] = { ANDROID_REQUEST_START,
- ANDROID_REQUEST_END },
- [ANDROID_LENS] = { ANDROID_LENS_START,
- ANDROID_LENS_END },
- [ANDROID_LENS_INFO] = { ANDROID_LENS_INFO_START,
- ANDROID_LENS_INFO_END },
- [ANDROID_SENSOR] = { ANDROID_SENSOR_START,
- ANDROID_SENSOR_END },
- [ANDROID_SENSOR_INFO] = { ANDROID_SENSOR_INFO_START,
- ANDROID_SENSOR_INFO_END },
- [ANDROID_FLASH] = { ANDROID_FLASH_START,
- ANDROID_FLASH_END },
- [ANDROID_FLASH_INFO] = { ANDROID_FLASH_INFO_START,
- ANDROID_FLASH_INFO_END },
- [ANDROID_HOT_PIXEL] = { ANDROID_HOT_PIXEL_START,
- ANDROID_HOT_PIXEL_END },
- [ANDROID_HOT_PIXEL_INFO] = { ANDROID_HOT_PIXEL_INFO_START,
- ANDROID_HOT_PIXEL_INFO_END },
- [ANDROID_DEMOSAIC] = { ANDROID_DEMOSAIC_START,
- ANDROID_DEMOSAIC_END },
- [ANDROID_DEMOSAIC_INFO] = { ANDROID_DEMOSAIC_INFO_START,
- ANDROID_DEMOSAIC_INFO_END },
- [ANDROID_NOISE] = { ANDROID_NOISE_START,
- ANDROID_NOISE_END },
- [ANDROID_NOISE_INFO] = { ANDROID_NOISE_INFO_START,
- ANDROID_NOISE_INFO_END },
- [ANDROID_SHADING] = { ANDROID_SHADING_START,
- ANDROID_SHADING_END },
- [ANDROID_SHADING_INFO] = { ANDROID_SHADING_INFO_START,
- ANDROID_SHADING_INFO_END },
- [ANDROID_GEOMETRIC] = { ANDROID_GEOMETRIC_START,
- ANDROID_GEOMETRIC_END },
- [ANDROID_GEOMETRIC_INFO] = { ANDROID_GEOMETRIC_INFO_START,
- ANDROID_GEOMETRIC_INFO_END },
- [ANDROID_COLOR] = { ANDROID_COLOR_START,
- ANDROID_COLOR_END },
- [ANDROID_COLOR_INFO] = { ANDROID_COLOR_INFO_START,
- ANDROID_COLOR_INFO_END },
- [ANDROID_TONEMAP] = { ANDROID_TONEMAP_START,
- ANDROID_TONEMAP_END },
- [ANDROID_TONEMAP_INFO] = { ANDROID_TONEMAP_INFO_START,
- ANDROID_TONEMAP_INFO_END },
- [ANDROID_EDGE] = { ANDROID_EDGE_START,
- ANDROID_EDGE_END },
- [ANDROID_EDGE_INFO] = { ANDROID_EDGE_INFO_START,
- ANDROID_EDGE_INFO_END },
- [ANDROID_SCALER] = { ANDROID_SCALER_START,
- ANDROID_SCALER_END },
- [ANDROID_SCALER_INFO] = { ANDROID_SCALER_INFO_START,
- ANDROID_SCALER_INFO_END },
- [ANDROID_JPEG] = { ANDROID_JPEG_START,
- ANDROID_JPEG_END },
- [ANDROID_JPEG_INFO] = { ANDROID_JPEG_INFO_START,
- ANDROID_JPEG_INFO_END },
- [ANDROID_STATS] = { ANDROID_STATS_START,
- ANDROID_STATS_END },
- [ANDROID_STATS_INFO] = { ANDROID_STATS_INFO_START,
- ANDROID_STATS_INFO_END },
- [ANDROID_CONTROL] = { ANDROID_CONTROL_START,
- ANDROID_CONTROL_END },
- [ANDROID_CONTROL_INFO] = { ANDROID_CONTROL_INFO_START,
- ANDROID_CONTROL_INFO_END },
- [ANDROID_QUIRKS_INFO] = { ANDROID_QUIRKS_INFO_START,
- ANDROID_QUIRKS_INFO_END }
+ [ANDROID_COLOR_CORRECTION] = { ANDROID_COLOR_CORRECTION_START,
+ ANDROID_COLOR_CORRECTION_END },
+ [ANDROID_CONTROL] = { ANDROID_CONTROL_START,
+ ANDROID_CONTROL_END },
+ [ANDROID_DEMOSAIC] = { ANDROID_DEMOSAIC_START,
+ ANDROID_DEMOSAIC_END },
+ [ANDROID_EDGE] = { ANDROID_EDGE_START,
+ ANDROID_EDGE_END },
+ [ANDROID_FLASH] = { ANDROID_FLASH_START,
+ ANDROID_FLASH_END },
+ [ANDROID_FLASH_INFO] = { ANDROID_FLASH_INFO_START,
+ ANDROID_FLASH_INFO_END },
+ [ANDROID_GEOMETRIC] = { ANDROID_GEOMETRIC_START,
+ ANDROID_GEOMETRIC_END },
+ [ANDROID_HOT_PIXEL] = { ANDROID_HOT_PIXEL_START,
+ ANDROID_HOT_PIXEL_END },
+ [ANDROID_HOT_PIXEL_INFO] = { ANDROID_HOT_PIXEL_INFO_START,
+ ANDROID_HOT_PIXEL_INFO_END },
+ [ANDROID_JPEG] = { ANDROID_JPEG_START,
+ ANDROID_JPEG_END },
+ [ANDROID_LENS] = { ANDROID_LENS_START,
+ ANDROID_LENS_END },
+ [ANDROID_LENS_INFO] = { ANDROID_LENS_INFO_START,
+ ANDROID_LENS_INFO_END },
+ [ANDROID_NOISE_REDUCTION] = { ANDROID_NOISE_REDUCTION_START,
+ ANDROID_NOISE_REDUCTION_END },
+ [ANDROID_QUIRKS] = { ANDROID_QUIRKS_START,
+ ANDROID_QUIRKS_END },
+ [ANDROID_REQUEST] = { ANDROID_REQUEST_START,
+ ANDROID_REQUEST_END },
+ [ANDROID_SCALER] = { ANDROID_SCALER_START,
+ ANDROID_SCALER_END },
+ [ANDROID_SENSOR] = { ANDROID_SENSOR_START,
+ ANDROID_SENSOR_END },
+ [ANDROID_SENSOR_INFO] = { ANDROID_SENSOR_INFO_START,
+ ANDROID_SENSOR_INFO_END },
+ [ANDROID_SHADING] = { ANDROID_SHADING_START,
+ ANDROID_SHADING_END },
+ [ANDROID_STATISTICS] = { ANDROID_STATISTICS_START,
+ ANDROID_STATISTICS_END },
+ [ANDROID_STATISTICS_INFO] = { ANDROID_STATISTICS_INFO_START,
+ ANDROID_STATISTICS_INFO_END },
+ [ANDROID_TONEMAP] = { ANDROID_TONEMAP_START,
+ ANDROID_TONEMAP_END },
};
-// Shortcut defines to make succint names for field definitions
-#define TIDX(section, tag) \
- [ ANDROID_ ## section ## _ ## tag - ANDROID_ ## section ## _START ]
-
-#define TIIDX(section, tag) \
- [ ANDROID_ ## section ## _ ## tag - ANDROID_ ## section ## _INFO_START ]
-
-tag_info_t android_request[ANDROID_REQUEST_END -
- ANDROID_REQUEST_START] = {
- TIDX(REQUEST, ID) =
- { "id", TYPE_INT32 },
- TIDX(REQUEST, TYPE) =
- { "type", TYPE_BYTE },
- TIDX(REQUEST, METADATA_MODE) =
- { "metadataMode", TYPE_BYTE },
- TIDX(REQUEST, OUTPUT_STREAMS) =
- { "outputStreams", TYPE_BYTE },
- TIDX(REQUEST, INPUT_STREAMS) =
- { "inputStreams", TYPE_BYTE },
- TIDX(REQUEST, FRAME_COUNT) =
- { "frameCount", TYPE_INT32 }
+static tag_info_t android_color_correction[ANDROID_COLOR_CORRECTION_END -
+ ANDROID_COLOR_CORRECTION_START] = {
+ [ ANDROID_COLOR_CORRECTION_MODE - ANDROID_COLOR_CORRECTION_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_COLOR_CORRECTION_TRANSFORM - ANDROID_COLOR_CORRECTION_START ] =
+ { "transform", TYPE_FLOAT },
};
-tag_info_t android_lens[ANDROID_LENS_END -
- ANDROID_LENS_START] = {
- TIDX(LENS, FOCUS_DISTANCE) =
- { "focusDistance", TYPE_FLOAT },
- TIDX(LENS, APERTURE) =
- { "aperture", TYPE_FLOAT },
- TIDX(LENS, FOCAL_LENGTH) =
- { "focalLength", TYPE_FLOAT },
- TIDX(LENS, FILTER_DENSITY) =
- { "filterDensity", TYPE_FLOAT },
- TIDX(LENS, OPTICAL_STABILIZATION_MODE) =
- { "opticalStabilizationMode", TYPE_BYTE },
- TIDX(LENS, FOCUS_RANGE) =
- { "focusRange", TYPE_FLOAT }
-};
-
-tag_info_t android_lens_info[ANDROID_LENS_INFO_END -
- ANDROID_LENS_INFO_START] = {
- TIIDX(LENS, MINIMUM_FOCUS_DISTANCE) =
- { "minimumFocusDistance", TYPE_FLOAT },
- TIIDX(LENS, HYPERFOCAL_DISTANCE) =
- { "hyperfocalDistance", TYPE_FLOAT },
- TIIDX(LENS, AVAILABLE_FOCAL_LENGTHS) =
- { "availableFocalLengths", TYPE_FLOAT },
- TIIDX(LENS, AVAILABLE_APERTURES) =
- { "availableApertures", TYPE_FLOAT },
- TIIDX(LENS, AVAILABLE_FILTER_DENSITY) =
- { "availableFilterDensities", TYPE_FLOAT },
- TIIDX(LENS, AVAILABLE_OPTICAL_STABILIZATION) =
- { "availableOpticalStabilizationModes", TYPE_BYTE },
- TIIDX(LENS, SHADING_MAP_SIZE) =
- { "shadingMapSize", TYPE_INT32 },
- TIIDX(LENS, SHADING_MAP) =
- { "shadingMap", TYPE_FLOAT },
- TIIDX(LENS, GEOMETRIC_CORRECTION_MAP_SIZE) =
- { "geometricCorrectionMapSize", TYPE_INT32 },
- TIIDX(LENS, GEOMETRIC_CORRECTION_MAP) =
- { "geometricCorrectionMap", TYPE_FLOAT },
- TIIDX(LENS, FACING) =
- { "facing", TYPE_BYTE },
- TIIDX(LENS, POSITION) =
- { "position", TYPE_FLOAT }
-};
-
-tag_info_t android_sensor[ANDROID_SENSOR_END -
- ANDROID_SENSOR_START] = {
- TIDX(SENSOR, EXPOSURE_TIME) =
- { "exposureTime", TYPE_INT64 },
- TIDX(SENSOR, FRAME_DURATION) =
- { "frameDuration", TYPE_INT64 },
- TIDX(SENSOR, SENSITIVITY) =
- { "sensitivity", TYPE_INT32 },
- TIDX(SENSOR, TIMESTAMP) =
- { "timestamp", TYPE_INT64 }
-};
-
-tag_info_t android_sensor_info[ANDROID_SENSOR_INFO_END -
- ANDROID_SENSOR_INFO_START] = {
- TIIDX(SENSOR, EXPOSURE_TIME_RANGE) =
- { "exposureTimeRange", TYPE_INT64 },
- TIIDX(SENSOR, MAX_FRAME_DURATION) =
- { "maxFrameDuration", TYPE_INT64 },
- TIIDX(SENSOR, AVAILABLE_SENSITIVITIES) =
- { "availableSensitivities", TYPE_INT32 },
- TIIDX(SENSOR, COLOR_FILTER_ARRANGEMENT) =
- { "colorFilterArrangement", TYPE_BYTE },
- TIIDX(SENSOR, PHYSICAL_SIZE) =
- { "physicalSize", TYPE_FLOAT },
- TIIDX(SENSOR, PIXEL_ARRAY_SIZE) =
- { "pixelArraySize", TYPE_INT32 },
- TIIDX(SENSOR, ACTIVE_ARRAY_SIZE) =
- { "activeArraySize", TYPE_INT32 },
- TIIDX(SENSOR, WHITE_LEVEL) =
- { "whiteLevel", TYPE_INT32 },
- TIIDX(SENSOR, BLACK_LEVEL_PATTERN) =
- { "blackLevelPattern", TYPE_INT32 },
- TIIDX(SENSOR, COLOR_TRANSFORM_1) =
- { "colorTransform1", TYPE_RATIONAL },
- TIIDX(SENSOR, COLOR_TRANSFORM_2) =
- { "colorTransform2", TYPE_RATIONAL },
- TIIDX(SENSOR, REFERENCE_ILLUMINANT_1) =
- { "referenceIlluminant1", TYPE_BYTE },
- TIIDX(SENSOR, REFERENCE_ILLUMINANT_2) =
- { "referenceIlluminant2", TYPE_BYTE },
- TIIDX(SENSOR, FORWARD_MATRIX_1) =
- { "forwardMatrix1", TYPE_RATIONAL },
- TIIDX(SENSOR, FORWARD_MATRIX_2) =
- { "forwardMatrix2", TYPE_RATIONAL },
- TIIDX(SENSOR, CALIBRATION_TRANSFORM_1) =
- { "calibrationTransform1", TYPE_RATIONAL },
- TIIDX(SENSOR, CALIBRATION_TRANSFORM_2) =
- { "calibrationTransform2", TYPE_RATIONAL },
- TIIDX(SENSOR, BASE_GAIN_FACTOR) =
- { "baseGainFactor", TYPE_RATIONAL },
- TIIDX(SENSOR, MAX_ANALOG_SENSITIVITY) =
- { "maxAnalogSensitivity", TYPE_INT32 },
- TIIDX(SENSOR, NOISE_MODEL_COEFFICIENTS) =
- { "noiseModelCoefficients", TYPE_FLOAT },
- TIIDX(SENSOR, ORIENTATION) =
- { "orientation", TYPE_INT32 }
-};
-
-tag_info_t android_flash[ANDROID_FLASH_END -
- ANDROID_FLASH_START] = {
- TIDX(FLASH, MODE) =
- { "mode", TYPE_BYTE },
- TIDX(FLASH, FIRING_POWER) =
- { "firingPower", TYPE_BYTE },
- TIDX(FLASH, FIRING_TIME) =
- { "firingTime", TYPE_INT64 }
-};
-
-tag_info_t android_flash_info[ANDROID_FLASH_INFO_END -
- ANDROID_FLASH_INFO_START] = {
- TIIDX(FLASH, AVAILABLE) =
- { "available", TYPE_BYTE },
- TIIDX(FLASH, CHARGE_DURATION) =
- { "chargeDuration", TYPE_INT64 },
-};
-
-tag_info_t android_hot_pixel[ANDROID_HOT_PIXEL_END -
- ANDROID_HOT_PIXEL_START] = {
- TIDX(HOT_PIXEL, MODE) =
- { "mode", TYPE_BYTE }
-};
-
-tag_info_t android_hot_pixel_info[ANDROID_HOT_PIXEL_INFO_END -
- ANDROID_HOT_PIXEL_INFO_START];
-
-tag_info_t android_demosaic[ANDROID_DEMOSAIC_END -
- ANDROID_DEMOSAIC_START] = {
- TIDX(DEMOSAIC, MODE) =
- { "mode", TYPE_BYTE }
-};
-
-tag_info_t android_demosaic_info[ANDROID_DEMOSAIC_INFO_END -
- ANDROID_DEMOSAIC_INFO_START];
-
-tag_info_t android_noise[ANDROID_NOISE_END -
- ANDROID_NOISE_START] = {
- TIDX(NOISE, MODE) =
- { "mode", TYPE_BYTE },
- TIDX(NOISE, STRENGTH) =
- { "strength", TYPE_BYTE }
-};
-
-tag_info_t android_noise_info[ANDROID_NOISE_INFO_END -
- ANDROID_NOISE_INFO_START];
-
-tag_info_t android_shading[ANDROID_SHADING_END -
- ANDROID_SHADING_START] = {
- TIDX(SHADING, MODE) =
- { "mode", TYPE_BYTE }
-};
-
-tag_info_t android_shading_info[ANDROID_SHADING_INFO_END -
- ANDROID_SHADING_INFO_START];
-
-tag_info_t android_geometric[ANDROID_GEOMETRIC_END -
- ANDROID_GEOMETRIC_START] = {
- TIDX(GEOMETRIC, MODE) =
- { "mode", TYPE_BYTE }
-};
-
-tag_info_t android_geometric_info[ANDROID_GEOMETRIC_INFO_END -
- ANDROID_GEOMETRIC_INFO_START];
-
-tag_info_t android_color[ANDROID_COLOR_END -
- ANDROID_COLOR_START] = {
- TIDX(COLOR, MODE) =
- { "mode", TYPE_BYTE },
- TIDX(COLOR, TRANSFORM) =
- { "transform", TYPE_FLOAT }
-};
-
-tag_info_t android_color_info[ANDROID_COLOR_INFO_END -
- ANDROID_COLOR_INFO_START];
-
-tag_info_t android_tonemap[ANDROID_TONEMAP_END -
- ANDROID_TONEMAP_START] = {
- TIDX(TONEMAP, MODE) =
- { "mode", TYPE_BYTE },
- TIDX(TONEMAP, CURVE_RED) =
- { "curveRed", TYPE_FLOAT },
- TIDX(TONEMAP, CURVE_GREEN) =
- { "curveGreen", TYPE_FLOAT },
- TIDX(TONEMAP, CURVE_BLUE) =
- { "curveBlue", TYPE_FLOAT }
-};
-
-tag_info_t android_tonemap_info[ANDROID_TONEMAP_INFO_END -
- ANDROID_TONEMAP_INFO_START] = {
- TIIDX(TONEMAP, MAX_CURVE_POINTS) =
- { "maxCurvePoints", TYPE_INT32 }
-};
-
-tag_info_t android_edge[ANDROID_EDGE_END -
- ANDROID_EDGE_START] = {
- TIDX(EDGE, MODE) =
- { "mode", TYPE_BYTE },
- TIDX(EDGE, STRENGTH) =
- { "strength", TYPE_BYTE }
-};
-
-tag_info_t android_edge_info[ANDROID_EDGE_INFO_END -
- ANDROID_EDGE_INFO_START];
-
-tag_info_t android_scaler[ANDROID_SCALER_END -
- ANDROID_SCALER_START] = {
- TIDX(SCALER, CROP_REGION) =
- { "cropRegion", TYPE_INT32 }
-};
-
-tag_info_t android_scaler_info[ANDROID_SCALER_INFO_END -
- ANDROID_SCALER_INFO_START] = {
- TIIDX(SCALER, AVAILABLE_FORMATS) =
- { "availableFormats", TYPE_INT32 },
- TIIDX(SCALER, AVAILABLE_RAW_SIZES) =
- { "availableRawSizes", TYPE_INT32 },
- TIIDX(SCALER, AVAILABLE_RAW_MIN_DURATIONS) =
- { "availableRawMinDurations", TYPE_INT64 },
- TIIDX(SCALER, AVAILABLE_PROCESSED_SIZES) =
- { "availableProcessedSizes", TYPE_INT32 },
- TIIDX(SCALER, AVAILABLE_PROCESSED_MIN_DURATIONS) =
- { "availableProcessedMinDurations", TYPE_INT64 },
- TIIDX(SCALER, AVAILABLE_JPEG_SIZES) =
- { "availableJpegSizes", TYPE_INT32 },
- TIIDX(SCALER, AVAILABLE_JPEG_MIN_DURATIONS) =
- { "availableJpegMinDurations", TYPE_INT64 },
- TIIDX(SCALER, AVAILABLE_MAX_ZOOM) =
- { "availableMaxDigitalZoom", TYPE_INT32 }
-};
-
-tag_info_t android_jpeg[ANDROID_JPEG_END -
- ANDROID_JPEG_START] = {
- TIDX(JPEG, QUALITY) =
- { "quality", TYPE_INT32 },
- TIDX(JPEG, THUMBNAIL_SIZE) =
- { "thumbnailSize", TYPE_INT32 },
- TIDX(JPEG, THUMBNAIL_QUALITY) =
- { "thumbnailQuality", TYPE_INT32 },
- TIDX(JPEG, GPS_COORDINATES) =
- { "gpsCoordinates", TYPE_DOUBLE },
- TIDX(JPEG, GPS_PROCESSING_METHOD) =
- { "gpsProcessingMethod", TYPE_BYTE },
- TIDX(JPEG, GPS_TIMESTAMP) =
- { "gpsTimestamp", TYPE_INT64 },
- TIDX(JPEG, ORIENTATION) =
- { "orientation", TYPE_INT32 },
- TIDX(JPEG, SIZE) =
- { "size", TYPE_INT32 }
-};
-
-tag_info_t android_jpeg_info[ANDROID_JPEG_INFO_END -
- ANDROID_JPEG_INFO_START] = {
- TIIDX(JPEG, AVAILABLE_THUMBNAIL_SIZES) =
- { "availableThumbnailSizes", TYPE_INT32 },
- TIIDX(JPEG, MAX_SIZE) =
- { "maxSize", TYPE_INT32 }
-};
-
-tag_info_t android_stats[ANDROID_STATS_END -
- ANDROID_STATS_START] = {
- TIDX(STATS, FACE_DETECT_MODE) =
- { "faceDetectMode", TYPE_BYTE },
- TIDX(STATS, FACE_RECTANGLES) =
- { "faceRectangles", TYPE_INT32 },
- TIDX(STATS, FACE_SCORES) =
- { "faceScores", TYPE_BYTE },
- TIDX(STATS, FACE_LANDMARKS) =
- { "faceLandmarks", TYPE_INT32 },
- TIDX(STATS, FACE_IDS) =
- { "faceIds", TYPE_INT32 },
- TIDX(STATS, HISTOGRAM_MODE) =
- { "histogramMode", TYPE_BYTE },
- TIDX(STATS, HISTOGRAM) =
- { "histogram", TYPE_INT32 },
- TIDX(STATS, SHARPNESS_MAP_MODE) =
- { "sharpnessMapMode", TYPE_BYTE },
- TIDX(STATS, SHARPNESS_MAP) =
- { "sharpnessMap", TYPE_INT32 }
-};
-
-tag_info_t android_stats_info[ANDROID_STATS_INFO_END -
- ANDROID_STATS_INFO_START] = {
- TIIDX(STATS, AVAILABLE_FACE_DETECT_MODES) =
- { "availableFaceDetectModes", TYPE_BYTE },
- TIIDX(STATS, MAX_FACE_COUNT) =
- { "maxFaceCount", TYPE_INT32 },
- TIIDX(STATS, HISTOGRAM_BUCKET_COUNT) =
- { "histogramBucketCount", TYPE_INT32 },
- TIIDX(STATS, MAX_HISTOGRAM_COUNT) =
- { "maxHistogramCount", TYPE_INT32 },
- TIIDX(STATS, SHARPNESS_MAP_SIZE) =
- { "sharpnessMapSize", TYPE_INT32 },
- TIIDX(STATS, MAX_SHARPNESS_MAP_VALUE) =
- { "maxSharpnessMapValue", TYPE_INT32 }
-};
-
-
-tag_info_t android_control[ANDROID_CONTROL_END -
+static tag_info_t android_control[ANDROID_CONTROL_END -
ANDROID_CONTROL_START] = {
- TIDX(CONTROL, CAPTURE_INTENT) =
- { "captureIntent", TYPE_BYTE },
- TIDX(CONTROL, MODE) =
- { "mode", TYPE_BYTE },
- TIDX(CONTROL, EFFECT_MODE) =
- { "effectMode", TYPE_BYTE },
- TIDX(CONTROL, SCENE_MODE) =
- { "sceneMode", TYPE_BYTE },
- TIDX(CONTROL, VIDEO_STABILIZATION_MODE) =
- { "videoStabilizationMode", TYPE_BYTE },
- TIDX(CONTROL, AE_MODE) =
- { "aeMode", TYPE_BYTE },
- TIDX(CONTROL, AE_LOCK) =
- { "aeLock", TYPE_BYTE },
- TIDX(CONTROL, AE_REGIONS) =
- { "aeRegions", TYPE_INT32 },
- TIDX(CONTROL, AE_EXP_COMPENSATION) =
- { "aeExposureCompensation", TYPE_INT32 },
- TIDX(CONTROL, AE_TARGET_FPS_RANGE) =
- { "aeTargetFpsRange", TYPE_INT32 },
- TIDX(CONTROL, AE_ANTIBANDING_MODE) =
- { "aeAntibandingMode", TYPE_BYTE },
- TIDX(CONTROL, AE_STATE) =
- { "aeState", TYPE_BYTE },
- TIDX(CONTROL, AE_PRECAPTURE_ID) =
- { "aePrecaptureId", TYPE_INT32},
- TIDX(CONTROL, AWB_MODE) =
- { "awbMode", TYPE_BYTE },
- TIDX(CONTROL, AWB_LOCK) =
- { "awbLock", TYPE_BYTE },
- TIDX(CONTROL, AWB_REGIONS) =
- { "awbRegions", TYPE_INT32 },
- TIDX(CONTROL, AWB_STATE) =
- { "awbState", TYPE_BYTE },
- TIDX(CONTROL, AF_MODE) =
- { "afMode", TYPE_BYTE },
- TIDX(CONTROL, AF_REGIONS) =
- { "afRegions", TYPE_INT32 },
- TIDX(CONTROL, AF_STATE) =
- { "afState", TYPE_BYTE },
- TIDX(CONTROL, AF_TRIGGER_ID) =
- { "afTriggerId", TYPE_INT32 }
+ [ ANDROID_CONTROL_AE_ANTIBANDING_MODE - ANDROID_CONTROL_START ] =
+ { "aeAntibandingMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION - ANDROID_CONTROL_START ] =
+ { "aeExposureCompensation", TYPE_INT32 },
+ [ ANDROID_CONTROL_AE_LOCK - ANDROID_CONTROL_START ] =
+ { "aeLock", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_MODE - ANDROID_CONTROL_START ] =
+ { "aeMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_REGIONS - ANDROID_CONTROL_START ] =
+ { "aeRegions", TYPE_INT32 },
+ [ ANDROID_CONTROL_AE_TARGET_FPS_RANGE - ANDROID_CONTROL_START ] =
+ { "aeTargetFpsRange", TYPE_INT32 },
+ [ ANDROID_CONTROL_AF_MODE - ANDROID_CONTROL_START ] =
+ { "afMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_AF_REGIONS - ANDROID_CONTROL_START ] =
+ { "afRegions", TYPE_INT32 },
+ [ ANDROID_CONTROL_AWB_LOCK - ANDROID_CONTROL_START ] =
+ { "awbLock", TYPE_BYTE },
+ [ ANDROID_CONTROL_AWB_MODE - ANDROID_CONTROL_START ] =
+ { "awbMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_AWB_REGIONS - ANDROID_CONTROL_START ] =
+ { "awbRegions", TYPE_INT32 },
+ [ ANDROID_CONTROL_CAPTURE_INTENT - ANDROID_CONTROL_START ] =
+ { "captureIntent", TYPE_BYTE },
+ [ ANDROID_CONTROL_EFFECT_MODE - ANDROID_CONTROL_START ] =
+ { "effectMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_MODE - ANDROID_CONTROL_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_CONTROL_SCENE_MODE - ANDROID_CONTROL_START ] =
+ { "sceneMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_VIDEO_STABILIZATION_MODE - ANDROID_CONTROL_START ] =
+ { "videoStabilizationMode", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES - ANDROID_CONTROL_START ] =
+ { "aeAvailableAntibandingModes", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_AVAILABLE_MODES - ANDROID_CONTROL_START ] =
+ { "aeAvailableModes", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES - ANDROID_CONTROL_START ] =
+ { "aeAvailableTargetFpsRanges", TYPE_INT32 },
+ [ ANDROID_CONTROL_AE_COMPENSATION_RANGE - ANDROID_CONTROL_START ] =
+ { "aeCompensationRange", TYPE_INT32 },
+ [ ANDROID_CONTROL_AE_COMPENSATION_STEP - ANDROID_CONTROL_START ] =
+ { "aeCompensationStep", TYPE_RATIONAL
+ },
+ [ ANDROID_CONTROL_AF_AVAILABLE_MODES - ANDROID_CONTROL_START ] =
+ { "afAvailableModes", TYPE_BYTE },
+ [ ANDROID_CONTROL_AVAILABLE_EFFECTS - ANDROID_CONTROL_START ] =
+ { "availableEffects", TYPE_BYTE },
+ [ ANDROID_CONTROL_AVAILABLE_SCENE_MODES - ANDROID_CONTROL_START ] =
+ { "availableSceneModes", TYPE_BYTE },
+ [ ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES - ANDROID_CONTROL_START ] =
+ { "availableVideoStabilizationModes",
+ TYPE_BYTE },
+ [ ANDROID_CONTROL_AWB_AVAILABLE_MODES - ANDROID_CONTROL_START ] =
+ { "awbAvailableModes", TYPE_BYTE },
+ [ ANDROID_CONTROL_MAX_REGIONS - ANDROID_CONTROL_START ] =
+ { "maxRegions", TYPE_INT32 },
+ [ ANDROID_CONTROL_SCENE_MODE_OVERRIDES - ANDROID_CONTROL_START ] =
+ { "sceneModeOverrides", TYPE_BYTE },
+ [ ANDROID_CONTROL_AE_PRECAPTURE_ID - ANDROID_CONTROL_START ] =
+ { "aePrecaptureId", TYPE_INT32 },
+ [ ANDROID_CONTROL_AE_STATE - ANDROID_CONTROL_START ] =
+ { "aeState", TYPE_BYTE },
+ [ ANDROID_CONTROL_AF_STATE - ANDROID_CONTROL_START ] =
+ { "afState", TYPE_BYTE },
+ [ ANDROID_CONTROL_AF_TRIGGER_ID - ANDROID_CONTROL_START ] =
+ { "afTriggerId", TYPE_INT32 },
+ [ ANDROID_CONTROL_AWB_STATE - ANDROID_CONTROL_START ] =
+ { "awbState", TYPE_BYTE },
};
-tag_info_t android_control_info[ANDROID_CONTROL_INFO_END -
- ANDROID_CONTROL_INFO_START] = {
- TIIDX(CONTROL, AVAILABLE_SCENE_MODES) =
- { "availableSceneModes", TYPE_BYTE },
- TIIDX(CONTROL, AVAILABLE_EFFECTS) =
- { "availableEffects", TYPE_BYTE },
- TIIDX(CONTROL, MAX_REGIONS) =
- { "maxRegions", TYPE_INT32 },
- TIIDX(CONTROL, AE_AVAILABLE_MODES) =
- { "aeAvailableModes", TYPE_BYTE },
- TIIDX(CONTROL, AE_EXP_COMPENSATION_STEP) =
- { "aeCompensationStep", TYPE_RATIONAL },
- TIIDX(CONTROL, AE_EXP_COMPENSATION_RANGE) =
- { "aeCompensationRange", TYPE_INT32 },
- TIIDX(CONTROL, AE_AVAILABLE_TARGET_FPS_RANGES) =
- { "aeAvailableTargetFpsRanges", TYPE_INT32 },
- TIIDX(CONTROL, AE_AVAILABLE_ANTIBANDING_MODES) =
- { "aeAvailableAntibandingModes", TYPE_BYTE },
- TIIDX(CONTROL, AWB_AVAILABLE_MODES) =
- { "awbAvailableModes", TYPE_BYTE },
- TIIDX(CONTROL, AF_AVAILABLE_MODES) =
- { "afAvailableModes", TYPE_BYTE },
- TIIDX(CONTROL, AVAILABLE_VIDEO_STABILIZATION_MODES) =
- { "availableVideoStabilizationModes", TYPE_BYTE },
- TIIDX(CONTROL, SCENE_MODE_OVERRIDES) =
- { "sceneModeOverrides", TYPE_BYTE }
+static tag_info_t android_demosaic[ANDROID_DEMOSAIC_END -
+ ANDROID_DEMOSAIC_START] = {
+ [ ANDROID_DEMOSAIC_MODE - ANDROID_DEMOSAIC_START ] =
+ { "mode", TYPE_BYTE },
};
-tag_info_t android_quirks_info[ANDROID_QUIRKS_INFO_END -
- ANDROID_QUIRKS_INFO_START] = {
- TIIDX(QUIRKS, TRIGGER_AF_WITH_AUTO) =
- { "triggerAfWithAuto", TYPE_BYTE },
- TIIDX(QUIRKS, USE_ZSL_FORMAT) =
- { "useZslFormat", TYPE_BYTE },
- TIIDX(QUIRKS, METERING_CROP_REGION) =
- { "meteringCropRegion", TYPE_BYTE },
+static tag_info_t android_edge[ANDROID_EDGE_END -
+ ANDROID_EDGE_START] = {
+ [ ANDROID_EDGE_MODE - ANDROID_EDGE_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_EDGE_STRENGTH - ANDROID_EDGE_START ] =
+ { "strength", TYPE_BYTE },
};
-#undef TIDX
-#undef TIIDX
+static tag_info_t android_flash[ANDROID_FLASH_END -
+ ANDROID_FLASH_START] = {
+ [ ANDROID_FLASH_FIRING_POWER - ANDROID_FLASH_START ] =
+ { "firingPower", TYPE_BYTE },
+ [ ANDROID_FLASH_FIRING_TIME - ANDROID_FLASH_START ] =
+ { "firingTime", TYPE_INT64 },
+ [ ANDROID_FLASH_MODE - ANDROID_FLASH_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_FLASH_COLOR_TEMPERATURE - ANDROID_FLASH_START ] =
+ { "colorTemperature", TYPE_BYTE },
+ [ ANDROID_FLASH_MAX_ENERGY - ANDROID_FLASH_START ] =
+ { "maxEnergy", TYPE_BYTE },
+ [ ANDROID_FLASH_STATE - ANDROID_FLASH_START ] =
+ { "state", TYPE_BYTE },
+};
+
+static tag_info_t android_flash_info[ANDROID_FLASH_INFO_END -
+ ANDROID_FLASH_INFO_START] = {
+ [ ANDROID_FLASH_INFO_AVAILABLE - ANDROID_FLASH_INFO_START ] =
+ { "available", TYPE_BYTE },
+ [ ANDROID_FLASH_INFO_CHARGE_DURATION - ANDROID_FLASH_INFO_START ] =
+ { "chargeDuration", TYPE_INT64 },
+};
+
+static tag_info_t android_geometric[ANDROID_GEOMETRIC_END -
+ ANDROID_GEOMETRIC_START] = {
+ [ ANDROID_GEOMETRIC_MODE - ANDROID_GEOMETRIC_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_GEOMETRIC_STRENGTH - ANDROID_GEOMETRIC_START ] =
+ { "strength", TYPE_BYTE },
+};
+
+static tag_info_t android_hot_pixel[ANDROID_HOT_PIXEL_END -
+ ANDROID_HOT_PIXEL_START] = {
+ [ ANDROID_HOT_PIXEL_MODE - ANDROID_HOT_PIXEL_START ] =
+ { "mode", TYPE_BYTE },
+};
+
+static tag_info_t android_hot_pixel_info[ANDROID_HOT_PIXEL_INFO_END -
+ ANDROID_HOT_PIXEL_INFO_START] = {
+ [ ANDROID_HOT_PIXEL_INFO_MAP - ANDROID_HOT_PIXEL_INFO_START ] =
+ { "map", TYPE_INT32 },
+};
+
+static tag_info_t android_jpeg[ANDROID_JPEG_END -
+ ANDROID_JPEG_START] = {
+ [ ANDROID_JPEG_GPS_COORDINATES - ANDROID_JPEG_START ] =
+ { "gpsCoordinates", TYPE_DOUBLE },
+ [ ANDROID_JPEG_GPS_PROCESSING_METHOD - ANDROID_JPEG_START ] =
+ { "gpsProcessingMethod", TYPE_BYTE },
+ [ ANDROID_JPEG_GPS_TIMESTAMP - ANDROID_JPEG_START ] =
+ { "gpsTimestamp", TYPE_INT64 },
+ [ ANDROID_JPEG_ORIENTATION - ANDROID_JPEG_START ] =
+ { "orientation", TYPE_INT32 },
+ [ ANDROID_JPEG_QUALITY - ANDROID_JPEG_START ] =
+ { "quality", TYPE_BYTE },
+ [ ANDROID_JPEG_THUMBNAIL_QUALITY - ANDROID_JPEG_START ] =
+ { "thumbnailQuality", TYPE_BYTE },
+ [ ANDROID_JPEG_THUMBNAIL_SIZE - ANDROID_JPEG_START ] =
+ { "thumbnailSize", TYPE_INT32 },
+ [ ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES - ANDROID_JPEG_START ] =
+ { "availableThumbnailSizes", TYPE_INT32 },
+ [ ANDROID_JPEG_MAX_SIZE - ANDROID_JPEG_START ] =
+ { "maxSize", TYPE_INT32 },
+ [ ANDROID_JPEG_SIZE - ANDROID_JPEG_START ] =
+ { "size", TYPE_INT32 },
+};
+
+static tag_info_t android_lens[ANDROID_LENS_END -
+ ANDROID_LENS_START] = {
+ [ ANDROID_LENS_APERTURE - ANDROID_LENS_START ] =
+ { "aperture", TYPE_FLOAT },
+ [ ANDROID_LENS_FILTER_DENSITY - ANDROID_LENS_START ] =
+ { "filterDensity", TYPE_FLOAT },
+ [ ANDROID_LENS_FOCAL_LENGTH - ANDROID_LENS_START ] =
+ { "focalLength", TYPE_FLOAT },
+ [ ANDROID_LENS_FOCUS_DISTANCE - ANDROID_LENS_START ] =
+ { "focusDistance", TYPE_FLOAT },
+ [ ANDROID_LENS_OPTICAL_STABILIZATION_MODE - ANDROID_LENS_START ] =
+ { "opticalStabilizationMode", TYPE_BYTE },
+ [ ANDROID_LENS_FACING - ANDROID_LENS_START ] =
+ { "facing", TYPE_BYTE },
+ [ ANDROID_LENS_OPTICAL_AXIS_ANGLE - ANDROID_LENS_START ] =
+ { "opticalAxisAngle", TYPE_FLOAT },
+ [ ANDROID_LENS_POSITION - ANDROID_LENS_START ] =
+ { "position", TYPE_FLOAT },
+ [ ANDROID_LENS_FOCUS_RANGE - ANDROID_LENS_START ] =
+ { "focusRange", TYPE_FLOAT },
+ [ ANDROID_LENS_STATE - ANDROID_LENS_START ] =
+ { "state", TYPE_BYTE },
+};
+
+static tag_info_t android_lens_info[ANDROID_LENS_INFO_END -
+ ANDROID_LENS_INFO_START] = {
+ [ ANDROID_LENS_INFO_AVAILABLE_APERTURES - ANDROID_LENS_INFO_START ] =
+ { "availableApertures", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES - ANDROID_LENS_INFO_START ] =
+ { "availableFilterDensities", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS - ANDROID_LENS_INFO_START ] =
+ { "availableFocalLengths", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION - ANDROID_LENS_INFO_START ] =
+ { "availableOpticalStabilization", TYPE_BYTE },
+ [ ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP - ANDROID_LENS_INFO_START ] =
+ { "geometricCorrectionMap", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE - ANDROID_LENS_INFO_START ] =
+ { "geometricCorrectionMapSize", TYPE_INT32 },
+ [ ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE - ANDROID_LENS_INFO_START ] =
+ { "hyperfocalDistance", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE - ANDROID_LENS_INFO_START ] =
+ { "minimumFocusDistance", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_SHADING_MAP - ANDROID_LENS_INFO_START ] =
+ { "shadingMap", TYPE_FLOAT },
+ [ ANDROID_LENS_INFO_SHADING_MAP_SIZE - ANDROID_LENS_INFO_START ] =
+ { "shadingMapSize", TYPE_INT32 },
+};
+
+static tag_info_t android_noise_reduction[ANDROID_NOISE_REDUCTION_END -
+ ANDROID_NOISE_REDUCTION_START] = {
+ [ ANDROID_NOISE_REDUCTION_MODE - ANDROID_NOISE_REDUCTION_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_NOISE_REDUCTION_STRENGTH - ANDROID_NOISE_REDUCTION_START ] =
+ { "strength", TYPE_BYTE },
+};
+
+static tag_info_t android_quirks[ANDROID_QUIRKS_END -
+ ANDROID_QUIRKS_START] = {
+ [ ANDROID_QUIRKS_METERING_CROP_REGION - ANDROID_QUIRKS_START ] =
+ { "meteringCropRegion", TYPE_BYTE },
+ [ ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO - ANDROID_QUIRKS_START ] =
+ { "triggerAfWithAuto", TYPE_BYTE },
+ [ ANDROID_QUIRKS_USE_ZSL_FORMAT - ANDROID_QUIRKS_START ] =
+ { "useZslFormat", TYPE_BYTE },
+};
+
+static tag_info_t android_request[ANDROID_REQUEST_END -
+ ANDROID_REQUEST_START] = {
+ [ ANDROID_REQUEST_FRAME_COUNT - ANDROID_REQUEST_START ] =
+ { "frameCount", TYPE_INT32 },
+ [ ANDROID_REQUEST_ID - ANDROID_REQUEST_START ] =
+ { "id", TYPE_INT32 },
+ [ ANDROID_REQUEST_INPUT_STREAMS - ANDROID_REQUEST_START ] =
+ { "inputStreams", TYPE_BYTE },
+ [ ANDROID_REQUEST_METADATA_MODE - ANDROID_REQUEST_START ] =
+ { "metadataMode", TYPE_BYTE },
+ [ ANDROID_REQUEST_OUTPUT_STREAMS - ANDROID_REQUEST_START ] =
+ { "outputStreams", TYPE_BYTE },
+ [ ANDROID_REQUEST_TYPE - ANDROID_REQUEST_START ] =
+ { "type", TYPE_BYTE },
+ [ ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS - ANDROID_REQUEST_START ] =
+ { "maxNumOutputStreams", TYPE_INT32 },
+ [ ANDROID_REQUEST_MAX_NUM_REPROCESS_STREAMS - ANDROID_REQUEST_START ] =
+ { "maxNumReprocessStreams", TYPE_INT32 },
+};
+
+static tag_info_t android_scaler[ANDROID_SCALER_END -
+ ANDROID_SCALER_START] = {
+ [ ANDROID_SCALER_CROP_REGION - ANDROID_SCALER_START ] =
+ { "cropRegion", TYPE_INT32 },
+ [ ANDROID_SCALER_AVAILABLE_FORMATS - ANDROID_SCALER_START ] =
+ { "availableFormats", TYPE_INT32 },
+ [ ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS - ANDROID_SCALER_START ] =
+ { "availableJpegMinDurations", TYPE_INT64 },
+ [ ANDROID_SCALER_AVAILABLE_JPEG_SIZES - ANDROID_SCALER_START ] =
+ { "availableJpegSizes", TYPE_INT32 },
+ [ ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM - ANDROID_SCALER_START ] =
+ { "availableMaxDigitalZoom", TYPE_INT32 },
+ [ ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS - ANDROID_SCALER_START ] =
+ { "availableProcessedMinDurations",
+ TYPE_INT64 },
+ [ ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES - ANDROID_SCALER_START ] =
+ { "availableProcessedSizes", TYPE_INT32 },
+ [ ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS - ANDROID_SCALER_START ] =
+ { "availableRawMinDurations", TYPE_INT64 },
+ [ ANDROID_SCALER_AVAILABLE_RAW_SIZES - ANDROID_SCALER_START ] =
+ { "availableRawSizes", TYPE_INT32 },
+ [ ANDROID_SCALER_MAX_DIGITAL_ZOOM - ANDROID_SCALER_START ] =
+ { "maxDigitalZoom", TYPE_FLOAT },
+};
+
+static tag_info_t android_sensor[ANDROID_SENSOR_END -
+ ANDROID_SENSOR_START] = {
+ [ ANDROID_SENSOR_EXPOSURE_TIME - ANDROID_SENSOR_START ] =
+ { "exposureTime", TYPE_INT64 },
+ [ ANDROID_SENSOR_FRAME_DURATION - ANDROID_SENSOR_START ] =
+ { "frameDuration", TYPE_INT64 },
+ [ ANDROID_SENSOR_SENSITIVITY - ANDROID_SENSOR_START ] =
+ { "sensitivity", TYPE_INT32 },
+ [ ANDROID_SENSOR_BASE_GAIN_FACTOR - ANDROID_SENSOR_START ] =
+ { "baseGainFactor", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_BLACK_LEVEL_PATTERN - ANDROID_SENSOR_START ] =
+ { "blackLevelPattern", TYPE_INT32 },
+ [ ANDROID_SENSOR_CALIBRATION_TRANSFORM1 - ANDROID_SENSOR_START ] =
+ { "calibrationTransform1", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_CALIBRATION_TRANSFORM2 - ANDROID_SENSOR_START ] =
+ { "calibrationTransform2", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_COLOR_TRANSFORM1 - ANDROID_SENSOR_START ] =
+ { "colorTransform1", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_COLOR_TRANSFORM2 - ANDROID_SENSOR_START ] =
+ { "colorTransform2", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_FORWARD_MATRIX1 - ANDROID_SENSOR_START ] =
+ { "forwardMatrix1", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_FORWARD_MATRIX2 - ANDROID_SENSOR_START ] =
+ { "forwardMatrix2", TYPE_RATIONAL
+ },
+ [ ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY - ANDROID_SENSOR_START ] =
+ { "maxAnalogSensitivity", TYPE_INT32 },
+ [ ANDROID_SENSOR_NOISE_MODEL_COEFFICIENTS - ANDROID_SENSOR_START ] =
+ { "noiseModelCoefficients", TYPE_FLOAT },
+ [ ANDROID_SENSOR_ORIENTATION - ANDROID_SENSOR_START ] =
+ { "orientation", TYPE_INT32 },
+ [ ANDROID_SENSOR_REFERENCE_ILLUMINANT1 - ANDROID_SENSOR_START ] =
+ { "referenceIlluminant1", TYPE_BYTE },
+ [ ANDROID_SENSOR_REFERENCE_ILLUMINANT2 - ANDROID_SENSOR_START ] =
+ { "referenceIlluminant2", TYPE_BYTE },
+ [ ANDROID_SENSOR_TIMESTAMP - ANDROID_SENSOR_START ] =
+ { "timestamp", TYPE_INT64 },
+};
+
+static tag_info_t android_sensor_info[ANDROID_SENSOR_INFO_END -
+ ANDROID_SENSOR_INFO_START] = {
+ [ ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE - ANDROID_SENSOR_INFO_START ] =
+ { "activeArraySize", TYPE_INT32 },
+ [ ANDROID_SENSOR_INFO_AVAILABLE_SENSITIVITIES - ANDROID_SENSOR_INFO_START ] =
+ { "availableSensitivities", TYPE_INT32 },
+ [ ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT - ANDROID_SENSOR_INFO_START ] =
+ { "colorFilterArrangement", TYPE_BYTE },
+ [ ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE - ANDROID_SENSOR_INFO_START ] =
+ { "exposureTimeRange", TYPE_INT64 },
+ [ ANDROID_SENSOR_INFO_MAX_FRAME_DURATION - ANDROID_SENSOR_INFO_START ] =
+ { "maxFrameDuration", TYPE_INT64 },
+ [ ANDROID_SENSOR_INFO_PHYSICAL_SIZE - ANDROID_SENSOR_INFO_START ] =
+ { "physicalSize", TYPE_FLOAT },
+ [ ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE - ANDROID_SENSOR_INFO_START ] =
+ { "pixelArraySize", TYPE_INT32 },
+ [ ANDROID_SENSOR_INFO_WHITE_LEVEL - ANDROID_SENSOR_INFO_START ] =
+ { "whiteLevel", TYPE_INT32 },
+};
+
+static tag_info_t android_shading[ANDROID_SHADING_END -
+ ANDROID_SHADING_START] = {
+ [ ANDROID_SHADING_MODE - ANDROID_SHADING_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_SHADING_STRENGTH - ANDROID_SHADING_START ] =
+ { "strength", TYPE_BYTE },
+};
+
+static tag_info_t android_statistics[ANDROID_STATISTICS_END -
+ ANDROID_STATISTICS_START] = {
+ [ ANDROID_STATISTICS_FACE_DETECT_MODE - ANDROID_STATISTICS_START ] =
+ { "faceDetectMode", TYPE_BYTE },
+ [ ANDROID_STATISTICS_HISTOGRAM_MODE - ANDROID_STATISTICS_START ] =
+ { "histogramMode", TYPE_BYTE },
+ [ ANDROID_STATISTICS_SHARPNESS_MAP_MODE - ANDROID_STATISTICS_START ] =
+ { "sharpnessMapMode", TYPE_BYTE },
+ [ ANDROID_STATISTICS_FACE_IDS - ANDROID_STATISTICS_START ] =
+ { "faceIds", TYPE_INT32 },
+ [ ANDROID_STATISTICS_FACE_LANDMARKS - ANDROID_STATISTICS_START ] =
+ { "faceLandmarks", TYPE_INT32 },
+ [ ANDROID_STATISTICS_FACE_RECTANGLES - ANDROID_STATISTICS_START ] =
+ { "faceRectangles", TYPE_INT32 },
+ [ ANDROID_STATISTICS_FACE_SCORES - ANDROID_STATISTICS_START ] =
+ { "faceScores", TYPE_BYTE },
+ [ ANDROID_STATISTICS_HISTOGRAM - ANDROID_STATISTICS_START ] =
+ { "histogram", TYPE_INT32 },
+ [ ANDROID_STATISTICS_SHARPNESS_MAP - ANDROID_STATISTICS_START ] =
+ { "sharpnessMap", TYPE_INT32 },
+};
+
+static tag_info_t android_statistics_info[ANDROID_STATISTICS_INFO_END -
+ ANDROID_STATISTICS_INFO_START] = {
+ [ ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES - ANDROID_STATISTICS_INFO_START ] =
+ { "availableFaceDetectModes", TYPE_BYTE },
+ [ ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT - ANDROID_STATISTICS_INFO_START ] =
+ { "histogramBucketCount", TYPE_INT32 },
+ [ ANDROID_STATISTICS_INFO_MAX_FACE_COUNT - ANDROID_STATISTICS_INFO_START ] =
+ { "maxFaceCount", TYPE_INT32 },
+ [ ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT - ANDROID_STATISTICS_INFO_START ] =
+ { "maxHistogramCount", TYPE_INT32 },
+ [ ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE - ANDROID_STATISTICS_INFO_START ] =
+ { "maxSharpnessMapValue", TYPE_INT32 },
+ [ ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE - ANDROID_STATISTICS_INFO_START ] =
+ { "sharpnessMapSize", TYPE_INT32 },
+};
+
+static tag_info_t android_tonemap[ANDROID_TONEMAP_END -
+ ANDROID_TONEMAP_START] = {
+ [ ANDROID_TONEMAP_CURVE_BLUE - ANDROID_TONEMAP_START ] =
+ { "curveBlue", TYPE_FLOAT },
+ [ ANDROID_TONEMAP_CURVE_GREEN - ANDROID_TONEMAP_START ] =
+ { "curveGreen", TYPE_FLOAT },
+ [ ANDROID_TONEMAP_CURVE_RED - ANDROID_TONEMAP_START ] =
+ { "curveRed", TYPE_FLOAT },
+ [ ANDROID_TONEMAP_MODE - ANDROID_TONEMAP_START ] =
+ { "mode", TYPE_BYTE },
+ [ ANDROID_TONEMAP_MAX_CURVE_POINTS - ANDROID_TONEMAP_START ] =
+ { "maxCurvePoints", TYPE_INT32 },
+};
+
tag_info_t *tag_info[ANDROID_SECTION_COUNT] = {
- android_request,
- android_lens,
- android_lens_info,
- android_sensor,
- android_sensor_info,
+ android_color_correction,
+ android_control,
+ android_demosaic,
+ android_edge,
android_flash,
android_flash_info,
+ android_geometric,
android_hot_pixel,
android_hot_pixel_info,
- android_demosaic,
- android_demosaic_info,
- android_noise,
- android_noise_info,
- android_shading,
- android_shading_info,
- android_geometric,
- android_geometric_info,
- android_color,
- android_color_info,
- android_tonemap,
- android_tonemap_info,
- android_edge,
- android_edge_info,
- android_scaler,
- android_scaler_info,
android_jpeg,
- android_jpeg_info,
- android_stats,
- android_stats_info,
- android_control,
- android_control_info,
- android_quirks_info
+ android_lens,
+ android_lens_info,
+ android_noise_reduction,
+ android_quirks,
+ android_request,
+ android_scaler,
+ android_sensor,
+ android_sensor_info,
+ android_shading,
+ android_statistics,
+ android_statistics_info,
+ android_tonemap,
};
+
+int camera_metadata_enum_snprint(uint32_t tag,
+ uint32_t value,
+ char *dst,
+ size_t size) {
+ const char *msg = "error: not an enum";
+ int ret = -1;
+
+ switch(tag) {
+ case ANDROID_COLOR_CORRECTION_MODE: {
+ switch (value) {
+ case ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX:
+ msg = "TRANSFORM_MATRIX";
+ ret = 0;
+ break;
+ case ANDROID_COLOR_CORRECTION_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_COLOR_CORRECTION_TRANSFORM: {
+ break;
+ }
+
+ case ANDROID_CONTROL_AE_ANTIBANDING_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ:
+ msg = "50HZ";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ:
+ msg = "60HZ";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO:
+ msg = "AUTO";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_LOCK: {
+ switch (value) {
+ case ANDROID_CONTROL_AE_LOCK_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_LOCK_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AE_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_AE_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_MODE_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
+ msg = "ON_AUTO_FLASH";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
+ msg = "ON_ALWAYS_FLASH";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
+ msg = "ON_AUTO_FLASH_REDEYE";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AE_REGIONS: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_TARGET_FPS_RANGE: {
+ break;
+ }
+ case ANDROID_CONTROL_AF_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_AF_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_MODE_AUTO:
+ msg = "AUTO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_MODE_MACRO:
+ msg = "MACRO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
+ msg = "CONTINUOUS_VIDEO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
+ msg = "CONTINUOUS_PICTURE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_MODE_EDOF:
+ msg = "EDOF";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AF_REGIONS: {
+ break;
+ }
+ case ANDROID_CONTROL_AWB_LOCK: {
+ switch (value) {
+ case ANDROID_CONTROL_AWB_LOCK_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_LOCK_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AWB_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_AWB_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_AUTO:
+ msg = "AUTO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
+ msg = "INCANDESCENT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
+ msg = "FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
+ msg = "WARM_FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
+ msg = "DAYLIGHT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
+ msg = "CLOUDY_DAYLIGHT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
+ msg = "TWILIGHT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_MODE_SHADE:
+ msg = "SHADE";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AWB_REGIONS: {
+ break;
+ }
+ case ANDROID_CONTROL_CAPTURE_INTENT: {
+ switch (value) {
+ case ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM:
+ msg = "CUSTOM";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW:
+ msg = "PREVIEW";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE:
+ msg = "STILL_CAPTURE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD:
+ msg = "VIDEO_RECORD";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT:
+ msg = "VIDEO_SNAPSHOT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG:
+ msg = "ZERO_SHUTTER_LAG";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_EFFECT_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_EFFECT_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_MONO:
+ msg = "MONO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE:
+ msg = "NEGATIVE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE:
+ msg = "SOLARIZE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_SEPIA:
+ msg = "SEPIA";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE:
+ msg = "POSTERIZE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD:
+ msg = "WHITEBOARD";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD:
+ msg = "BLACKBOARD";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_EFFECT_MODE_AQUA:
+ msg = "AQUA";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_MODE_AUTO:
+ msg = "AUTO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_MODE_USE_SCENE_MODE:
+ msg = "USE_SCENE_MODE";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_SCENE_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
+ msg = "UNSUPPORTED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
+ msg = "FACE_PRIORITY";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_ACTION:
+ msg = "ACTION";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
+ msg = "PORTRAIT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
+ msg = "LANDSCAPE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_NIGHT:
+ msg = "NIGHT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
+ msg = "NIGHT_PORTRAIT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_THEATRE:
+ msg = "THEATRE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_BEACH:
+ msg = "BEACH";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_SNOW:
+ msg = "SNOW";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_SUNSET:
+ msg = "SUNSET";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
+ msg = "STEADYPHOTO";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
+ msg = "FIREWORKS";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_SPORTS:
+ msg = "SPORTS";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_PARTY:
+ msg = "PARTY";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
+ msg = "CANDLELIGHT";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_SCENE_MODE_BARCODE:
+ msg = "BARCODE";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE: {
+ switch (value) {
+ case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_AVAILABLE_MODES: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_COMPENSATION_RANGE: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_COMPENSATION_STEP: {
+ break;
+ }
+ case ANDROID_CONTROL_AF_AVAILABLE_MODES: {
+ break;
+ }
+ case ANDROID_CONTROL_AVAILABLE_EFFECTS: {
+ break;
+ }
+ case ANDROID_CONTROL_AVAILABLE_SCENE_MODES: {
+ break;
+ }
+ case ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES: {
+ break;
+ }
+ case ANDROID_CONTROL_AWB_AVAILABLE_MODES: {
+ break;
+ }
+ case ANDROID_CONTROL_MAX_REGIONS: {
+ break;
+ }
+ case ANDROID_CONTROL_SCENE_MODE_OVERRIDES: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_PRECAPTURE_ID: {
+ break;
+ }
+ case ANDROID_CONTROL_AE_STATE: {
+ switch (value) {
+ case ANDROID_CONTROL_AE_STATE_INACTIVE:
+ msg = "INACTIVE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_STATE_SEARCHING:
+ msg = "SEARCHING";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_STATE_CONVERGED:
+ msg = "CONVERGED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_STATE_LOCKED:
+ msg = "LOCKED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
+ msg = "FLASH_REQUIRED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
+ msg = "PRECAPTURE";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AF_STATE: {
+ switch (value) {
+ case ANDROID_CONTROL_AF_STATE_INACTIVE:
+ msg = "INACTIVE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
+ msg = "PASSIVE_SCAN";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
+ msg = "PASSIVE_FOCUSED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
+ msg = "ACTIVE_SCAN";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
+ msg = "FOCUSED_LOCKED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
+ msg = "NOT_FOCUSED_LOCKED";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_CONTROL_AF_TRIGGER_ID: {
+ break;
+ }
+ case ANDROID_CONTROL_AWB_STATE: {
+ switch (value) {
+ case ANDROID_CONTROL_AWB_STATE_INACTIVE:
+ msg = "INACTIVE";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_STATE_SEARCHING:
+ msg = "SEARCHING";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_STATE_CONVERGED:
+ msg = "CONVERGED";
+ ret = 0;
+ break;
+ case ANDROID_CONTROL_AWB_STATE_LOCKED:
+ msg = "LOCKED";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+
+ case ANDROID_DEMOSAIC_MODE: {
+ switch (value) {
+ case ANDROID_DEMOSAIC_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_DEMOSAIC_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+
+ case ANDROID_EDGE_MODE: {
+ switch (value) {
+ case ANDROID_EDGE_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_EDGE_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_EDGE_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_EDGE_STRENGTH: {
+ break;
+ }
+
+ case ANDROID_FLASH_FIRING_POWER: {
+ break;
+ }
+ case ANDROID_FLASH_FIRING_TIME: {
+ break;
+ }
+ case ANDROID_FLASH_MODE: {
+ switch (value) {
+ case ANDROID_FLASH_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_FLASH_MODE_SINGLE:
+ msg = "SINGLE";
+ ret = 0;
+ break;
+ case ANDROID_FLASH_MODE_TORCH:
+ msg = "TORCH";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_FLASH_COLOR_TEMPERATURE: {
+ break;
+ }
+ case ANDROID_FLASH_MAX_ENERGY: {
+ break;
+ }
+ case ANDROID_FLASH_STATE: {
+ switch (value) {
+ case ANDROID_FLASH_STATE_UNAVAILABLE:
+ msg = "UNAVAILABLE";
+ ret = 0;
+ break;
+ case ANDROID_FLASH_STATE_CHARGING:
+ msg = "CHARGING";
+ ret = 0;
+ break;
+ case ANDROID_FLASH_STATE_READY:
+ msg = "READY";
+ ret = 0;
+ break;
+ case ANDROID_FLASH_STATE_FIRED:
+ msg = "FIRED";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+
+ case ANDROID_FLASH_INFO_AVAILABLE: {
+ break;
+ }
+ case ANDROID_FLASH_INFO_CHARGE_DURATION: {
+ break;
+ }
+
+ case ANDROID_GEOMETRIC_MODE: {
+ switch (value) {
+ case ANDROID_GEOMETRIC_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_GEOMETRIC_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_GEOMETRIC_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_GEOMETRIC_STRENGTH: {
+ break;
+ }
+
+ case ANDROID_HOT_PIXEL_MODE: {
+ switch (value) {
+ case ANDROID_HOT_PIXEL_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_HOT_PIXEL_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+
+ case ANDROID_HOT_PIXEL_INFO_MAP: {
+ break;
+ }
+
+ case ANDROID_JPEG_GPS_COORDINATES: {
+ break;
+ }
+ case ANDROID_JPEG_GPS_PROCESSING_METHOD: {
+ break;
+ }
+ case ANDROID_JPEG_GPS_TIMESTAMP: {
+ break;
+ }
+ case ANDROID_JPEG_ORIENTATION: {
+ break;
+ }
+ case ANDROID_JPEG_QUALITY: {
+ break;
+ }
+ case ANDROID_JPEG_THUMBNAIL_QUALITY: {
+ break;
+ }
+ case ANDROID_JPEG_THUMBNAIL_SIZE: {
+ break;
+ }
+ case ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES: {
+ break;
+ }
+ case ANDROID_JPEG_MAX_SIZE: {
+ break;
+ }
+ case ANDROID_JPEG_SIZE: {
+ break;
+ }
+
+ case ANDROID_LENS_APERTURE: {
+ break;
+ }
+ case ANDROID_LENS_FILTER_DENSITY: {
+ break;
+ }
+ case ANDROID_LENS_FOCAL_LENGTH: {
+ break;
+ }
+ case ANDROID_LENS_FOCUS_DISTANCE: {
+ break;
+ }
+ case ANDROID_LENS_OPTICAL_STABILIZATION_MODE: {
+ switch (value) {
+ case ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_LENS_FACING: {
+ switch (value) {
+ case ANDROID_LENS_FACING_FRONT:
+ msg = "FRONT";
+ ret = 0;
+ break;
+ case ANDROID_LENS_FACING_BACK:
+ msg = "BACK";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_LENS_OPTICAL_AXIS_ANGLE: {
+ break;
+ }
+ case ANDROID_LENS_POSITION: {
+ break;
+ }
+ case ANDROID_LENS_FOCUS_RANGE: {
+ break;
+ }
+ case ANDROID_LENS_STATE: {
+ switch (value) {
+ case ANDROID_LENS_STATE_STATIONARY:
+ msg = "STATIONARY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+
+ case ANDROID_LENS_INFO_AVAILABLE_APERTURES: {
+ break;
+ }
+ case ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES: {
+ break;
+ }
+ case ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS: {
+ break;
+ }
+ case ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION: {
+ break;
+ }
+ case ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP: {
+ break;
+ }
+ case ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE: {
+ break;
+ }
+ case ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE: {
+ break;
+ }
+ case ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE: {
+ break;
+ }
+ case ANDROID_LENS_INFO_SHADING_MAP: {
+ break;
+ }
+ case ANDROID_LENS_INFO_SHADING_MAP_SIZE: {
+ break;
+ }
+
+ case ANDROID_NOISE_REDUCTION_MODE: {
+ switch (value) {
+ case ANDROID_NOISE_REDUCTION_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_NOISE_REDUCTION_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_NOISE_REDUCTION_STRENGTH: {
+ break;
+ }
+
+ case ANDROID_QUIRKS_METERING_CROP_REGION: {
+ break;
+ }
+ case ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO: {
+ break;
+ }
+ case ANDROID_QUIRKS_USE_ZSL_FORMAT: {
+ break;
+ }
+
+ case ANDROID_REQUEST_FRAME_COUNT: {
+ break;
+ }
+ case ANDROID_REQUEST_ID: {
+ break;
+ }
+ case ANDROID_REQUEST_INPUT_STREAMS: {
+ break;
+ }
+ case ANDROID_REQUEST_METADATA_MODE: {
+ switch (value) {
+ case ANDROID_REQUEST_METADATA_MODE_NONE:
+ msg = "NONE";
+ ret = 0;
+ break;
+ case ANDROID_REQUEST_METADATA_MODE_FULL:
+ msg = "FULL";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_REQUEST_OUTPUT_STREAMS: {
+ break;
+ }
+ case ANDROID_REQUEST_TYPE: {
+ switch (value) {
+ case ANDROID_REQUEST_TYPE_CAPTURE:
+ msg = "CAPTURE";
+ ret = 0;
+ break;
+ case ANDROID_REQUEST_TYPE_REPROCESS:
+ msg = "REPROCESS";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS: {
+ break;
+ }
+ case ANDROID_REQUEST_MAX_NUM_REPROCESS_STREAMS: {
+ break;
+ }
+
+ case ANDROID_SCALER_CROP_REGION: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_FORMATS: {
+ switch (value) {
+ case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_SENSOR:
+ msg = "RAW_SENSOR";
+ ret = 0;
+ break;
+ case ANDROID_SCALER_AVAILABLE_FORMATS_YV12:
+ msg = "YV12";
+ ret = 0;
+ break;
+ case ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_SP:
+ msg = "YCbCr_420_SP";
+ ret = 0;
+ break;
+ case ANDROID_SCALER_AVAILABLE_FORMATS_JPEG:
+ msg = "JPEG";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_JPEG_SIZES: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS: {
+ break;
+ }
+ case ANDROID_SCALER_AVAILABLE_RAW_SIZES: {
+ break;
+ }
+ case ANDROID_SCALER_MAX_DIGITAL_ZOOM: {
+ break;
+ }
+
+ case ANDROID_SENSOR_EXPOSURE_TIME: {
+ break;
+ }
+ case ANDROID_SENSOR_FRAME_DURATION: {
+ break;
+ }
+ case ANDROID_SENSOR_SENSITIVITY: {
+ break;
+ }
+ case ANDROID_SENSOR_BASE_GAIN_FACTOR: {
+ break;
+ }
+ case ANDROID_SENSOR_BLACK_LEVEL_PATTERN: {
+ break;
+ }
+ case ANDROID_SENSOR_CALIBRATION_TRANSFORM1: {
+ break;
+ }
+ case ANDROID_SENSOR_CALIBRATION_TRANSFORM2: {
+ break;
+ }
+ case ANDROID_SENSOR_COLOR_TRANSFORM1: {
+ break;
+ }
+ case ANDROID_SENSOR_COLOR_TRANSFORM2: {
+ break;
+ }
+ case ANDROID_SENSOR_FORWARD_MATRIX1: {
+ break;
+ }
+ case ANDROID_SENSOR_FORWARD_MATRIX2: {
+ break;
+ }
+ case ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY: {
+ break;
+ }
+ case ANDROID_SENSOR_NOISE_MODEL_COEFFICIENTS: {
+ break;
+ }
+ case ANDROID_SENSOR_ORIENTATION: {
+ break;
+ }
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1: {
+ switch (value) {
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT:
+ msg = "DAYLIGHT";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT:
+ msg = "FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN:
+ msg = "TUNGSTEN";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FLASH:
+ msg = "FLASH";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER:
+ msg = "FINE_WEATHER";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER:
+ msg = "CLOUDY_WEATHER";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_SHADE:
+ msg = "SHADE";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT:
+ msg = "DAYLIGHT_FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT:
+ msg = "DAY_WHITE_FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT:
+ msg = "COOL_WHITE_FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT:
+ msg = "WHITE_FLUORESCENT";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A:
+ msg = "STANDARD_A";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B:
+ msg = "STANDARD_B";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C:
+ msg = "STANDARD_C";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D55:
+ msg = "D55";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D65:
+ msg = "D65";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D75:
+ msg = "D75";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D50:
+ msg = "D50";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN:
+ msg = "ISO_STUDIO_TUNGSTEN";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_SENSOR_REFERENCE_ILLUMINANT2: {
+ break;
+ }
+ case ANDROID_SENSOR_TIMESTAMP: {
+ break;
+ }
+
+ case ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE: {
+ break;
+ }
+ case ANDROID_SENSOR_INFO_AVAILABLE_SENSITIVITIES: {
+ break;
+ }
+ case ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT: {
+ switch (value) {
+ case ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB:
+ msg = "RGGB";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG:
+ msg = "GRBG";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG:
+ msg = "GBRG";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR:
+ msg = "BGGR";
+ ret = 0;
+ break;
+ case ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB:
+ msg = "RGB";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE: {
+ break;
+ }
+ case ANDROID_SENSOR_INFO_MAX_FRAME_DURATION: {
+ break;
+ }
+ case ANDROID_SENSOR_INFO_PHYSICAL_SIZE: {
+ break;
+ }
+ case ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE: {
+ break;
+ }
+ case ANDROID_SENSOR_INFO_WHITE_LEVEL: {
+ break;
+ }
+
+ case ANDROID_SHADING_MODE: {
+ switch (value) {
+ case ANDROID_SHADING_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_SHADING_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_SHADING_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_SHADING_STRENGTH: {
+ break;
+ }
+
+ case ANDROID_STATISTICS_FACE_DETECT_MODE: {
+ switch (value) {
+ case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE:
+ msg = "SIMPLE";
+ ret = 0;
+ break;
+ case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL:
+ msg = "FULL";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_STATISTICS_HISTOGRAM_MODE: {
+ switch (value) {
+ case ANDROID_STATISTICS_HISTOGRAM_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_STATISTICS_HISTOGRAM_MODE_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_STATISTICS_SHARPNESS_MAP_MODE: {
+ switch (value) {
+ case ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF:
+ msg = "OFF";
+ ret = 0;
+ break;
+ case ANDROID_STATISTICS_SHARPNESS_MAP_MODE_ON:
+ msg = "ON";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_STATISTICS_FACE_IDS: {
+ break;
+ }
+ case ANDROID_STATISTICS_FACE_LANDMARKS: {
+ break;
+ }
+ case ANDROID_STATISTICS_FACE_RECTANGLES: {
+ break;
+ }
+ case ANDROID_STATISTICS_FACE_SCORES: {
+ break;
+ }
+ case ANDROID_STATISTICS_HISTOGRAM: {
+ break;
+ }
+ case ANDROID_STATISTICS_SHARPNESS_MAP: {
+ break;
+ }
+
+ case ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES: {
+ break;
+ }
+ case ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT: {
+ break;
+ }
+ case ANDROID_STATISTICS_INFO_MAX_FACE_COUNT: {
+ break;
+ }
+ case ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT: {
+ break;
+ }
+ case ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE: {
+ break;
+ }
+ case ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE: {
+ break;
+ }
+
+ case ANDROID_TONEMAP_CURVE_BLUE: {
+ break;
+ }
+ case ANDROID_TONEMAP_CURVE_GREEN: {
+ break;
+ }
+ case ANDROID_TONEMAP_CURVE_RED: {
+ break;
+ }
+ case ANDROID_TONEMAP_MODE: {
+ switch (value) {
+ case ANDROID_TONEMAP_MODE_CONTRAST_CURVE:
+ msg = "CONTRAST_CURVE";
+ ret = 0;
+ break;
+ case ANDROID_TONEMAP_MODE_FAST:
+ msg = "FAST";
+ ret = 0;
+ break;
+ case ANDROID_TONEMAP_MODE_HIGH_QUALITY:
+ msg = "HIGH_QUALITY";
+ ret = 0;
+ break;
+ default:
+ msg = "error: enum value out of range";
+ }
+ break;
+ }
+ case ANDROID_TONEMAP_MAX_CURVE_POINTS: {
+ break;
+ }
+
+ }
+
+ strncpy(dst, msg, size - 1);
+ dst[size - 1] = '\0';
+
+ return ret;
+}
+
+
+#define CAMERA_METADATA_ENUM_STRING_MAX_SIZE 23
diff --git a/camera/tests/camera_metadata_tests.cpp b/camera/tests/camera_metadata_tests.cpp
index 47faf42..4712121 100644
--- a/camera/tests/camera_metadata_tests.cpp
+++ b/camera/tests/camera_metadata_tests.cpp
@@ -20,6 +20,8 @@
#include <errno.h>
+#include <vector>
+#include <algorithm>
#include "gtest/gtest.h"
#include "system/camera_metadata.h"
@@ -226,11 +228,11 @@
0.0f, 0.1f, 0.7f
};
result = add_camera_metadata_entry(m,
- ANDROID_COLOR_TRANSFORM,
+ ANDROID_COLOR_CORRECTION_TRANSFORM,
colorTransform, 9);
EXPECT_EQ(OK, result);
data_used += calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(ANDROID_COLOR_TRANSFORM), 9);
+ get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_TRANSFORM), 9);
entries_used++;
// Check added entries
@@ -267,7 +269,7 @@
3, &entry);
EXPECT_EQ(OK, result);
EXPECT_EQ((size_t)3, entry.index);
- EXPECT_EQ(ANDROID_COLOR_TRANSFORM, entry.tag);
+ EXPECT_EQ(ANDROID_COLOR_CORRECTION_TRANSFORM, entry.tag);
EXPECT_EQ(TYPE_FLOAT, entry.type);
EXPECT_EQ((size_t)9, entry.count);
for (unsigned int i=0; i < entry.count; i++) {
@@ -881,7 +883,7 @@
0.0f, 0.1f, 0.7f
};
result = add_camera_metadata_entry(m,
- ANDROID_COLOR_TRANSFORM,
+ ANDROID_COLOR_CORRECTION_TRANSFORM,
colorTransform, 9);
EXPECT_EQ(OK, result);
@@ -916,7 +918,7 @@
EXPECT_EQ(focus_distance, *entry.data.f);
result = find_camera_metadata_entry(m,
- ANDROID_NOISE_STRENGTH,
+ ANDROID_NOISE_REDUCTION_STRENGTH,
&entry);
EXPECT_EQ(NOT_FOUND, result);
EXPECT_EQ((size_t)1, entry.index);
@@ -940,22 +942,35 @@
}
// Test sorted find
+ size_t lensFocusIndex = -1;
+ {
+ std::vector<uint32_t> tags;
+ tags.push_back(ANDROID_COLOR_CORRECTION_TRANSFORM);
+ tags.push_back(ANDROID_LENS_FOCUS_DISTANCE);
+ tags.push_back(ANDROID_SENSOR_EXPOSURE_TIME);
+ tags.push_back(ANDROID_SENSOR_SENSITIVITY);
+ std::sort(tags.begin(), tags.end());
+
+ lensFocusIndex =
+ std::find(tags.begin(), tags.end(), ANDROID_LENS_FOCUS_DISTANCE)
+ - tags.begin();
+ }
result = find_camera_metadata_entry(m,
ANDROID_LENS_FOCUS_DISTANCE,
&entry);
EXPECT_EQ(OK, result);
- EXPECT_EQ((size_t)0, entry.index);
+ EXPECT_EQ(lensFocusIndex, entry.index);
EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
EXPECT_EQ(TYPE_FLOAT, entry.type);
EXPECT_EQ((size_t)1, (size_t)entry.count);
EXPECT_EQ(focus_distance, *entry.data.f);
result = find_camera_metadata_entry(m,
- ANDROID_NOISE_STRENGTH,
+ ANDROID_NOISE_REDUCTION_STRENGTH,
&entry);
EXPECT_EQ(NOT_FOUND, result);
- EXPECT_EQ((size_t)0, entry.index);
+ EXPECT_EQ(lensFocusIndex, entry.index);
EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
EXPECT_EQ(TYPE_FLOAT, entry.type);
EXPECT_EQ((size_t)1, entry.count);
@@ -1751,7 +1766,7 @@
ANDROID_LENS_FOCUS_DISTANCE,
ANDROID_SENSOR_EXPOSURE_TIME,
ANDROID_JPEG_GPS_COORDINATES,
- ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP
+ ANDROID_CONTROL_AE_COMPENSATION_STEP
};
/*