OSDN Git Service

Make camera metadata tag definitions more robust to mismatches.
authorEino-Ville Talvala <etalvala@google.com>
Wed, 11 Apr 2012 23:15:50 +0000 (16:15 -0700)
committerEino-Ville Talvala <etalvala@google.com>
Mon, 16 Apr 2012 17:52:27 +0000 (10:52 -0700)
Use array assignment-by-index syntax to make sure we match the desired
index to the entry, so it's easier to keep the metadata header and the
info structures in sync.

Change-Id: I06d1ea3d52c651b447cc167cd551e907c8e001ab

camera/include/system/camera_metadata_tags.h
camera/src/camera_metadata.c
camera/src/camera_metadata_tag_info.c

index ce1319e..bfb4fe3 100644 (file)
@@ -245,13 +245,13 @@ enum {
     ANDROID_JPEG_INFO_END,
 
     ANDROID_STATS_FACE_DETECT_MODE = ANDROID_STATS_START,
-    ANDROID_STATS_HISTOGRAM_MODE,
-    ANDROID_STATS_SHARPNESS_MAP_MODE,
     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,
 
index c7121ca..1991835 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
+#define _GNU_SOURCE // for fdprintf
 #include <system/camera_metadata.h>
 #include <cutils/log.h>
-#define _GNU_SOURCE // for fdprintf
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
index fada37e..0481eb5 100644 (file)
  *
  * It is logically a part of camera_metadata.c.  It is broken out for ease of
  * maintaining the tag info.
+ *
+ * Array assignments are done using specified-index syntax to keep things in
+ * sync with camera_metadata_tags.h
  */
 
 const char *camera_metadata_section_names[ANDROID_SECTION_COUNT] = {
-    "android.request",
-    "android.control",
-    "android.control.info",
-    "android.sensor",
-    "android.sensor.info",
-    "android.lens",
-    "android.lens.info",
-    "android.flash",
-    "android.flash.info",
-    "android.hotPixel",
-    "android.hotPixel.info",
-    "android.demosaic",
-    "android.demosaic.info",
-    "android.noiseReduction",
-    "android.noiseReduction.info",
-    "android.shadingCorrection",
-    "android.shadingCorrection.info",
-    "android.geometricCorrection",
-    "android.geometricCorrection.info",
-    "android.colorCorrection",
-    "android.colorCorrection.info",
-    "android.tonemap",
-    "android.tonemap.info",
-    "android.edge",
-    "android.edge.info",
-    "android.scaler",
-    "android.scaler.info",
-    "android.jpeg",
-    "android.jpeg.info",
-    "android.statistics",
-    "android.statistics.info"
+    [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"
 };
 
 unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2] = {
-    { ANDROID_REQUEST_START,        ANDROID_REQUEST_END },
-    { ANDROID_LENS_START,           ANDROID_LENS_END },
-    { ANDROID_LENS_INFO_START,      ANDROID_LENS_INFO_END },
-    { ANDROID_SENSOR_START,         ANDROID_SENSOR_END },
-    { ANDROID_SENSOR_INFO_START,    ANDROID_SENSOR_INFO_END },
-    { ANDROID_FLASH_START,          ANDROID_FLASH_END },
-    { ANDROID_FLASH_INFO_START,     ANDROID_FLASH_INFO_END },
-    { ANDROID_HOT_PIXEL_START,      ANDROID_HOT_PIXEL_END },
-    { ANDROID_HOT_PIXEL_INFO_START, ANDROID_HOT_PIXEL_INFO_END },
-    { ANDROID_DEMOSAIC_START,       ANDROID_DEMOSAIC_END },
-    { ANDROID_DEMOSAIC_INFO_START,  ANDROID_DEMOSAIC_INFO_END },
-    { ANDROID_NOISE_START,          ANDROID_NOISE_END },
-    { ANDROID_NOISE_INFO_START,     ANDROID_NOISE_INFO_END },
-    { ANDROID_SHADING_START,        ANDROID_SHADING_END },
-    { ANDROID_SHADING_INFO_START,   ANDROID_SHADING_INFO_END },
-    { ANDROID_GEOMETRIC_START,      ANDROID_GEOMETRIC_END },
-    { ANDROID_GEOMETRIC_INFO_START, ANDROID_GEOMETRIC_INFO_END },
-    { ANDROID_COLOR_START,          ANDROID_COLOR_END },
-    { ANDROID_COLOR_INFO_START,     ANDROID_COLOR_INFO_END },
-    { ANDROID_TONEMAP_START,        ANDROID_TONEMAP_END },
-    { ANDROID_TONEMAP_INFO_START,   ANDROID_TONEMAP_INFO_END },
-    { ANDROID_EDGE_START,           ANDROID_EDGE_END },
-    { ANDROID_EDGE_INFO_START,      ANDROID_EDGE_INFO_END },
-    { ANDROID_SCALER_START,         ANDROID_SCALER_END },
-    { ANDROID_SCALER_INFO_START,    ANDROID_SCALER_INFO_END },
-    { ANDROID_JPEG_START,           ANDROID_JPEG_END },
-    { ANDROID_JPEG_INFO_START,      ANDROID_JPEG_INFO_END },
-    { ANDROID_STATS_START,          ANDROID_STATS_END },
-    { ANDROID_STATS_INFO_START,     ANDROID_STATS_INFO_END },
-    { ANDROID_CONTROL_START,        ANDROID_CONTROL_END },
-    { ANDROID_CONTROL_INFO_START,   ANDROID_CONTROL_INFO_END }
+    [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 }
 };
 
+// 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] = {
-    { "id",                          TYPE_INT32 },
-    { "metadataMode",                TYPE_BYTE },
-    { "outputStreams",               TYPE_BYTE },
-    { "frameCount",                  TYPE_INT32 }
+    TIDX(REQUEST, ID)             =
+    { "id",            TYPE_INT32 },
+    TIDX(REQUEST, METADATA_MODE)  =
+    { "metadataMode",  TYPE_BYTE },
+    TIDX(REQUEST, OUTPUT_STREAMS) =
+    { "outputStreams", TYPE_BYTE },
+    TIDX(REQUEST, FRAME_COUNT)    =
+    { "frameCount",    TYPE_INT32 }
 };
 
