1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project
3*b9df5ad1SAndroid Build Coastguard Worker *
4*b9df5ad1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b9df5ad1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b9df5ad1SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b9df5ad1SAndroid Build Coastguard Worker *
8*b9df5ad1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b9df5ad1SAndroid Build Coastguard Worker *
10*b9df5ad1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b9df5ad1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b9df5ad1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b9df5ad1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b9df5ad1SAndroid Build Coastguard Worker * limitations under the License.
15*b9df5ad1SAndroid Build Coastguard Worker */
16*b9df5ad1SAndroid Build Coastguard Worker
17*b9df5ad1SAndroid Build Coastguard Worker #define LOG_NDEBUG 1
18*b9df5ad1SAndroid Build Coastguard Worker #define LOG_TAG "camera_metadata_tests"
19*b9df5ad1SAndroid Build Coastguard Worker
20*b9df5ad1SAndroid Build Coastguard Worker #include <errno.h>
21*b9df5ad1SAndroid Build Coastguard Worker
22*b9df5ad1SAndroid Build Coastguard Worker #include <vector>
23*b9df5ad1SAndroid Build Coastguard Worker #include <algorithm>
24*b9df5ad1SAndroid Build Coastguard Worker
25*b9df5ad1SAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*b9df5ad1SAndroid Build Coastguard Worker #include <log/log.h>
27*b9df5ad1SAndroid Build Coastguard Worker
28*b9df5ad1SAndroid Build Coastguard Worker #include "system/camera_metadata.h"
29*b9df5ad1SAndroid Build Coastguard Worker #include "camera_metadata_hidden.h"
30*b9df5ad1SAndroid Build Coastguard Worker
31*b9df5ad1SAndroid Build Coastguard Worker #include "camera_metadata_tests_fake_vendor.h"
32*b9df5ad1SAndroid Build Coastguard Worker
33*b9df5ad1SAndroid Build Coastguard Worker #define EXPECT_NULL(x) EXPECT_EQ((void*)0, x)
34*b9df5ad1SAndroid Build Coastguard Worker #define EXPECT_NOT_NULL(x) EXPECT_NE((void*)0, x)
35*b9df5ad1SAndroid Build Coastguard Worker #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
36*b9df5ad1SAndroid Build Coastguard Worker
37*b9df5ad1SAndroid Build Coastguard Worker #define OK 0
38*b9df5ad1SAndroid Build Coastguard Worker #define ERROR 1
39*b9df5ad1SAndroid Build Coastguard Worker #define NOT_FOUND (-ENOENT)
40*b9df5ad1SAndroid Build Coastguard Worker
41*b9df5ad1SAndroid Build Coastguard Worker #define _Alignas(T) \
42*b9df5ad1SAndroid Build Coastguard Worker ({struct _AlignasStruct { char c; T field; }; \
43*b9df5ad1SAndroid Build Coastguard Worker offsetof(struct _AlignasStruct, field); })
44*b9df5ad1SAndroid Build Coastguard Worker
45*b9df5ad1SAndroid Build Coastguard Worker #define FINISH_USING_CAMERA_METADATA(m) \
46*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL)); \
47*b9df5ad1SAndroid Build Coastguard Worker free_camera_metadata(m); \
48*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,allocate_normal)49*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, allocate_normal) {
50*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
51*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
52*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 32;
53*b9df5ad1SAndroid Build Coastguard Worker
54*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
55*b9df5ad1SAndroid Build Coastguard Worker
56*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m);
57*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
58*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
59*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
60*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
61*b9df5ad1SAndroid Build Coastguard Worker
62*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
63*b9df5ad1SAndroid Build Coastguard Worker }
64*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,allocate_nodata)65*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, allocate_nodata) {
66*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
67*b9df5ad1SAndroid Build Coastguard Worker
68*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(1, 0);
69*b9df5ad1SAndroid Build Coastguard Worker
70*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m);
71*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
72*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, get_camera_metadata_entry_capacity(m));
73*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
74*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
75*b9df5ad1SAndroid Build Coastguard Worker
76*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
77*b9df5ad1SAndroid Build Coastguard Worker }
78*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,clone_nodata)79*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, clone_nodata) {
80*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *src = NULL;
81*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *copy = NULL;
82*b9df5ad1SAndroid Build Coastguard Worker
83*b9df5ad1SAndroid Build Coastguard Worker src = allocate_camera_metadata(10, 0);
84*b9df5ad1SAndroid Build Coastguard Worker
85*b9df5ad1SAndroid Build Coastguard Worker ASSERT_NE((void*)NULL, (void*)src);
86*b9df5ad1SAndroid Build Coastguard Worker copy = clone_camera_metadata(src);
87*b9df5ad1SAndroid Build Coastguard Worker ASSERT_NE((void*)NULL, (void*)copy);
88*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(copy));
89*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(copy));
90*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(copy));
91*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(copy));
92*b9df5ad1SAndroid Build Coastguard Worker
93*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(src);
94*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(copy);
95*b9df5ad1SAndroid Build Coastguard Worker }
96*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,allocate_nothing)97*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, allocate_nothing) {
98*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
99*b9df5ad1SAndroid Build Coastguard Worker
100*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(0, 0);
101*b9df5ad1SAndroid Build Coastguard Worker
102*b9df5ad1SAndroid Build Coastguard Worker ASSERT_NE((void*)NULL, (void*)m);
103*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
104*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(m));
105*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
106*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
107*b9df5ad1SAndroid Build Coastguard Worker }
108*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,place_normal)109*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, place_normal) {
110*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
111*b9df5ad1SAndroid Build Coastguard Worker void *buf = NULL;
112*b9df5ad1SAndroid Build Coastguard Worker
113*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
114*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 32;
115*b9df5ad1SAndroid Build Coastguard Worker
116*b9df5ad1SAndroid Build Coastguard Worker size_t buf_size = calculate_camera_metadata_size(entry_capacity,
117*b9df5ad1SAndroid Build Coastguard Worker data_capacity);
118*b9df5ad1SAndroid Build Coastguard Worker
119*b9df5ad1SAndroid Build Coastguard Worker EXPECT_TRUE(buf_size > 0);
120*b9df5ad1SAndroid Build Coastguard Worker
121*b9df5ad1SAndroid Build Coastguard Worker buf = malloc(buf_size);
122*b9df5ad1SAndroid Build Coastguard Worker
123*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(buf);
124*b9df5ad1SAndroid Build Coastguard Worker
125*b9df5ad1SAndroid Build Coastguard Worker m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
126*b9df5ad1SAndroid Build Coastguard Worker
127*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(buf, (uint8_t*)m);
128*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
129*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
130*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
131*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
132*b9df5ad1SAndroid Build Coastguard Worker
133*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
134*b9df5ad1SAndroid Build Coastguard Worker
135*b9df5ad1SAndroid Build Coastguard Worker free(buf);
136*b9df5ad1SAndroid Build Coastguard Worker }
137*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,place_nospace)138*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, place_nospace) {
139*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
140*b9df5ad1SAndroid Build Coastguard Worker void *buf = NULL;
141*b9df5ad1SAndroid Build Coastguard Worker
142*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
143*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 32;
144*b9df5ad1SAndroid Build Coastguard Worker
145*b9df5ad1SAndroid Build Coastguard Worker size_t buf_size = calculate_camera_metadata_size(entry_capacity,
146*b9df5ad1SAndroid Build Coastguard Worker data_capacity);
147*b9df5ad1SAndroid Build Coastguard Worker
148*b9df5ad1SAndroid Build Coastguard Worker EXPECT_GT(buf_size, (size_t)0);
149*b9df5ad1SAndroid Build Coastguard Worker
150*b9df5ad1SAndroid Build Coastguard Worker buf_size--;
151*b9df5ad1SAndroid Build Coastguard Worker
152*b9df5ad1SAndroid Build Coastguard Worker buf = malloc(buf_size);
153*b9df5ad1SAndroid Build Coastguard Worker
154*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(buf);
155*b9df5ad1SAndroid Build Coastguard Worker
156*b9df5ad1SAndroid Build Coastguard Worker m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
157*b9df5ad1SAndroid Build Coastguard Worker
158*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(m);
159*b9df5ad1SAndroid Build Coastguard Worker
160*b9df5ad1SAndroid Build Coastguard Worker free(buf);
161*b9df5ad1SAndroid Build Coastguard Worker }
162*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,place_extraspace)163*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, place_extraspace) {
164*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
165*b9df5ad1SAndroid Build Coastguard Worker uint8_t *buf = NULL;
166*b9df5ad1SAndroid Build Coastguard Worker
167*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
168*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 32;
169*b9df5ad1SAndroid Build Coastguard Worker const size_t extra_space = 10;
170*b9df5ad1SAndroid Build Coastguard Worker
171*b9df5ad1SAndroid Build Coastguard Worker size_t buf_size = calculate_camera_metadata_size(entry_capacity,
172*b9df5ad1SAndroid Build Coastguard Worker data_capacity);
173*b9df5ad1SAndroid Build Coastguard Worker
174*b9df5ad1SAndroid Build Coastguard Worker EXPECT_GT(buf_size, (size_t)0);
175*b9df5ad1SAndroid Build Coastguard Worker
176*b9df5ad1SAndroid Build Coastguard Worker buf_size += extra_space;
177*b9df5ad1SAndroid Build Coastguard Worker
178*b9df5ad1SAndroid Build Coastguard Worker buf = (uint8_t*)malloc(buf_size);
179*b9df5ad1SAndroid Build Coastguard Worker
180*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(buf);
181*b9df5ad1SAndroid Build Coastguard Worker
182*b9df5ad1SAndroid Build Coastguard Worker m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
183*b9df5ad1SAndroid Build Coastguard Worker
184*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((uint8_t*)m, buf);
185*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
186*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
187*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
188*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
189*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(buf + buf_size - extra_space, (uint8_t*)m + get_camera_metadata_size(m));
190*b9df5ad1SAndroid Build Coastguard Worker
191*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
192*b9df5ad1SAndroid Build Coastguard Worker
193*b9df5ad1SAndroid Build Coastguard Worker free(buf);
194*b9df5ad1SAndroid Build Coastguard Worker }
195*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,get_size)196*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, get_size) {
197*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
198*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
199*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 32;
200*b9df5ad1SAndroid Build Coastguard Worker
201*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
202*b9df5ad1SAndroid Build Coastguard Worker
203*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
204*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_size(m) );
205*b9df5ad1SAndroid Build Coastguard Worker
206*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(calculate_camera_metadata_size(0,0),
207*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_compact_size(m) );
208*b9df5ad1SAndroid Build Coastguard Worker
209*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
210*b9df5ad1SAndroid Build Coastguard Worker }
211*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,add_get_normal)212*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, add_get_normal) {
213*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
214*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
215*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 128;
216*b9df5ad1SAndroid Build Coastguard Worker
217*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
218*b9df5ad1SAndroid Build Coastguard Worker
219*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
220*b9df5ad1SAndroid Build Coastguard Worker
221*b9df5ad1SAndroid Build Coastguard Worker int result;
222*b9df5ad1SAndroid Build Coastguard Worker size_t data_used = 0;
223*b9df5ad1SAndroid Build Coastguard Worker size_t entries_used = 0;
224*b9df5ad1SAndroid Build Coastguard Worker
225*b9df5ad1SAndroid Build Coastguard Worker // INT64
226*b9df5ad1SAndroid Build Coastguard Worker
227*b9df5ad1SAndroid Build Coastguard Worker int64_t exposure_time = 1000000000;
228*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
229*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_EXPOSURE_TIME,
230*b9df5ad1SAndroid Build Coastguard Worker &exposure_time, 1);
231*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
232*b9df5ad1SAndroid Build Coastguard Worker data_used += calculate_camera_metadata_entry_data_size(
233*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
234*b9df5ad1SAndroid Build Coastguard Worker entries_used++;
235*b9df5ad1SAndroid Build Coastguard Worker
236*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
237*b9df5ad1SAndroid Build Coastguard Worker
238*b9df5ad1SAndroid Build Coastguard Worker // INT32
239*b9df5ad1SAndroid Build Coastguard Worker
240*b9df5ad1SAndroid Build Coastguard Worker int32_t sensitivity = 800;
241*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
242*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_SENSITIVITY,
243*b9df5ad1SAndroid Build Coastguard Worker &sensitivity, 1);
244*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
245*b9df5ad1SAndroid Build Coastguard Worker data_used += calculate_camera_metadata_entry_data_size(
246*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_SENSOR_SENSITIVITY), 1);
247*b9df5ad1SAndroid Build Coastguard Worker entries_used++;
248*b9df5ad1SAndroid Build Coastguard Worker
249*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
250*b9df5ad1SAndroid Build Coastguard Worker
251*b9df5ad1SAndroid Build Coastguard Worker // FLOAT
252*b9df5ad1SAndroid Build Coastguard Worker
253*b9df5ad1SAndroid Build Coastguard Worker float focusDistance = 0.5f;
254*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
255*b9df5ad1SAndroid Build Coastguard Worker ANDROID_LENS_FOCUS_DISTANCE,
256*b9df5ad1SAndroid Build Coastguard Worker &focusDistance, 1);
257*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
258*b9df5ad1SAndroid Build Coastguard Worker data_used += calculate_camera_metadata_entry_data_size(
259*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_LENS_FOCUS_DISTANCE), 1);
260*b9df5ad1SAndroid Build Coastguard Worker entries_used++;
261*b9df5ad1SAndroid Build Coastguard Worker
262*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
263*b9df5ad1SAndroid Build Coastguard Worker
264*b9df5ad1SAndroid Build Coastguard Worker // Array of FLOAT
265*b9df5ad1SAndroid Build Coastguard Worker
266*b9df5ad1SAndroid Build Coastguard Worker float colorCorrectionGains[] = {1.69f, 1.00f, 1.00f, 2.41f};
267*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
268*b9df5ad1SAndroid Build Coastguard Worker ANDROID_COLOR_CORRECTION_GAINS,
269*b9df5ad1SAndroid Build Coastguard Worker colorCorrectionGains, ARRAY_SIZE(colorCorrectionGains));
270*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
271*b9df5ad1SAndroid Build Coastguard Worker data_used += calculate_camera_metadata_entry_data_size(
272*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_GAINS),
273*b9df5ad1SAndroid Build Coastguard Worker ARRAY_SIZE(colorCorrectionGains));
274*b9df5ad1SAndroid Build Coastguard Worker entries_used++;
275*b9df5ad1SAndroid Build Coastguard Worker
276*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
277*b9df5ad1SAndroid Build Coastguard Worker
278*b9df5ad1SAndroid Build Coastguard Worker
279*b9df5ad1SAndroid Build Coastguard Worker // Array of RATIONAL
280*b9df5ad1SAndroid Build Coastguard Worker
281*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_rational_t colorTransform[] = {
282*b9df5ad1SAndroid Build Coastguard Worker {9, 10}, {0, 1}, {0, 1},
283*b9df5ad1SAndroid Build Coastguard Worker {1, 5}, {1, 2}, {0, 1},
284*b9df5ad1SAndroid Build Coastguard Worker {0, 1}, {1, 10}, {7, 10}
285*b9df5ad1SAndroid Build Coastguard Worker };
286*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
287*b9df5ad1SAndroid Build Coastguard Worker ANDROID_COLOR_CORRECTION_TRANSFORM,
288*b9df5ad1SAndroid Build Coastguard Worker colorTransform, ARRAY_SIZE(colorTransform));
289*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
290*b9df5ad1SAndroid Build Coastguard Worker data_used += calculate_camera_metadata_entry_data_size(
291*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_TRANSFORM),
292*b9df5ad1SAndroid Build Coastguard Worker ARRAY_SIZE(colorTransform));
293*b9df5ad1SAndroid Build Coastguard Worker entries_used++;
294*b9df5ad1SAndroid Build Coastguard Worker
295*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
296*b9df5ad1SAndroid Build Coastguard Worker
297*b9df5ad1SAndroid Build Coastguard Worker // Check added entries
298*b9df5ad1SAndroid Build Coastguard Worker
299*b9df5ad1SAndroid Build Coastguard Worker size_t index = 0;
300*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry entry;
301*b9df5ad1SAndroid Build Coastguard Worker
302*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
303*b9df5ad1SAndroid Build Coastguard Worker index, &entry);
304*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
305*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(index, entry.index);
306*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
307*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, entry.type);
308*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
309*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposure_time, *entry.data.i64);
310*b9df5ad1SAndroid Build Coastguard Worker index++;
311*b9df5ad1SAndroid Build Coastguard Worker
312*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
313*b9df5ad1SAndroid Build Coastguard Worker index, &entry);
314*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
315*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(index, entry.index);
316*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_SENSITIVITY, entry.tag);
317*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, entry.type);
318*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
319*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(sensitivity, *entry.data.i32);
320*b9df5ad1SAndroid Build Coastguard Worker index++;
321*b9df5ad1SAndroid Build Coastguard Worker
322*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
323*b9df5ad1SAndroid Build Coastguard Worker index, &entry);
324*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
325*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(index, entry.index);
326*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
327*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_FLOAT, entry.type);
328*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
329*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(focusDistance, *entry.data.f);
330*b9df5ad1SAndroid Build Coastguard Worker index++;
331*b9df5ad1SAndroid Build Coastguard Worker
332*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
333*b9df5ad1SAndroid Build Coastguard Worker index, &entry);
334*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
335*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(index, entry.index);
336*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_COLOR_CORRECTION_GAINS, entry.tag);
337*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_FLOAT, entry.type);
338*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ARRAY_SIZE(colorCorrectionGains), entry.count);
339*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < entry.count; i++) {
340*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(colorCorrectionGains[i], entry.data.f[i]);
341*b9df5ad1SAndroid Build Coastguard Worker }
342*b9df5ad1SAndroid Build Coastguard Worker index++;
343*b9df5ad1SAndroid Build Coastguard Worker
344*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
345*b9df5ad1SAndroid Build Coastguard Worker index, &entry);
346*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
347*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(index, entry.index);
348*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_COLOR_CORRECTION_TRANSFORM, entry.tag);
349*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_RATIONAL, entry.type);
350*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ARRAY_SIZE(colorTransform), entry.count);
351*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < entry.count; i++) {
352*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(colorTransform[i].numerator, entry.data.r[i].numerator);
353*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(colorTransform[i].denominator, entry.data.r[i].denominator);
354*b9df5ad1SAndroid Build Coastguard Worker }
355*b9df5ad1SAndroid Build Coastguard Worker index++;
356*b9df5ad1SAndroid Build Coastguard Worker
357*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
358*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_size(m) );
359*b9df5ad1SAndroid Build Coastguard Worker
360*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(calculate_camera_metadata_size(entries_used, data_used),
361*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_compact_size(m) );
362*b9df5ad1SAndroid Build Coastguard Worker
363*b9df5ad1SAndroid Build Coastguard Worker IF_ALOGV() {
364*b9df5ad1SAndroid Build Coastguard Worker dump_camera_metadata(m, 0, 2);
365*b9df5ad1SAndroid Build Coastguard Worker }
366*b9df5ad1SAndroid Build Coastguard Worker
367*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
368*b9df5ad1SAndroid Build Coastguard Worker }
369*b9df5ad1SAndroid Build Coastguard Worker
add_test_metadata(camera_metadata_t * m,int entry_count)370*b9df5ad1SAndroid Build Coastguard Worker void add_test_metadata(camera_metadata_t *m, int entry_count) {
371*b9df5ad1SAndroid Build Coastguard Worker
372*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m);
373*b9df5ad1SAndroid Build Coastguard Worker
374*b9df5ad1SAndroid Build Coastguard Worker int result;
375*b9df5ad1SAndroid Build Coastguard Worker size_t data_used = 0;
376*b9df5ad1SAndroid Build Coastguard Worker size_t entries_used = 0;
377*b9df5ad1SAndroid Build Coastguard Worker int64_t exposure_time;
378*b9df5ad1SAndroid Build Coastguard Worker for (int i=0; i < entry_count; i++ ) {
379*b9df5ad1SAndroid Build Coastguard Worker exposure_time = 100 + i * 100;
380*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
381*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_EXPOSURE_TIME,
382*b9df5ad1SAndroid Build Coastguard Worker &exposure_time, 1);
383*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
384*b9df5ad1SAndroid Build Coastguard Worker data_used += calculate_camera_metadata_entry_data_size(
385*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
386*b9df5ad1SAndroid Build Coastguard Worker entries_used++;
387*b9df5ad1SAndroid Build Coastguard Worker }
388*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_used, get_camera_metadata_data_count(m));
389*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entries_used, get_camera_metadata_entry_count(m));
390*b9df5ad1SAndroid Build Coastguard Worker EXPECT_GE(get_camera_metadata_data_capacity(m),
391*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m));
392*b9df5ad1SAndroid Build Coastguard Worker }
393*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,add_get_toomany)394*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, add_get_toomany) {
395*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
396*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
397*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 50;
398*b9df5ad1SAndroid Build Coastguard Worker int result;
399*b9df5ad1SAndroid Build Coastguard Worker
400*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
401*b9df5ad1SAndroid Build Coastguard Worker
402*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
403*b9df5ad1SAndroid Build Coastguard Worker
404*b9df5ad1SAndroid Build Coastguard Worker int32_t sensitivity = 100;
405*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
406*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_SENSITIVITY,
407*b9df5ad1SAndroid Build Coastguard Worker &sensitivity, 1);
408*b9df5ad1SAndroid Build Coastguard Worker
409*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
410*b9df5ad1SAndroid Build Coastguard Worker
411*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry entry;
412*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < entry_capacity; i++) {
413*b9df5ad1SAndroid Build Coastguard Worker int64_t exposure_time = 100 + i * 100;
414*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
415*b9df5ad1SAndroid Build Coastguard Worker i, &entry);
416*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
417*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, entry.index);
418*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
419*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, entry.type);
420*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
421*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposure_time, *entry.data.i64);
422*b9df5ad1SAndroid Build Coastguard Worker }
423*b9df5ad1SAndroid Build Coastguard Worker entry.tag = 1234;
424*b9df5ad1SAndroid Build Coastguard Worker entry.type = 56;
425*b9df5ad1SAndroid Build Coastguard Worker entry.data.u8 = NULL;
426*b9df5ad1SAndroid Build Coastguard Worker entry.count = 7890;
427*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
428*b9df5ad1SAndroid Build Coastguard Worker entry_capacity, &entry);
429*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
430*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((uint32_t)1234, entry.tag);
431*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((uint8_t)56, entry.type);
432*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(NULL, entry.data.u8);
433*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)7890, entry.count);
434*b9df5ad1SAndroid Build Coastguard Worker
435*b9df5ad1SAndroid Build Coastguard Worker IF_ALOGV() {
436*b9df5ad1SAndroid Build Coastguard Worker dump_camera_metadata(m, 0, 2);
437*b9df5ad1SAndroid Build Coastguard Worker }
438*b9df5ad1SAndroid Build Coastguard Worker
439*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
440*b9df5ad1SAndroid Build Coastguard Worker }
441*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,add_too_much_data)442*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, add_too_much_data) {
443*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
444*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
445*b9df5ad1SAndroid Build Coastguard Worker int result;
446*b9df5ad1SAndroid Build Coastguard Worker size_t data_used = entry_capacity * calculate_camera_metadata_entry_data_size(
447*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
448*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity + 1, data_used);
449*b9df5ad1SAndroid Build Coastguard Worker
450*b9df5ad1SAndroid Build Coastguard Worker
451*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
452*b9df5ad1SAndroid Build Coastguard Worker
453*b9df5ad1SAndroid Build Coastguard Worker int64_t exposure_time = 12345;
454*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
455*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_EXPOSURE_TIME,
456*b9df5ad1SAndroid Build Coastguard Worker &exposure_time, 1);
457*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
458*b9df5ad1SAndroid Build Coastguard Worker
459*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
460*b9df5ad1SAndroid Build Coastguard Worker }
461*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,copy_metadata)462*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, copy_metadata) {
463*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
464*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 50;
465*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 450;
466*b9df5ad1SAndroid Build Coastguard Worker
467*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
468*b9df5ad1SAndroid Build Coastguard Worker
469*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
470*b9df5ad1SAndroid Build Coastguard Worker
471*b9df5ad1SAndroid Build Coastguard Worker size_t buf_size = get_camera_metadata_compact_size(m);
472*b9df5ad1SAndroid Build Coastguard Worker EXPECT_LT((size_t)0, buf_size);
473*b9df5ad1SAndroid Build Coastguard Worker
474*b9df5ad1SAndroid Build Coastguard Worker uint8_t *buf = (uint8_t*)malloc(buf_size);
475*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(buf);
476*b9df5ad1SAndroid Build Coastguard Worker
477*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
478*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m2);
479*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(buf, (uint8_t*)m2);
480*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_count(m),
481*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
482*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m),
483*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
484*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
485*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
486*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_capacity(m2),
487*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
488*b9df5ad1SAndroid Build Coastguard Worker
489*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
490*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e1, e2;
491*b9df5ad1SAndroid Build Coastguard Worker int result;
492*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e1);
493*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
494*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
495*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
496*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
497*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
498*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.type, e2.type);
499*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.count, e2.count);
500*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int j=0;
501*b9df5ad1SAndroid Build Coastguard Worker j < e1.count * camera_metadata_type_size[e1.type];
502*b9df5ad1SAndroid Build Coastguard Worker j++) {
503*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
504*b9df5ad1SAndroid Build Coastguard Worker }
505*b9df5ad1SAndroid Build Coastguard Worker }
506*b9df5ad1SAndroid Build Coastguard Worker
507*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
508*b9df5ad1SAndroid Build Coastguard Worker free(buf);
509*b9df5ad1SAndroid Build Coastguard Worker
510*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
511*b9df5ad1SAndroid Build Coastguard Worker }
512*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,copy_metadata_extraspace)513*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, copy_metadata_extraspace) {
514*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
515*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 12;
516*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 100;
517*b9df5ad1SAndroid Build Coastguard Worker
518*b9df5ad1SAndroid Build Coastguard Worker const size_t extra_space = 10;
519*b9df5ad1SAndroid Build Coastguard Worker
520*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
521*b9df5ad1SAndroid Build Coastguard Worker
522*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
523*b9df5ad1SAndroid Build Coastguard Worker
524*b9df5ad1SAndroid Build Coastguard Worker size_t buf_size = get_camera_metadata_compact_size(m);
525*b9df5ad1SAndroid Build Coastguard Worker EXPECT_LT((size_t)0, buf_size);
526*b9df5ad1SAndroid Build Coastguard Worker buf_size += extra_space;
527*b9df5ad1SAndroid Build Coastguard Worker
528*b9df5ad1SAndroid Build Coastguard Worker uint8_t *buf = (uint8_t*)malloc(buf_size);
529*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(buf);
530*b9df5ad1SAndroid Build Coastguard Worker
531*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
532*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m2);
533*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(buf, (uint8_t*)m2);
534*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_count(m),
535*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
536*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m),
537*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
538*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
539*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
540*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_capacity(m2),
541*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
542*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(buf + buf_size - extra_space,
543*b9df5ad1SAndroid Build Coastguard Worker (uint8_t*)m2 + get_camera_metadata_size(m2) );
544*b9df5ad1SAndroid Build Coastguard Worker
545*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
546*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e1, e2;
547*b9df5ad1SAndroid Build Coastguard Worker
548*b9df5ad1SAndroid Build Coastguard Worker int result;
549*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e1);
550*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
551*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e1.index);
552*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
553*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
554*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
555*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
556*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.type, e2.type);
557*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.count, e2.count);
558*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int j=0;
559*b9df5ad1SAndroid Build Coastguard Worker j < e1.count * camera_metadata_type_size[e1.type];
560*b9df5ad1SAndroid Build Coastguard Worker j++) {
561*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
562*b9df5ad1SAndroid Build Coastguard Worker }
563*b9df5ad1SAndroid Build Coastguard Worker }
564*b9df5ad1SAndroid Build Coastguard Worker
565*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
566*b9df5ad1SAndroid Build Coastguard Worker free(buf);
567*b9df5ad1SAndroid Build Coastguard Worker
568*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
569*b9df5ad1SAndroid Build Coastguard Worker }
570*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,copy_metadata_nospace)571*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, copy_metadata_nospace) {
572*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
573*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
574*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 50;
575*b9df5ad1SAndroid Build Coastguard Worker
576*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
577*b9df5ad1SAndroid Build Coastguard Worker
578*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
579*b9df5ad1SAndroid Build Coastguard Worker
580*b9df5ad1SAndroid Build Coastguard Worker size_t buf_size = get_camera_metadata_compact_size(m);
581*b9df5ad1SAndroid Build Coastguard Worker EXPECT_LT((size_t)0, buf_size);
582*b9df5ad1SAndroid Build Coastguard Worker
583*b9df5ad1SAndroid Build Coastguard Worker buf_size--;
584*b9df5ad1SAndroid Build Coastguard Worker
585*b9df5ad1SAndroid Build Coastguard Worker uint8_t *buf = (uint8_t*)malloc(buf_size);
586*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(buf);
587*b9df5ad1SAndroid Build Coastguard Worker
588*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
589*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(m2);
590*b9df5ad1SAndroid Build Coastguard Worker
591*b9df5ad1SAndroid Build Coastguard Worker free(buf);
592*b9df5ad1SAndroid Build Coastguard Worker
593*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
594*b9df5ad1SAndroid Build Coastguard Worker }
595*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,append_metadata)596*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, append_metadata) {
597*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
598*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
599*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 50;
600*b9df5ad1SAndroid Build Coastguard Worker
601*b9df5ad1SAndroid Build Coastguard Worker int result;
602*b9df5ad1SAndroid Build Coastguard Worker
603*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
604*b9df5ad1SAndroid Build Coastguard Worker
605*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
606*b9df5ad1SAndroid Build Coastguard Worker
607*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = NULL;
608*b9df5ad1SAndroid Build Coastguard Worker
609*b9df5ad1SAndroid Build Coastguard Worker m2 = allocate_camera_metadata(entry_capacity*2, data_capacity*2);
610*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m2);
611*b9df5ad1SAndroid Build Coastguard Worker
612*b9df5ad1SAndroid Build Coastguard Worker result = append_camera_metadata(m2, m);
613*b9df5ad1SAndroid Build Coastguard Worker
614*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
615*b9df5ad1SAndroid Build Coastguard Worker
616*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_count(m),
617*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
618*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m),
619*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
620*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
621*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity*2, get_camera_metadata_data_capacity(m2));
622*b9df5ad1SAndroid Build Coastguard Worker
623*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
624*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e1, e2;
625*b9df5ad1SAndroid Build Coastguard Worker int result;
626*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e1);
627*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
628*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e1.index);
629*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
630*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
631*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
632*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
633*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.type, e2.type);
634*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.count, e2.count);
635*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int j=0;
636*b9df5ad1SAndroid Build Coastguard Worker j < e1.count * camera_metadata_type_size[e1.type];
637*b9df5ad1SAndroid Build Coastguard Worker j++) {
638*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
639*b9df5ad1SAndroid Build Coastguard Worker }
640*b9df5ad1SAndroid Build Coastguard Worker }
641*b9df5ad1SAndroid Build Coastguard Worker
642*b9df5ad1SAndroid Build Coastguard Worker result = append_camera_metadata(m2, m);
643*b9df5ad1SAndroid Build Coastguard Worker
644*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
645*b9df5ad1SAndroid Build Coastguard Worker
646*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_count(m)*2,
647*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
648*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m)*2,
649*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
650*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
651*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity*2, get_camera_metadata_data_capacity(m2));
652*b9df5ad1SAndroid Build Coastguard Worker
653*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
654*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e1, e2;
655*b9df5ad1SAndroid Build Coastguard Worker
656*b9df5ad1SAndroid Build Coastguard Worker int result;
657*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
658*b9df5ad1SAndroid Build Coastguard Worker i % entry_capacity, &e1);
659*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
660*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i % entry_capacity, e1.index);
661*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2,
662*b9df5ad1SAndroid Build Coastguard Worker i, &e2);
663*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
664*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
665*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
666*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.type, e2.type);
667*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.count, e2.count);
668*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int j=0;
669*b9df5ad1SAndroid Build Coastguard Worker j < e1.count * camera_metadata_type_size[e1.type];
670*b9df5ad1SAndroid Build Coastguard Worker j++) {
671*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
672*b9df5ad1SAndroid Build Coastguard Worker }
673*b9df5ad1SAndroid Build Coastguard Worker }
674*b9df5ad1SAndroid Build Coastguard Worker
675*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
676*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m2);
677*b9df5ad1SAndroid Build Coastguard Worker }
678*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,append_metadata_nospace)679*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, append_metadata_nospace) {
680*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
681*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
682*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 50;
683*b9df5ad1SAndroid Build Coastguard Worker
684*b9df5ad1SAndroid Build Coastguard Worker int result;
685*b9df5ad1SAndroid Build Coastguard Worker
686*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
687*b9df5ad1SAndroid Build Coastguard Worker
688*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
689*b9df5ad1SAndroid Build Coastguard Worker
690*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = NULL;
691*b9df5ad1SAndroid Build Coastguard Worker
692*b9df5ad1SAndroid Build Coastguard Worker m2 = allocate_camera_metadata(entry_capacity-1, data_capacity);
693*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m2);
694*b9df5ad1SAndroid Build Coastguard Worker
695*b9df5ad1SAndroid Build Coastguard Worker result = append_camera_metadata(m2, m);
696*b9df5ad1SAndroid Build Coastguard Worker
697*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
698*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m2));
699*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m2));
700*b9df5ad1SAndroid Build Coastguard Worker
701*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
702*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m2);
703*b9df5ad1SAndroid Build Coastguard Worker }
704*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,append_metadata_onespace)705*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, append_metadata_onespace) {
706*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
707*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
708*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 50;
709*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity2 = entry_capacity * 2 - 2;
710*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity2 = data_capacity * 2;
711*b9df5ad1SAndroid Build Coastguard Worker int result;
712*b9df5ad1SAndroid Build Coastguard Worker
713*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
714*b9df5ad1SAndroid Build Coastguard Worker
715*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, entry_capacity);
716*b9df5ad1SAndroid Build Coastguard Worker
717*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = NULL;
718*b9df5ad1SAndroid Build Coastguard Worker
719*b9df5ad1SAndroid Build Coastguard Worker m2 = allocate_camera_metadata(entry_capacity2, data_capacity2);
720*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m2);
721*b9df5ad1SAndroid Build Coastguard Worker
722*b9df5ad1SAndroid Build Coastguard Worker result = append_camera_metadata(m2, m);
723*b9df5ad1SAndroid Build Coastguard Worker
724*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
725*b9df5ad1SAndroid Build Coastguard Worker
726*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_count(m),
727*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
728*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m),
729*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
730*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
731*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity2, get_camera_metadata_data_capacity(m2));
732*b9df5ad1SAndroid Build Coastguard Worker
733*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
734*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e1, e2;
735*b9df5ad1SAndroid Build Coastguard Worker
736*b9df5ad1SAndroid Build Coastguard Worker int result;
737*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e1);
738*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
739*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e1.index);
740*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
741*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
742*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
743*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
744*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.type, e2.type);
745*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.count, e2.count);
746*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int j=0;
747*b9df5ad1SAndroid Build Coastguard Worker j < e1.count * camera_metadata_type_size[e1.type];
748*b9df5ad1SAndroid Build Coastguard Worker j++) {
749*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
750*b9df5ad1SAndroid Build Coastguard Worker }
751*b9df5ad1SAndroid Build Coastguard Worker }
752*b9df5ad1SAndroid Build Coastguard Worker
753*b9df5ad1SAndroid Build Coastguard Worker result = append_camera_metadata(m2, m);
754*b9df5ad1SAndroid Build Coastguard Worker
755*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
756*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_count(m2));
757*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m),
758*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
759*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
760*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity2, get_camera_metadata_data_capacity(m2));
761*b9df5ad1SAndroid Build Coastguard Worker
762*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
763*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e1, e2;
764*b9df5ad1SAndroid Build Coastguard Worker
765*b9df5ad1SAndroid Build Coastguard Worker int result;
766*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
767*b9df5ad1SAndroid Build Coastguard Worker i % entry_capacity, &e1);
768*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
769*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i % entry_capacity, e1.index);
770*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
771*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
772*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
773*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
774*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.type, e2.type);
775*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.count, e2.count);
776*b9df5ad1SAndroid Build Coastguard Worker for (unsigned int j=0;
777*b9df5ad1SAndroid Build Coastguard Worker j < e1.count * camera_metadata_type_size[e1.type];
778*b9df5ad1SAndroid Build Coastguard Worker j++) {
779*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
780*b9df5ad1SAndroid Build Coastguard Worker }
781*b9df5ad1SAndroid Build Coastguard Worker }
782*b9df5ad1SAndroid Build Coastguard Worker
783*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
784*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m2);
785*b9df5ad1SAndroid Build Coastguard Worker }
786*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,vendor_tags)787*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, vendor_tags) {
788*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
789*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
790*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 50;
791*b9df5ad1SAndroid Build Coastguard Worker int result;
792*b9df5ad1SAndroid Build Coastguard Worker
793*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
794*b9df5ad1SAndroid Build Coastguard Worker
795*b9df5ad1SAndroid Build Coastguard Worker uint8_t superMode = 5;
796*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
797*b9df5ad1SAndroid Build Coastguard Worker FAKEVENDOR_SENSOR_SUPERMODE,
798*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
799*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
800*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
801*b9df5ad1SAndroid Build Coastguard Worker
802*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
803*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_METADATA_MODE,
804*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
805*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
806*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
807*b9df5ad1SAndroid Build Coastguard Worker
808*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
809*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
810*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
811*b9df5ad1SAndroid Build Coastguard Worker
812*b9df5ad1SAndroid Build Coastguard Worker set_camera_metadata_vendor_ops(&fakevendor_ops);
813*b9df5ad1SAndroid Build Coastguard Worker
814*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
815*b9df5ad1SAndroid Build Coastguard Worker FAKEVENDOR_SENSOR_SUPERMODE,
816*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
817*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
818*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
819*b9df5ad1SAndroid Build Coastguard Worker
820*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
821*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_METADATA_MODE,
822*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
823*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
824*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
825*b9df5ad1SAndroid Build Coastguard Worker
826*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
827*b9df5ad1SAndroid Build Coastguard Worker FAKEVENDOR_SCALER_END,
828*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
829*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
830*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
831*b9df5ad1SAndroid Build Coastguard Worker
832*b9df5ad1SAndroid Build Coastguard Worker EXPECT_STREQ("com.fakevendor.sensor",
833*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
834*b9df5ad1SAndroid Build Coastguard Worker EXPECT_STREQ("superMode",
835*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
836*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_BYTE,
837*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
838*b9df5ad1SAndroid Build Coastguard Worker
839*b9df5ad1SAndroid Build Coastguard Worker EXPECT_STREQ("com.fakevendor.scaler",
840*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_section_name(FAKEVENDOR_SCALER_END));
841*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SCALER_END));
842*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SCALER_END));
843*b9df5ad1SAndroid Build Coastguard Worker
844*b9df5ad1SAndroid Build Coastguard Worker set_camera_metadata_vendor_ops(NULL);
845*b9df5ad1SAndroid Build Coastguard Worker // TODO: fix vendor ops. Then the below 3 validations should fail.
846*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
847*b9df5ad1SAndroid Build Coastguard Worker
848*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
849*b9df5ad1SAndroid Build Coastguard Worker FAKEVENDOR_SENSOR_SUPERMODE,
850*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
851*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
852*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
853*b9df5ad1SAndroid Build Coastguard Worker
854*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
855*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_METADATA_MODE,
856*b9df5ad1SAndroid Build Coastguard Worker &superMode, 1);
857*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
858*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
859*b9df5ad1SAndroid Build Coastguard Worker
860*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
861*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
862*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
863*b9df5ad1SAndroid Build Coastguard Worker
864*b9df5ad1SAndroid Build Coastguard Worker // Remove all vendor entries so validation passes
865*b9df5ad1SAndroid Build Coastguard Worker {
866*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_ro_entry_t entry;
867*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, find_camera_metadata_ro_entry(m,
868*b9df5ad1SAndroid Build Coastguard Worker FAKEVENDOR_SENSOR_SUPERMODE,
869*b9df5ad1SAndroid Build Coastguard Worker &entry));
870*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, delete_camera_metadata_entry(m, entry.index));
871*b9df5ad1SAndroid Build Coastguard Worker }
872*b9df5ad1SAndroid Build Coastguard Worker
873*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
874*b9df5ad1SAndroid Build Coastguard Worker }
875*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,add_all_tags)876*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, add_all_tags) {
877*b9df5ad1SAndroid Build Coastguard Worker int total_tag_count = 0;
878*b9df5ad1SAndroid Build Coastguard Worker for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
879*b9df5ad1SAndroid Build Coastguard Worker total_tag_count += camera_metadata_section_bounds[i][1] -
880*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_section_bounds[i][0];
881*b9df5ad1SAndroid Build Coastguard Worker }
882*b9df5ad1SAndroid Build Coastguard Worker int entry_data_count = 3;
883*b9df5ad1SAndroid Build Coastguard Worker int conservative_data_space = total_tag_count * entry_data_count * 8;
884*b9df5ad1SAndroid Build Coastguard Worker uint8_t data[entry_data_count * 8];
885*b9df5ad1SAndroid Build Coastguard Worker int32_t *data_int32 = (int32_t *)data;
886*b9df5ad1SAndroid Build Coastguard Worker float *data_float = (float *)data;
887*b9df5ad1SAndroid Build Coastguard Worker int64_t *data_int64 = (int64_t *)data;
888*b9df5ad1SAndroid Build Coastguard Worker double *data_double = (double *)data;
889*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_rational_t *data_rational =
890*b9df5ad1SAndroid Build Coastguard Worker (camera_metadata_rational_t *)data;
891*b9df5ad1SAndroid Build Coastguard Worker
892*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = allocate_camera_metadata(total_tag_count,
893*b9df5ad1SAndroid Build Coastguard Worker conservative_data_space);
894*b9df5ad1SAndroid Build Coastguard Worker
895*b9df5ad1SAndroid Build Coastguard Worker ASSERT_NE((void*)NULL, (void*)m);
896*b9df5ad1SAndroid Build Coastguard Worker
897*b9df5ad1SAndroid Build Coastguard Worker int result;
898*b9df5ad1SAndroid Build Coastguard Worker
899*b9df5ad1SAndroid Build Coastguard Worker int counter = 0;
900*b9df5ad1SAndroid Build Coastguard Worker for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
901*b9df5ad1SAndroid Build Coastguard Worker for (uint32_t tag = camera_metadata_section_bounds[i][0];
902*b9df5ad1SAndroid Build Coastguard Worker tag < camera_metadata_section_bounds[i][1];
903*b9df5ad1SAndroid Build Coastguard Worker tag++, counter++) {
904*b9df5ad1SAndroid Build Coastguard Worker int type = get_camera_metadata_tag_type(tag);
905*b9df5ad1SAndroid Build Coastguard Worker ASSERT_NE(-1, type);
906*b9df5ad1SAndroid Build Coastguard Worker
907*b9df5ad1SAndroid Build Coastguard Worker switch (type) {
908*b9df5ad1SAndroid Build Coastguard Worker case TYPE_BYTE:
909*b9df5ad1SAndroid Build Coastguard Worker data[0] = tag & 0xFF;
910*b9df5ad1SAndroid Build Coastguard Worker data[1] = (tag >> 8) & 0xFF;
911*b9df5ad1SAndroid Build Coastguard Worker data[2] = (tag >> 16) & 0xFF;
912*b9df5ad1SAndroid Build Coastguard Worker break;
913*b9df5ad1SAndroid Build Coastguard Worker case TYPE_INT32:
914*b9df5ad1SAndroid Build Coastguard Worker data_int32[0] = tag;
915*b9df5ad1SAndroid Build Coastguard Worker data_int32[1] = i;
916*b9df5ad1SAndroid Build Coastguard Worker data_int32[2] = counter;
917*b9df5ad1SAndroid Build Coastguard Worker break;
918*b9df5ad1SAndroid Build Coastguard Worker case TYPE_FLOAT:
919*b9df5ad1SAndroid Build Coastguard Worker data_float[0] = tag;
920*b9df5ad1SAndroid Build Coastguard Worker data_float[1] = i;
921*b9df5ad1SAndroid Build Coastguard Worker data_float[2] = counter / (float)total_tag_count;
922*b9df5ad1SAndroid Build Coastguard Worker break;
923*b9df5ad1SAndroid Build Coastguard Worker case TYPE_INT64:
924*b9df5ad1SAndroid Build Coastguard Worker data_int64[0] = (int64_t)tag | ( (int64_t)tag << 32);
925*b9df5ad1SAndroid Build Coastguard Worker data_int64[1] = i;
926*b9df5ad1SAndroid Build Coastguard Worker data_int64[2] = counter;
927*b9df5ad1SAndroid Build Coastguard Worker break;
928*b9df5ad1SAndroid Build Coastguard Worker case TYPE_DOUBLE:
929*b9df5ad1SAndroid Build Coastguard Worker data_double[0] = tag;
930*b9df5ad1SAndroid Build Coastguard Worker data_double[1] = i;
931*b9df5ad1SAndroid Build Coastguard Worker data_double[2] = counter / (double)total_tag_count;
932*b9df5ad1SAndroid Build Coastguard Worker break;
933*b9df5ad1SAndroid Build Coastguard Worker case TYPE_RATIONAL:
934*b9df5ad1SAndroid Build Coastguard Worker data_rational[0].numerator = tag;
935*b9df5ad1SAndroid Build Coastguard Worker data_rational[0].denominator = 1;
936*b9df5ad1SAndroid Build Coastguard Worker data_rational[1].numerator = i;
937*b9df5ad1SAndroid Build Coastguard Worker data_rational[1].denominator = 1;
938*b9df5ad1SAndroid Build Coastguard Worker data_rational[2].numerator = counter;
939*b9df5ad1SAndroid Build Coastguard Worker data_rational[2].denominator = total_tag_count;
940*b9df5ad1SAndroid Build Coastguard Worker break;
941*b9df5ad1SAndroid Build Coastguard Worker default:
942*b9df5ad1SAndroid Build Coastguard Worker FAIL() << "Unknown type field encountered:" << type;
943*b9df5ad1SAndroid Build Coastguard Worker break;
944*b9df5ad1SAndroid Build Coastguard Worker }
945*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
946*b9df5ad1SAndroid Build Coastguard Worker tag,
947*b9df5ad1SAndroid Build Coastguard Worker data,
948*b9df5ad1SAndroid Build Coastguard Worker entry_data_count);
949*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
950*b9df5ad1SAndroid Build Coastguard Worker
951*b9df5ad1SAndroid Build Coastguard Worker }
952*b9df5ad1SAndroid Build Coastguard Worker }
953*b9df5ad1SAndroid Build Coastguard Worker
954*b9df5ad1SAndroid Build Coastguard Worker IF_ALOGV() {
955*b9df5ad1SAndroid Build Coastguard Worker dump_camera_metadata(m, 0, 2);
956*b9df5ad1SAndroid Build Coastguard Worker }
957*b9df5ad1SAndroid Build Coastguard Worker
958*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
959*b9df5ad1SAndroid Build Coastguard Worker }
960*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,sort_metadata)961*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, sort_metadata) {
962*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
963*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 5;
964*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 100;
965*b9df5ad1SAndroid Build Coastguard Worker
966*b9df5ad1SAndroid Build Coastguard Worker int result;
967*b9df5ad1SAndroid Build Coastguard Worker
968*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
969*b9df5ad1SAndroid Build Coastguard Worker
970*b9df5ad1SAndroid Build Coastguard Worker // Add several unique entries in non-sorted order
971*b9df5ad1SAndroid Build Coastguard Worker
972*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_rational_t colorTransform[] = {
973*b9df5ad1SAndroid Build Coastguard Worker {9, 10}, {0, 1}, {0, 1},
974*b9df5ad1SAndroid Build Coastguard Worker {1, 5}, {1, 2}, {0, 1},
975*b9df5ad1SAndroid Build Coastguard Worker {0, 1}, {1, 10}, {7, 10}
976*b9df5ad1SAndroid Build Coastguard Worker };
977*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
978*b9df5ad1SAndroid Build Coastguard Worker ANDROID_COLOR_CORRECTION_TRANSFORM,
979*b9df5ad1SAndroid Build Coastguard Worker colorTransform, ARRAY_SIZE(colorTransform));
980*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
981*b9df5ad1SAndroid Build Coastguard Worker
982*b9df5ad1SAndroid Build Coastguard Worker float focus_distance = 0.5f;
983*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
984*b9df5ad1SAndroid Build Coastguard Worker ANDROID_LENS_FOCUS_DISTANCE,
985*b9df5ad1SAndroid Build Coastguard Worker &focus_distance, 1);
986*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
987*b9df5ad1SAndroid Build Coastguard Worker
988*b9df5ad1SAndroid Build Coastguard Worker int64_t exposure_time = 1000000000;
989*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
990*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_EXPOSURE_TIME,
991*b9df5ad1SAndroid Build Coastguard Worker &exposure_time, 1);
992*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
993*b9df5ad1SAndroid Build Coastguard Worker
994*b9df5ad1SAndroid Build Coastguard Worker int32_t sensitivity = 800;
995*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
996*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_SENSITIVITY,
997*b9df5ad1SAndroid Build Coastguard Worker &sensitivity, 1);
998*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
999*b9df5ad1SAndroid Build Coastguard Worker
1000*b9df5ad1SAndroid Build Coastguard Worker // Test unsorted find
1001*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t entry;
1002*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1003*b9df5ad1SAndroid Build Coastguard Worker ANDROID_LENS_FOCUS_DISTANCE,
1004*b9df5ad1SAndroid Build Coastguard Worker &entry);
1005*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1006*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1007*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.index);
1008*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_FLOAT, entry.type);
1009*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
1010*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(focus_distance, *entry.data.f);
1011*b9df5ad1SAndroid Build Coastguard Worker
1012*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1013*b9df5ad1SAndroid Build Coastguard Worker ANDROID_NOISE_REDUCTION_STRENGTH,
1014*b9df5ad1SAndroid Build Coastguard Worker &entry);
1015*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(NOT_FOUND, result);
1016*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.index);
1017*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1018*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_FLOAT, entry.type);
1019*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
1020*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(focus_distance, *entry.data.f);
1021*b9df5ad1SAndroid Build Coastguard Worker
1022*b9df5ad1SAndroid Build Coastguard Worker // Sort
1023*b9df5ad1SAndroid Build Coastguard Worker IF_ALOGV() {
1024*b9df5ad1SAndroid Build Coastguard Worker std::cout << "Pre-sorted metadata" << std::endl;
1025*b9df5ad1SAndroid Build Coastguard Worker dump_camera_metadata(m, 0, 2);
1026*b9df5ad1SAndroid Build Coastguard Worker }
1027*b9df5ad1SAndroid Build Coastguard Worker
1028*b9df5ad1SAndroid Build Coastguard Worker result = sort_camera_metadata(m);
1029*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1030*b9df5ad1SAndroid Build Coastguard Worker
1031*b9df5ad1SAndroid Build Coastguard Worker IF_ALOGV() {
1032*b9df5ad1SAndroid Build Coastguard Worker std::cout << "Sorted metadata" << std::endl;
1033*b9df5ad1SAndroid Build Coastguard Worker dump_camera_metadata(m, 0, 2);
1034*b9df5ad1SAndroid Build Coastguard Worker }
1035*b9df5ad1SAndroid Build Coastguard Worker
1036*b9df5ad1SAndroid Build Coastguard Worker // Test sorted find
1037*b9df5ad1SAndroid Build Coastguard Worker size_t lensFocusIndex = -1;
1038*b9df5ad1SAndroid Build Coastguard Worker {
1039*b9df5ad1SAndroid Build Coastguard Worker std::vector<uint32_t> tags;
1040*b9df5ad1SAndroid Build Coastguard Worker tags.push_back(ANDROID_COLOR_CORRECTION_TRANSFORM);
1041*b9df5ad1SAndroid Build Coastguard Worker tags.push_back(ANDROID_LENS_FOCUS_DISTANCE);
1042*b9df5ad1SAndroid Build Coastguard Worker tags.push_back(ANDROID_SENSOR_EXPOSURE_TIME);
1043*b9df5ad1SAndroid Build Coastguard Worker tags.push_back(ANDROID_SENSOR_SENSITIVITY);
1044*b9df5ad1SAndroid Build Coastguard Worker std::sort(tags.begin(), tags.end());
1045*b9df5ad1SAndroid Build Coastguard Worker
1046*b9df5ad1SAndroid Build Coastguard Worker lensFocusIndex =
1047*b9df5ad1SAndroid Build Coastguard Worker std::find(tags.begin(), tags.end(), ANDROID_LENS_FOCUS_DISTANCE)
1048*b9df5ad1SAndroid Build Coastguard Worker - tags.begin();
1049*b9df5ad1SAndroid Build Coastguard Worker }
1050*b9df5ad1SAndroid Build Coastguard Worker
1051*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1052*b9df5ad1SAndroid Build Coastguard Worker ANDROID_LENS_FOCUS_DISTANCE,
1053*b9df5ad1SAndroid Build Coastguard Worker &entry);
1054*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1055*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(lensFocusIndex, entry.index);
1056*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1057*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_FLOAT, entry.type);
1058*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, (size_t)entry.count);
1059*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(focus_distance, *entry.data.f);
1060*b9df5ad1SAndroid Build Coastguard Worker
1061*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1062*b9df5ad1SAndroid Build Coastguard Worker ANDROID_NOISE_REDUCTION_STRENGTH,
1063*b9df5ad1SAndroid Build Coastguard Worker &entry);
1064*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(NOT_FOUND, result);
1065*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(lensFocusIndex, entry.index);
1066*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1067*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_FLOAT, entry.type);
1068*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, entry.count);
1069*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(focus_distance, *entry.data.f);
1070*b9df5ad1SAndroid Build Coastguard Worker
1071*b9df5ad1SAndroid Build Coastguard Worker
1072*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
1073*b9df5ad1SAndroid Build Coastguard Worker }
1074*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,delete_metadata)1075*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, delete_metadata) {
1076*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
1077*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 50;
1078*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 450;
1079*b9df5ad1SAndroid Build Coastguard Worker
1080*b9df5ad1SAndroid Build Coastguard Worker int result;
1081*b9df5ad1SAndroid Build Coastguard Worker
1082*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
1083*b9df5ad1SAndroid Build Coastguard Worker
1084*b9df5ad1SAndroid Build Coastguard Worker size_t num_entries = 5;
1085*b9df5ad1SAndroid Build Coastguard Worker size_t data_per_entry =
1086*b9df5ad1SAndroid Build Coastguard Worker calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1087*b9df5ad1SAndroid Build Coastguard Worker size_t num_data = num_entries * data_per_entry;
1088*b9df5ad1SAndroid Build Coastguard Worker
1089*b9df5ad1SAndroid Build Coastguard Worker // Delete an entry with data
1090*b9df5ad1SAndroid Build Coastguard Worker
1091*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, num_entries);
1092*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1093*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1094*b9df5ad1SAndroid Build Coastguard Worker
1095*b9df5ad1SAndroid Build Coastguard Worker result = delete_camera_metadata_entry(m, 1);
1096*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1097*b9df5ad1SAndroid Build Coastguard Worker num_entries--;
1098*b9df5ad1SAndroid Build Coastguard Worker num_data -= data_per_entry;
1099*b9df5ad1SAndroid Build Coastguard Worker
1100*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1101*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1102*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1103*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1104*b9df5ad1SAndroid Build Coastguard Worker
1105*b9df5ad1SAndroid Build Coastguard Worker result = delete_camera_metadata_entry(m, 4);
1106*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
1107*b9df5ad1SAndroid Build Coastguard Worker
1108*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1109*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1110*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1111*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1112*b9df5ad1SAndroid Build Coastguard Worker
1113*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < num_entries; i++) {
1114*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e;
1115*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e);
1116*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1117*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e.index);
1118*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1119*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1120*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1121*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e.data.i64);
1122*b9df5ad1SAndroid Build Coastguard Worker }
1123*b9df5ad1SAndroid Build Coastguard Worker
1124*b9df5ad1SAndroid Build Coastguard Worker // Delete an entry with no data, at end of array
1125*b9df5ad1SAndroid Build Coastguard Worker
1126*b9df5ad1SAndroid Build Coastguard Worker int32_t frameCount = 12;
1127*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
1128*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT,
1129*b9df5ad1SAndroid Build Coastguard Worker &frameCount, 1);
1130*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1131*b9df5ad1SAndroid Build Coastguard Worker num_entries++;
1132*b9df5ad1SAndroid Build Coastguard Worker
1133*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1134*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1135*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1136*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1137*b9df5ad1SAndroid Build Coastguard Worker
1138*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e;
1139*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, 4, &e);
1140*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1141*b9df5ad1SAndroid Build Coastguard Worker
1142*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)4, e.index);
1143*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1144*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1145*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1146*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(frameCount, *e.data.i32);
1147*b9df5ad1SAndroid Build Coastguard Worker
1148*b9df5ad1SAndroid Build Coastguard Worker result = delete_camera_metadata_entry(m, 4);
1149*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1150*b9df5ad1SAndroid Build Coastguard Worker
1151*b9df5ad1SAndroid Build Coastguard Worker num_entries--;
1152*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1153*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1154*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1155*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1156*b9df5ad1SAndroid Build Coastguard Worker
1157*b9df5ad1SAndroid Build Coastguard Worker result = delete_camera_metadata_entry(m, 4);
1158*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
1159*b9df5ad1SAndroid Build Coastguard Worker
1160*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, 4, &e);
1161*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
1162*b9df5ad1SAndroid Build Coastguard Worker
1163*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1164*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1165*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1166*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1167*b9df5ad1SAndroid Build Coastguard Worker
1168*b9df5ad1SAndroid Build Coastguard Worker // Delete with extra data on end of array
1169*b9df5ad1SAndroid Build Coastguard Worker result = delete_camera_metadata_entry(m, 3);
1170*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1171*b9df5ad1SAndroid Build Coastguard Worker num_entries--;
1172*b9df5ad1SAndroid Build Coastguard Worker num_data -= data_per_entry;
1173*b9df5ad1SAndroid Build Coastguard Worker
1174*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < num_entries; i++) {
1175*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1176*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1177*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1178*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1179*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1180*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1181*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1182*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1183*b9df5ad1SAndroid Build Coastguard Worker }
1184*b9df5ad1SAndroid Build Coastguard Worker
1185*b9df5ad1SAndroid Build Coastguard Worker // Delete without extra data in front of array
1186*b9df5ad1SAndroid Build Coastguard Worker
1187*b9df5ad1SAndroid Build Coastguard Worker frameCount = 1001;
1188*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
1189*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT,
1190*b9df5ad1SAndroid Build Coastguard Worker &frameCount, 1);
1191*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1192*b9df5ad1SAndroid Build Coastguard Worker num_entries++;
1193*b9df5ad1SAndroid Build Coastguard Worker
1194*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1195*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1196*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1197*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1198*b9df5ad1SAndroid Build Coastguard Worker
1199*b9df5ad1SAndroid Build Coastguard Worker result = sort_camera_metadata(m);
1200*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1201*b9df5ad1SAndroid Build Coastguard Worker
1202*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1203*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1204*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1205*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1206*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1207*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1208*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1209*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(frameCount, *e.data.i32);
1210*b9df5ad1SAndroid Build Coastguard Worker
1211*b9df5ad1SAndroid Build Coastguard Worker result = delete_camera_metadata_entry(m, e.index);
1212*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1213*b9df5ad1SAndroid Build Coastguard Worker num_entries--;
1214*b9df5ad1SAndroid Build Coastguard Worker
1215*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1216*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1217*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1218*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1219*b9df5ad1SAndroid Build Coastguard Worker
1220*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < num_entries; i++) {
1221*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1222*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1223*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1224*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1225*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1226*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1227*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1228*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1229*b9df5ad1SAndroid Build Coastguard Worker }
1230*b9df5ad1SAndroid Build Coastguard Worker }
1231*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,update_metadata)1232*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, update_metadata) {
1233*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
1234*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 50;
1235*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 450;
1236*b9df5ad1SAndroid Build Coastguard Worker
1237*b9df5ad1SAndroid Build Coastguard Worker int result;
1238*b9df5ad1SAndroid Build Coastguard Worker
1239*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
1240*b9df5ad1SAndroid Build Coastguard Worker
1241*b9df5ad1SAndroid Build Coastguard Worker size_t num_entries = 5;
1242*b9df5ad1SAndroid Build Coastguard Worker size_t data_per_entry =
1243*b9df5ad1SAndroid Build Coastguard Worker calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1244*b9df5ad1SAndroid Build Coastguard Worker size_t num_data = num_entries * data_per_entry;
1245*b9df5ad1SAndroid Build Coastguard Worker
1246*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, num_entries);
1247*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1248*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1249*b9df5ad1SAndroid Build Coastguard Worker
1250*b9df5ad1SAndroid Build Coastguard Worker // Update with same-size data, doesn't fit in entry
1251*b9df5ad1SAndroid Build Coastguard Worker
1252*b9df5ad1SAndroid Build Coastguard Worker int64_t newExposureTime = 1000;
1253*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t e;
1254*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1255*b9df5ad1SAndroid Build Coastguard Worker 0, &newExposureTime, 1, &e);
1256*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1257*b9df5ad1SAndroid Build Coastguard Worker
1258*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1259*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1260*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1261*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1262*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposureTime, *e.data.i64);
1263*b9df5ad1SAndroid Build Coastguard Worker
1264*b9df5ad1SAndroid Build Coastguard Worker e.count = 0;
1265*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
1266*b9df5ad1SAndroid Build Coastguard Worker 0, &e);
1267*b9df5ad1SAndroid Build Coastguard Worker
1268*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1269*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1270*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1271*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1272*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposureTime, *e.data.i64);
1273*b9df5ad1SAndroid Build Coastguard Worker
1274*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 1; i < num_entries; i++) {
1275*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1276*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1277*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1278*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1279*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1280*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1281*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 + 100 * i;
1282*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1283*b9df5ad1SAndroid Build Coastguard Worker }
1284*b9df5ad1SAndroid Build Coastguard Worker
1285*b9df5ad1SAndroid Build Coastguard Worker // Update with larger data
1286*b9df5ad1SAndroid Build Coastguard Worker int64_t newExposures[2] = { 5000, 6000 };
1287*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1288*b9df5ad1SAndroid Build Coastguard Worker 0, newExposures, 2, &e);
1289*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1290*b9df5ad1SAndroid Build Coastguard Worker num_data += data_per_entry;
1291*b9df5ad1SAndroid Build Coastguard Worker
1292*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1293*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1294*b9df5ad1SAndroid Build Coastguard Worker
1295*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1296*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1297*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1298*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)2, e.count);
1299*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[0], e.data.i64[0]);
1300*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[1], e.data.i64[1]);
1301*b9df5ad1SAndroid Build Coastguard Worker
1302*b9df5ad1SAndroid Build Coastguard Worker e.count = 0;
1303*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
1304*b9df5ad1SAndroid Build Coastguard Worker 0, &e);
1305*b9df5ad1SAndroid Build Coastguard Worker
1306*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1307*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1308*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1309*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)2, e.count);
1310*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[0], e.data.i64[0]);
1311*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[1], e.data.i64[1]);
1312*b9df5ad1SAndroid Build Coastguard Worker
1313*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 1; i < num_entries; i++) {
1314*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1315*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1316*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1317*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1318*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1319*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1320*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 + 100 * i;
1321*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1322*b9df5ad1SAndroid Build Coastguard Worker }
1323*b9df5ad1SAndroid Build Coastguard Worker
1324*b9df5ad1SAndroid Build Coastguard Worker // Update with smaller data
1325*b9df5ad1SAndroid Build Coastguard Worker newExposureTime = 100;
1326*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1327*b9df5ad1SAndroid Build Coastguard Worker 0, &newExposureTime, 1, &e);
1328*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1329*b9df5ad1SAndroid Build Coastguard Worker
1330*b9df5ad1SAndroid Build Coastguard Worker num_data -= data_per_entry;
1331*b9df5ad1SAndroid Build Coastguard Worker
1332*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1333*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1334*b9df5ad1SAndroid Build Coastguard Worker
1335*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1336*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1337*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1338*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1339*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposureTime, *e.data.i64);
1340*b9df5ad1SAndroid Build Coastguard Worker
1341*b9df5ad1SAndroid Build Coastguard Worker e.count = 0;
1342*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m,
1343*b9df5ad1SAndroid Build Coastguard Worker 0, &e);
1344*b9df5ad1SAndroid Build Coastguard Worker
1345*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1346*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1347*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1348*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1349*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposureTime, *e.data.i64);
1350*b9df5ad1SAndroid Build Coastguard Worker
1351*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 1; i < num_entries; i++) {
1352*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1353*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1354*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1355*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1356*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1357*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1358*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 + 100 * i;
1359*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1360*b9df5ad1SAndroid Build Coastguard Worker }
1361*b9df5ad1SAndroid Build Coastguard Worker
1362*b9df5ad1SAndroid Build Coastguard Worker // Update with size fitting in entry
1363*b9df5ad1SAndroid Build Coastguard Worker
1364*b9df5ad1SAndroid Build Coastguard Worker int32_t frameCount = 1001;
1365*b9df5ad1SAndroid Build Coastguard Worker result = add_camera_metadata_entry(m,
1366*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT,
1367*b9df5ad1SAndroid Build Coastguard Worker &frameCount, 1);
1368*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1369*b9df5ad1SAndroid Build Coastguard Worker num_entries++;
1370*b9df5ad1SAndroid Build Coastguard Worker
1371*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1372*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1373*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1374*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1375*b9df5ad1SAndroid Build Coastguard Worker
1376*b9df5ad1SAndroid Build Coastguard Worker result = sort_camera_metadata(m);
1377*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1378*b9df5ad1SAndroid Build Coastguard Worker
1379*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1380*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1381*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1382*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1383*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1384*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1385*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1386*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(frameCount, *e.data.i32);
1387*b9df5ad1SAndroid Build Coastguard Worker
1388*b9df5ad1SAndroid Build Coastguard Worker int32_t newFrameCount = 0x12349876;
1389*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1390*b9df5ad1SAndroid Build Coastguard Worker 0, &newFrameCount, 1, &e);
1391*b9df5ad1SAndroid Build Coastguard Worker
1392*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1393*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1394*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1395*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1396*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1397*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1398*b9df5ad1SAndroid Build Coastguard Worker
1399*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1400*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1401*b9df5ad1SAndroid Build Coastguard Worker
1402*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1403*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1404*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1405*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1406*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1407*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1408*b9df5ad1SAndroid Build Coastguard Worker
1409*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 1; i < num_entries; i++) {
1410*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1411*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1412*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1413*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1414*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1415*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1416*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 * i;
1417*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1418*b9df5ad1SAndroid Build Coastguard Worker }
1419*b9df5ad1SAndroid Build Coastguard Worker
1420*b9df5ad1SAndroid Build Coastguard Worker // Update to bigger than entry
1421*b9df5ad1SAndroid Build Coastguard Worker
1422*b9df5ad1SAndroid Build Coastguard Worker int32_t newFrameCounts[4] = { 0x0, 0x1, 0x10, 0x100 };
1423*b9df5ad1SAndroid Build Coastguard Worker
1424*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1425*b9df5ad1SAndroid Build Coastguard Worker 0, &newFrameCounts, 4, &e);
1426*b9df5ad1SAndroid Build Coastguard Worker
1427*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1428*b9df5ad1SAndroid Build Coastguard Worker
1429*b9df5ad1SAndroid Build Coastguard Worker num_data += calculate_camera_metadata_entry_data_size(TYPE_INT32,
1430*b9df5ad1SAndroid Build Coastguard Worker 4);
1431*b9df5ad1SAndroid Build Coastguard Worker
1432*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1433*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1434*b9df5ad1SAndroid Build Coastguard Worker
1435*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1436*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1437*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1438*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)4, e.count);
1439*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
1440*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
1441*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
1442*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
1443*b9df5ad1SAndroid Build Coastguard Worker
1444*b9df5ad1SAndroid Build Coastguard Worker e.count = 0;
1445*b9df5ad1SAndroid Build Coastguard Worker
1446*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1447*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1448*b9df5ad1SAndroid Build Coastguard Worker
1449*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1450*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1451*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1452*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1453*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)4, e.count);
1454*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
1455*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
1456*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
1457*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
1458*b9df5ad1SAndroid Build Coastguard Worker
1459*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 1; i < num_entries; i++) {
1460*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry e2;
1461*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1462*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1463*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1464*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1465*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1466*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 * i;
1467*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1468*b9df5ad1SAndroid Build Coastguard Worker }
1469*b9df5ad1SAndroid Build Coastguard Worker
1470*b9df5ad1SAndroid Build Coastguard Worker // Update to smaller than entry
1471*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1472*b9df5ad1SAndroid Build Coastguard Worker 0, &newFrameCount, 1, &e);
1473*b9df5ad1SAndroid Build Coastguard Worker
1474*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1475*b9df5ad1SAndroid Build Coastguard Worker
1476*b9df5ad1SAndroid Build Coastguard Worker num_data -= camera_metadata_type_size[TYPE_INT32] * 4;
1477*b9df5ad1SAndroid Build Coastguard Worker
1478*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1479*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1480*b9df5ad1SAndroid Build Coastguard Worker
1481*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1482*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1483*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1484*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1485*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1486*b9df5ad1SAndroid Build Coastguard Worker
1487*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m,
1488*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1489*b9df5ad1SAndroid Build Coastguard Worker
1490*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1491*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1492*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1493*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1494*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1495*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1496*b9df5ad1SAndroid Build Coastguard Worker
1497*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 1; i < num_entries; i++) {
1498*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t e2;
1499*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e2);
1500*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1501*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1502*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1503*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1504*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 * i;
1505*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1506*b9df5ad1SAndroid Build Coastguard Worker }
1507*b9df5ad1SAndroid Build Coastguard Worker
1508*b9df5ad1SAndroid Build Coastguard Worker // Setup new buffer with no spare data space
1509*b9df5ad1SAndroid Build Coastguard Worker
1510*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m,
1511*b9df5ad1SAndroid Build Coastguard Worker 1, newExposures, 2, &e);
1512*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1513*b9df5ad1SAndroid Build Coastguard Worker
1514*b9df5ad1SAndroid Build Coastguard Worker num_data += data_per_entry;
1515*b9df5ad1SAndroid Build Coastguard Worker
1516*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1517*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1518*b9df5ad1SAndroid Build Coastguard Worker
1519*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.index);
1520*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1521*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1522*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)2, e.count);
1523*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[0], e.data.i64[0]);
1524*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[1], e.data.i64[1]);
1525*b9df5ad1SAndroid Build Coastguard Worker
1526*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2;
1527*b9df5ad1SAndroid Build Coastguard Worker m2 = allocate_camera_metadata(get_camera_metadata_entry_count(m),
1528*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m));
1529*b9df5ad1SAndroid Build Coastguard Worker EXPECT_NOT_NULL(m2);
1530*b9df5ad1SAndroid Build Coastguard Worker
1531*b9df5ad1SAndroid Build Coastguard Worker result = append_camera_metadata(m2, m);
1532*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1533*b9df5ad1SAndroid Build Coastguard Worker
1534*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m2,
1535*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1536*b9df5ad1SAndroid Build Coastguard Worker
1537*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1538*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1539*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1540*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1541*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1542*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1543*b9df5ad1SAndroid Build Coastguard Worker
1544*b9df5ad1SAndroid Build Coastguard Worker // Update when there's no more room
1545*b9df5ad1SAndroid Build Coastguard Worker
1546*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m2,
1547*b9df5ad1SAndroid Build Coastguard Worker 0, &newFrameCounts, 4, &e);
1548*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ERROR, result);
1549*b9df5ad1SAndroid Build Coastguard Worker
1550*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1551*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1552*b9df5ad1SAndroid Build Coastguard Worker
1553*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1554*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1555*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1556*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1557*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1558*b9df5ad1SAndroid Build Coastguard Worker
1559*b9df5ad1SAndroid Build Coastguard Worker // Update when there's no data room, but change fits into entry
1560*b9df5ad1SAndroid Build Coastguard Worker
1561*b9df5ad1SAndroid Build Coastguard Worker newFrameCount = 5;
1562*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m2,
1563*b9df5ad1SAndroid Build Coastguard Worker 0, &newFrameCount, 1, &e);
1564*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1565*b9df5ad1SAndroid Build Coastguard Worker
1566*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1567*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1568*b9df5ad1SAndroid Build Coastguard Worker
1569*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1570*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1571*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1572*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1573*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1574*b9df5ad1SAndroid Build Coastguard Worker
1575*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m2,
1576*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1577*b9df5ad1SAndroid Build Coastguard Worker
1578*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1579*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1580*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1581*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1582*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1583*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1584*b9df5ad1SAndroid Build Coastguard Worker
1585*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, 1, &e);
1586*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.index);
1587*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1588*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1589*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)2, e.count);
1590*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[0], e.data.i64[0]);
1591*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[1], e.data.i64[1]);
1592*b9df5ad1SAndroid Build Coastguard Worker
1593*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 2; i < num_entries; i++) {
1594*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t e2;
1595*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
1596*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1597*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1598*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1599*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1600*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 * i;
1601*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1602*b9df5ad1SAndroid Build Coastguard Worker }
1603*b9df5ad1SAndroid Build Coastguard Worker
1604*b9df5ad1SAndroid Build Coastguard Worker // Update when there's no data room, but data size doesn't change
1605*b9df5ad1SAndroid Build Coastguard Worker
1606*b9df5ad1SAndroid Build Coastguard Worker newExposures[0] = 1000;
1607*b9df5ad1SAndroid Build Coastguard Worker
1608*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m2,
1609*b9df5ad1SAndroid Build Coastguard Worker 1, newExposures, 2, &e);
1610*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1611*b9df5ad1SAndroid Build Coastguard Worker
1612*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1613*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1614*b9df5ad1SAndroid Build Coastguard Worker
1615*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.index);
1616*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1617*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1618*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)2, e.count);
1619*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[0], e.data.i64[0]);
1620*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposures[1], e.data.i64[1]);
1621*b9df5ad1SAndroid Build Coastguard Worker
1622*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m2,
1623*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1624*b9df5ad1SAndroid Build Coastguard Worker
1625*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1626*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1627*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1628*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1629*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1630*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1631*b9df5ad1SAndroid Build Coastguard Worker
1632*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 2; i < num_entries; i++) {
1633*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t e2;
1634*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
1635*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1636*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1637*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1638*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1639*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 * i;
1640*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1641*b9df5ad1SAndroid Build Coastguard Worker }
1642*b9df5ad1SAndroid Build Coastguard Worker
1643*b9df5ad1SAndroid Build Coastguard Worker // Update when there's no data room, but data size shrinks
1644*b9df5ad1SAndroid Build Coastguard Worker
1645*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m2,
1646*b9df5ad1SAndroid Build Coastguard Worker 1, &newExposureTime, 1, &e);
1647*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1648*b9df5ad1SAndroid Build Coastguard Worker
1649*b9df5ad1SAndroid Build Coastguard Worker num_data -= calculate_camera_metadata_entry_data_size(TYPE_INT64, 2);
1650*b9df5ad1SAndroid Build Coastguard Worker num_data += calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1651*b9df5ad1SAndroid Build Coastguard Worker
1652*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1653*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1654*b9df5ad1SAndroid Build Coastguard Worker
1655*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.index);
1656*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1657*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e.type);
1658*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1659*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newExposureTime, e.data.i64[0]);
1660*b9df5ad1SAndroid Build Coastguard Worker
1661*b9df5ad1SAndroid Build Coastguard Worker result = find_camera_metadata_entry(m2,
1662*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_FRAME_COUNT, &e);
1663*b9df5ad1SAndroid Build Coastguard Worker
1664*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1665*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, e.index);
1666*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1667*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT32, e.type);
1668*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, e.count);
1669*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(newFrameCount, *e.data.i32);
1670*b9df5ad1SAndroid Build Coastguard Worker
1671*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 2; i < num_entries; i++) {
1672*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t e2;
1673*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
1674*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1675*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(i, e2.index);
1676*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1677*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(TYPE_INT64, e2.type);
1678*b9df5ad1SAndroid Build Coastguard Worker int64_t exposureTime = 100 * i;
1679*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(exposureTime, *e2.data.i64);
1680*b9df5ad1SAndroid Build Coastguard Worker }
1681*b9df5ad1SAndroid Build Coastguard Worker
1682*b9df5ad1SAndroid Build Coastguard Worker }
1683*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,memcpy)1684*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, memcpy) {
1685*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
1686*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 50;
1687*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 450;
1688*b9df5ad1SAndroid Build Coastguard Worker
1689*b9df5ad1SAndroid Build Coastguard Worker int result;
1690*b9df5ad1SAndroid Build Coastguard Worker
1691*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
1692*b9df5ad1SAndroid Build Coastguard Worker
1693*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, 5);
1694*b9df5ad1SAndroid Build Coastguard Worker
1695*b9df5ad1SAndroid Build Coastguard Worker size_t m_size = get_camera_metadata_size(m);
1696*b9df5ad1SAndroid Build Coastguard Worker uint8_t *dst = new uint8_t[m_size];
1697*b9df5ad1SAndroid Build Coastguard Worker
1698*b9df5ad1SAndroid Build Coastguard Worker memcpy(dst, m, m_size);
1699*b9df5ad1SAndroid Build Coastguard Worker
1700*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m2 = reinterpret_cast<camera_metadata_t*>(dst);
1701*b9df5ad1SAndroid Build Coastguard Worker
1702*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(get_camera_metadata_size(m),
1703*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_size(m2));
1704*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_compact_size(m),
1705*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_compact_size(m2));
1706*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(get_camera_metadata_entry_count(m),
1707*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_count(m2));
1708*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_entry_capacity(m),
1709*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_entry_capacity(m2));
1710*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_count(m),
1711*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_count(m2));
1712*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(get_camera_metadata_data_capacity(m),
1713*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_data_capacity(m2));
1714*b9df5ad1SAndroid Build Coastguard Worker
1715*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_entry_t e1, e2;
1716*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < get_camera_metadata_entry_count(m); i++) {
1717*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, i, &e1);
1718*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
1719*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, i, &e2);
1720*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
1721*b9df5ad1SAndroid Build Coastguard Worker
1722*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
1723*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
1724*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(e1.type, e2.type);
1725*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(e1.count, e2.count);
1726*b9df5ad1SAndroid Build Coastguard Worker
1727*b9df5ad1SAndroid Build Coastguard Worker ASSERT_TRUE(!memcmp(e1.data.u8, e2.data.u8,
1728*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_type_size[e1.type] * e1.count));
1729*b9df5ad1SAndroid Build Coastguard Worker }
1730*b9df5ad1SAndroid Build Coastguard Worker
1731*b9df5ad1SAndroid Build Coastguard Worker // Make sure updating one metadata buffer doesn't change the other
1732*b9df5ad1SAndroid Build Coastguard Worker
1733*b9df5ad1SAndroid Build Coastguard Worker int64_t double_exposure_time[] = { 100, 200 };
1734*b9df5ad1SAndroid Build Coastguard Worker
1735*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m, 0,
1736*b9df5ad1SAndroid Build Coastguard Worker double_exposure_time,
1737*b9df5ad1SAndroid Build Coastguard Worker sizeof(double_exposure_time)/sizeof(int64_t), NULL);
1738*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1739*b9df5ad1SAndroid Build Coastguard Worker
1740*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, 0, &e1);
1741*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
1742*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, 0, &e2);
1743*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
1744*b9df5ad1SAndroid Build Coastguard Worker
1745*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
1746*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
1747*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(e1.type, e2.type);
1748*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)2, e1.count);
1749*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)1, e2.count);
1750*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(100, e1.data.i64[0]);
1751*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(200, e1.data.i64[1]);
1752*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(100, e2.data.i64[0]);
1753*b9df5ad1SAndroid Build Coastguard Worker
1754*b9df5ad1SAndroid Build Coastguard Worker // And in the reverse direction as well
1755*b9df5ad1SAndroid Build Coastguard Worker
1756*b9df5ad1SAndroid Build Coastguard Worker double_exposure_time[0] = 300;
1757*b9df5ad1SAndroid Build Coastguard Worker result = update_camera_metadata_entry(m2, 0,
1758*b9df5ad1SAndroid Build Coastguard Worker double_exposure_time,
1759*b9df5ad1SAndroid Build Coastguard Worker sizeof(double_exposure_time)/sizeof(int64_t), NULL);
1760*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, result);
1761*b9df5ad1SAndroid Build Coastguard Worker
1762*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m, 0, &e1);
1763*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
1764*b9df5ad1SAndroid Build Coastguard Worker result = get_camera_metadata_entry(m2, 0, &e2);
1765*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, result);
1766*b9df5ad1SAndroid Build Coastguard Worker
1767*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.index, e2.index);
1768*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(e1.tag, e2.tag);
1769*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(e1.type, e2.type);
1770*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)2, e1.count);
1771*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)2, e2.count);
1772*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(100, e1.data.i64[0]);
1773*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(200, e1.data.i64[1]);
1774*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(300, e2.data.i64[0]);
1775*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(200, e2.data.i64[1]);
1776*b9df5ad1SAndroid Build Coastguard Worker
1777*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &m_size));
1778*b9df5ad1SAndroid Build Coastguard Worker
1779*b9df5ad1SAndroid Build Coastguard Worker delete[] dst;
1780*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
1781*b9df5ad1SAndroid Build Coastguard Worker }
1782*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,data_alignment)1783*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, data_alignment) {
1784*b9df5ad1SAndroid Build Coastguard Worker // Verify that when we store the data, the data aligned as we expect
1785*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
1786*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 50;
1787*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 450;
1788*b9df5ad1SAndroid Build Coastguard Worker char dummy_data[data_capacity] = {0,};
1789*b9df5ad1SAndroid Build Coastguard Worker
1790*b9df5ad1SAndroid Build Coastguard Worker int m_types[] = {
1791*b9df5ad1SAndroid Build Coastguard Worker TYPE_BYTE,
1792*b9df5ad1SAndroid Build Coastguard Worker TYPE_INT32,
1793*b9df5ad1SAndroid Build Coastguard Worker TYPE_FLOAT,
1794*b9df5ad1SAndroid Build Coastguard Worker TYPE_INT64,
1795*b9df5ad1SAndroid Build Coastguard Worker TYPE_DOUBLE,
1796*b9df5ad1SAndroid Build Coastguard Worker TYPE_RATIONAL
1797*b9df5ad1SAndroid Build Coastguard Worker };
1798*b9df5ad1SAndroid Build Coastguard Worker const size_t (&m_type_sizes)[NUM_TYPES] = camera_metadata_type_size;
1799*b9df5ad1SAndroid Build Coastguard Worker size_t m_type_align[] = {
1800*b9df5ad1SAndroid Build Coastguard Worker _Alignas(uint8_t), // BYTE
1801*b9df5ad1SAndroid Build Coastguard Worker _Alignas(int32_t), // INT32
1802*b9df5ad1SAndroid Build Coastguard Worker _Alignas(float), // FLOAT
1803*b9df5ad1SAndroid Build Coastguard Worker _Alignas(int64_t), // INT64
1804*b9df5ad1SAndroid Build Coastguard Worker _Alignas(double), // DOUBLE
1805*b9df5ad1SAndroid Build Coastguard Worker _Alignas(camera_metadata_rational_t), // RATIONAL
1806*b9df5ad1SAndroid Build Coastguard Worker };
1807*b9df5ad1SAndroid Build Coastguard Worker /* arbitrary tags. the important thing is that their type
1808*b9df5ad1SAndroid Build Coastguard Worker corresponds to m_type_sizes[i]
1809*b9df5ad1SAndroid Build Coastguard Worker */
1810*b9df5ad1SAndroid Build Coastguard Worker int m_type_tags[] = {
1811*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_TYPE,
1812*b9df5ad1SAndroid Build Coastguard Worker ANDROID_REQUEST_ID,
1813*b9df5ad1SAndroid Build Coastguard Worker ANDROID_LENS_FOCUS_DISTANCE,
1814*b9df5ad1SAndroid Build Coastguard Worker ANDROID_SENSOR_EXPOSURE_TIME,
1815*b9df5ad1SAndroid Build Coastguard Worker ANDROID_JPEG_GPS_COORDINATES,
1816*b9df5ad1SAndroid Build Coastguard Worker ANDROID_CONTROL_AE_COMPENSATION_STEP
1817*b9df5ad1SAndroid Build Coastguard Worker };
1818*b9df5ad1SAndroid Build Coastguard Worker
1819*b9df5ad1SAndroid Build Coastguard Worker /*
1820*b9df5ad1SAndroid Build Coastguard Worker if the asserts fail, its because we added more types.
1821*b9df5ad1SAndroid Build Coastguard Worker this means the test should be updated to include more types.
1822*b9df5ad1SAndroid Build Coastguard Worker */
1823*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_types)/sizeof(m_types[0]));
1824*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_align)/sizeof(m_type_align[0]));
1825*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_tags)/sizeof(m_type_tags[0]));
1826*b9df5ad1SAndroid Build Coastguard Worker
1827*b9df5ad1SAndroid Build Coastguard Worker for (int m_type = 0; m_type < (int)NUM_TYPES; ++m_type) {
1828*b9df5ad1SAndroid Build Coastguard Worker
1829*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(m_types[m_type],
1830*b9df5ad1SAndroid Build Coastguard Worker get_camera_metadata_tag_type(m_type_tags[m_type]));
1831*b9df5ad1SAndroid Build Coastguard Worker
1832*b9df5ad1SAndroid Build Coastguard Worker // misalignment possibilities are [0,type_size) for any type pointer
1833*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < m_type_sizes[m_type]; ++i) {
1834*b9df5ad1SAndroid Build Coastguard Worker
1835*b9df5ad1SAndroid Build Coastguard Worker /* data_count = 1, we may store data in the index.
1836*b9df5ad1SAndroid Build Coastguard Worker data_count = 10, we will store data separately
1837*b9df5ad1SAndroid Build Coastguard Worker */
1838*b9df5ad1SAndroid Build Coastguard Worker for (int data_count = 1; data_count <= 10; data_count += 9) {
1839*b9df5ad1SAndroid Build Coastguard Worker
1840*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
1841*b9df5ad1SAndroid Build Coastguard Worker
1842*b9df5ad1SAndroid Build Coastguard Worker // add dummy data to test various different padding requirements
1843*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK,
1844*b9df5ad1SAndroid Build Coastguard Worker add_camera_metadata_entry(m,
1845*b9df5ad1SAndroid Build Coastguard Worker m_type_tags[TYPE_BYTE],
1846*b9df5ad1SAndroid Build Coastguard Worker &dummy_data[0],
1847*b9df5ad1SAndroid Build Coastguard Worker data_count + i));
1848*b9df5ad1SAndroid Build Coastguard Worker // insert the type we care to test
1849*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK,
1850*b9df5ad1SAndroid Build Coastguard Worker add_camera_metadata_entry(m, m_type_tags[m_type],
1851*b9df5ad1SAndroid Build Coastguard Worker &dummy_data[0], data_count));
1852*b9df5ad1SAndroid Build Coastguard Worker
1853*b9df5ad1SAndroid Build Coastguard Worker // now check the alignment for our desired type. it should be ok
1854*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_ro_entry_t entry = camera_metadata_ro_entry_t();
1855*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK,
1856*b9df5ad1SAndroid Build Coastguard Worker find_camera_metadata_ro_entry(m, m_type_tags[m_type],
1857*b9df5ad1SAndroid Build Coastguard Worker &entry));
1858*b9df5ad1SAndroid Build Coastguard Worker
1859*b9df5ad1SAndroid Build Coastguard Worker void* data_ptr = (void*)entry.data.u8;
1860*b9df5ad1SAndroid Build Coastguard Worker void* aligned_ptr = (void*)((uintptr_t)data_ptr & ~(m_type_align[m_type] - 1));
1861*b9df5ad1SAndroid Build Coastguard Worker EXPECT_EQ(aligned_ptr, data_ptr) <<
1862*b9df5ad1SAndroid Build Coastguard Worker "Wrong alignment for type " <<
1863*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_type_names[m_type] <<
1864*b9df5ad1SAndroid Build Coastguard Worker " with " << (data_count + i) << " dummy bytes and " <<
1865*b9df5ad1SAndroid Build Coastguard Worker " data_count " << data_count <<
1866*b9df5ad1SAndroid Build Coastguard Worker " expected alignment was: " << m_type_align[m_type];
1867*b9df5ad1SAndroid Build Coastguard Worker
1868*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
1869*b9df5ad1SAndroid Build Coastguard Worker }
1870*b9df5ad1SAndroid Build Coastguard Worker }
1871*b9df5ad1SAndroid Build Coastguard Worker }
1872*b9df5ad1SAndroid Build Coastguard Worker }
1873*b9df5ad1SAndroid Build Coastguard Worker
TEST(camera_metadata,buffer_alignment)1874*b9df5ad1SAndroid Build Coastguard Worker TEST(camera_metadata, buffer_alignment) {
1875*b9df5ad1SAndroid Build Coastguard Worker // Verify that misaligned metadata buffers only fail VALIDATION_SHIFTED, nothing else
1876*b9df5ad1SAndroid Build Coastguard Worker const size_t entry_capacity = 50;
1877*b9df5ad1SAndroid Build Coastguard Worker const size_t data_capacity = 450;
1878*b9df5ad1SAndroid Build Coastguard Worker const size_t offsetRange = 16;
1879*b9df5ad1SAndroid Build Coastguard Worker const uint32_t validAlignment = 8;
1880*b9df5ad1SAndroid Build Coastguard Worker
1881*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m = NULL;
1882*b9df5ad1SAndroid Build Coastguard Worker m = allocate_camera_metadata(entry_capacity, data_capacity);
1883*b9df5ad1SAndroid Build Coastguard Worker
1884*b9df5ad1SAndroid Build Coastguard Worker add_test_metadata(m, 15);
1885*b9df5ad1SAndroid Build Coastguard Worker
1886*b9df5ad1SAndroid Build Coastguard Worker size_t m_size = get_camera_metadata_size(m);
1887*b9df5ad1SAndroid Build Coastguard Worker size_t dst_size = m_size + offsetRange;
1888*b9df5ad1SAndroid Build Coastguard Worker uint8_t *dst = new uint8_t[dst_size];
1889*b9df5ad1SAndroid Build Coastguard Worker
1890*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < offsetRange; i++) {
1891*b9df5ad1SAndroid Build Coastguard Worker memset(dst, 0, dst_size);
1892*b9df5ad1SAndroid Build Coastguard Worker memcpy(dst + i, m, m_size);
1893*b9df5ad1SAndroid Build Coastguard Worker camera_metadata_t *m_shifted = (camera_metadata_t*)(dst + i);
1894*b9df5ad1SAndroid Build Coastguard Worker
1895*b9df5ad1SAndroid Build Coastguard Worker int err = validate_camera_metadata_structure(m_shifted, &m_size);
1896*b9df5ad1SAndroid Build Coastguard Worker if (i % validAlignment == 0) {
1897*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(OK, err) << "For alignment shift " << i << ", expected OK" ;
1898*b9df5ad1SAndroid Build Coastguard Worker } else {
1899*b9df5ad1SAndroid Build Coastguard Worker ASSERT_EQ(CAMERA_METADATA_VALIDATION_SHIFTED, err) <<
1900*b9df5ad1SAndroid Build Coastguard Worker "For alignment shift " << i << ", expected VALIDATION_SHIFTED" ;
1901*b9df5ad1SAndroid Build Coastguard Worker }
1902*b9df5ad1SAndroid Build Coastguard Worker }
1903*b9df5ad1SAndroid Build Coastguard Worker
1904*b9df5ad1SAndroid Build Coastguard Worker delete[] dst;
1905*b9df5ad1SAndroid Build Coastguard Worker FINISH_USING_CAMERA_METADATA(m);
1906*b9df5ad1SAndroid Build Coastguard Worker }
1907