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
24enum vendor_extension_section {
25    FAKEVENDOR_SENSOR = VENDOR_SECTION,
26    FAKEVENDOR_SENSOR_INFO,
27    FAKEVENDOR_COLORCORRECTION,
28    FAKEVENDOR_SCALER,
29    FAKEVENDOR_SECTION_END
30};
31
32const int FAKEVENDOR_SECTION_COUNT = FAKEVENDOR_SECTION_END - VENDOR_SECTION;
33
34enum vendor_extension_section_ranges {
35    FAKEVENDOR_SENSOR_START          = FAKEVENDOR_SENSOR << 16,
36    FAKEVENDOR_SENSOR_I_START        = FAKEVENDOR_SENSOR_INFO << 16,
37    FAKEVENDOR_COLORCORRECTION_START = FAKEVENDOR_COLORCORRECTION << 16,
38    FAKEVENDOR_SCALER_START          = FAKEVENDOR_SCALER << 16
39};
40
41enum vendor_extension_tags {
42    FAKEVENDOR_SENSOR_SUPERMODE = FAKEVENDOR_SENSOR_START,
43    FAKEVENDOR_SENSOR_DOUBLE_EXPOSURE,
44    FAKEVENDOR_SENSOR_END,
45
46    FAKEVENDOR_SENSOR_AVAILABLE_SUPERMODES = FAKEVENDOR_SENSOR_I_START,
47    FAKEVENDOR_SENSOR_I_END,
48
49    FAKEVENDOR_COLORCORRECTION_3DLUT_MODE = FAKEVENDOR_COLORCORRECTION_START,
50    FAKEVENDOR_COLORCORRECTION_3DLUT_TABLES,
51    FAKEVENDOR_COLORCORRECTION_END,
52
53    FAKEVENDOR_SCALER_DOWNSCALE_MODE = FAKEVENDOR_SCALER_START,
54    FAKEVENDOR_SCALER_DOWNSCALE_COEFF,
55    FAKEVENDOR_SCALER_END
56};
57
58typedef struct vendor_tag_info {
59    const char *tag_name;
60    uint8_t     tag_type;
61} vendor_tag_info_t;
62
63const char *fakevendor_section_names[FAKEVENDOR_SECTION_COUNT] = {
64    "com.fakevendor.sensor",
65    "com.fakevendor.sensor.info",
66    "com.fakevendor.colorCorrection",
67    "com.fakevendor.scaler"
68};
69
70unsigned int fakevendor_section_bounds[FAKEVENDOR_SECTION_COUNT][2] = {
71    { FAKEVENDOR_SENSOR_START,          FAKEVENDOR_SENSOR_END },
72    { FAKEVENDOR_SENSOR_I_START,        FAKEVENDOR_SENSOR_I_END },
73    { FAKEVENDOR_COLORCORRECTION_START, FAKEVENDOR_COLORCORRECTION_END },
74    { FAKEVENDOR_SCALER_START,          FAKEVENDOR_SCALER_END}
75};
76
77vendor_tag_info_t fakevendor_sensor[FAKEVENDOR_SENSOR_END -
78        FAKEVENDOR_SENSOR_START] = {
79    { "superMode",       TYPE_BYTE },
80    { "doubleExposure",  TYPE_INT64 }
81};
82
83vendor_tag_info_t fakevendor_sensor_info[FAKEVENDOR_SENSOR_I_END -
84        FAKEVENDOR_SENSOR_I_START] = {
85    { "availableSuperModes",   TYPE_BYTE }
86};
87
88vendor_tag_info_t fakevendor_color_correction[FAKEVENDOR_COLORCORRECTION_END -
89        FAKEVENDOR_COLORCORRECTION_START] = {
90    { "3dLutMode",   TYPE_BYTE },
91    { "3dLutTables", TYPE_FLOAT }
92};
93
94vendor_tag_info_t fakevendor_scaler[FAKEVENDOR_SCALER_END -
95        FAKEVENDOR_SCALER_START] = {
96    { "downscaleMode",  TYPE_BYTE },
97    { "downscaleCoefficients", TYPE_FLOAT }
98};
99
100vendor_tag_info_t *fakevendor_tag_info[FAKEVENDOR_SECTION_COUNT] = {
101    fakevendor_sensor,
102    fakevendor_sensor_info,
103    fakevendor_color_correction,
104    fakevendor_scaler
105};
106
107const char *get_fakevendor_section_name(const vendor_tag_query_ops_t *v,
108        uint32_t tag);
109const char *get_fakevendor_tag_name(const vendor_tag_query_ops_t *v,
110        uint32_t tag);
111int get_fakevendor_tag_type(const vendor_tag_query_ops_t *v,
112        uint32_t tag);
113int get_fakevendor_tag_count(const vendor_tag_query_ops_t *v);
114void get_fakevendor_tags(const vendor_tag_query_ops_t *v, uint32_t *tag_array);
115
116static const vendor_tag_query_ops_t fakevendor_query_ops = {
117    get_fakevendor_section_name,
118    get_fakevendor_tag_name,
119    get_fakevendor_tag_type,
120    get_fakevendor_tag_count,
121    get_fakevendor_tags
122};
123
124const char *get_fakevendor_section_name(const vendor_tag_query_ops_t *v,
125        uint32_t tag) {
126    if (v != &fakevendor_query_ops) return NULL;
127    int tag_section = (tag >> 16) - VENDOR_SECTION;
128    if (tag_section < 0 ||
129            tag_section >= FAKEVENDOR_SECTION_COUNT) return NULL;
130
131    return fakevendor_section_names[tag_section];
132}
133
134const char *get_fakevendor_tag_name(const vendor_tag_query_ops_t *v,
135        uint32_t tag) {
136    if (v != &fakevendor_query_ops) return NULL;
137    int tag_section = (tag >> 16) - VENDOR_SECTION;
138    if (tag_section < 0
139            || tag_section >= FAKEVENDOR_SECTION_COUNT
140            || tag >= fakevendor_section_bounds[tag_section][1]) return NULL;
141    int tag_index = tag & 0xFFFF;
142    return fakevendor_tag_info[tag_section][tag_index].tag_name;
143}
144
145int get_fakevendor_tag_type(const vendor_tag_query_ops_t *v,
146        uint32_t tag) {
147    if (v != &fakevendor_query_ops) return -1;
148    int tag_section = (tag >> 16) - VENDOR_SECTION;
149    if (tag_section < 0
150            || tag_section >= FAKEVENDOR_SECTION_COUNT
151            || tag >= fakevendor_section_bounds[tag_section][1]) return -1;
152    int tag_index = tag & 0xFFFF;
153    return fakevendor_tag_info[tag_section][tag_index].tag_type;
154}
155
156int get_fakevendor_tag_count(const vendor_tag_query_ops_t *v) {
157    int section;
158    unsigned int start, end;
159    int count = 0;
160
161    if (v != &fakevendor_query_ops) return -1;
162    for (section = 0; section < FAKEVENDOR_SECTION_COUNT; section++) {
163        start = fakevendor_section_bounds[section][0];
164        end = fakevendor_section_bounds[section][1];
165        count += end - start;
166    }
167    return count;
168}
169
170void get_fakevendor_tags(const vendor_tag_query_ops_t *v, uint32_t *tag_array) {
171    int section;
172    unsigned int start, end, tag;
173
174    if (v != &fakevendor_query_ops || tag_array == NULL) return;
175    for (section = 0; section < FAKEVENDOR_SECTION_COUNT; section++) {
176        start = fakevendor_section_bounds[section][0];
177        end = fakevendor_section_bounds[section][1];
178        for (tag = start; tag < end; tag++) {
179            *tag_array++ = tag;
180        }
181    }
182}
183
184#endif
185