-tag_info_t android_control[ANDROID_CONTROL_END -
-        ANDROID_CONTROL_START] = {
-    { "mode",                        TYPE_BYTE },
-    { "aeMode",                      TYPE_BYTE },
-    { "aeRegions",                   TYPE_INT32 },
-    { "aeExposureCompensation",      TYPE_INT32 },
-    { "aeTargetFpsRange",            TYPE_INT32 },
-    { "aeAntibandingMode",           TYPE_BYTE },
-    { "awbMode",                     TYPE_BYTE },
-    { "awbRegions",                  TYPE_INT32 },
-    { "afMode",                      TYPE_BYTE },
-    { "afRegions",                   TYPE_INT32 },
-    { "afTrigger",                   TYPE_BYTE },
-    { "afState",                     TYPE_BYTE },
-    { "videoStabilizationMode",      TYPE_BYTE }
+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_control_info[ANDROID_CONTROL_INFO_END -
-        ANDROID_CONTROL_INFO_START] = {
-    { "availableModes",              TYPE_BYTE },
-    { "maxRegions",                  TYPE_INT32 },
-    { "aeAvailableModes",            TYPE_BYTE },
-    { "aeCompensationStep",          TYPE_RATIONAL },
-    { "aeCompensationRange",         TYPE_INT32 },
-    { "aeAvailableTargetFpsRanges",  TYPE_INT32 },
-    { "aeAvailableAntibandingModes", TYPE_BYTE },
-    { "awbAvailableModes",           TYPE_BYTE },
-    { "afAvailableModes",            TYPE_BYTE }
+tag_info_t android_lens_info[ANDROID_LENS_INFO_END -
+        ANDROID_LENS_INFO_START] = {
+    TIIDX(LENS, MINIMUM_FOCUS_DISTANCE)  =
+    { "minimumFocusDistance",               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) =
+    { "shadingMap",                         TYPE_FLOAT },
+    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, 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_lens[ANDROID_LENS_END -
-        ANDROID_LENS_START] = {
-    { "focusDistance",            TYPE_FLOAT },
-    { "aperture",                 TYPE_FLOAT },
-    { "focalLength",              TYPE_FLOAT },
-    { "filterDensity",            TYPE_FLOAT },
-    { "opticalStabilizationMode", TYPE_BYTE },
-    { "focusRange",               TYPE_FLOAT }
-};
-
-tag_info_t android_lens_info[ANDROID_LENS_INFO_END -
-        ANDROID_LENS_INFO_START] = {
-    { "minimumFocusDistance",               TYPE_FLOAT },
-    { "availableFocalLengths",              TYPE_FLOAT },
-    { "availableApertures",                 TYPE_FLOAT },
-    { "availableFilterDensities",           TYPE_FLOAT },
-    { "availableOpticalStabilizationModes", TYPE_BYTE },
-    { "shadingMap",                         TYPE_FLOAT },
-    { "geometricCorrectionMap",             TYPE_FLOAT },
-    { "facing",                             TYPE_BYTE },
-    { "position",                           TYPE_FLOAT }
-};
-
 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_MODES) =
     { "available",      TYPE_BYTE },
+    TIIDX(FLASH, CHARGE_DURATION) =
     { "chargeDuration", TYPE_INT64 },
 };
 
 tag_info_t android_hot_pixel[ANDROID_HOT_PIXEL_END -
         ANDROID_HOT_PIXEL_START] = {
-    { "mode",           TYPE_BYTE }
+    TIDX(HOT_PIXEL, MODE) =
+    { "mode", TYPE_BYTE }
 };
 
 tag_info_t android_hot_pixel_info[ANDROID_HOT_PIXEL_INFO_END -
@@ -205,7 +265,8 @@ tag_info_t android_hot_pixel_info[ANDROID_HOT_PIXEL_INFO_END -
 
 tag_info_t android_demosaic[ANDROID_DEMOSAIC_END -
         ANDROID_DEMOSAIC_START] = {
-    { "mode",          TYPE_BYTE }
+    TIDX(DEMOSAIC, MODE) =
+    { "mode", TYPE_BYTE }
 };
 
 tag_info_t android_demosaic_info[ANDROID_DEMOSAIC_INFO_END -
@@ -213,8 +274,10 @@ tag_info_t android_demosaic_info[ANDROID_DEMOSAIC_INFO_END -
 
 tag_info_t android_noise[ANDROID_NOISE_END -
         ANDROID_NOISE_START] = {
-    { "mode",          TYPE_BYTE },
-    { "strength",      TYPE_BYTE }
+    TIDX(NOISE, MODE) =
+    { "mode",     TYPE_BYTE },
+    TIDX(NOISE, STRENGTH) =
+    { "strength", TYPE_BYTE }
 };
 
 tag_info_t android_noise_info[ANDROID_NOISE_INFO_END -
@@ -222,7 +285,8 @@ tag_info_t android_noise_info[ANDROID_NOISE_INFO_END -
 
 tag_info_t android_shading[ANDROID_SHADING_END -
         ANDROID_SHADING_START] = {
-    { "mode",          TYPE_BYTE }
+    TIDX(SHADING, MODE) =
+    { "mode", TYPE_BYTE }
 };
 
 tag_info_t android_shading_info[ANDROID_SHADING_INFO_END -
@@ -230,7 +294,8 @@ tag_info_t android_shading_info[ANDROID_SHADING_INFO_END -
 
 tag_info_t android_geometric[ANDROID_GEOMETRIC_END -
         ANDROID_GEOMETRIC_START] = {
-    { "mode",          TYPE_BYTE }
+    TIDX(GEOMETRIC, MODE) =
+    { "mode", TYPE_BYTE }
 };
 
 tag_info_t android_geometric_info[ANDROID_GEOMETRIC_INFO_END -
@@ -238,31 +303,41 @@ tag_info_t android_geometric_info[ANDROID_GEOMETRIC_INFO_END -
 
 tag_info_t android_color[ANDROID_COLOR_END -
         ANDROID_COLOR_START] = {
-    { "mode",          TYPE_BYTE },
-    { "transform",     TYPE_FLOAT }
+    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] = {
+    TIIDX(COLOR, AVAILABLE_MODES) =
     { "availableModes", TYPE_INT32 }
 };
 
 tag_info_t android_tonemap[ANDROID_TONEMAP_END -
         ANDROID_TONEMAP_START] = {
-    { "mode",          TYPE_BYTE },
-    { "curveRed",      TYPE_FLOAT },
-    { "curveGreen",    TYPE_FLOAT },
-    { "curveBlue",     TYPE_FLOAT }
+    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 }
 };
 
@@ -271,60 +346,148 @@ tag_info_t android_edge_info[ANDROID_EDGE_INFO_END -
 
 tag_info_t android_scaler[ANDROID_SCALER_END -
         ANDROID_SCALER_START] = {
-    { "size",          TYPE_INT32 },
-    { "format",        TYPE_BYTE },
-    { "cropRegion",    TYPE_INT32 },
-    { "rotation",      TYPE_INT32 },
+    TIDX(SCALER, SIZE) =
+    { "size",       TYPE_INT32 },
+    TIDX(SCALER, FORMAT) =
+    { "format",     TYPE_BYTE },
+    TIDX(SCALER, CROP_REGION) =
+    { "cropRegion", TYPE_INT32 },
+    TIDX(SCALER, ROTATION) =
+    { "rotation",   TYPE_INT32 },
 };
 
 tag_info_t android_scaler_info[ANDROID_SCALER_INFO_END -
         ANDROID_SCALER_INFO_START] = {
-    { "availableFormats",            TYPE_INT32 },
-    { "availableSizesPerFormat",     TYPE_INT32 },
-    { "availableSizes",              TYPE_INT32 },
-    { "availableMinFrameDurations",  TYPE_INT32 },
-    { "availableMaxDigitalZoom",     TYPE_INT32 }
+    TIIDX(SCALER, AVAILABLE_FORMATS) =
+    { "availableFormats",           TYPE_INT32 },
+    TIIDX(SCALER, AVAILABLE_SIZES_PER_FORMAT) =
+    { "availableSizesPerFormat",    TYPE_INT32 },
+    TIIDX(SCALER, AVAILABLE_SIZES) =
+    { "availableSizes",             TYPE_INT32 },
+    TIIDX(SCALER, AVAILABLE_MIN_FRAME_DURATIONS) =
+    { "availableMinFrameDurations", 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 }
 };
 
 tag_info_t android_jpeg_info[ANDROID_JPEG_INFO_END -
         ANDROID_JPEG_INFO_START] = {
+    TIIDX(JPEG, AVAILABLE_THUMBNAIL_SIZES) =
     { "availableThumbnailSizes", TYPE_INT32 }
 };
 
 tag_info_t android_stats[ANDROID_STATS_END -
         ANDROID_STATS_START] = {
-    { "faceDetectMode",      TYPE_BYTE },
-    { "faceRectangles",      TYPE_INT32 },
-    { "faceScores",          TYPE_BYTE },
-    { "faceLandmarks",       TYPE_INT32 },
-    { "faceIds",             TYPE_INT32 },
-    { "histogramMode",       TYPE_BYTE },
-    { "histogram",           TYPE_INT32 },
-    { "sharpnessMapMode",    TYPE_BYTE },
-    { "sharpnessMap",        TYPE_INT32 }
+    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] = {
-    { "availableFaceDetectModes",    TYPE_BYTE },
-    { "maxFaceCount",                TYPE_INT32 },
-    { "histogramBucketCount",        TYPE_INT32 },
-    { "maxHistogramCount",           TYPE_INT32 },
-    { "sharpnessMapSize",            TYPE_INT32 },
-    { "maxSharpnessMapValue",        TYPE_INT32 }
+    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 -
+        ANDROID_CONTROL_START] = {
+    TIDX(CONTROL, MODE) =
+    { "mode",                        TYPE_BYTE },
+    TIDX(CONTROL, AE_MODE) =
+    { "aeMode",                      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, AWB_MODE) =
+    { "awbMode",                     TYPE_BYTE },
+    TIDX(CONTROL, AWB_REGIONS) =
+    { "awbRegions",                  TYPE_INT32 },
+    TIDX(CONTROL, AF_MODE) =
+    { "afMode",                      TYPE_BYTE },
+    TIDX(CONTROL, AF_REGIONS) =
+    { "afRegions",                   TYPE_INT32 },
+    TIDX(CONTROL, AF_TRIGGER) =
+    { "afTrigger",                   TYPE_BYTE },
+    TIDX(CONTROL, AF_STATE) =
+    { "afState",                     TYPE_BYTE },
+    TIDX(CONTROL, VIDEO_STABILIZATION_MODE) =
+    { "videoStabilizationMode",      TYPE_BYTE }
+};
+
+tag_info_t android_control_info[ANDROID_CONTROL_INFO_END -
+        ANDROID_CONTROL_INFO_START] = {
+    TIIDX(CONTROL, AVAILABLE_MODES) =
+    { "availableModes",              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 }
+};
+
+#undef TIDX
+#undef TIIDX
+
 tag_info_t *tag_info[ANDROID_SECTION_COUNT] = {
     android_request,
     android_lens,