Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * Fake vendor extensions for testing
     19  */
     20 
     21 #ifndef TESTING_CAMERA_METADATA_FAKEVENDOR_H
     22 #define TESTING_CAMERA_METADATA_FAKEVENDOR_H
     23 
     24 #include <stdint.h>
     25 
     26 #include <system/camera_metadata.h>
     27 #include <system/camera_vendor_tags.h>
     28 
     29 enum vendor_extension_section {
     30     FAKEVENDOR_SENSOR = VENDOR_SECTION,
     31     FAKEVENDOR_SENSOR_INFO,
     32     FAKEVENDOR_COLORCORRECTION,
     33     FAKEVENDOR_SCALER,
     34     FAKEVENDOR_SECTION_END
     35 };
     36 
     37 const int FAKEVENDOR_SECTION_COUNT = FAKEVENDOR_SECTION_END - VENDOR_SECTION;
     38 
     39 enum vendor_extension_section_ranges {
     40     FAKEVENDOR_SENSOR_START          = FAKEVENDOR_SENSOR << 16,
     41     FAKEVENDOR_SENSOR_I_START        = FAKEVENDOR_SENSOR_INFO << 16,
     42     FAKEVENDOR_COLORCORRECTION_START = FAKEVENDOR_COLORCORRECTION << 16,
     43     FAKEVENDOR_SCALER_START          = FAKEVENDOR_SCALER << 16
     44 };
     45 
     46 enum vendor_extension_tags {
     47     FAKEVENDOR_SENSOR_SUPERMODE = FAKEVENDOR_SENSOR_START,
     48     FAKEVENDOR_SENSOR_DOUBLE_EXPOSURE,
     49     FAKEVENDOR_SENSOR_END,
     50 
     51     FAKEVENDOR_SENSOR_AVAILABLE_SUPERMODES = FAKEVENDOR_SENSOR_I_START,
     52     FAKEVENDOR_SENSOR_I_END,
     53 
     54     FAKEVENDOR_COLORCORRECTION_3DLUT_MODE = FAKEVENDOR_COLORCORRECTION_START,
     55     FAKEVENDOR_COLORCORRECTION_3DLUT_TABLES,
     56     FAKEVENDOR_COLORCORRECTION_END,
     57 
     58     FAKEVENDOR_SCALER_DOWNSCALE_MODE = FAKEVENDOR_SCALER_START,
     59     FAKEVENDOR_SCALER_DOWNSCALE_COEFF,
     60     FAKEVENDOR_SCALER_END
     61 };
     62 
     63 typedef struct vendor_tag_info {
     64     const char *tag_name;
     65     uint8_t     tag_type;
     66 } vendor_tag_info_t;
     67 
     68 const char *fakevendor_section_names[FAKEVENDOR_SECTION_COUNT] = {
     69     "com.fakevendor.sensor",
     70     "com.fakevendor.sensor.info",
     71     "com.fakevendor.colorCorrection",
     72     "com.fakevendor.scaler"
     73 };
     74 
     75 uint32_t fakevendor_section_bounds[FAKEVENDOR_SECTION_COUNT][2] = {
     76     { (uint32_t) FAKEVENDOR_SENSOR_START,          (uint32_t) FAKEVENDOR_SENSOR_END },
     77     { (uint32_t) FAKEVENDOR_SENSOR_I_START,        (uint32_t) FAKEVENDOR_SENSOR_I_END },
     78     { (uint32_t) FAKEVENDOR_COLORCORRECTION_START, (uint32_t) FAKEVENDOR_COLORCORRECTION_END },
     79     { (uint32_t) FAKEVENDOR_SCALER_START,          (uint32_t) FAKEVENDOR_SCALER_END}
     80 };
     81 
     82 vendor_tag_info_t fakevendor_sensor[FAKEVENDOR_SENSOR_END -
     83         FAKEVENDOR_SENSOR_START] = {
     84     { "superMode",       TYPE_BYTE },
     85     { "doubleExposure",  TYPE_INT64 }
     86 };
     87 
     88 vendor_tag_info_t fakevendor_sensor_info[FAKEVENDOR_SENSOR_I_END -
     89         FAKEVENDOR_SENSOR_I_START] = {
     90     { "availableSuperModes",   TYPE_BYTE }
     91 };
     92 
     93 vendor_tag_info_t fakevendor_color_correction[FAKEVENDOR_COLORCORRECTION_END -
     94         FAKEVENDOR_COLORCORRECTION_START] = {
     95     { "3dLutMode",   TYPE_BYTE },
     96     { "3dLutTables", TYPE_FLOAT }
     97 };
     98 
     99 vendor_tag_info_t fakevendor_scaler[FAKEVENDOR_SCALER_END -
    100         FAKEVENDOR_SCALER_START] = {
    101     { "downscaleMode",  TYPE_BYTE },
    102     { "downscaleCoefficients", TYPE_FLOAT }
    103 };
    104 
    105 vendor_tag_info_t *fakevendor_tag_info[FAKEVENDOR_SECTION_COUNT] = {
    106     fakevendor_sensor,
    107     fakevendor_sensor_info,
    108     fakevendor_color_correction,
    109     fakevendor_scaler
    110 };
    111 
    112 const char *get_fakevendor_section_name(const vendor_tag_ops_t *v,
    113         uint32_t tag);
    114 const char *get_fakevendor_tag_name(const vendor_tag_ops_t *v,
    115         uint32_t tag);
    116 int get_fakevendor_tag_type(const vendor_tag_ops_t *v,
    117         uint32_t tag);
    118 int get_fakevendor_tag_count(const vendor_tag_ops_t *v);
    119 void get_fakevendor_tags(const vendor_tag_ops_t *v, uint32_t *tag_array);
    120 
    121 static const vendor_tag_ops_t fakevendor_ops = {
    122     get_fakevendor_tag_count,
    123     get_fakevendor_tags,
    124     get_fakevendor_section_name,
    125     get_fakevendor_tag_name,
    126     get_fakevendor_tag_type,
    127     {NULL}
    128 };
    129 
    130 const char *get_fakevendor_section_name(const vendor_tag_ops_t *v,
    131         uint32_t tag) {
    132     if (v != &fakevendor_ops) return NULL;
    133     int tag_section = (tag >> 16) - VENDOR_SECTION;
    134     if (tag_section < 0 ||
    135             tag_section >= FAKEVENDOR_SECTION_COUNT) return NULL;
    136 
    137     return fakevendor_section_names[tag_section];
    138 }
    139 
    140 const char *get_fakevendor_tag_name(const vendor_tag_ops_t *v,
    141         uint32_t tag) {
    142     if (v != &fakevendor_ops) return NULL;
    143     int tag_section = (tag >> 16) - VENDOR_SECTION;
    144     if (tag_section < 0
    145             || tag_section >= FAKEVENDOR_SECTION_COUNT
    146             || tag >= fakevendor_section_bounds[tag_section][1]) return NULL;
    147     int tag_index = tag & 0xFFFF;
    148     return fakevendor_tag_info[tag_section][tag_index].tag_name;
    149 }
    150 
    151 int get_fakevendor_tag_type(const vendor_tag_ops_t *v,
    152         uint32_t tag) {
    153     if (v != &fakevendor_ops) return -1;
    154     int tag_section = (tag >> 16) - VENDOR_SECTION;
    155     if (tag_section < 0
    156             || tag_section >= FAKEVENDOR_SECTION_COUNT
    157             || tag >= fakevendor_section_bounds[tag_section][1]) return -1;
    158     int tag_index = tag & 0xFFFF;
    159     return fakevendor_tag_info[tag_section][tag_index].tag_type;
    160 }
    161 
    162 int get_fakevendor_tag_count(const vendor_tag_ops_t *v) {
    163     int section;
    164     unsigned int start, end;
    165     int count = 0;
    166 
    167     if (v != &fakevendor_ops) return -1;
    168     for (section = 0; section < FAKEVENDOR_SECTION_COUNT; section++) {
    169         start = fakevendor_section_bounds[section][0];
    170         end = fakevendor_section_bounds[section][1];
    171         count += end - start;
    172     }
    173     return count;
    174 }
    175 
    176 void get_fakevendor_tags(const vendor_tag_ops_t *v, uint32_t *tag_array) {
    177     int section;
    178     unsigned int start, end, tag;
    179 
    180     if (v != &fakevendor_ops || tag_array == NULL) return;
    181     for (section = 0; section < FAKEVENDOR_SECTION_COUNT; section++) {
    182         start = fakevendor_section_bounds[section][0];
    183         end = fakevendor_section_bounds[section][1];
    184         for (tag = start; tag < end; tag++) {
    185             *tag_array++ = tag;
    186         }
    187     }
    188 }
    189 
    190 #endif
    191